# Configuring Nodes Source: https://docs.chain.link/chainlink-nodes/configuring-nodes Starting with Chainlink v2.0.0, TOML configuration is the only supported configuration method. You can switch to TOML format using the [Chainlink v1.13.0 image](https://hub.docker.com/r/smartcontract/chainlink/tags). After your Chainlink node is running stable on v1.13.0, you can continue to use the TOML config on future images where support for `.env` configs are no longer supported. You can see the available config options on the [Node Config](/chainlink-nodes/v1/node-config) and [Node Secrets](/chainlink-nodes/v1/secrets-config) pages. ## Migrating from environment variables to TOML Before you begin, update your Chainlink Node to v1.13.0 and ensure that it operates as expected. This is the last version that supports environment variable configuration, and the best version to use for TOML migration before you update the node to future versions. ### Export your current config You can generate the `config.toml` file using the `chainlink config dump` command. This guide shows you how to do this for a Chainlink node running in a Docker container: 1. Open an interactive shell inside the Docker container that runs your node: ```shell docker exec -it chainlink bash ``` 2. Log in to the Chainlink CLI with an account that has admin access: ```shell chainlink admin login ``` 3. Export the current config to a `config.toml` file: ```shell chainlink config dump > config.toml ``` 4. Log out of the Chainlink CLI and close the shell on the Docker container. ```shell chainlink admin logout && exit ``` 5. Change to the directory where your .env file is located. This is the directory that you mount to Docker when you run the node. You will create your `config.toml` and `secrets.toml` files here so Docker can provide them to your node container. ```shell cd ~/.chainlink ``` 6. Write the config file from the container to your host: ```shell docker exec -it chainlink cat /home/chainlink/config.toml > ./config.toml ``` 7. Create a `secrets.toml` file with the minimum required secrets, which are `[Database]` and `[Password]`. If you are working on a test node, you can use `?sslmode=disable` in the database `URL`. You might also need [`AllowSimplePasswords = true`](/chainlink-nodes/v1/secrets-config#allowsimplepasswords) in the `[Database]` section so you can start the node, but you should make the database password sufficiently complex as a best practice: ```shell echo "[Database] URL = 'postgresql://user:pass@localhost:5432/dbname' [Password] Keystore = 'keystore_pass'" > ./secrets.toml ``` 8. Edit the `secrets.toml` file to include the secrets you need for your specific Chainlink node. See the [Node Secrets](/chainlink-nodes/v1/secrets-config) page for a full list of available options. ### Validate the configuration After you have the `config.toml` file and the `secrets.toml` files on the host system, you can validate these files using a temporary Docker container. 1. Validate the configuration by running the `config validate` command in the Docker container. This command changes to `node validate` when you upgrade your node to version `2.0.0` or later. ```shell docker run --platform linux/x86_64/v8 --name chainlink-config-validator -v ~/.chainlink:/chainlink -it --rm smartcontract/chainlink:1.13.0 -config /chainlink/config.toml -secrets /chainlink/secrets.toml config validate ``` You will likely see some invalid config errors. For example: ```shell Invalid configuration: EVM.3.Nodes: missing: must have at least one node ``` 2. Edit the `config.toml` and `secrets.toml` files to manually correct any errors. See the [Node Config](/chainlink-nodes/v1/node-config) and [Node Secrets](/chainlink-nodes/v1/secrets-config) pages to learn which settings are valid. For the error in this example, an EVM chain was configured with no nodes. Removing this from the config made the config valid: ``` [[EVM]] ChainID = '421613' Enabled = false Nodes = [] ``` 3. Run the `config validate` command again and make additional changes until you have a valid config message: ```shell Valid configuration. ``` ### Restart your Chainlink node using the TOML config With your valid config and secrets files, you can migrate your Chainlink node to use the new config. 1. Stop your existing Chainlink node: ```shell docker stop chainlink ``` 2. Make a Postgres [database snapshot](https://www.postgresql.org/docs/current/backup-dump.html) so you can restore your previous Chainlink node if necessary. 3. Start a new Chainlink node Docker container named using the new `config.toml` and `secrets.toml` files. This example uses `chainlink-toml` as the container name: ```shell docker run --platform linux/x86_64/v8 --name chainlink-toml -v ~/.chainlink:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink:1.13.0 -config /chainlink/config.toml -secrets /chainlink/secrets.toml node start ``` Test your node to verify that it works as intended. If you are using a VPS, open an [SSH tunnel](https://www.howtogeek.com/168145/how-to-use-ssh-tunneling/) using `ssh -i $KEY $USER@$REMOTE-IP -L 6688:localhost:6688 -N`. Connect to the Operator UI in your browser at `localhost:6688`. ## Using multiple config files You can use multiple config and secrets files. The config settings from each file are applied in the order that you specify when you run your node. Duplicated fields override values specified in earlier config files. This allows you to create a common config that applies to many nodes with specific configs for nodes that need unique configuration settings. Specifying multiple secrets files is invalid. To specify multiple config files, add additional `-config` flags to the `docker run` command: ```shell docker run --platform linux/x86_64/v8 --name chainlink -v ~/.chainlink:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink:1.13.0 -config /chainlink/config.toml -config /chainlink/config2.toml -config /chainlink/config3.toml -secrets /chainlink/secrets.toml node start ``` --- # Contract addresses Source: https://docs.chain.link/chainlink-nodes/contracts/addresses This page lists the [operator factory](/chainlink-nodes/contracts/operatorfactory) addresses for different networks. ## Ethereum ### Mainnet [0x3E64Cd889482443324F91bFA9c84fE72A511f48A](https://etherscan.io/address/0x3E64Cd889482443324F91bFA9c84fE72A511f48A) ### Sepolia [0x447Fd5eC2D383091C22B8549cb231a3bAD6d3fAf](https://sepolia.etherscan.io/address/0x447Fd5eC2D383091C22B8549cb231a3bAD6d3fAf) --- # Forwarder Source: https://docs.chain.link/chainlink-nodes/contracts/forwarder In the EVM world, [externally-owned account](https://ethereum.org/en/developers/docs/accounts/) transactions are confirmed sequentially. Chainlink nodes that use a single externally-owned account (EOA) per chain face several important challenges: - Transactions are broadcast through a single FIFO queue, so the throughput is limited to a single lane. Low throughput is terrible for the overall user experience because concurrent clients must wait to have their requests fulfilled. When more clients make requests, the longer it takes for requests to be fulfilled. - Transactions are not executed by priority. For example, consider a situation where there are two transactions in a row. The first transaction is a fulfillment of an API request to get the winner of the FIFA world cup 2022, and the second transaction is an *ETH/USD* price feed update used by multiple DeFi protocols. Relying on a single EOA forces the second transaction to be confirmed only after the first transaction is fulfilled. The first transaction is not as time-sensitive, but it is still fulfilled first. - A stuck transaction will cause all the subsequent transactions to remain pending. For example, if a transaction becomes stuck because the gas price is not set high enough, that transaction must be bumped or canceled before subsequent transactions can be fulfilled. - As a workaround, some node operators deploy multiple Chainlink nodes per chain. While this allows them to handle different types of requests separately (one node for price feeds and another to fulfill API requests), this comes with an overhead in infrastructure and maintenance costs. To solve these challenges, we introduced two major features that will allow node operators to set up different transaction-sending strategies more securely while lowering their infrastructure costs: - Chainlink nodes support multiple EOAs. - [Forwarder](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/AuthorizedForwarder.sol) contracts allow a node operator to manage multiple EOAs and make them look like a single address. If you use a web2 analogy, forwarder contracts act like a reverse proxy server where the user is served by the same address and does not see which server the traffic is coming from. To do so, nodes call the [forward](#forward) function on the forwarder contract. Combining multiple EOAs and forwarder contracts allows greater flexibility and security in terms of design: - Node operators can expand horizontally using multiple EOAs. They can deploy one or multiple forwarder contracts for these EOAs. The combination of EOAs and forwarders offers a lot of flexibility for setting up different pipelines for handling transactions. - Node operators can support different job types (OCR, VRF, API request..Etc) on the same node, which reduces maintenance and infrastructure costs. - Security-wise, forwarder contracts distinguish between owner accounts and authorized sender accounts. Authorized senders are hot wallets such as the EOAs of a Chainlink node. If a node is compromised, the owner is responsible for changing the authorized senders list. - Node operators do not need to manually compile and deploy [operator](/chainlink-nodes/contracts/operator) and [forwarder](/chainlink-nodes/contracts/forwarder) contracts. They can deploy them directly from the [operator factory](/chainlink-nodes/contracts/operatorfactory) by calling the [deploynewoperatorandforwarder](/chainlink-nodes/contracts/operatorfactory#deploynewoperatorandforwarder) function. From a design perspective, the owner of a forwarder contract is an [operator](/chainlink-nodes/contracts/operator) contract. The owner of the operator contract is usually a more secure address with keys stored in a hardware wallet or protected by a multisig. Node operators can manage a set of forwarder contracts through an operator contract. ## API Reference The forwarder contract inherits [AuthorizedReceiver.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/AuthorizedReceiver.sol) and [ConfirmedOwnerWithProposal.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol). Read the [Receiver](/chainlink-nodes/contracts/receiver) and [Ownership](/chainlink-nodes/contracts/ownership) API references to learn more. ### Methods #### typeAndVersion ```solidity function typeAndVersion() external pure virtual returns (string) ``` The type and version of this contract. ##### Return Values | Name | Type | Description | | ---- | ------ | ----------------------- | | | string | Type and version string | #### forward ```solidity function forward(address to, bytes data) external ``` Forward a call to another contract. *Only callable by an authorized sender* ##### Parameters | Name | Type | Description | | ---- | ------- | ----------- | | to | address | address | | data | bytes | to forward | #### ownerForward ```solidity function ownerForward(address to, bytes data) external ``` Forward a call to another contract. *Only callable by the owner* ##### Parameters | Name | Type | Description | | ---- | ------- | ----------- | | to | address | address | | data | bytes | to forward | #### transferOwnershipWithMessage ```solidity function transferOwnershipWithMessage(address to, bytes message) external ``` Transfer ownership with instructions for recipient.Emit [OwnershipTransferRequestedWithMessage](#ownershiptransferrequestedwithmessage) event. ##### Parameters | Name | Type | Description | | ------- | ------- | --------------------------------------------------- | | to | address | address proposed recipient of ownership | | message | bytes | instructions for recipient upon accepting ownership | ### Events #### OwnershipTransferRequestedWithMessage ```solidity event OwnershipTransferRequestedWithMessage(address from, address to, bytes message) ``` --- # Operator Source: https://docs.chain.link/chainlink-nodes/contracts/operator Oracles must deploy an onchain contract to handle requests made through the LINK token (Read [Basic Request Model](/architecture-overview/architecture-request-model) to learn more). When the *Basic Request* model was introduced, node operators had to deploy the legacy [Oracle contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.4/Oracle.sol). However, these come with some limitations, and soon, we introduced [operator contracts](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol). > **NOTE** > > Node operators must use *Operator.sol* instead of *Oracle.sol*. In addition to replacing oracle contracts, operator contracts come with additional features that add more security and flexibility for node operators. ## Features ### Multi-word response In the EVM architecture, a word is made up of 32 bytes. One limitation of the [Oracle.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.4/Oracle.sol) contract is that it limits responses to requests to 32 bytes. [Operator.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) doesn't have the same limitation as it supports a response made of multiple EVM words. ### Factory deployment To deploy an *Oracle* contract, each node operator has to manually compile and deploy [Oracle.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.4/Oracle.sol). The vast number of Solidity versions and steps involved in verifying the contract made it difficult for a client to verify that the deployed contract had not been tampered with. To fix this, node operators can use a [factory](/chainlink-nodes/contracts/operatorfactory) to deploy an instance of the *operator* contract. Moreover, the factory exposes a getter for clients to check if it deployed a specific *operator* contract address. ### Distributing funds to multiple addresses A common pain point of node operators is keeping their addresses funded. *Operator*'s `distributeFunds` method allows node operators to fund multiple addresses in a single transaction. ### Flexibility and security By using multiple externally-owned accounts (EOAs) on Chainlink nodes and [forwarder](/chainlink-nodes/contracts/forwarder) contracts, node operators can set up different transaction-sending strategies. > **NOTE** > > Read more about [forwarders](/chainlink-nodes/contracts/forwarder). As discussed in the [forwarder](/chainlink-nodes/contracts/forwarder) contracts page: - Chainlink nodes' EOAs are hot wallets that fulfill requests. - These EOAs can be associated with one or multiple [forwarder](/chainlink-nodes/contracts/forwarder) contracts. The forwarder's owner must whitelist them to call the [forward](/chainlink-nodes/contracts/forwarder#forward) function. One operator contract owns one or multiple forwarder contracts. - Node operators manage their forwarder contracts through operator contracts. They use a secure wallet such as hardware or a multisig wallet as the operator's owner account. ## API reference The operator contract inherits [AuthorizedReceiver](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/AuthorizedReceiver.sol) and [ConfirmedOwnerWithProposal](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol). Read [AuthorizedReceiver](/chainlink-nodes/contracts/receiver) and [ConfirmedOwnerWithProposal](/chainlink-nodes/contracts/ownership) API references. ### Methods #### oracleRequest > **NOTE: Legacy** > > Use `operatorRequest` [function](#operatorrequest) instead. ```solidity function oracleRequest(address sender, uint256 payment, bytes32 specId, address callbackAddress, bytes4 callbackFunctionId, uint256 nonce, uint256 dataVersion, bytes data) external ``` Creates the Chainlink request. This is backwards compatible API with [Oracle.sol contracts](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.4/Oracle.sol), but the behavior changes because `callbackAddress` is assumed to be the same as the request sender. ##### Parameters | Name | Type | Description | | ------------------ | ------- | ---------------------------------------------- | | sender | address | The sender of the request | | payment | uint256 | The amount of payment given (specified in wei) | | specId | bytes32 | The Job Specification ID | | callbackAddress | address | The consumer of the request | | callbackFunctionId | bytes4 | The callback function ID for the response | | nonce | uint256 | The nonce sent by the requester | | dataVersion | uint256 | The specified data version | | data | bytes | The extra request parameters | #### operatorRequest ```solidity function operatorRequest(address sender, uint256 payment, bytes32 specId, bytes4 callbackFunctionId, uint256 nonce, uint256 dataVersion, bytes data) external ``` Creates the Chainlink request. Stores the hash of the params as the onchain commitment for the request. Emits [OracleRequest](#oraclerequest-1) event for the Chainlink node to detect. ##### Parameters | Name | Type | Description | | ------------------ | ------- | ---------------------------------------------- | | sender | address | The sender of the request | | payment | uint256 | The amount of payment given (specified in wei) | | specId | bytes32 | The Job Specification ID | | callbackFunctionId | bytes4 | The callback function ID for the response | | nonce | uint256 | The nonce sent by the requester | | dataVersion | uint256 | The specified data version | | data | bytes | The extra request parameters | #### fulfillOracleRequest > **NOTE: Legacy** > > Use `fulfillOracleRequest2` [function](#fulfilloraclerequest2) instead. ```solidity function fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes32 data) external returns (bool) ``` Called by the Chainlink node to fulfill requests. Given params must hash back to the commitment stored from `oracleRequest`. Will call the callback address' callback function without bubbling up error checking in a `require` so that the node can get paid. Emits [OracleResponse](#oracleresponse) event. ##### Parameters | Name | Type | Description | | ------------------ | ------- | ------------------------------------------------------------------------------ | | requestId | bytes32 | The fulfillment request ID that must match the requester's | | payment | uint256 | The payment amount that will be released for the oracle (specified in wei) | | callbackAddress | address | The callback address to call for fulfillment | | callbackFunctionId | bytes4 | The callback function ID to use for fulfillment | | expiration | uint256 | The expiration that the node should respond by before the requester can cancel | | data | bytes32 | The data to return to the consuming contract | ##### Return values | Name | Type | Description | | ---- | ---- | ------------------------------------------ | | | bool | Status if the external call was successful | #### fulfillOracleRequest2 ```solidity function fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes data) external returns (bool) ``` Called by the Chainlink node to fulfill requests with multi-word support. Given params must hash back to the commitment stored from `oracleRequest`. Will call the callback address' callback function without bubbling up error checking in a `require` so that the node can get paid. Emits [OracleResponse](#oracleresponse) event. ##### Parameters | Name | Type | Description | | ------------------ | ------- | ------------------------------------------------------------------------------ | | requestId | bytes32 | The fulfillment request ID that must match the requester's | | payment | uint256 | The payment amount that will be released for the oracle (specified in wei) | | callbackAddress | address | The callback address to call for fulfillment | | callbackFunctionId | bytes4 | The callback function ID to use for fulfillment | | expiration | uint256 | The expiration that the node should respond by before the requester can cancel | | data | bytes | The data to return to the consuming contract | ##### Return values | Name | Type | Description | | ---- | ---- | ------------------------------------------ | | | bool | Status if the external call was successful | #### transferOwnableContracts ```solidity function transferOwnableContracts(address[] ownable, address newOwner) external ``` Transfer the ownership of ownable contracts. This is primarily intended for authorized forwarders but could possibly be extended to work with future contracts. ##### Parameters | Name | Type | Description | | -------- | ---------- | -------------------------------- | | ownable | address[] | list of addresses to transfer | | newOwner | address | address to transfer ownership to | #### acceptOwnableContracts ```solidity function acceptOwnableContracts(address[] ownable) public ``` Accept the ownership of an ownable contract. This is primarily intended for authorized forwarders but could possibly be extended to work with future contracts. Emits [OwnableContractAccepted](#ownablecontractaccepted) event. *Must be the pending owner on the contract* ##### Parameters | Name | Type | Description | | ------- | ---------- | ------------------------------------------------ | | ownable | address[] | list of addresses of Ownable contracts to accept | #### setAuthorizedSendersOn ```solidity function setAuthorizedSendersOn(address[] targets, address[] senders) public ``` Sets the fulfillment permission for `senders` on `targets`. Emits [TargetsUpdatedAuthorizedSenders](#targetsupdatedauthorizedsenders) event. ##### Parameters | Name | Type | Description | | ------- | ---------- | ---------------------------------------------- | | targets | address[] | The addresses to set permissions on | | senders | address[] | The addresses that are allowed to send updates | #### acceptAuthorizedReceivers ```solidity function acceptAuthorizedReceivers(address[] targets, address[] senders) external ``` Accepts ownership of ownable contracts and then immediately sets the authorized sender list on each of the newly owned contracts. This is primarily intended for authorized forwarders but could possibly be extended to work with future contracts. ##### Parameters | Name | Type | Description | | ------- | ---------- | ---------------------------------------------- | | targets | address[] | The addresses to set permissions on | | senders | address[] | The addresses that are allowed to send updates | #### withdraw ```solidity function withdraw(address recipient, uint256 amount) external ``` Allows the node operator to withdraw earned LINK to a given address `recipient`. *The owner of the contract can be another wallet and does not have to be a Chainlink node* ##### Parameters | Name | Type | Description | | --------- | ------- | ------------------------------------- | | recipient | address | The address to send the LINK token to | | amount | uint256 | The amount to send (specified in wei) | #### withdrawable ```solidity function withdrawable() external view returns (uint256) ``` Displays the amount of LINK that is available for the node operator to withdraw. *We use `1` in place of 0 in storage* ##### Return values | Name | Type | Description | | ---- | ------- | ----------------------------------------------- | | | uint256 | The amount of withdrawable LINK on the contract | #### ownerForward ```solidity function ownerForward(address to, bytes data) external ``` Forward a call to another contract. *Only callable by the owner* ##### Parameters | Name | Type | Description | | ---- | ------- | ----------- | | to | address | address | | data | bytes | to forward | #### ownerTransferAndCall ```solidity function ownerTransferAndCall(address to, uint256 value, bytes data) external returns (bool success) ``` Interact with other LinkTokenReceiver contracts by calling transferAndCall. ##### Parameters | Name | Type | Description | | ----- | ------- | ------------------------------------------------------ | | to | address | The address to transfer to. | | value | uint256 | The amount to be transferred. | | data | bytes | The extra data to be passed to the receiving contract. | ##### Return values | Name | Type | Description | | ------- | ---- | ----------- | | success | bool | bool | #### distributeFunds ```solidity function distributeFunds(address payable[] receivers, uint256[] amounts) external payable ``` Distribute funds to multiple addresses using ETH sent to this payable function. Array length must be equal, ETH sent must equal the sum of amounts. A malicious receiver could cause the distribution to revert, in which case it is expected that the address is removed from the list. ##### Parameters | Name | Type | Description | | --------- | ------------------ | ----------------- | | receivers | address payable[] | list of addresses | | amounts | uint256[] | list of amounts | #### cancelOracleRequest ```solidity function cancelOracleRequest(bytes32 requestId, uint256 payment, bytes4 callbackFunc, uint256 expiration) external ``` Allows recipient to cancel requests sent to this oracle contract. Will transfer the LINK sent for the request back to the recipient address. Given params must hash to a commitment stored on the contract in order for the request to be valid. Emits [CancelOracleRequest](#canceloraclerequest-1) event. ##### Parameters | Name | Type | Description | | ------------ | ------- | ---------------------------------------------------- | | requestId | bytes32 | The request ID | | payment | uint256 | The amount of payment given (specified in wei) | | callbackFunc | bytes4 | The requester's specified callback function selector | | expiration | uint256 | The time of the expiration for the request | #### cancelOracleRequestByRequester ```solidity function cancelOracleRequestByRequester(uint256 nonce, uint256 payment, bytes4 callbackFunc, uint256 expiration) external ``` Allows requester to cancel requests sent to this oracle contract. Will transfer the LINK sent for the request back to the recipient address. Given params must hash to a commitment stored on the contract in order for the request to be valid. Emits [CancelOracleRequest](#canceloraclerequest-1) event. ##### Parameters | Name | Type | Description | | ------------ | ------- | ---------------------------------------------------- | | nonce | uint256 | The nonce used to generate the request ID | | payment | uint256 | The amount of payment given (specified in wei) | | callbackFunc | bytes4 | The requester's specified callback function selector | | expiration | uint256 | The time of the expiration for the request | #### getChainlinkToken ```solidity function getChainlinkToken() public view returns (address) ``` Returns the address of the LINK token This is the public implementation for chainlinkTokenAddress, which is an internal method of the ChainlinkClient contract. ### Events #### OracleRequest ```solidity event OracleRequest(bytes32 specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data) ``` #### CancelOracleRequest ```solidity event CancelOracleRequest(bytes32 requestId) ``` #### OracleResponse ```solidity event OracleResponse(bytes32 requestId) ``` #### OwnableContractAccepted ```solidity event OwnableContractAccepted(address acceptedContract) ``` #### TargetsUpdatedAuthorizedSenders ```solidity event TargetsUpdatedAuthorizedSenders(address[] targets, address[] senders, address changedBy) ``` --- # Operator Factory Source: https://docs.chain.link/chainlink-nodes/contracts/operatorfactory The [factory](https://www.youtube.com/watch?v=Q1zZo4O_Ong) design pattern is a well know programming pattern: Rather than compiling and creating instances of a contract yourself, the *factory* does it for you. As explained in the [operator guide](/chainlink-nodes/contracts/operator), the `OperatorFactory` contract comes with these benefits: - Node operators do not need to manually compile and deploy [operator](/chainlink-nodes/contracts/operator) or/and [forwarder](/chainlink-nodes/contracts/forwarder) contracts. They can deploy them directly from the factory. See the[deploynewoperator](#deploynewoperator), [deploynewforwarder](#deploynewforwarder), and [deploynewoperatorandforwarder](#deploynewoperatorandforwarder) functions. - Clients can verify if the factory deployed a given contract. See the [created](#created) function. ## API Reference ### Methods #### typeAndVersion ```solidity function typeAndVersion() external pure virtual returns (string) ``` The type and version of this contract. ##### Return values | Name | Type | Description | | ---- | ------ | ----------------------- | | | string | Type and version string | #### deployNewOperator ```solidity function deployNewOperator() external returns (address) ``` Creates a new operator contract with the msg.sender as owner. Emits `OperatorCreated` event. #### deployNewOperatorAndForwarder ```solidity function deployNewOperatorAndForwarder() external returns (address, address) ``` Creates a new operator contract with the msg.sender as the owner and a new forwarder with the operator as the owner. Emits: - [OperatorCreated](#operatorcreated) event. - [AuthorizedForwarderCreated](#authorizedforwardercreated) event. #### deployNewForwarder ```solidity function deployNewForwarder() external returns (address) ``` Creates a new forwarder contract with the msg.sender as owner. Emits [AuthorizedForwarderCreated](#authorizedforwardercreated) event. #### deployNewForwarderAndTransferOwnership ```solidity function deployNewForwarderAndTransferOwnership(address to, bytes message) external returns (address) ``` Creates a new forwarder contract with the msg.sender as owner. Emits [AuthorizedForwarderCreated](#authorizedforwardercreated) event. #### created ```solidity function created(address query) external view returns (bool) ``` Indicates whether this factory deployed an address. ### Events #### OperatorCreated ```solidity event OperatorCreated(address operator, address owner, address sender) ``` #### AuthorizedForwarderCreated ```solidity event AuthorizedForwarderCreated(address forwarder, address owner, address sender) ``` --- # Ownership Source: https://docs.chain.link/chainlink-nodes/contracts/ownership [ConfirmedOwnerWithProposal](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol) is inherited by [operator](/chainlink-nodes/contracts/operator) and [forwarder](/chainlink-nodes/contracts/forwarder) contracts. It contains helpers for basic contract ownership. ## API reference ### Methods #### transferOwnership ```solidity function transferOwnership(address to) public ``` Allows an owner to begin transferring ownership to a new address. Emits an [OwnershipTransferRequested](#ownershiptransferrequested) event. #### acceptOwnership ```solidity function acceptOwnership() external ``` Allows an ownership transfer to be completed by the recipient. Emits an [OwnershipTransferred](#ownershiptransferred) event. #### owner ```solidity function owner() public view returns (address) ``` Get the current owner. ### Events #### OwnershipTransferRequested ```solidity event OwnershipTransferRequested(address from, address to) ``` #### OwnershipTransferred ```solidity event OwnershipTransferred(address from, address to) ``` --- # Receiver Source: https://docs.chain.link/chainlink-nodes/contracts/receiver [AuthorizedReceiver](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/AuthorizedReceiver.sol) is an abstract contract inherited by [operator](/chainlink-nodes/contracts/operator) and [forwarder](/chainlink-nodes/contracts/forwarder) contracts. > **NOTE** > > Calling [setAuthorizedSenders](#setauthorizedsenders) has a different effect depending if it is called from an [operator](/chainlink-nodes/contracts/operator) or a [forwarder](/chainlink-nodes/contracts/forwarder) contract: > > - Owners of forwarder contracts allow authorized senders to call [forward](/chainlink-nodes/contracts/forwarder#forward). > - Owners of operator contracts allow authorized senders to call the [fulfillOracleRequest](/chainlink-nodes/contracts/operator#fulfilloraclerequest) and [fulfillOracleRequest2](/chainlink-nodes/contracts/operator#fulfilloraclerequest2) methods. ## API reference ### Methods #### setAuthorizedSenders ```solidity function setAuthorizedSenders(address[] senders) external ``` Sets the fulfillment permission for a given node. Use `true` to allow, `false` to disallow. Emits an [AuthorizedSendersChanged](#authorizedsenderschanged) event. ##### Parameters | Name | Type | Description | | ------- | ---------- | ---------------------------------------------- | | senders | address[] | The addresses of the authorized Chainlink node | #### getAuthorizedSenders ```solidity function getAuthorizedSenders() external view returns (address[]) ``` Retrieve a list of authorized senders. ##### Return values | Name | Type | Description | | ---- | ---------- | ------------------ | | | address[] | array of addresses | #### isAuthorizedSender ```solidity function isAuthorizedSender(address sender) public view returns (bool) ``` Use this to check if a node is authorized to fulfill requests. ##### Parameters | Name | Type | Description | | ------ | ------- | --------------------------------- | | sender | address | The address of the Chainlink node | ##### Return values | Name | Type | Description | | ---- | ---- | ------------------------------------ | | | bool | The authorization status of the node | ### Events #### AuthorizedSendersChanged ```solidity event AuthorizedSendersChanged(address[] senders, address changedBy) ``` --- # Building External Initiators Source: https://docs.chain.link/chainlink-nodes/external-initiators/building-external-initiators An external initiator can trigger a run for any webhook job that it has been linked to. The URL for triggering a run is such: ```shell curl -X POST -H "Content-Type: application/json" --data '{"myKey": "myVal"}' http://localhost:6688/v2/jobs//runs ``` You will need to specify two headers: 1. "X-Chainlink-EA-AccessKey" 2. "X-Chainlink-EA-Secret" ## JSON jobs (REMOVED) > **CAUTION: v1 Jobs are removed** > > The initiators for v1 Jobs are removed for Chainlink nodes running version 1.0.0 and later. Use [v2 job > types](/chainlink-nodes/oracle-jobs/jobs) instead. > > See the [v2 jobs migration page](/chainlink-nodes/oracle-jobs/migration-v1-v2) to learn how to migrate to v2 jobs. We will be using the [Chainlink external initiator](https://github.com/smartcontractkit/external-initiator) repo for reference. You can see some examples of existing initiators in the [blockchain](https://github.com/smartcontractkit/external-initiator/tree/master/blockchain) folder. External initiators are simple web initiators that can be activated by any job instead of just one. To set one up, you need to have a service similar to an external adapter that sends an `HTTPPost` message runs API call to your chainlink node service. Here is a sample URL for a web job could look like: ```shell curl -b cookiefile -X POST -H "Content-Type: application/json" --data '{"myKey":"myVal"}' http://localhost:6688/v2/jobs/%s/runs ``` Where `%s` is the jobId. External initiators make the same API call, with 2 added headers: 1. "X-Chainlink-EA-AccessKey" 2. "X-Chainlink-EA-Secret" These are keys generated when you register your external initiator with your node. Triggering a run through an external initiator is as simple as making this API call to your node. All jobs with this EI configured will then be kicked off in this way. A simple external initiator in pseudo code could look like this: ```text while(True): send_api_call_with_external_initiator_access_key_headers() sleep(4) ``` And have this job run on the same machine as your node. --- # Adding External Initiators to Nodes Source: https://docs.chain.link/chainlink-nodes/external-initiators/external-initiators-in-nodes > **NOTE** > > External initiators are disabled on nodes by default. Set the `FEATURE_EXTERNAL_INITIATORS=true` [configuration > variable](/chainlink-nodes/v1/configuration) to enable this feature. ## Creating an external initiator To create an external initiator you must use the remote API. You can do this yourself, like so: ```text POST http:///v2/external_initiators -d ``` where payload is a JSON blob that contains: ```json { "name": , "url": } ``` If a URL is provided, Chainlink will notify this URL of added and deleted jobs that can be triggered by this external initiator. This allows the external initiator to program in certain actions e.g. subscribing/unsubscribing to logs based on the job, etc. On creation: ```text POST -d {"jobId": , "type": , "params": } ``` On deletion: ```text DELETE / ``` You can use the chainlink client for convenience to access this API. Enter the [Chainlink nodes CLI](/chainlink-nodes/resources/miscellaneous/#execute-commands-running-docker) and run the following command ```shell chainlink initiators create ``` `NAME`: The name you want to use for your external initiator. `URL`: The URL of your jobs endpoint. ie: `http://172.17.0.1:8080/jobs` This will give you the environment variables you need to run your external initiator. Copy the output. It will look something like this: ``` ║ ei_name ║ http://localhost:8080/jobs ║ a4846e85727e46b48889c6e28b555696 ║ dnNfNhiiCTm1o6l+hGJVfCtRSSuDfZbj1VO4BkZG3E+b96lminE7yQHj2KALMAIk ║ iWt64+Q9benOf5JuGwJtQnbByN9rtHwSlElOVpHVTvGTP5Zb2Guwzy6w3wflwyYt ║ 56m38YkeCymYU0kr4Yg6x3e98CyAu+37y2+kMO2AL9lRMjA3hRA1ejFdG9UfFCAE ``` Be sure to save these values, since the secrets cannot be shown again. You now can use `ei_name` as an initiator in your jobspec. Set a new `.env` file, and add the respective values ```text EI_DATABASEURL=postgresql://$USERNAME:$PASSWORD@$SERVER:$PORT/$DATABASE EI_CHAINLINKURL=http://localhost:6688 EI_IC_ACCESSKEY= EI_IC_SECRET= EI_CI_ACCESSKEY= EI_CI_SECRET= ``` At the time of writing, the output should be in order. For example, in from the output above, `EI_IC_ACCESSKEY=a4846e85727e46b48889c6e28b555696` and so on. Start your EI. Whatever code you used to run your external initiator, pass it the new headers created for the access headers, and then start your service. An easy way to do this is by having it read from the `.env` file you just created. Check out the [Conflux External initiator](https://github.com/Conflux-Network-Global/demo-cfx-chainlink) for an example. You'll want to test that your job is running properly. Meeting the criteria of your EI and then checking to see if a sample job kicks off is the best way to test this. To try a real-life example, feel free to follow along with the [Conflux EI demo](https://www.youtube.com/watch?v=J8oJEp4qz5w). [Additional external initiator reference](https://github.com/smartcontractkit/chainlink/wiki/External-Initiators) > **NOTE** > > The External Initiator can only initiate [webhook jobs](/chainlink-nodes/oracle-jobs/all-jobs#webhook-jobs) that have > been linked to it. Trying to initiate a job that is not linked will give an unauthorised error. ## Deleting an external initiator To delete an external initiator you must use the remote API. You can do this yourself, like so: ```text DELETE http:///v2/external_initiators/ ``` You can alternatively use the chainlink client for convenience: ```shell chainlink initiators destroy ``` ## Listing external initiators To see your installed external initiators: ```text GET http:///v2/external_initiators?size=100&page=1 ``` Or, using the chainlink client: ```shell chainlink initiators list ``` --- # Introduction Source: https://docs.chain.link/chainlink-nodes/external-initiators/external-initiators-introduction External initiators allow jobs in a node to be initiated depending on some external condition. The ability to create and add external initiators to Chainlink nodes enables blockchain agnostic cross-chain compatibility. > **NOTE** > > At this time of writing, external initiators do not show up in the bridges tab. However, they act exactly the same as > if they did. > **NOTE** > > External initiators are disabled on nodes by default. Set the `FEATURE_EXTERNAL_INITIATORS=true` [configuration > variable](/chainlink-nodes/v1/configuration) to enable this feature. Initiator Bridges handle the authentication to and from the External Initiator and where to send the messages. When creating a Bridge two parameters are required: Only the [webhook](/chainlink-nodes/oracle-jobs/all-jobs/#webhook-jobs) job type can be initiated using an External Initiator. The external initiator must be created before the webhook job, and must be referenced by name (whitelisted) in order for that external initiator to be allowed to trigger the given webhook job. When the External Initiator is created it generates two pairs of credentials: Outgoing and Incoming. The Outgoing Access Key and Secret are used to authenticate messages sent from the Core to the External Initiator. The Incoming Access Key and Secret are used to authenticate messages sent from the External Initiator to the Core. Then, once you've created the name, bridge, and have the correct access keys for the URL, you can proceed to use the external initiator as if it's a regular initiator in future job specs. For how to create an external initiator see [adding external initiators to nodes](/chainlink-nodes/external-initiators/external-initiators-in-nodes). --- # Existing Job Example specs Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-existing-job This is an example v2 (TOML) job spec for returning gas price using [etherscan](https://docs.etherscan.io/api-endpoints/gas-tracker#get-gas-oracle) in one Chainlink API Call. Note that the job : - Uses an [external adapter](/chainlink-nodes/external-adapters/external-adapters) to consume the etherscan API: [EtherScan External Adapter](https://github.com/smartcontractkit/external-adapters-js/tree/develop/packages/sources/etherscan). Note that this is done using the [bridge](/chainlink-nodes/oracle-jobs/all-tasks/#bridge-task) task: `type="bridge" name="etherscan"`. - Calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test this job spec from a smart contract, see this [Example](/any-api/get-request/examples/existing-job-request). ```toml type = "directrequest" schemaVersion = 1 name = "Etherscan gas price" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] etherscanFast [type="bridge" name="etherscan" requestData="{\\"data\\": {\\"endpoint\\": \\"gasprice\\", \\"speed\\":\\"fast\\" }}"] etherscanAverage [type="bridge" name="etherscan" requestData="{\\"data\\": {\\"endpoint\\": \\"gasprice\\", \\"speed\\":\\"medium\\" }}"] etherscanSafe [type="bridge" name="etherscan" requestData="{\\"data\\": {\\"endpoint\\": \\"gasprice\\", \\"speed\\":\\"safe\\" }}"] decode_log -> etherscanFast decode_log -> etherscanAverage decode_log -> etherscanSafe gasPriceFast [type=jsonparse path="data,result"] gasPriceAverage [type=jsonparse path="data,result"] gasPriceSafe [type=jsonparse path="data,result"] etherscanFast -> gasPriceFast etherscanAverage -> gasPriceAverage etherscanSafe -> gasPriceSafe gasPriceFast -> encode_data gasPriceAverage -> encode_data gasPriceSafe -> encode_data encode_data [type=ethabiencode abi="(bytes32 _requestId, uint256 _fastPrice, uint256 _averagePrice, uint256 _safePrice)" data="{\\"_requestId\\": $(decode_log.requestId),\\"_fastPrice\\": $(gasPriceFast),\\"_averagePrice\\": $(gasPriceAverage),\\"_safePrice\\": $(gasPriceSafe)}"] encode_tx [type=ethabiencode abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}"] submit_tx [type=ethtx to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] encode_data -> encode_tx -> submit_tx """ ``` --- # GET > Bool Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-bool This is an example v2 (TOML) job spec for calling any public API, parsing the result then returning a *bool* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. ```toml type = "directrequest" schemaVersion = 1 name = "Get > Bool - (TOML)" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, bool value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx """ ``` --- # GET > Bytes Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-bytes This is an example v2 (TOML) job spec for returning *bytes* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test it from a smart contract, see this [Example](/any-api/get-request/examples/large-responses). ```toml type = "directrequest" schemaVersion = 1 name = "Get > Bytes" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] encode_large [type="ethabiencode" abi="(bytes32 requestId, bytes _data)" data="{\\"requestId\\": $(decode_log.requestId), \\"_data\\": $(parse)}" ] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_large)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> encode_large -> encode_tx -> submit_tx """ ``` This is an example legacy v1 job spec for returning large responses in one Chainlink API Call. ```json { "name": "large-word", "initiators": [ { "id": 9, "jobSpecId": "7a97ff84-93ec-406d-9062-1b2531f9251a", "type": "runlog", "params": { "address": "0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8" } } ], "tasks": [ { "jobSpecId": "7a97ff8493ec406d90621b2531f9251a", "type": "httpget" }, { "jobSpecId": "7a97ff8493ec406d90621b2531f9251a", "type": "jsonparse" }, { "jobSpecId": "7a97ff8493ec406d90621b2531f9251a", "type": "resultcollect" }, { "jobSpecId": "7a97ff8493ec406d90621b2531f9251a", "type": "ethtx", "confirmations": 1, "params": { "abiEncoding": ["bytes32", "bytes"] } } ] } ``` --- # GET > Int256 Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-int256 This is an example v2 (TOML) job spec for calling any public API, retrieving a number , removing its decimals then returning *int256* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. ```toml type = "directrequest" schemaVersion = 1 name = "Get > Int256 - (TOML)" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, int256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx """ ``` --- # GET > String Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-string This is an example v2 (TOML) job spec for returning a *string* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test it from a smart contract, see this [Example](/any-api/get-request/examples/array-response). ```toml # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. # DO NOT USE THIS CODE IN PRODUCTION. type = "directrequest" # evmChainID for Sepolia Testnet evmChainID = "11155111" schemaVersion = 1 name = "Get > String" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" maxTaskDuration = "0s" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, string value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx """ ``` --- # GET > Uint256 Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-uint256 This is an example v2 (TOML) job spec for calling any public API, retrieving a number , removing its decimals then returning *uint256* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test it from a smart contract, see this [Example](/any-api/get-request/examples/single-word-response). ```toml type = "directrequest" schemaVersion = 1 name = "Get > Uint256 - (TOML)" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, uint256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx """ ``` --- # MultiWord Example Job Spec Source: https://docs.chain.link/chainlink-nodes/job-specs/multi-word-job This is an example v2 (TOML) job spec for returning multiple responses in 1 Chainlink API Call.Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test it from a smart contract, see this [Example](/any-api/get-request/examples/multi-variable-responses). ```toml type = "directrequest" schemaVersion = 1 name = "multi-word (TOML)" maxTaskDuration = "0s" contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] decode_log -> decode_cbor decode_cbor -> btc decode_cbor -> usd decode_cbor -> eur btc [type="http" method=GET url="$(decode_cbor.urlBTC)" allowunrestrictednetworkaccess="true"] btc_parse [type="jsonparse" path="$(decode_cbor.pathBTC)" data="$(btc)"] btc_multiply [type="multiply" input="$(btc_parse)", times="100000"] btc -> btc_parse -> btc_multiply usd [type="http" method=GET url="$(decode_cbor.urlUSD)" allowunrestrictednetworkaccess="true"] usd_parse [type="jsonparse" path="$(decode_cbor.pathUSD)" data="$(usd)"] usd_multiply [type="multiply" input="$(usd_parse)", times="100000"] usd -> usd_parse -> usd_multiply eur [type="http" method=GET url="$(decode_cbor.urlEUR)" allowunrestrictednetworkaccess="true"] eur_parse [type="jsonparse" path="$(decode_cbor.pathEUR)" data="$(eur)"] eurs_multiply [type="multiply" input="$(eur_parse)", times="100000"] eur -> eur_parse -> eurs_multiply btc_multiply -> encode_mwr usd_multiply -> encode_mwr eurs_multiply -> encode_mwr // MWR API does NOT auto populate the requestID. encode_mwr [type="ethabiencode" abi="(bytes32 requestId, uint256 _btc, uint256 _usd, uint256 _eurs)" data="{\\"requestId\\": $(decode_log.requestId), \\"_btc\\": $(btc_multiply), \\"_usd\\": $(usd_multiply), \\"_eurs\\": $(eurs_multiply)}" ] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_mwr)}" ] submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] encode_mwr -> encode_tx -> submit_tx """ ``` --- # Job Types Source: https://docs.chain.link/chainlink-nodes/oracle-jobs/all-jobs This guide outlines different job types. ## Solidity cron jobs > **NOTE: Chainlink Job Scheduler** > > If you need to schedule a contract function call, use the [Chainlink Job > Scheduler](https://automation.chain.link/new). The Job Scheduler uses the [Chainlink > Automation](/chainlink-automation) network to execute deployed contract calls on a cron schedule that you define, such > as an Ethereum cron job for your dApp. Executes a job on a schedule. Does not rely on any kind of external trigger. ### Spec format ```toml 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](/chainlink-nodes/oracle-jobs/jobs/#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, no `CRON_TZ` parameter is needed. For all supported schedules, please refer to the [cron library documentation](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc). ### 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 > **CAUTION: Deprecation** > > After Chainlink Node version 2.47, Chainlink is deprecating support for the legacy Direct Request and Run Log job > types. These job types will no longer be supported in Chainlink node releases. Node operators and developers that > continue to rely on them can choose to remain on the last compatible release, but should not expect ongoing > development support, including maintenance, bug fixes, security patches, or compatibility with future releases. Teams > using these legacy job types should begin planning to upgrade to the [Chainlink Runtime Environment (CRE)](/cre) as an > alternative. 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 ```toml 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](/chainlink-nodes/oracle-jobs/jobs/#shared-fields). #### Unique fields - `contractAddress`: The Oracle or Operator contract to monitor for requests - `requesters`: Optional - Allows whitelisting requesters - `minContractPaymentLinkJuels` Optional - Allows you to specify a job-specific minimum contract payment - `minIncomingConfirmations` Optional - Allows you to specify a job-specific `MIN_INCOMING_CONFIRMATIONS` value, must be greater than global `MIN_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 (`indexed` fields). - `$(jobRun.logData)`: the log's data (non-`indexed` fields). - `$(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*. - The smart contract example can be found [here](/any-api/get-request/examples/single-word-response). - The job spec example can be found [here](/chainlink-nodes/job-specs/direct-request-get-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](/chainlink-nodes/job-specs/direct-request-get-int256). #### 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](/chainlink-nodes/job-specs/direct-request-get-bool). #### 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. - The smart contract example can be found [here](/any-api/get-request/examples/array-response). - The job spec example can be found [here](/chainlink-nodes/job-specs/direct-request-get-string). #### 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). - The smart contract example can be found [here](/any-api/get-request/examples/large-responses). - The job spec example can be found [here](/chainlink-nodes/job-specs/direct-request-get-bytes). #### 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. - The smart contract example can be found [here](/any-api/get-request/examples/multi-variable-responses). - The job spec example can be found [here](/chainlink-nodes/job-specs/multi-word-job). #### 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](https://github.com/smartcontractkit/external-adapters-js/tree/develop/packages/sources/etherscan) to retrieve the gas price. - The smart contract example can be found [here](/any-api/get-request/examples/existing-job-request). - The job spec example can be found [here](/chainlink-nodes/job-specs/direct-request-existing-job). ## Flux Monitor Jobs > **CAUTION: Deprecation** > > After Chainlink Node version 2.47, Chainlink is deprecating support for the legacy Flux Monitor, Direct Request, and > Run Log job types. These job types will no longer be supported in Chainlink node releases. Node operators and > developers that continue to rely on them can choose to remain on the last compatible release, but should not expect > ongoing development support, including maintenance, bug fixes, security patches, or compatibility with future > releases. Teams using these legacy job types should begin planning to upgrade to the [Chainlink Runtime Environment > (CRE)](/cre) as an alternative. 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 `cron` job ### Spec format ```toml 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](/chainlink-nodes/oracle-jobs/jobs/#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](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc) 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. ### 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 ```toml type = "keeper" schemaVersion = 1 evmChainID = 1 name = "example keeper spec" contractAddress = "0x7b3EC232b08BD7b4b3305BE0C044D907B2DF960B" fromAddress = "0xa8037A20989AFcBC51798de9762b351D63ff462e" ``` ### Shared fields See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields). ### Unique fields - `evmChainID`: The numeric chain ID of the chain on which Chainlink Automation Registry is deployed - `contractAddress`: The address of the Chainlink Automation Registry contract to poll and update - `fromAddress`: The Oracle node address from which to send updates - `externalJobID`: 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. Offchain reporting jobs require the `FEATURE_OFFCHAIN_REPORTING=true` environment variable. ### 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 ```toml 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](/chainlink-nodes/oracle-jobs/jobs/#shared-fields). #### Unique fields - `contractAddress`: The address of the `OffchainReportingAggregator` contract. - `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 to `true`. #### 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 ```toml 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](/chainlink-nodes/oracle-jobs/jobs/#shared-fields). #### Unique fields - `contractAddress`: The address of the `OffchainReportingAggregator` contract. - `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//tcp//p2p/" ]` - `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 = [ "@:" ]` - `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 the `chainlink keys ocr` sub-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 > **CAUTION: Deprecation** > > After Chainlink Node version 2.49, Chainlink is deprecating support for the legacy Webhook job type. This job type > will no longer be supported in Chainlink node releases. Node operators and developers that continue to rely on it can > choose to remain on the last compatible release, but should not expect ongoing development support, including > maintenance, bug fixes, security patches, or compatibility with future releases. Teams using this legacy job type > should begin planning to upgrade to the [Chainlink Runtime Environment (CRE)](/cre) as an alternative. Webhook jobs can be initiated by HTTP request, either by a user or external initiator. > **NOTE** > > You must have `ExternalInitiatorsEnabled = true` in your config to enable these jobs. See > [ExternalInitiatorsEnabled](/chainlink-nodes/v1/node-config#externalinitiatorsenabled) in the config > reference for details. This is an example webhook job: ```toml 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, where `name` is the name registered with the node, and `spec` is the job spec to be forwarded to the external initiator when it is created. ### Shared fields See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#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. --- # Task Types Source: https://docs.chain.link/chainlink-nodes/oracle-jobs/all-tasks This guide outlines different task types. ## 'Any' task Returns a random value from the set of inputs passed in. **Parameters** None. **Inputs** Can be anything. **Outputs** A randomly-selected value from the set of inputs. **Example** ```toml fetch1 [type="http" ...] fetch2 [type="http" ...] fetch3 [type="http" ...] pick_any [type="any"] fetch1 -> pick_any fetch2 -> pick_any fetch3 -> pick_any ``` `pick_any` will return either the result of `fetch1`, `fetch2`, or `fetch3`. ## Base64 Decode task Accepts a base64 encoded string and returns decoded bytes. **Parameters** - `input`: a base64 encoded string. **Outputs** Decoded bytes. **Example** ```toml my_base64decode_task [type="base64decode" input="SGVsbG8sIHBsYXlncm91bmQ="] ``` Given the input `SGVsbG8sIHBsYXlncm91bmQ=`, the task will return `Hello, playground` (as ASCII bytes). ## Base64 Encode task Encodes bytes/string into a Base64 string. **Parameters** - `input`: Byte array or string to be encoded. **Outputs** String with Base64 encoding of input. **Example** ```toml my_base64encode_task [type="base64encode" input="Hello, playground"] ``` Given the input string "Hello, playground", the task will return "SGVsbG8sIHBsYXlncm91bmQ=". ## Bridge task Bridge tasks make HTTP POST requests to pre-configured URLs. Bridges can be configured via the UI or the CLI, and are referred to by a simple user-specified name. This is the way that most jobs interact with [External Adapters](/chainlink-nodes/external-adapters/external-adapters). **Parameters** - `name`: an arbitrary name given to the bridge by the node operator. - `requestData` (optional): a statically-defined payload to be sent to the external adapter. - `cacheTTL` (optional): a duration-formatted string indicating the maximum acceptable staleness for cached bridge responses in case of intermittent failures. This is disabled by default. - `headers` (optional): an array of strings. The number of strings must be even. Example: `foo [type="bridge" name="foo" headers="[\\"X-Header-1\\", \\"value1\\", \\"X-Header-2\\", \\"value2\\"]"]` **Outputs** A string containing the response body. **Example** ```toml my_bridge_task [type="bridge" name="some_bridge" requestData="{\\"data\\":{\\"foo\\": $(foo), \\"bar\\": $(bar)}}" ] ``` ## CBOR Parse task CBOR Parse tasks parse a CBOR payload, typically as part of a Direct Request workflow. In Direct Request, a user makes an onchain request using a `ChainlinkClient` contract, which encodes the request parameters as CBOR. See below for an example. **Parameters** - `data`: A byte array containing the CBOR payload. - `mode`: An optional parameter that specifies how to parse the incoming CBOR. The default mode is `diet`, which expects the input to be a map. Set the mode to `standard` to pass literal values through "as-is". Empty inputs return nil. **Outputs** A map containing the request parameters. Parameters can be individually accessed using `$(dot.accessors)`. **Example** ```toml // First, we parse the request log and the CBOR payload inside of it decode_log [type="ethabidecodelog" data="$(jobRun.logData)" topics="$(jobRun.logTopics)" abi="SomeContractEvent(bytes32 requestID, bytes cborPayload)"] decode_cbor [type="cborparse" data="$(decode_log.cborPayload)"] // Then, we use the decoded request parameters to make an HTTP fetch fetch [type="http" url="$(decode_cbor.fetchURL)" method=GET] parse [type="jsonparse" path="$(decode_cbor.jsonPath)" data="$(fetch)"] // ... etc ... ``` See the [Direct Request page](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs) for a more comprehensive example. ## Divide task Divides the provided `input` by the `divisor` and returns the result with a number of decimal places defined in the `precision` value. **Parameters** - `input`: The value to be divided - number - stringified number - bytes-ified number - `$(variable)` - `divisor`: The value by which to divide the `input` - number - stringified number - bytes-ified number - `$(variable)` - `precision`: The number of decimal places to retain in the result - number - stringified number - bytes-ified number - `$(variable)` **Outputs** The result of the division. **Example** ```toml my_divide_task [type="divide" input="$(json_parse_result)" divisor="3" precision="2"] ``` Given the input `10`, this example returns `3.33`. ## ETH ABI Decode Log task Decodes a log emitted by an ETH contract. **Parameters** - `abi`: a canonical ETH log event definition. Should be formatted exactly as in Solidity. Each argument must be named. Examples: - `NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt)` - `AuthorizedSendersChanged(address[] senders)` - `data`: the ABI-encoded log data. Can be: - a byte array - a hex-encoded string beginning with `0x` - ... but generally should just be set to `$(jobRun.logData)` (see the [Direct Request page](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs)) - `topics`: the ABI-encoded log topics (i.e., the `indexed` parameters) - an array of bytes32 values - an array of hex-encoded bytes32 values beginning with `0x` - ... but generally should just be set to `$(jobRun.logTopics)` (see the [Direct Request page](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs)) **Outputs** A map containing the decoded values. **Example** ```toml decode [type="ethabidecodelog" abi="NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] ``` This task will return a map with the following schema: ```json { "roundId": ..., // a number "startedBy": ..., // an address "startedAt": ..., // a number } ``` ## ETH ABI Decode task Decodes a ETH ABI-encoded payload, typically the result of an [ETH Call task](/chainlink-nodes/oracle-jobs/all-tasks/#eth-call-task). **Parameters** - `abi`: a canonical ETH ABI argument string. Should be formatted exactly as in Solidity. Each argument must be named. Examples: - `uint256 foo, bytes32 bar, address[] baz` - `address a, uint80[3][] u, bytes b, bytes32 b32` - `data`: the ABI-encoded payload to decode. Can be: - a byte array - a hex-encoded string beginning with `0x` **Outputs** A map containing the decoded values. **Example** ```toml decode [type="ethabidecode" abi="bytes32 requestID, uint256 price, address[] oracles" data="$(eth_call_result)"] ``` This task will return a map with the following schema: ```json { "requestID": ..., // [32]byte value "price": ..., // a number "oracles": [ "0x859AAa51961284C94d970B47E82b8771942F1980", "0x51DE85B0cD5B3684865ECfEedfBAF12777cd0Ff8", ... ] } ``` ## ETH ABI Encode task Encodes a bytes payload according to ETH ABI encoding, typically in order to perform an [ETH Call](/chainlink-nodes/oracle-jobs/all-tasks/#eth-call-task) or an [ETH Tx](/chainlink-nodes/oracle-jobs/all-tasks/#eth-tx-task). **Parameters** - `abi`: a canonical ETH ABI argument string. Should be formatted exactly as in Solidity. Each argument must be named. If a method name is provided, the 4-byte method signature is prepended to the result. Examples: - `uint256 foo, bytes32 bar, address[] baz` - `fulfillRequest(bytes32 requestID, uint256 answer)` - `data`: a map of the values to be encoded. The task will make a best effort at converting values to the appropriate types. **Outputs** A byte array. **Example** ```toml encode [type="ethabiencode" abi="fulfillRequest(bytes32 requestID, uint256 answer)" data="{\\"requestID\\": $(foo), \\"answer\\": $(bar)}" ] ``` ## ETH Call task Makes a non-mutating contract call to the specified contract with the specified data payload. **Parameters** - `contract`: the address of the contract to call. - `data`: the data to attach to the call (including the function selector). - `gas`: the amount of gas to attach to the transaction. - `from`: The from address with which the call should be made. Defaults to zero address. - `gasPrice`: The gasPrice for the call. Defaults to zero. - `gasTipCap`: The gasTipCap (EIP-1559) for the call. Defaults to zero. - `gasFeeCap`: The gasFeeCap (EIP-1559) for the call. Defaults to zero. - `gasUnlimited`: A boolean indicating if unlimited gas should be provided for the call. If set to true, do not pass the `gas` parameter. - `evmChainID`: Set this optional parameter to transmit on the given chain. You must have the chain configured with RPC nodes for this to work. If left blank, it will use the default chain. **Outputs** An ABI-encoded byte array containing the return value of the contract function. **Example** ```toml encode_call [type="ethabiencode" abi="checkUpkeep(bytes data)" data="{ \\"data\\": $(upkeep_data) }"] call [type="ethcall" contract="0xa36085F69e2889c224210F603D836748e7dC0088" data="$(encode_call)" gas="1000"] decode_result [type="ethabidecode" abi="bool upkeepNeeded, bytes performData" data="$(call)"] encode_call -> call -> decode_result ``` ## ETH Tx task Makes a mutating transaction to the specified contract with the specified data payload. The transaction is guaranteed to succeed eventually. **Parameters** - `from`: one or more addresses of the externally-owned account from which to send the transaction. If left blank, it will select a random address on every send for the given chain ID. - `to`: the address of the contract to make a transaction to. - `data`: the data to attach to the call (including the function selector). Most likely, this will be the output of an `ethabiencode` task. - `gasLimit`: the amount of gas to attach to the transaction. - `txMeta`: a map of metadata that is saved into the database for debugging. - `minConfirmations`: minimum number of confirmations required before this task will continue. Set to zero to continue immediately. Note that this does not affect transaction inclusion. All transactions will always be included in the chain up to the configured finality depth. - `evmChainID`: set this optional parameter to transmit on the given chain. You must have the chain configured with RPC nodes for this to work. If left blank, it will use the default chain. - `failOnRevert`: an optional parameter, a boolean, that allows a ChainLink node operator's UI to display and color the status of the task within a job's pipeline depending on a transaction status. *default*: false. **Outputs** The hash of the transaction attempt that eventually succeeds (after potentially going through a gas bumping process to ensure confirmation). **Example** ```toml encode_tx [type="ethabiencode" abi="performUpkeep(bytes performData)" data="{ \\"data\\": $(upkeep_data) }"] submit_tx [type="ethtx" to="0xa36085F69e2889c224210F603D836748e7dC0088" data="$(encode_tx)" failOnRevert="true"] encode_tx -> submit_tx ``` ## Hex Decode task Accepts a hexadecimal encoded string and returns decoded bytes. **Parameters** - `input`: a hexadecimal encoded string, must have prefix `0x`. **Outputs** Decoded bytes. **Example** ```toml my_hexdecode_task [type="hexdecode" input="0x12345678"] ``` Given the input `0x12345678`, the task will return `[0x12, 0x34, 0x56, 0x78]`. ## Hex Encode task Encodes bytes/string/integer into a hexadecimal string. **Parameters** - `input`: Byte array, string or integer to be encoded. **Outputs** Hexadecimal string prefixed with "0x" (or empty string if input was empty). **Example** ```toml my_hexencode_task [type="hexencode" input="xyz"] ``` Given the input string "xyz", the task will return "0x78797a", which are the ascii values of characters in the string. ## HTTP task HTTP tasks make HTTP requests to arbitrary URLs. **Parameters** - `method`: the HTTP method that the request should use. - `url`: the URL to make the HTTP request to. - `requestData` (optional): a statically-defined payload to be sent to the external adapter. - `allowUnrestrictedNetworkAccess` (optional): permits the task to access a URL at `localhost`, which could present a security risk. Note that Bridge tasks allow this by default. - `headers` (optional): an array of strings. The number of strings must be even. Example: `foo [type=http headers="[\\"X-Header-1\\", \\"value1\\", \\"X-Header-2\\", \\"value2\\"]"]` **Outputs** A string containing the response body. **Example** ```toml my_http_task [type="http" method=PUT url="http://chain.link" requestData="{\\"foo\\": $(foo), \\"bar\\": $(bar), \\"jobID\\": 123}" allowUnrestrictedNetworkAccess=true ] ``` ## JSON Parse task JSON Parse tasks parse a JSON payload and extract a value at a given keypath. **Parameters** - `data`: the JSON string. Can be: - string - byte array - `path`: the keypath to extract. Must be a comma-delimited list of keys, or specify a custom `separator` alternative. - `separator`: (optional) custom `path` key separator. Defaults to comma (`,`). - `lax` (optional): if false (or omitted), and the keypath doesn't exist, the task will error. If true, the task will return `nil` to the next task. **Outputs** The value at the provided keypath. **Example** ```toml my_json_task [type="jsonparse" data="$(http_fetch_result)" path="data,0,price"] ``` This task returns `123.45` (float64) when given the following example `data` value: ```json { "data": [{ "price": 123.45 }, { "price": 678.9 }] } ``` ## Length task Returns the length of a byte array or string. **Parameters** - `input`: Byte array, or string to get the length for. **Outputs** The length of the byte array or string. **Note**: For strings containing multi-byte unicode characters, the output is the length in bytes and not number of characters. **Example** ```toml my_length_task [type="length" input="xyz"] ``` Given the input string "xyz", the task will return 3, length of the string. ## Less Than task Returns a boolean, result of computing `left LESS_THAN right`. **Parameters** - `left`: the left hand side of comparison. Possible values: - number - stringified number - bytes-ified number - `$(variable)` - `right`: the right hand side of comparison. Possible values: - number - stringified number - bytes-ified number - `$(variable)` **Outputs** The result of less than comparison. **Example** ```toml my_lessthan_task [type="lessthan" left="3" right="10"] ``` the task will return true which is the result of `3 LESS_THAN 10` ## Lowercase task Accepts a string and returns a lowercase string. **Parameters** - `input`: a string. **Outputs** Lowercase string. **Example** ```toml my_lowercase_task [type="lowercase" input="Hello World!"] ``` Given the input `Hello World!`, the task will return `hello world!`. ## Mean task Accepts multiple numerical inputs and returns the mean (average) of them. **Parameters** - `values`: an array of values to be averaged. - `allowedFaults` (optional): the maximum number of input tasks that can error without the Mean task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs. - `precision`: the number of decimal places in the result. **Outputs** The average of the values in the `values` array. **Example** ```toml my_mean_task [type="mean" values=<[ $(fetch1), $(fetch2), $(fetch3) ]> precision=2 allowedFaults=1] ``` Given the inputs `2`, `5`, and `20`, the task will return `9`. ## Median task Accepts multiple numerical inputs and returns the median of them. **Parameters** - `values`: an array of values from which to select a median. - `allowedFaults` (optional): the maximum number of input tasks that can error without the Median task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs. **Outputs** The median of the values in the `values` array. **Example** ```toml my_median_task [type="median" values=<[ $(fetch1), $(fetch2), $(fetch3) ]> allowedFaults=1] ``` Given the inputs `2`, `5`, and `20`, the task will return `5`. ## Memo task The `memo` task returns its value as a result. **Parameters** - `value`: value to return. Possible values: - number - boolean - float - string - array **Outputs** The value. **Example** ```toml memo [type="memo" value="10"] ``` The task will return the value `10` ## Merge task Merge task returns the merged value of two maps. **Parameters** - `left`: The left map. - `right`: The right map, which overwrites the left side. **Outputs** Returns the combined map of left and right. If the merged map is invalid, it returns `null`. **Example** ```toml merge [type="merge" left="{\\"foo\\":\\"abc\\", \\"bar\\":\\"123\\"}" right="{\\"bar\\":\\"xyz\\", \\"biz\\":\\"buzz\\"}"] ``` This example task returns the following map: ```json { "foo": "abc", "bar": "xyz", "biz": "buzz" } ``` ## 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. **Parameters** - `values`: an array of values from which to select a mode. - `allowedFaults` (optional): the maximum number of input tasks that can error without the Mode task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs. **Outputs** A map containing two keys: ```json { "results": [ ... ], // An array containing all of the values that occurred the maximum number of times "occurrences": ..., // The number of times those values occurred } ``` **Example** ```toml my_mode_task [type="mode" values=<[ $(fetch1), $(fetch2), $(fetch3), $(fetch4), $(fetch5), $(fetch6), $(fetch7), $(fetch8) ]> allowedFaults=3] ``` This task can handle arrays with mixed types. For example, given a `values` array containing both strings and ints like `[ 2, 5, 2, "foo", "foo" "bar", "foo", 2 ]`, the task returns the following JSON: ```json { "occurrences": 3, "results": [2, "foo"] } ``` To encode the results array into the `ethabiencode` task, specify that the data is an array in the `abi` and point the data parameter to the results from your mode task. Because [argument encoding](https://docs.soliditylang.org/en/develop/abi-spec.html#argument-encoding) enforces types, all of the values in the array must be of the same type. As an example, you can encode the results of a `mode` task with an array of integers: ```toml mode_task [type="mode" values=<[ 1, 2, 2, 3, 1 ]>] encode_mode_task [type="ethabiencode" abi="(bytes32 requestId, uint64 occurrences, uint256[] results)" data="{\\"requestId\\": $(decode_log.requestId), \\"occurrences\\": $(mode_task.occurrences), \\"results\\": $(mode_task.results) }"] ``` In this example, the `mode` task returns the following result: ```json { "occurrences": 2, "results": [2, 1] } ``` The `ethabiencode` task encodes `results` as a `uint256[]` array. ## Multiply task Multiplies the provided `input` and `times` values. **Parameters** - `input`: the value to be multiplied. Possible values: - number - stringified number - bytes-ified number - `$(variable)` - `times`: the value to multiply the input with. - number - stringified number - bytes-ified number - `$(variable)` **Outputs** The result of the multiplication. **Example** ```toml my_multiply_task [type="multiply" input="$(json_parse_result)" times=3] ``` Given the input `10`, the task will return `30`. ## Sum Task Accepts multiple numerical inputs and returns the sum of them. **Parameters** - `values`: an array of values to sum. - `allowedFaults` (optional): the maximum number of input tasks that can error without the Sum task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs. **Outputs** The sum of the values in the `values` array. **Example** ```toml my_sum_task [type="sum" values=<[ $(fetch1), $(fetch2), $(fetch3) ]> allowedFaults=1] ``` Given the inputs `2`, `5`, and `20`, the task will return `27`. ## Uppercase task Accepts a string and returns an uppercase string. **Parameters** - `input`: a string. **Outputs** Uppercase string. **Example** ```toml my_uppercase_task [type="uppercase" input="Hello World!"] ``` Given the input `Hello World!`, the task will return `HELLO WORLD!`. --- # v2 Jobs Source: https://docs.chain.link/chainlink-nodes/oracle-jobs/jobs > **NOTE: Chainlink v2 jobs** > > This page describes Chainlink v2 jobs. In the Operator UI interface, these are called TOML jobs. The v1 jobs are > removed in Chainlink nodes versioned 1.0.0 and later. To learn how to migrate your v1 jobs to v2 jobs, see [Migrating > to v2 Jobs](/chainlink-nodes/oracle-jobs/migration-v1-v2). If you still need to use v1 jobs on older versions of > Chainlink nodes, see the [v1 Jobs](/chainlink-nodes/oracle-jobs/migration-v1-v2) documentation. ## What is a Job? Chainlink nodes require jobs to do anything useful. For example, posting asset price data onchain requires jobs. Chainlink nodes support the following job types: - [`cron`](/chainlink-nodes/oracle-jobs/all-jobs/#solidity-cron-jobs) - [`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) - [`webhook`](/chainlink-nodes/oracle-jobs/all-jobs/#webhook-jobs) Jobs are represented by TOML specifications. ## Example v2 job spec The following is an example `cron` job spec. This is a simple spec that you can add to a node: ```toml type = "cron" schemaVersion = 1 schedule = "CRON_TZ=UTC 0 0 1 1 *" # Optional externalJobID: Automatically generated if unspecified # externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46" 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; """ ``` ## Shared fields 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: - `cron` - `directrequest` - `fluxmonitor` - `keeper` - `offchainreporting` - `webhook` - `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. - `forwardingAllowed`: Optional. When `true`, it allows forwarding transactions submitted by the job. --- # Migrating to v2 Jobs Source: https://docs.chain.link/chainlink-nodes/oracle-jobs/migration-v1-v2 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 v1 jobs were intended for extremely targeted use cases, so they opted for simplicity in the job spec over explicitness. The v2 Job Specs support expanding functionality in Chainlink nodes and prefer explicitness, so they are much more powerful and support advanced capabilities like running tasks in parallel. This change provides the following benefits to node operators: - Support increased job complexity - Better performance - Easier scaling - Ability to run more offchain computing - Reliability - Easier support - Improved security ### DAG dependencies and variables v2 jobs require the author to specify dependencies using [DOT syntax](https://en.wikipedia.org/wiki/DOT_(graph_description_language)). If a task needs data produced by another task, this must be specified using DOT. To facilitate explicitness, v2 jobs require the author to specify inputs to tasks using `$(variable)` syntax. For example, if an `http` task feeds data into a `jsonparse` task, it must be specified like the following example: ```toml fetch [type="http" method=GET url="http://chain.link/price_feeds/ethusd"] // This task consumes the output of the 'fetch' task in its 'data' parameter parse [type="jsonparse" path="data,result" data="$(fetch)"] // This is the specification of the dependency fetch -> parse ``` Task names must be defined before their opening `[` bracket. In this example, the name of the task is `fetch`. The output of each task is stored in the variable corresponding to the name of the task. In some cases, tasks return complex values like maps or arrays. By using dot access syntax, you can access the elements of these values. For example: ```toml // Assume that this task returns the following object: // { "ethusd": 123.45, "btcusd": 678.90 } parse [type="jsonparse" path="data" data="$(fetch)"] // Now, we want to send the ETH/USD price to one bridge and the BTC/USD price to another: submit_ethusd [type="bridge" name="ethusd" requestData="{ \\"data\\": { \\"value\\": $(parse.ethusd) }}"] submit_btcusd [type="bridge" name="btcusd" requestData="{ \\"data\\": { \\"value\\": $(parse.btcusd) }}"] parse -> submit_ethusd parse -> submit_btcusd ``` ### Quotes Some tasks, like the `bridge` tasks above, require you to specify a JSON object. Because the keys of JSON objects must be enclosed in double quotes, you must use the alternative `<` angle bracket `>` quotes. Angle brackets also enable multi-line strings, which can be useful when a JSON object parameter is large: ```toml submit_btcusd [type="bridge" name="btcusd" requestData="{\\"data\\":{\\"value\\": $(foo), \\"price\\": $(bar), \\"timestamp\\": $(baz)}}" ] ``` ### Misc. notes - Each job type provides a particular set of variables to its pipeline. See the documentation for each job type to understand which variables are provided. - Each task type provides a certain kind of output variable to other tasks that consume it. See the documentation for each task type to understand their output types. *** ## Example Migrations ### Runlog with ETH ABI encoding **v1 spec** This spec relies on CBOR-encoded onchain values for the `httpget` URL and `jsonparse` path. ```json { "name": "Get > Bytes32", "initiators": [ { "type": "runlog", "params": { "address": "YOUR_ORACLE_CONTRACT_ADDRESS" } } ], "tasks": [ { "type": "httpget" }, { "type": "jsonparse" }, { "type": "ethbytes32" }, { "type": "ethtx" } ] } ``` Notes: - In v1, the job ID is randomly generated at creation time. In v2 jobs, the job ID can be manually specified or the Chainlink node will automatically generate it. - In v2, the `ethbytes32` task and all of the other ABI encoding tasks are now encapsulated in the `ethabiencode` task with much more flexibility. See the [ETH ABI Encode task](/chainlink-nodes/oracle-jobs/all-tasks/#eth-abi-encode-task) page to learn more. **Equivalent v2 spec:** ```toml type = "directrequest" schemaVersion = 1 name = "Get > Bytes32" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" # Optional externalJobID: Automatically generated if unspecified # externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F47" observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.url)"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] encode_data [type="ethabiencode" abi="(uint256 value)" data="{ \\"value\\": $(parse) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes32 data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="0x613a38AC1659769640aaE063C651F48E0250454C" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx """ ``` ### Simple fetch (runlog) **v1 spec:** ```json { "initiators": [ { "type": "RunLog", "params": { "address": "0x51DE85B0cD5B3684865ECfEedfBAF12777cd0Ff8" } } ], "tasks": [ { "type": "HTTPGet", "params": { "get": "https://bitstamp.net/api/ticker/" } }, { "type": "JSONParse", "params": { "path": ["last"] } }, { "type": "Multiply", "params": { "times": 100 } }, { "type": "EthUint256" }, { "type": "EthTx" } ], "startAt": "2020-02-09T15:13:03Z", "endAt": null, "minPayment": "1000000000000000000" } ``` **Equivalent v2 spec:** ```toml type = "directrequest" schemaVersion = 1 name = "Get > Bytes32" contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C" # Optional externalJobID: Automatically generated if unspecified # externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F47" observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] fetch [type="http" method=get url="https://bitstamp.net/api/ticker/"] parse [type="jsonparse" data="$(fetch)" path="last"] multiply [type="multiply" input="$(parse)" times=100] encode_data [type="ethabiencode" abi="(uint256 value)" data="{ \\"value\\": $(multiply) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes32 data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="0x613a38AC1659769640aaE063C651F48E0250454C" data="$(encode_tx)"] decode_log -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx """ ``` ### Cron **v1 spec:** ```json { "initiators": [ { "type": "cron", "params": { "schedule": "CRON_TZ=UTC * */20 * * * *" } } ], "tasks": [ { "type": "HttpGet", "params": { "get": "https://example.com/api" } }, { "type": "JsonParse", "params": { "path": ["data", "price"] } }, { "type": "Multiply", "params": { "times": 100 } }, { "type": "EthUint256" }, { "type": "EthTx" } ] } ``` **Equivalent v2 spec:** ```toml type = "cron" schemaVersion = 1 schedule = "CRON_TZ=UTC * */20 * * * *" # Optional externalJobID: Automatically generated if unspecified # externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46" observationSource = """ fetch [type="http" method=GET url="https://example.com/api"] parse [type="jsonparse" data="$(fetch)" path="data,price"] multiply [type="multiply" input="$(parse)" times=100] encode_tx [type="ethabiencode" abi="submit(uint256 value)" data="{ \\"value\\": $(multiply) }"] submit_tx [type="ethtx" to="0x859AAa51961284C94d970B47E82b8771942F1980" data="$(encode_tx)"] fetch -> parse -> multiply -> encode_tx -> submit_tx """ ``` ### Web (-> Webhook) **v1 spec:** ```json { "initiators": [ { "type": "web" } ], "tasks": [ { "type": "multiply", "params": { "times": 100 } }, { "type": "custombridge" } ] } ``` **Equivalent v2 spec:** ```toml type = "webhook" schemaVersion = 1 # Optional externalJobID: Automatically generated if unspecified # externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46" observationSource = """ multiply [type="multiply" input="$(jobRun.requestBody)" times=100] send_to_bridge [type="bridge" name="custombridge" requestData="{ \\"data\\": { \\"value\\": $(multiply) }}"] multiply -> send_to_bridge """ ``` --- # Tasks Source: https://docs.chain.link/chainlink-nodes/oracle-jobs/tasks ## What is a Task? > **NOTE: Tasks** > > Tasks replace the [core adapters](/chainlink-nodes/oracle-jobs/migration-v1-v2) from v1 jobs. Tasks are a replacement for core adapters that is more flexible. Tasks can be composed in arbitrary order into [pipelines](#writing-pipelines). Pipelines consist of one or more threads of execution where tasks are executed in a well-defined order. You can use Chainlink's [built-in tasks](/chainlink-nodes/oracle-jobs/all-tasks), or you can create your own [external adapters](/chainlink-nodes/external-adapters/external-adapters) for tasks which are accessed through a `bridge`. ## Shared attributes All tasks share a few common attributes: `index`: when a task has more than one input (or the pipeline overall needs to support more than one final output), and the ordering of the values matters, the index parameter can be used to specify that ordering. ```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)"] data_1 -> multiword_abi_encode data_2 -> multiword_abi_encode ``` `timeout`: The maximum duration that the task is allowed to run before it is considered to be errored. Overrides the `maxTaskDuration` value in the job spec. ## Writing pipelines Pipelines are composed of tasks arranged in a DAG (directed acyclic graph). Pipelines are expressed in [DOT syntax](https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29#Directed_graphs). Each node in the graph is a task with a user-specified ID and a set of configuration parameters and attributes: ```toml my_fetch_task [type="http" method=GET url="https://chain.link/eth_usd"] ``` The edges between tasks define how data flows from one task to the next. Some tasks can have multiple inputs, such as `median`. Other tasks are limited to 0 (`http`) or 1 (`jsonparse`). ```toml data_source_1 [type="http" method=GET url="https://chain.link/eth_usd"] data_source_2 [type="http" method=GET url="https://coingecko.com/eth_usd"] medianize_data [type="median"] submit_to_ea [type="bridge" name="my_bridge"] data_source_1 -> medianize_data data_source_2 -> medianize_data medianize_data -> submit_to_ea ``` ![DAG Example](/images/dag_example.png) --- # Security and Operation Best Practices Source: https://docs.chain.link/chainlink-nodes/resources/best-security-practices The following information provides a set of security and operation best practices that node operators need to use at a minimum to enhance the security and reliability of their infrastructure. ## Restricting access To run a Chainlink node, the Operator UI port does not need to be open on the internet for it to correctly function. Due to this, we strongly recommend restricting access to all of the services required over the internet. **Minimum Requirements:** - SSH (port 22 or changed from the default) is open, and access to the node is granted via SSH tunnelling. This is done typically by adding `-L 6688:localhost:6688` to your SSH command. - Access to the Ethereum client that the Chainlink node uses is restricted to solely the Chainlink node. This includes ports 8545 and 8546, but excludes 30303 for P2P traffic. **Recommended:** - The use of a VPN restricts access to only those who are signed into the VPN in order to access internal resources. For example, this can be achieved by using something like [OpenVPN Access Server](https://openvpn.net/vpn-server/). - With the use of the VPN, all traffic between Chainlink nodes and Ethereum clients is routed internally rather than over the internet. For example, all servers are placed in an internal subnet range such as `10.0.0.0/16` and use these IP addresses for communicating. - Chainlink nodes have the potential to send arbitrary HTTP GET and POST requests, exposing internal network resources. We recommend deploying with a DMZ which has strong outbound network restrictions. ## Failover capabilities To ensure there is very minimal downtime, failover capabilities are required on both the Chainlink and Ethereum clients so that if any one server fails, the service is still online. **Minimum requirements:** - Chainlink nodes are using a PostgreSQL database that are not on the same servers as the Chainlink nodes. - At least two Chainlink nodes are running at any one time, with both of them pointing to the same database to ensure failover if one fails. **Ethereum-specific:** - Ethereum client websocket connectivity is fronted by a load balancer, used by the Chainlink nodes. [Here is an example on how to set up a load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/tutorial-target-ecs-containers.html). - If a VPN and internal routing is configured, SSL is not needed but still recommended, as all traffic is purely internal. - If both Ethereum and Chainlink nodes are public facing without a VPN, SSL is required to ensure that no communication between both can be intercepted. ## Disaster recovery Problems occur and when they do, the right processes need to be in-place to ensure that as little downtime as possible occurs. The main impediment to incurring large amounts of downtime in the context of Chainlink node operators is a fully corrupted Ethereum node that requires a re-sync. Due to the challenge of recovering an Ethereum client, we recommend: - Daily snapshots of the Ethereum chain on a separate server than what the Chainlink node is connected to. - An Ethereum client start-up process that pulls down the latest template of the chain and syncs it to the latest height. With this process in-place, the elapsed time of full disaster is kept to a minimum. ## Active monitoring To be proactive in detecting any issues before or when they occur, active monitoring needs to be in place. The areas where we recommend to monitor are: - (Minimum Required) ETH balance of the wallet address assigned to the node. - Errored job runs. - Operator UI port to be open and responsive. (Usually: 6688) - Ethereum http and websocket ports to be open and responsive. (Usually: 8545 & 8546) - 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. ## Frequent updates Due to the early nature of the software, it may be required to perform frequent updates to your Chainlink node. On performing system maintenance to update the Chainlink node, follow [this](/chainlink-nodes/resources/performing-system-maintenance/#failover-node-example) guide. ## Jobs and config The following are suggestions for job specifications and configuration settings for the node. [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. [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. ## Addresses - Chainlink node address: this is the address used by the Chainlink node to sign and send responses onchain. This address should not be used by any other service since the Chainlink node keeps track of its nonce locally (instead of polling the network each transaction). This address only needs to be funded with ETH to be able to write back to the blockchain. - Oracle contract address: this is the address that users will send Chainlink requests to, and which your Chainlink node will fulfill them through this contract. For best practice, it should be owned by a secure address in your control, like a hardware or cold wallet, since it has access to your earned LINK funds. You will not need to fund this contract with anything (LINK or ETH). Instead, users will fund the contract with LINK as they send requests to it, and those funds will become available for withdrawal as your node fulfills the requests. ## Infrastructure as Code (IaC) Running a Chainlink node works well if you template out your infrastructure using tools like Kubernetes or Terraform. The following repositories can assist you with doing that: - [Pega88's Kubernetes & Terraform setup](https://github.com/Pega88/chainlink-gcp) - [SDL Chainlink Kubernetes Deployment](https://github.com/mycelium-ethereum/ChainlinkKubernetes) - [LinkPool's Terraform Provider](https://github.com/linkpoolio/terraform-provider-chainlink) - [Ansible hardened Chainlink](https://github.com/WilsonBillkia/bane) - [Terraform module for serverless OCR node on AWS](https://github.com/ChainOrion/terraform-aws-chainlink-node) - [Terraform module for serverless adapters on AWS](https://github.com/ChainOrion/terraform-aws-chainlink-ea) --- # Connecting to a Remote Database Source: https://docs.chain.link/chainlink-nodes/resources/connecting-to-a-remote-database This guide show you how to set up a PostgreSQL database and connect your Chainlink node to it. Alternatively, you can follow the guides below: - [Amazon AWS](https://aws.amazon.com/getting-started/tutorials/create-connect-postgresql-db/) - [Azure](https://docs.microsoft.com/en-us/azure/postgresql/quickstart-create-server-database-portal) - [Docker](https://docs.docker.com/samples/postgres/) - [Google Cloud](https://cloud.google.com/community/tutorials/setting-up-postgres) ## Obtain information about your database In order to connect to a remote database, you must obtain information about the database and the server. Note the following database details so you can use them to configure your Chainlink node later: - Server hostname or IP - Port - Username - Password - Database name 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 Below is an example for setting the `DATABASE_URL` environment variable for your Chainlink Node's `.env` configuration file: ```text DATABASE_URL DATABASE_URL=postgresql://[USERNAME]:[PASSWORD]@[SERVER]:[PORT]/[DATABASE]?sslmode=[SSL_MODE] ``` Change the following placeholders to their real values: - `[USERNAME]`: The username for the database owner account. - `[PASSWORD]`: The password for the database owner account. - `[SERVER]`: The hostname or IP address of the database server. - `[PORT]`: The port that the database is listening on. The default port for PostgreSQL is `5432`. - `[DATABASE]`: The name of the database to use for the Chainlink node. - `[SSL_MODE]`: If you are testing on a database that does not have SSL enabled, you can specify `disable` so that you don't need to go through the process of configuring SSL on your database. On a production node, set this value to `require` or `verify-full`. This requires an encrypted connection between your Chainlink node and the database. See the [PostgreSQL documentation](https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION) to learn about the available SSL modes. --- # Enabling HTTPS Connections Source: https://docs.chain.link/chainlink-nodes/resources/enabling-https-connections This guide will walk you through how to generate your own self-signed certificates for use by the Chainlink node. You can also substitute self-signed certificates with certificates of your own, like those created by [Let's Encrypt](https://letsencrypt.org/). > **TIP: TLS** > > You will need [OpenSSL](https://www.openssl.org) in order to generate your own self-signed certificates. Create a directory `tls/` within your local Chainlink directory: ### Sepolia ```text Sepolia mkdir ~/.chainlink-sepolia/tls ``` ### Mainnet ```text Mainnet mkdir ~/.chainlink/tls ``` Run this command to create a `server.crt` and `server.key` file in the previously created directory: ### Sepolia ```shell Sepolia openssl req -x509 -out ~/.chainlink-sepolia/tls/server.crt -keyout ~/.chainlink-sepolia/tls/server.key \ -newkey rsa:2048 -nodes -sha256 -days 365 \ -subj '/CN=localhost' -extensions EXT -config <( \ printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") ``` ### Mainnet ```shell Mainnet openssl req -x509 -out ~/.chainlink/tls/server.crt -keyout ~/.chainlink/tls/server.key \ -newkey rsa:2048 -nodes -sha256 -days 365 \ -subj '/CN=localhost' -extensions EXT -config <( \ printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") ``` Next, add the `TLS_CERT_PATH` and `TLS_KEY_PATH` environment variables to your `.env` file. ```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: ```shell Shell code": "sed -i '/SECURE_COOKIES=false/d' .env ``` Finally, update your run command to forward port 6689 to the container instead of 6688: ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run -p 6689:6689 -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` ### Mainnet ```shell Mainnet cd ~/.chainlink && docker run -p 6689:6689 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` Now when running the node, you can access it by navigating to [https://localhost:6689](https://localhost:6689) if running on the same machine or with a ssh tunnel. --- # Optimizing EVM Performance Source: https://docs.chain.link/chainlink-nodes/resources/evm-performance-configuration The most basic Chainlink node deployment uses the default configuration on only a single primary node with a websocket URL. This configuration is appropriate for small or simple workloads with only a few jobs that execute infrequently. If you need to run hundreds of jobs and thousands of transactions per hour, your Chainlink and RPC nodes will require a more advanced configuration. This guide explains how to configure Chainlink and your EVM nodes for high reliability and throughput. > **NOTE: Note on Ethereum clients** > > Ethereum clients have bugs. Much work is done on the Chainlink node software to mitigate bugs in various different RPC > implementations. This guide helps you understand how to mitigate and work around these bugs. ## Using multiple nodes > **NOTE: Use multiple nodes** > > Providing multiple primary nodes can improve performance and reliability. Chainlink node version 1.3.0 and later support configurations with multiple primary nodes and send-only nodes with automatic liveness detection and failover. It is no longer necessary to run a load balancing failover RPC proxy between Chainlink and its EVM RPC nodes. If you are using a failover proxy transparently for commercial node provider services, it will continue to work properly as long as the RPC you are talking to acts just like a standard RPC node. You can have as many primary nodes as you want. Requests are evenly distributed across all nodes, so the performance increase will be linear as you add more nodes. If a node fails with no heads for several minutes or a failed liveness check, it is removed from the live pool and all requests are routed to one of the live nodes. If no live nodes are available, the system attempts to use nodes from the list of failed nodes at random. You can configure as many send-only nodes as you want. Send-only nodes only broadcast transactions and do not process regular RPC calls. Specifying additional send-only nodes uses a minimum number of RPC calls and can help to include transactions faster. Send-only nodes also act as backup if your primary node starts to blackhole transactions. > **NOTE: Transaction broadcasts** > > Transaction broadcasts are always sent to every primary node and send-only node. It is redundant to specify the same > 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 }, ] ' ``` Send-only nodes are used for broadcasting transactions only, and must support the following RPC calls: - `eth_chainId`: Returns the chain ID - `eth_sendRawTransaction`: Both regular and batched - `web3_clientVersion`: Can return any arbitrary string ## Automatic load balancing and failover > **CAUTION: Do not use load balancers for RPCs** > > Our recommendation is that node operators should **not** use load-balancers for RPCs. If you do use them, the load > balancers must provide finality guarantees. Chainlink node version 1.3.0 and above has built in failover and load balancing for primary nodes. Chainlink always uses round-robin requests across all primary nodes. Chainlink monitors when nodes go offline and stops routing requests to those nodes. If you don't want to use Chainlink's built-in failover, or you want to use an external proxy instead, you can disable failover completely using the following environment variables: ```text NODE_NO_NEW_HEADS_THRESHOLD=0 NODE_POLL_FAILURE_THRESHOLD=0 NODE_POLL_INTERVAL=0 ``` - [NODE_NO_NEW_HEADS_THRESHOLD](/chainlink-nodes/v1/configuration): Controls how long to wait receiving no new heads before marking a node dead - [NODE_POLL_FAILURE_THRESHOLD](/chainlink-nodes/v1/configuration): Controls how many consecutive poll failures will disable a node - [NODE_POLL_INTERVAL](/chainlink-nodes/v1/configuration): Controls how often the node will be polled By default, these environment variables use the following values: ```text NODE_NO_NEW_HEADS_THRESHOLD="3m" NODE_POLL_FAILURE_THRESHOLD="5" NODE_POLL_INTERVAL="10s" ``` ## Configuring websocket and HTTP URLs > **NOTE: Note on URLs** > > Ideally, every primary node specifies an HTTP URL in addition to the websocket URL. It is not recommended to configure primary nodes with *only* a websocket URL. Routing all traffic over only a websocket can cause problems. As a best practices, every primary node must have both websocket and HTTP URLs specified. This allows Chainlink to route almost all RPC calls over HTTP, which tends to be more robust and reliable. The websocket URL is used only for subscriptions. Both URLs must point to the same node because they are bundled together and have the same liveness state. If you enabled HTTP URLs on all your primary nodes, you can increase the values for the following environment variables: - [ETH_RPC_DEFAULT_BATCH_SIZE](/chainlink-nodes/v1/configuration) - [BLOCK_HISTORY_ESTIMATOR_BATCH_SIZE](/chainlink-nodes/v1/configuration) - [ETH_LOG_BACKFILL_BATCH_SIZE](/chainlink-nodes/v1/configuration) By default, these config variables are set conservatively to avoid overflowing websocket frames. In HTTP mode, there are no such limitations. You might be able to improve performance with increased values similar to the following example: ```text ETH_RPC_DEFAULT_BATCH_SIZE=1000 BLOCK_HISTORY_ESTIMATOR_BATCH_SIZE=100 ETH_LOG_BACKFILL_BATCH_SIZE=1000 ``` > **CAUTION** > > Do not modify these values unless *all* primary nodes are configured with HTTP URLs. ## Increasing transaction throughput By default, Chainlink has conservative limits because it must be compliant with standard out-of-the-box RPC configurations. This limits transaction throughput and the performance of some RPC calls. Before you make any changes to your Chainlink configuration, you must ensure that *all* of your primary and send-only nodes are configured to handle the increased throughput. > **NOTE: Transaction throughput** > > The best way to improve transaction throughput is to keep the default configuration and use multiple keys to transmit. > Chainlink supports an arbitrary number of keys for any given chain. By default, tasks will round-robin through keys, > but you can assign them individually to keys as well. Assigning tasks to keys is the preferred way to improve > throughput because increasing the max number of in-flight requests can have complicated effects based on the mempool > configurations of other RPC nodes. If you are unable to distribute transmission load across multiple keys, try the > following options to increase throughput. ### Increase `ETH_MAX_QUEUED_TRANSACTIONS` You can increase `ETH_MAX_QUEUED_TRANSACTIONS` if you require high burst throughput. Setting this variable to `0` disables any limit and ensures that no transaction are ever dropped. The default is set automatically based on the chain ID and usually is `250`. Overriding this value does not require any RPC changes and only affects the Chainlink side. This represents the maximum number of unbroadcast transactions per key that are allowed to be enqueued before jobs start failing and refusing to send further transactions. It acts as a "buffer" for transactions waiting to be sent. If the buffer is exceeded, transactions will be permanently dropped. Do not set `ETH_MAX_QUEUED_TRANSACTIONS` too high. It acts as a sanity limit and the queue can grow unbounded if you are trying to send transactions consistently faster than they can be confirmed. If you have an issue that must be recovered later, you will have to churn through all the enqueued transactions. As a best practice, set `ETH_MAX_QUEUED_TRANSACTIONS` to the minimum possible value that supports your burst requirements or represents the maximum number of transactions that could be sent in a given 15 minute window. `ETH_MAX_QUEUED_TRANSACTIONS=10000` might be an example where very high burst throughput is needed. ### Increase `ETH_MAX_IN_FLIGHT_TRANSACTIONS` `ETH_MAX_IN_FLIGHT_TRANSACTIONS` is another variable that you can increase if you require higher constant transaction throughput. Setting this variable to `0` disables any kind of limit. The default value is `16`. `ETH_MAX_IN_FLIGHT_TRANSACTIONS` controls how many transactions are allowed to be broadcast but unconfirmed at any one time. This is a form of transaction throttling. The default is set conservatively at `16` because this is a pessimistic minimum that go-ethereum will hold without evicting local transactions. If your node is falling behind and not able to get transactions in as fast as they are created, you can increase this setting. > **CAUTION** > > If you increase `ETH_MAX_IN_FLIGHT_TRANSACTIONS` you must make sure that your ETH node is configured properly > otherwise you can get nonce-gapped and your node will get stuck. ## Optimizing RPC nodes You can also improve transaction throughput by optimizing RPC nodes. Configure your RPC node to **never** evict local transactions. For example, you can use the following example configurations: ```text Go-Ethereum [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 ``` If you are using another RPC node, such as Besu or Nethermind, you must look at the documentation for that node to ensure that it will keep at least as many transactions in the mempool for the Chainlink node keys as you have set in `ETH_MAX_IN_FLIGHT_TRANSACTIONS`. The recommended way to scale is to use more keys rather than increasing throughput for one key. ## Remove rejections on expensive transactions By default, go-ethereum rejects transactions that exceed its built-in RPC gas or txfee caps. Chainlink nodes fatally error transactions if this happens. If you ever exceed the caps, your node will miss transactions. Disable the default RPC gas and txfee caps on your ETH node in the config using the TOML snippet shown below, or by running go-ethereum with the command line arguments: `--rpc.gascap=0 --rpc.txfeecap=0`. ```text [Eth] RPCGasCap = 0 RPCTxFeeCap = 0.0 ``` ### Arbitrum differences Arbitrum Nitro runs a fork of go-ethereum internally, but the original flags are not valid. These modified flags are equivalent: `--node.rpc.gas-cap 0 --node.rpc.tx-fee-cap 0` ## Adjusting minimum outgoing confirmations for high throughput jobs `ethtx` tasks have a `minConfirmations` label that can be adjusted. You can get a minor performance boost if you set this label to `0`. Use this if you do not need to wait for confirmations on your `ethtx` tasks. For example, if you don't need the receipt or don't care about failing the task if the transaction reverts onchain, you can set `minConfirmations` to `0`. Set the task label similarly to the following example: `foo [type=ethtx minConfirmations=0 ...]` Note that this only affects the presentation of jobs, and whether they are marked as errored or not. It has no effect on inclusion of the transaction, which is handled with separate logic. > **CAUTION** > > Do not confuse `minConfirmations` set on the task with transaction inclusion. The transaction manager always attempts > to get every transaction mined up to `EVMFinalityDepth`. `minConfirmations` on the task is a task-specific view of > when the transaction that can be considered final, which might be fewer blocks than `EVMFinalityDepth`. ## Increase `ORM_MAX_OPEN_CONNS` and `ORM_MAX_IDLE_CONNS` Chainlink can be configured to allow more concurrent database connections than the default. This might improve performance, but be careful not to exceed postgres connection limits. These variables have the following default values: ```text ORM_MAX_OPEN_CONNS=20 ORM_MAX_IDLE_CONNS=10 ``` You might increase these values to `ORM_MAX_OPEN_CONNS=50` and `ORM_MAX_IDLE_CONNS=25` if you have a large and powerful database server with high connection count headroom. --- # Miscellaneous Source: https://docs.chain.link/chainlink-nodes/resources/miscellaneous ## Execute Commands Running Docker In order to interact with the node's CLI commands, you need to be authenticated. This means that you need to access a shell within the Chainlink node's running container first. You can obtain the running container's `NAME` by running: ```shell docker ps ``` The output will look similar to: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 436882efd51d smartcontract/chainlink "./chainlink-launche…" 33 minutes ago Up 21 minutes 6688/tcp, 0.0.0.0:6688->6688/tcp chainlink ``` The last item, `chainlink`, is the name of the running container (using `--name chainlink` in your `docker run` command will give you a common name). Accessing a shell for this container is accomplished by running: ```shell docker exec -it chainlink /bin/bash ``` This changes the prompt to something similar to: ```shell root@436882efd51d:~# ``` You can now log in by running: ```shell chainlink admin login ``` You will be prompted to enter your API Email and Password, and if successful, the prompt will simply appear again. You can check that you are authenticated by running: ```shell chainlink jobs list ``` If no jobs have been added, you will receive the following output, otherwise, the list of added jobs will be returned: ``` ╔ Jobs ╬════╬════════════╬════════════╬═══════╬ ║ ID ║ CREATED AT ║ INITIATORS ║ TASKS ║ ╬════╬════════════╬════════════╬═══════╬ ``` ## Transfer funds from node wallet. > **NOTE: Note for Docker** > > If using Docker, you will first need to follow the [Execute Commands Running Docker](#execute-commands-running-docker) > guide to enter the running container. To transfer funds from the node wallet to another address, use the following CLI command: ```shell chainlink txs create ``` This method is the preferred way to interact with your node wallet. Using other methods to manually interact with the node wallet can cause nonce issues. ## Change your API password > **NOTE: Note for Docker** > > If using Docker, you will first need to follow the [Execute Commands Running Docker](#execute-commands-running-docker) > guide to enter the running container. In order to change your password, you first need to log into the CLI by running: ```shell chainlink admin login ``` Use your API email and old password in order to authenticate. Then run the following in order to update the password: ```shell chainlink admin chpass ``` It will ask for your old password first, then ask for the new password and a confirmation. Once complete, you should see a message "Password updated." ## Multi-user and Role Based Access Control (RBAC) See the [Roles and Access Control](/chainlink-nodes/v1/roles-and-access) page. ## Key management In this section, ensure you log into the CLI by executing the following command: ```shell chainlink admin login ``` Authenticate using your API email and password. ### List ETH keys To list available Ethereum accounts along with their ETH & LINK balances, nonces, and other metadata, execute the following command: ```shell chainlink keys eth list ``` Example: ```text 🔑 ETH keys ------------------------------------------------------------------------------------------------- Address: 0x2d4f5FBD00E5A4fD53D162cE7EDFdb5b7664C542 EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-04-26 08:12:51.340348 +0000 UTC Updated: 2023-04-26 08:12:51.340348 +0000 UTC ``` ### Create a new ETH Key To create a key in the node's keystore alongside the existing keys, run the following command: ```shell chainlink keys eth create ``` Example: ```text ETH key created. 🔑 New key ------------------------------------------------------------------------------------------------- Address: 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-04-26 08:28:36.52974 +0000 UTC Updated: 2023-04-26 08:28:36.52974 +0000 UTC Max Gas Price Wei: 115792089237316195423570985008687907853269984665640564039457584007913129639935 ``` ### Export an ETH key To export an Ethereum key to a JSON file, run the following command: ```shell chainlink keys eth export [address] [command options] ``` where: - `address`: The EVM account address for which you want to export the private key. - Options: - `--newpassword FILE, -p FILE FILE`: A file containing the password to encrypt the key. - `--output value, -o value`: The path where the JSON file will be saved. Example: ```text chainlink keys eth export 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 --newpassword .chainlink/pass --output privatekey.json 🔑 Exported ETH key 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 to privatekey.json ``` ### Delete an ETH key To remove an Ethereum key, run the following command: ```shell chainlink keys eth delete [address] [command options] ``` where: - `address`: The EVM account address that you want to remove. - Options: - `--yes, -y`: Skip the confirmation prompt. Example: ```text $ chainlink keys eth delete 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 --yes Deleted ETH key: 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 ``` ### Import an ETH key To import an Ethereum key from a JSON file, run the following command: ```shell chainlink keys eth import [JSON file] [command options] ``` where: - `JSON file`: The path where the JSON file containing the ETH key is saved. - Options: - `--oldpassword FILE, -p FILE`: FILE containing the password used to encrypt the key in the JSON file. - `--evmChainID value`: Chain ID for the key. If left blank, default chain will be used. Example: ```text $ chainlink keys eth import privatekey.json --oldpassword .chainlink/pass 🔑 Imported ETH key ------------------------------------------------------------- Address: 0xd31961E1f62A2FaB824AC3C1A7a332daF8B11eE0 EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-04-26 08:51:02.04186 +0000 UTC Updated: 2023-04-26 08:51:02.04186 +0000 UTC Max Gas Price Wei: ``` ## Full example in detached mode ```shell cd ~/.chainlink-sepolia && docker run --restart=always -p 6688:6688 -d --name sepolia-primary -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink:1.0.0 node start -p /chainlink/.password ``` --- # Performing System Maintenance Source: https://docs.chain.link/chainlink-nodes/resources/performing-system-maintenance You might occasionally need to restart the system that the Chainlink node runs on. To restart without any downtime for completing requests, perform the upgrade as a series of steps that passes database access to a new instance while the first instance is down. ## Maintenance and image update example > **NOTE: Docker** > > This example uses Docker to run the Chainlink node, see the [Running a Chainlink > Node](/chainlink-nodes/v1/running-a-chainlink-node) page for instructions on how to set it up. First, find the most recent Chainlink image on [Docker Hub](https://hub.docker.com/r/smartcontract/chainlink/) and pull that Docker image. For version 1.11.0: ```shell docker pull smartcontract/chainlink:1.11.0 ``` Then, check what port the existing container is running on: ```shell docker ps ``` Output: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d203191c1d6 smartcontract/chainlink:latest "./chainlink-launche…" 26 seconds ago Up 25 seconds 0.0.0.0:6688->6688/tcp jovial_shirley ``` Look under the PORTS label to see the ports in use by the running container, in this case, the local port 6688 has been mapped to the application's port 6688, as identified by the `->` arrow. Since we can't use the same local port number twice, we'll need to run the second instance with a different one. Now start the second instance of the node. The local port option has been modified so that both containers run simultaneously. ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run -p 6687:6688 -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` ### Mainnet ```shell Mainnet cd ~/.chainlink && docker run -p 6687:6688 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` The log messages on the second node instance inform you that it is waiting for the database lock. Now you can shut down the first node instance. We'll use the name given earlier and kill the container. Note that your container name will likely be different. ```shell docker kill jovial_shirley ``` The output returns the name "jovial_shirley" (or what your container's name was) and if you look at the log of your second container, you'll notice that it has taken over. At this point, you're now running the latest image on your secondary container. If you have any system maintenance to perform on your primary machine, you can do so now. Next, run the container again with the local port 6688 in order to go back to normal operations. ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run -p 6688:6688 -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` ### Mainnet ```shell Mainnet cd ~/.chainlink && docker run -p 6688:6688 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` When the log messages on the first node indicate that it is waiting for the database lock, shut down the second instance of the node. The original instance automatically obtains a lock and resumes normal operation. ## Failover node example > **NOTE: Docker** > > This example uses Docker to run the Chainlink node, see the [Running a Chainlink > Node](/chainlink-nodes/v1/running-a-chainlink-node) page for instructions on how to set it up. You might want to run multiple instances of the Chainlink node on the same machine. If one instance goes down, the second instance can automatically pick up requests. Building off the concepts in the previous example, use Docker to have primary and a secondary containers referencing the same database URL. Use the default `DATABASE_LOCKING_MODE=advisorylock` setting unless you want to test the `lease` or `dual` settings. See [the docs](/chainlink-nodes/v1/configuration) for more information about this configuration variable. Run the Chainlink node with a name option specified: ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run --name chainlink -p 6688:6688 -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` ### Mainnet ```shell Mainnet cd ~/.chainlink && docker run --name chainlink -p 6688:6688 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` You will now notice that you no longer receive a randomly generated name from Docker: ```shell docker ps ``` Output (truncated): ``` ... NAMES ... chainlink ``` This will remain your primary Chainlink container, and should always use port 6688 (unless configured otherwise). For the secondary instance, you will run the container in the same way, but with a different name and a different local port: ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run --name secondary -p 6687:6688 -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` ### Mainnet ```shell Mainnet cd ~/.chainlink && docker run --name secondary -p 6687:6688 -v ~/.chainlink:/chainlink -it --env-file=.env smartcontract/chainlink local n ``` Notice the `--name secondary` was used for this container and the local port is 6687. Be sure to add this port to your SSH tunnel as well so that you can access the secondary node's GUI if it has become active (it will not function until the primary container goes down). Running `docker ps` now reveals two named containers running (output truncated): ``` ... NAMES ... secondary ... chainlink ``` If your primary container goes down, the secondary one automatically takes over. To start the primary container again, simply run: ```shell docker start -i chainlink ``` This starts the container, but the secondary node still has a lock on the database. To give the primary container access, you can restart the secondary container: ```shell docker restart secondary -t 0 ``` The primary container takes control of the database and resumes operation. You can attach to the secondary container using `docker attach`: ```shell docker attach secondary ``` However, it does not produce any output while waiting for a lock on the database. Congratulations! You now have a redundant setup of Chainlink nodes in case the primary container goes down. Get comfortable with the process by passing control of the database back and forth between the `chainlink` and `secondary` containers. --- # Requirements Source: https://docs.chain.link/chainlink-nodes/resources/requirements ## Hardware The requirements for running a Chainlink node scale with the as the number of jobs that your node services. CPUs with the x86 architecture is recommended for production environments, but you can use Apple M1 systems for development if you run the Chainlink node in Docker. - Minimum: At least **2 CPU cores** and **4 GB of RAM** will allow you to get a node running for testing and basic development. - Recommended: For nodes in a production environment with over 100 jobs, you will need at least **4 CPU cores** and **8GB of RAM**. If you run your PostgreSQL database locally, you will need additional hardware. To support more than 100 jobs, your database server will need at least **4 cores**, **16 GB of RAM**, and **100 GB of storage**. If you run your node on AWS or another cloud platform, use a VM instance type with dedicated core time. [Burstable Performance Instances](https://aws.amazon.com/ec2/instance-types/#Burstable_Performance_Instances) and VM instances with shared cores often have a limited number of [CPU credits](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html), which do not perform well for Chainlink nodes that require consistent performance. ## Software Chainlink nodes have the following software dependencies: - Operating System: Linux, MacOS, or the [WSL](https://learn.microsoft.com/en-us/windows/wsl/about) (Windows Subsystem for Linux) - For production environments, Linux is recommended. - Docker: Although it is possible to [build Chainlink nodes from source](https://github.com/smartcontractkit/chainlink), the best practice is to use the [Chainlink Docker Images](https://hub.docker.com/r/smartcontract/chainlink/tags) without `-root`. - [PostgreSQL](https://wiki.postgresql.org/wiki/Detailed_installation_guides) versions `>= 14` and `< 18` (Versions 14 through 17). - If you use a database as a service, your database host must provide access to logs. - If you run the database on a separate system, [secure the TCP/IP connection with SSL](https://www.postgresql.org/docs/15/ssl-tcp.html). ## Blockchain connectivity Chainlink nodes require a fully-synced network client so that they can run onchain transactions and interact with deployed contracts. For Ethereum, see the list of [supported clients](https://github.com/smartcontractkit/chainlink#ethereum-execution-client-requirements). Other L1s, L2s, and side-chains use different clients. See your network's documentation to learn how to run a client for your specific network. The client must meet the following requirements: - You can use a provider like Alchemy or Infura, but running your own client can provide lower latency and greater decentralization. - Run your Chainlink nodes on their own separate VM or system. Hardware and storage requirements for these clients will change over time, so you will likely need to scale their capacity separately from the system where you run your Chainlink nodes. - The client must provide both HTTP and WebSocket connections secured with SSL. Most providers give you `https://` and `wss://` connections by default. If you run your own client, you must create a reverse proxy for your client using a web server like [Nginx](https://www.nginx.com/). The web server handles the SSL encryption and forwards the connection to your client. See [Running Ethereum Clients](/chainlink-nodes/resources/run-an-ethereum-client) for more details. --- # Run an Ethereum Client Source: https://docs.chain.link/chainlink-nodes/resources/run-an-ethereum-client Chainlink nodes must be able to connect to an Ethereum client with an active websocket connection. This is accomplished by running both an execution client and a consensus client. You can run these clients yourself, but running Ethereum clients requires significant storage and network resources. Optionally, you can use [External Services](#external-services) that manage these clients for you. > **NOTE: Enable the Websockets API** > > If you run these clients yourself, you must enable the websockets API. The websockets API is required for the > Chainlink node to communicate with the Ethereum blockchain. ## Geth You can use the [Geth client](https://geth.ethereum.org/docs/) for the Sepolia testnet and the Ethereum Mainnet. See the [Geth Documentation](https://geth.ethereum.org/docs/interface/peer-to-peer/) for a list of supported networks. Download the latest version: ```shell docker pull ethereum/client-go:latest ``` Create a local directory to persist the data: ### Sepolia ```shell Sepolia mkdir ~/.geth-sepolia ``` ### Mainnet ```shell Mainnet mkdir ~/.geth ``` Run the container: ### Sepolia ```shell Sepolia docker run --name eth -p 8546:8546 -v ~/.geth-sepolia:/geth -it \ ethereum/client-go --sepolia --ws --ipcdisable \ --ws.addr 0.0.0.0 --ws.origins="*" --datadir /geth ``` ### Mainnet ```shell Mainnet docker run --name eth -p 8546:8546 -v ~/.geth:/geth -it \ ethereum/client-go --ws --ipcdisable \ --ws.addr 0.0.0.0 --ws.origins="*" --datadir /geth ``` Once the Ethereum client is running, you can use `Ctrl + P, Ctrl + Q` to detach from the container without stopping it. You will need to leave the container running for the Chainlink node to connect to it. If the container was stopped and you need to run it again, you can simply use the following command: ```shell docker start -i eth ``` Follow Geth's instructions for [Connecting to Consensus Clients](https://geth.ethereum.org/docs/getting-started/consensus-clients). This will require some additional configuration settings for the Docker command that runs Geth. Return to [Running a Chainlink Node](/chainlink-nodes/v1/running-a-chainlink-node). ## Nethermind You can use the [Nethermind client](https://docs.nethermind.io) for the Ethereum Mainnet. See the [Nethermind supported network configurations](https://docs.nethermind.io/get-started/installing-nethermind#supported-networks) page for a list of supported networks. Download the latest version: ```shell docker pull nethermind/nethermind:latest ``` Create a local directory to persist the data: ### Sepolia ```shell Sepolia mkdir ~/.nethermind-sepolia ``` ### Mainnet ```shell Mainnet mkdir ~/.nethermind ``` Run the container: ### Sepolia ```shell Sepolia docker run --name eth -p 8545:8545 \ -v ~/.nethermind-sepolia/:/nethermind/data \ -it nethermind/nethermind:latest --config sepolia \ --Init.WebSocketsEnabled true --JsonRpc.Enabled true \ --JsonRpc.Host 0.0.0.0 --NoCategory.CorsOrigins * \ --datadir data ``` ### Mainnet ```shell Mainnet docker run --name eth -p 8545:8545 \ -v ~/.nethermind/:/nethermind/data \ -it nethermind/nethermind:latest --Sync.FastSync true \ --Init.WebSocketsEnabled true --JsonRpc.Enabled true \ --JsonRpc.Host 0.0.0.0 --NoCategory.CorsOrigins * \ --datadir data ``` After the Ethereum client is running, you can use `Ctrl + P, Ctrl + Q` to detach from the container without stopping it. You will need to leave the container running for the Chainlink node to connect to it. If the container was stopped and you need to run it again, use the following command to start it: ```shell docker start -i eth ``` Follow Nethermind's instructions for [Installing and configuring the Consensus Client](https://docs.nethermind.io/nethermind/guides-and-helpers/validator-setup/eth2-validator#setup). This will require some additional configuration settings for the Docker command that runs Nethermind. Return to [Running a Chainlink Node](/chainlink-nodes/v1/running-a-chainlink-node). ## External Services The following services offer Ethereum clients with websockets connectivity known to work with the Chainlink node. ## [Alchemy](https://www.alchemyapi.io) Example connection setting: ### Sepolia ```text Sepolia ETH_URL=wss://eth-sepolia.alchemyapi.io/v2/YOUR_PROJECT_ID ``` ### Mainnet ```text Mainnet ETH_URL=wss://eth-mainnet.alchemyapi.io/v2/YOUR_PROJECT_ID ``` ## [Chainstack](https://support.chainstack.com/hc/en-us/articles/900001664463-Setting-up-a-Chainlink-node-with-an-Ethereum-node-provided-by-Chainstack) Example connection setting: ```text Mainnet ETH_URL=wss://user-name:pass-word-pass-word-pass-word@ws-nd-123-456-789.p2pify.com ``` ## [Fiews](https://docs.fiews.io/docs/getting-started) Example connection setting: ```text Mainnet ETH_URL=wss://cl-main.fiews.io/v2/YOUR_API_KEY ``` ## [GetBlock](https://getblock.io/) Example connection setting: ### Sepolia ```text Sepolia ETH_URL=wss://eth.getblock.io/sepolia/?api_key=YOUR_API_KEY ``` ### Mainnet ```text Mainnet ETH_URL=wss://eth.getblock.io/mainnet/?api_key=YOUR_API_KEY ``` ## [Infura](https://infura.io/docs/ethereum/wss/introduction.md) Example connection setting. Replace YOUR_PROJECT_ID with the ID Infura provides you on your project settings page. ### Sepolia ```text Sepolia ETH_URL=wss://sepolia.infura.io/ws/v3/YOUR_PROJECT_ID ``` ### Mainnet ```text Mainnet ETH_URL=wss://mainnet.infura.io/ws/v3/YOUR_PROJECT_ID ``` ## [LinkPool](https://docs.linkpool.io/docs/general_public_rpc_nodes) Example connection setting: ```text Mainnet ETH_URL=wss://main-rpc.linkpool.io/ws ``` ## [QuikNode](https://www.quiknode.io) Example connection setting: ### Sepolia ```text Sepolia ETH_URL=wss://your-node-name.sepolia.quiknode.pro/security-hash/ ``` ### Mainnet ```text Mainnet ETH_URL=wss://your-node-name.quiknode.pro/security-hash/ ``` ## Configuring your ETH node > **CAUTION: RPC gas/txfee caps** > > By default, go-ethereum rejects transactions that exceed the built-in RPC gas/txfee caps. The node will fatally error > transactions if this happens. If you ever exceed the caps, the node will miss transactions. At a minimum, disable the default RPC gas and txfee caps on your ETH node. This can be done in the TOML file as seen below, or by running go-ethereum with the command line arguments: `--rpc.gascap=0 --rpc.txfeecap=0`. To learn more about configuring ETH nodes, see the [configuration page](/chainlink-nodes/v1/configuration). ## Additional Tools - [Chainlink ETH Failover Proxy](https://github.com/Fiews/ChainlinkEthFailover) --- # Fulfilling Requests Source: https://docs.chain.link/chainlink-nodes/v1/fulfilling-requests > **NOTE: Run a Chainlink node** > > This guide assumes you have a running Chainlink node. To learn how to run a node, see the [Running a Chainlink Node > locally](/chainlink-nodes/v1/running-a-chainlink-node) guide. You can use your Chainlink nodes to fulfill requests. This guide shows you how to deploy your own operator contract and add jobs to your node so that it can provide data to smart contracts. Chainlink nodes can fulfill requests from open or unauthenticated APIs without the need for [External Adapters](/chainlink-nodes/external-adapters/external-adapters) as long as you've [added the jobs](#add-a-job-to-the-node) to the node. For these requests, requesters supply the URL to the open API that they want each node to retrieve. The Chainlink node will use [tasks](/chainlink-nodes/oracle-jobs/tasks) to fulfill the request. Some APIs require authentication by providing request headers for the operator's API key, which the Chainlink node supports. If you would like to provide access to an API that requires authentication, you must create a job that is specific for that API either using an [external adapter](/chainlink-nodes/external-adapters/external-adapters) or by using the parameters of the [HTTP task](/chainlink-nodes/oracle-jobs/all-tasks/#http-task). ## Requirements Before you begin this guide, complete the following tasks to make sure you have all of the tools that you need: - [Set up MetaMask](/quickstarts/deploy-your-first-contract/#install-and-fund-your-metamask-wallet) and [obtain testnet LINK](/resources/acquire-link). - [Run a Chainlink Node](/chainlink-nodes/v1/running-a-chainlink-node). - Fund the Ethereum address that your Chainlink node uses. You can find the address in the node Operator GUI under the **Key Management** configuration. The address of the node is the `Regular` type. You can obtain test ETH from several [faucets](/resources/link-token-contracts). For this tutorial to work, you will have to fund the node's Ethereum address with Sepolia ETH. Here is an example: ![chainlink node fund address](/images/chainlink-nodes/node-operators/key-management.jpg) ## Address types Your node works with several different types of addresses. Each address type has a specific function: - **Node address:** This is the address for your Chainlink node wallet. The node requires native gas tokens at all times to respond to requests. For this example, the node uses Sepolia ETH. When you start a Chainlink node, it automatically generates this address. You can find this address on the Node Operator GUI under **Key Management > EVM Chain Accounts**. - **Oracle contract address:** This is the address for contracts like `Operator.sol` that are deployed to a blockchain. Do not fund these addresses with native gas tokens such as ETH. When you make API call requests, the funds pass through this contract to interact with your Chainlink node. This will be the address that smart contract developers point to when they choose a node for an API call. - **Admin wallet address:** This is the address that owns your `Operator.sol` contract addresses. If you're on OCR, this is the wallet address that receives LINK tokens. ## Set up your Operator contract ### Deploy your own Operator contract 1. Go to Remix and open the [`Operator.sol` smart contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkNodes/Operator.sol\&autoCompile=true). 2. On the **Compile** tab, click the **Compile** button for `Operator.sol`. Remix automatically selects the compiler version and language from the `pragma` line unless you select a specific version manually. 3. On the **Deploy and Run** tab, configure the following settings: - Select "Injected Provider" as your **Environment**. The Javascript VM environment cannot access your oracle node. Make sure your Metamask is connected to Sepolia testnet. - Select the "Operator" contract from the **Contract** menu. - Copy the [LINK token contract address](/resources/link-token-contracts) for the network you are using and paste it into the `LINK` field next to the **Deploy** button. For Sepolia, you can use this address: ```text Sepolia 0x779877A7B0D9E8603169DdbD7836e478b4624789 ``` - Copy the *Admin wallet address* into the `OWNER` field. ![The Deploy & Run transaction window showing Injected Web 3 selected and the address for your MetaMask wallet.](/images/chainlink-nodes/node-operators/deploy-operator.jpg) 4. Click **transact**. MetaMask prompts you to confirm the transaction. > **NOTE: MetaMask doesn't pop up?** > > If MetaMask does not prompt you and instead displays the error below, disable "Privacy Mode" in MetaMask. You can > do this by clicking on your unique account icon at the top-right, then go to the Settings. Privacy Mode will be a > switch near the bottom. > > Error: **Send transaction failed: Invalid address. If you use an injected provider, please check it is properly > unlocked.** 5. If the transaction is successful, a new address displays in the **Deployed Contracts** section. ![Screenshot showing the newly deployed contract.](/images/chainlink-nodes/node-operators/operator-deployed.jpg) 6. Keep note of the Operator contract address. You need it later for your consuming contract. ### Whitelist your node address in the Operator contract 1. In the Chainlink node GUI, find and copy the address of your chainlink node. see [Requirements](#requirements). 2. In Remix, call the `setAuthorizedSenders` function with the address of your node. Note the function expects an array. ![A screenshot showing all of the fields for the deployed contract in Remix.](/images/chainlink-nodes/node-operators/operator-authorizedsenders.jpg) 3. Click the `transact` function to run it. Approve the transaction in MetaMask and wait for it to confirm on the blockchain. 4. Call `isAuthorizedSender` function with the address of your node to verify that your chainlink node address can call the operator contract. The function must return `true`. ![A screenshot showing Chainlink node whitelisted in Remix.](/images/chainlink-nodes/node-operators/operator-isauthorizedsender.jpg) ## Add a job to the node You will create a job that calls an OpenAPI , parses the response and then returns a `uint256`. 1. In the Chainlink Operator UI on the **Jobs** tab, click **New Job**. ![The new job button.](/images/chainlink-nodes/node-operators/new-job-button.png) 2. Paste the job specification from above into the text field. ```toml # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. # DO NOT USE THIS CODE IN PRODUCTION. name = "Get > Uint256 - (TOML)" schemaVersion = 1 type = "directrequest" # evmChainID for Sepolia Testnet evmChainID = "11155111" # Optional External Job ID: Automatically generated if unspecified # externalJobID = "b1d42cd5-4a3a-4200-b1f7-25a68e48aad8" contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" maxTaskDuration = "0s" minIncomingConfirmations = 0 observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, uint256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx """ ``` 3. Replace `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address from the previous steps. 4. Click **Create Job**. If the node creates the job successfully, a notice with the job number appears. ![A screenshot showing that the job is created successfully.](/images/chainlink-nodes/node-operators/job-created.jpg) 5. Click the job number to view the job details. You can also find the job listed on the **Jobs** tab in the Node Operators UI. Save the `externalJobID` value because you will need it later to tell your consumer contract what job ID to request from your node. ![A screenshot showing the External Job ID.](/images/chainlink-nodes/node-operators/job-id.jpg) ## Create a request to your node After you add jobs to your node, you can use the node to fulfill requests. This section shows what a requester does when they send requests to your node. It is also a way to test and make sure that your node is functioning correctly. 1. Open [ATestnetConsumer.sol in Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/APIRequests/ATestnetConsumer.sol\&autoCompile=true). 2. Note that `_setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789)` is configured for *Sepolia*. 3. On the **Compiler** tab, click the **Compile** button for `ATestnetConsumer.sol`. 4. On the **Deploy and Run** tab, configure the following settings: - Select *Injected Provider* as your environment. Make sure your metamask is connected to Sepolia. - Select *ATestnetConsumer* from the **Contract** menu. 5. Click **Deploy**. MetaMask prompts you to confirm the transaction. 6. Fund the contract by sending LINK to the contract's address. See the [Fund your contract](/resources/fund-your-contract) page for instructions. The address for the `ATestnetConsumer` contract is on the list of your deployed contracts in Remix. You can fund your contract with 1 LINK. 7. After you fund the contract, create a request. Input your operator contract address and the job ID for the `Get > Uint256` job into the `requestEthereumPrice` request method **without dashes**. The job ID is the `externalJobID` parameter, which you can find on your job's definition page in the Node Operators UI. ![Screenshot of the requestEthereumPrice function with the oracle address and job ID specified.](/images/chainlink-nodes/node-operators/requestEthereumPrice.jpg) 8. Click the **transact** button for the `requestEthereumPrice` function and approve the transaction in Metamask. The `requestEthereumPrice` function asks the node to retrieve `uint256` data specifically from [https://min-api.cryptocompare.com/data/price?fsym=ETH\&tsyms=USD](https://min-api.cryptocompare.com/data/price?fsym=ETH\&tsyms=USD). 9. After the transaction processes, you can see the details for the complete the job run the **Runs** page in the Node Operators UI. ![A screenshot of the task link](/images/chainlink-nodes/node-operators/taskList.jpg) 10. In Remix, click the `currentPrice` variable to see the current price updated on your consumer contract. ![A screenshot of the currentPrice button](/images/chainlink-nodes/node-operators/currentPrice.jpg) ## Withdrawing LINK You can withdraw LINK from the operator contract. In Remix under the list of deployed contracts, click on your Operator contract and find the `withdraw` function in the function list. Note that only the admin (see [Admin wallet address](#address-types)) can withdraw LINK. ![Remix Click Withdraw Button](/images/chainlink-nodes/node-operators/operator-withdraw-link.jpg) Paste the address you want to withdraw to, and specify the amount of LINK that you want to withdraw. Then, click `withdraw`. Confirm the transaction in MetaMask when the popup appears. --- # Chainlink nodes v1 Source: https://docs.chain.link/chainlink-nodes/v1 This section provides specific information for running and configuring v1.x.x Chainlink nodes. First you will [run a chainlink node](/chainlink-nodes/v1/running-a-chainlink-node) that implements the [basic request architecture model](/architecture-overview/architecture-request-model). Then you will [fulfill requests](/chainlink-nodes/v1/fulfilling-requests) initiated by a smart contract. The [Configuring Nodes page](/chainlink-nodes/v1/configuration) lists all the environment variables for configuring a v1.x.x Chainlink node. --- # Node Config (TOML) Source: https://docs.chain.link/chainlink-nodes/v1/node-config [//]: # "Documentation generated from docs/*.toml - DO NOT EDIT." This document describes the TOML format for configuration. See also: [Secrets Config](/chainlink-nodes/v1/secrets-config) ## Example ```toml Log.Level = 'debug' [[EVM]] ChainID = '1' # Required [[EVM.Nodes]] Name = 'fake' # Required WSURL = 'wss://foo.bar/ws' HTTPURL = 'https://foo.bar' # Required ``` ## Global ```toml InsecureFastScrypt = false # Default InsecurePPROFHeap = true # Default RootDir = '~/.chainlink' # Default ShutdownGracePeriod = '5s' # Default ``` ### InsecureFastScrypt ```toml InsecureFastScrypt = false # Default ``` InsecureFastScrypt causes all key stores to encrypt using "fast" scrypt params instead. This is insecure and only useful for local testing. DO NOT ENABLE THIS IN PRODUCTION. ### InsecurePPROFHeap ```toml InsecurePPROFHeap = true # Default ``` InsecurePPROFHeap allows dumping the heap in pprof. This is very useful for debugging memory leaks but in certain rare cases may potentially expose sensitive data e.g. private key components, so is disabled by default. Deprecated: no effect. Always enabled. ### RootDir ```toml RootDir = '~/.chainlink' # Default ``` RootDir is the Chainlink node's root directory. This is the default directory for logging, database backups, cookies, and other misc Chainlink node files. Chainlink nodes will always ensure this directory has 700 permissions because it might contain sensitive data. ### ShutdownGracePeriod ```toml ShutdownGracePeriod = '5s' # Default ``` ShutdownGracePeriod is the maximum time allowed to shut down gracefully. If exceeded, the node will terminate immediately to avoid being SIGKILLed. ## Feature ```toml [Feature] FeedsManager = true # Default LogPoller = false # Default UICSAKeys = false # Default CCIP = true # Default MultiFeedsManagers = false # Default ``` ### FeedsManager ```toml FeedsManager = true # Default ``` FeedsManager enables the feeds manager service. ### LogPoller ```toml LogPoller = false # Default ``` LogPoller enables the log poller, an experimental approach to processing logs, required if also using Evm.UseForwarders or OCR2. ### UICSAKeys ```toml UICSAKeys = false # Default ``` UICSAKeys enables CSA Keys in the UI. ### CCIP ```toml CCIP = true # Default ``` CCIP enables the CCIP service. ### MultiFeedsManagers ```toml MultiFeedsManagers = false # Default ``` MultiFeedsManagers enables support for multiple feeds manager connections. ## Database ```toml [Database] DefaultIdleInTxSessionTimeout = '1h' # Default DefaultLockTimeout = '15s' # Default DefaultQueryTimeout = '10s' # Default LogQueries = false # Default MaxIdleConns = 10 # Default MaxOpenConns = 100 # Default MigrateOnStartup = true # Default ``` ### DefaultIdleInTxSessionTimeout ```toml DefaultIdleInTxSessionTimeout = '1h' # Default ``` DefaultIdleInTxSessionTimeout is the maximum time allowed for a transaction to be open and idle before timing out. See Postgres `idle_in_transaction_session_timeout` for more details. ### DefaultLockTimeout ```toml DefaultLockTimeout = '15s' # Default ``` DefaultLockTimeout is the maximum time allowed to wait for database lock of any kind before timing out. See Postgres `lock_timeout` for more details. ### DefaultQueryTimeout ```toml DefaultQueryTimeout = '10s' # Default ``` DefaultQueryTimeout is the maximum time allowed for standard queries before timing out. ### LogQueries ```toml LogQueries = false # Default ``` LogQueries tells the Chainlink node to log database queries made using the default logger. SQL statements will be logged at `debug` level. Not all statements can be logged. The best way to get a true log of all SQL statements is to enable SQL statement logging on Postgres. ### MaxIdleConns ```toml MaxIdleConns = 10 # Default ``` MaxIdleConns configures the maximum number of idle database connections that the Chainlink node will keep open. Think of this as the baseline number of database connections per Chainlink node instance. Increasing this number can help to improve performance under database-heavy workloads. Postgres has connection limits, so you must use caution when increasing this value. If you are running several instances of a Chainlink node or another application on a single database server, you might run out of Postgres connection slots if you raise this value too high. ### MaxOpenConns ```toml MaxOpenConns = 100 # Default ``` MaxOpenConns configures the maximum number of database connections that a Chainlink node will have open at any one time. Think of this as the maximum burst upper bound limit of database connections per Chainlink node instance. Increasing this number can help to improve performance under database-heavy workloads. Postgres has connection limits, so you must use caution when increasing this value. If you are running several instances of a Chainlink node or another application on a single database server, you might run out of Postgres connection slots if you raise this value too high. ### MigrateOnStartup ```toml MigrateOnStartup = true # Default ``` MigrateOnStartup controls whether a Chainlink node will attempt to automatically migrate the database on boot. If you want more control over your database migration process, set this variable to `false` and manually migrate the database using the CLI `migrate` command instead. ## Database.Backup ```toml [Database.Backup] Mode = 'none' # Default Dir = 'test/backup/dir' # Example OnVersionUpgrade = true # Default Frequency = '1h' # Default ``` As a best practice, take regular database backups in case of accidental data loss. This best practice is especially important when you upgrade your Chainlink node to a new version. Chainlink nodes support automated database backups to make this process easier. NOTE: Dumps can cause high load and massive database latencies, which will negatively impact the normal functioning of the Chainlink node. For this reason, it is recommended to set a `URL` and point it to a read replica if you enable automatic backups. ### Mode ```toml Mode = 'none' # Default ``` Mode sets the type of automatic database backup, which can be one of *none*, `lite`, or `full`. If enabled, the Chainlink node will always dump a backup on every boot before running migrations. Additionally, it will automatically take database backups that overwrite the backup file for the given version at regular intervals if `Frequency` is set to a non-zero interval. *none* - Disables backups. `lite` - Dumps small tables including configuration and keys that are essential for the node to function, which excludes historical data like job runs, transaction history, etc. `full` - Dumps the entire database. It will write to a file like `'Dir'/backup/cl_backup_.dump`. There is one backup dump file per version of the Chainlink node. If you upgrade the node, it will keep the backup taken right before the upgrade migration so you can restore to an older version if necessary. ### Dir ```toml Dir = 'test/backup/dir' # Example ``` Dir sets the directory to use for saving the backup file. Use this if you want to save the backup file in a directory other than the default ROOT directory. ### OnVersionUpgrade ```toml OnVersionUpgrade = true # Default ``` OnVersionUpgrade enables automatic backups of the database before running migrations, when you are upgrading to a new version. ### Frequency ```toml Frequency = '1h' # Default ``` Frequency sets the interval for database dumps, if set to a positive duration and `Mode` is not *none*. Set to `0` to disable periodic backups. ## Database.Listener ```toml [Database.Listener] MaxReconnectDuration = '10m' # Default MinReconnectInterval = '1m' # Default FallbackPollInterval = '30s' # Default ``` These settings control the postgres event listener. ### MaxReconnectDuration ```toml MaxReconnectDuration = '10m' # Default ``` MaxReconnectDuration is the maximum duration to wait between reconnect attempts. ### MinReconnectInterval ```toml MinReconnectInterval = '1m' # Default ``` MinReconnectInterval controls the duration to wait before trying to re-establish the database connection after connection loss. After each consecutive failure this interval is doubled, until MaxReconnectInterval is reached. Successfully completing the connection establishment procedure resets the interval back to MinReconnectInterval. ### FallbackPollInterval ```toml FallbackPollInterval = '30s' # Default ``` FallbackPollInterval controls how often clients should manually poll as a fallback in case the postgres event was missed/dropped. ## Database.Lock ```toml [Database.Lock] Enabled = true # Default LeaseDuration = '10s' # Default LeaseRefreshInterval = '1s' # Default ``` Ideally, you should use a container orchestration system like [Kubernetes](https://kubernetes.io/) to ensure that only one Chainlink node instance can ever use a specific Postgres database. However, some node operators do not have the technical capacity to do this. Common use cases run multiple Chainlink node instances in failover mode as recommended by our official documentation. The first instance takes a lock on the database and subsequent instances will wait trying to take this lock in case the first instance fails. - If your nodes or applications hold locks open for several hours or days, Postgres is unable to complete internal cleanup tasks. The Postgres maintainers explicitly discourage holding locks open for long periods of time. Because of the complications with advisory locks, Chainlink nodes with v2.0 and later only support `lease` locking mode. The `lease` locking mode works using the following process: - Node A creates one row in the database with the client ID and updates it once per second. - Node B spinlocks and checks periodically to see if the client ID is too old. If the client ID is not updated after a period of time, node B assumes that node A failed and takes over. Node B becomes the owner of the row and updates the client ID once per second. - If node A comes back, it attempts to take out a lease, realizes that the database has been leased to another process, and exits the entire application immediately. ### Enabled ```toml Enabled = true # Default ``` Enabled enables the database lock. ### LeaseDuration ```toml LeaseDuration = '10s' # Default ``` LeaseDuration is how long the lease lock will last before expiring. ### LeaseRefreshInterval ```toml LeaseRefreshInterval = '1s' # Default ``` LeaseRefreshInterval determines how often to refresh the lease lock. Also controls how often a standby node will check to see if it can grab the lease. ## TelemetryIngress ```toml [TelemetryIngress] UniConn = false # Default Logging = false # Default BufferSize = 100 # Default MaxBatchSize = 50 # Default SendInterval = '500ms' # Default SendTimeout = '10s' # Default UseBatchSend = true # Default ChipIngressEnabled = false # Default ``` ### UniConn ```toml UniConn = false # Default ``` UniConn toggles which ws connection style is used. ### Logging ```toml Logging = false # Default ``` Logging toggles verbose logging of the raw telemetry messages being sent. ### BufferSize ```toml BufferSize = 100 # Default ``` BufferSize is the number of telemetry messages to buffer before dropping new ones. ### MaxBatchSize ```toml MaxBatchSize = 50 # Default ``` MaxBatchSize is the maximum number of messages to batch into one telemetry request. ### SendInterval ```toml SendInterval = '500ms' # Default ``` SendInterval determines how often batched telemetry is sent to the ingress server. ### SendTimeout ```toml SendTimeout = '10s' # Default ``` SendTimeout is the max duration to wait for the request to complete when sending batch telemetry. ### UseBatchSend ```toml UseBatchSend = true # Default ``` UseBatchSend toggles sending telemetry to the ingress server using the batch client. ### ChipIngressEnabled ```toml ChipIngressEnabled = false # Default ``` ChipIngressEnabled enables sending telemetry to CHIP Ingress. ## TelemetryIngress.Endpoints ```toml [[TelemetryIngress.Endpoints]] # Example Network = 'EVM' # Example ChainID = '111551111' # Example ServerPubKey = 'test-pub-key-111551111-evm' # Example URL = 'localhost-111551111-evm:9000' # Example ``` ### Network ```toml Network = 'EVM' # Example ``` Network aka EVM, Solana, Starknet ### ChainID ```toml ChainID = '111551111' # Example ``` ChainID of the network ### ServerPubKey ```toml ServerPubKey = 'test-pub-key-111551111-evm' # Example ``` ServerPubKey is the public key of the telemetry server. ### URL ```toml URL = 'localhost-111551111-evm:9000' # Example ``` URL is where to send telemetry. ## AuditLogger ```toml [AuditLogger] Enabled = false # Default ForwardToUrl = 'http://localhost:9898' # Example JsonWrapperKey = 'event' # Example Headers = ['Authorization: token', 'X-SomeOther-Header: value with spaces | and a bar+*'] # Example ``` ### Enabled ```toml Enabled = false # Default ``` Enabled determines if this logger should be configured at all ### ForwardToUrl ```toml ForwardToUrl = 'http://localhost:9898' # Example ``` ForwardToUrl is where you want to forward logs to ### JsonWrapperKey ```toml JsonWrapperKey = 'event' # Example ``` JsonWrapperKey if set wraps the map of data under another single key to make parsing easier ### Headers ```toml Headers = ['Authorization: token', 'X-SomeOther-Header: value with spaces | and a bar+*'] # Example ``` Headers is the set of headers you wish to pass along with each request ## Log ```toml [Log] Level = 'info' # Default JSONConsole = false # Default UnixTS = false # Default ``` ### Level ```toml Level = 'info' # Default ``` Level determines only what is printed on the screen/console. This configuration does not apply to the logs that are recorded in a file (see [`Log.File`](#logfile) for more details). The available levels are: - "debug": Useful for forensic debugging of issues. - "info": High-level informational messages. (default) - "warn": A mild error occurred that might require non-urgent action. Check these warnings semi-regularly to see if any of them require attention. These warnings usually happen due to factors outside of the control of the node operator. Examples: Unexpected responses from a remote API or misleading networking errors. - "error": An unexpected error occurred during the regular operation of a well-maintained node. Node operators might need to take action to remedy this error. Check these regularly to see if any of them require attention. Examples: Use of deprecated configuration options or incorrectly configured settings that cause a job to fail. - "crit": A critical error occurred. The node might be unable to function. Node operators should take immediate action to fix these errors. Examples: The node could not boot because a network socket could not be opened or the database became inaccessible. - "panic": An exceptional error occurred that could not be handled. If the node is unresponsive, node operators should try to restart their nodes and notify the Chainlink team of a potential bug. - "fatal": The node encountered an unrecoverable problem and had to exit. ### JSONConsole ```toml JSONConsole = false # Default ``` JSONConsole enables JSON logging. Otherwise, the log is saved in a human-friendly console format. ### UnixTS ```toml UnixTS = false # Default ``` UnixTS enables legacy unix timestamps. Previous versions of Chainlink nodes wrote JSON logs with a unix timestamp. As of v1.1.0 and up, the default has changed to use ISO8601 timestamps for better readability. ## Log.File ```toml [Log.File] Dir = '/my/log/directory' # Example MaxSize = '5120mb' # Default MaxAgeDays = 0 # Default MaxBackups = 1 # Default ``` ### Dir ```toml Dir = '/my/log/directory' # Example ``` Dir sets the log directory. By default, Chainlink nodes write log data to `$ROOT/log.jsonl`. ### MaxSize ```toml MaxSize = '5120mb' # Default ``` MaxSize determines the log file's max size before file rotation. Having this not set or set to a value smaller than 1Mb will disable logging to disk. If your disk doesn't have enough disk space, the logging will pause and the application will log errors until space is available again. Values must have suffixes with a unit like: `5120mb` (5,120 megabytes). If no unit suffix is provided, the value defaults to `b` (bytes). The list of valid unit suffixes are: - b (bytes) - kb (kilobytes) - mb (megabytes) - gb (gigabytes) - tb (terabytes) ### MaxAgeDays ```toml MaxAgeDays = 0 # Default ``` MaxAgeDays determines the log file's max age in days before file rotation. Keeping this config with the default value will not remove log files based on age. ### MaxBackups ```toml MaxBackups = 1 # Default ``` MaxBackups determines the maximum number of old log files to retain. Keeping this config with the default value retains all old log files. The `MaxAgeDays` variable can still cause them to get deleted. ## WebServer ```toml [WebServer] AuthenticationMethod = 'local' # Default AllowOrigins = 'http://localhost:3000,http://localhost:6688' # Default BridgeCacheTTL = '0s' # Default BridgeResponseURL = 'https://my-chainlink-node.example.com:6688' # Example HTTPWriteTimeout = '10s' # Default HTTPPort = 6688 # Default SecureCookies = true # Default SessionTimeout = '15m' # Default SessionReaperExpiration = '240h' # Default HTTPMaxSize = '32768b' # Default StartTimeout = '15s' # Default ListenIP = '0.0.0.0' # Default ``` ### AuthenticationMethod ```toml AuthenticationMethod = 'local' # Default ``` AuthenticationMethod defines which pluggable auth interface to use for user login and role assumption. Options include 'local' and 'ldap'. See docs for more details ### AllowOrigins ```toml AllowOrigins = 'http://localhost:3000,http://localhost:6688' # Default ``` AllowOrigins controls the URLs Chainlink nodes emit in the `Allow-Origins` header of its API responses. The setting can be a comma-separated list with no spaces. You might experience CORS issues if this is not set correctly. You should set this to the external URL that you use to access the Chainlink UI. You can set `AllowOrigins = '*'` to allow the UI to work from any URL, but it is recommended for security reasons to make it explicit instead. ### BridgeCacheTTL ```toml BridgeCacheTTL = '0s' # Default ``` BridgeCacheTTL controls the cache TTL for all bridge tasks to use old values in newer observations in case of intermittent failure. It's disabled by default. ### BridgeResponseURL ```toml BridgeResponseURL = 'https://my-chainlink-node.example.com:6688' # Example ``` BridgeResponseURL defines the URL for bridges to send a response to. This *must* be set when using async external adapters. Usually this will be the same as the URL/IP and port you use to connect to the Chainlink UI. ### HTTPWriteTimeout ```toml HTTPWriteTimeout = '10s' # Default ``` HTTPWriteTimeout controls how long the Chainlink node's API server can hold a socket open for writing a response to an HTTP request. Sometimes, this must be increased for pprof. ### HTTPPort ```toml HTTPPort = 6688 # Default ``` HTTPPort is the port used for the Chainlink Node API, [CLI](/docs/configuration-variables/#cli-client), and GUI. ### SecureCookies ```toml SecureCookies = true # Default ``` SecureCookies requires the use of secure cookies for authentication. Set to false to enable standard HTTP requests along with `TLSPort = 0`. ### SessionTimeout ```toml SessionTimeout = '15m' # Default ``` SessionTimeout determines the amount of idle time to elapse before session cookies expire. This signs out GUI users from their sessions. ### SessionReaperExpiration ```toml SessionReaperExpiration = '240h' # Default ``` SessionReaperExpiration represents how long an API session lasts before expiring and requiring a new login. ### HTTPMaxSize ```toml HTTPMaxSize = '32768b' # Default ``` HTTPMaxSize defines the maximum size for HTTP requests and responses made by the node server. ### StartTimeout ```toml StartTimeout = '15s' # Default ``` StartTimeout defines the maximum amount of time the node will wait for a server to start. ### ListenIP ```toml ListenIP = '0.0.0.0' # Default ``` ListenIP specifies the IP to bind the HTTP server to ## WebServer.OIDC ```toml [WebServer.OIDC] ClientID = 'abcd1234' # Example ProviderURL = 'https://id[.]example[.]com/oauth2/default' # Example RedirectURL = 'http://localhost:8080/signin' # Example ClaimName = 'groups' # Default AdminClaim = 'NodeAdmins' # Default EditClaim = 'NodeEditors' # Default RunClaim = 'NodeRunners' # Default ReadClaim = 'NodeReadOnly' # Default SessionTimeout = '15m0s' # Default UserAPITokenEnabled = false # Default UserAPITokenDuration = '240h0m0s' # Default ``` Optional OIDC config if WebServer.AuthenticationMethod is set to 'oidc' ### ClientID ```toml ClientID = 'abcd1234' # Example ``` ClientID is the ID of the OIDC application registered with the identity provider ### ProviderURL ```toml ProviderURL = 'https://id[.]example[.]com/oauth2/default' # Example ``` ProviderURL is the base URL for your OIDC Identity provider. ### RedirectURL ```toml RedirectURL = 'http://localhost:8080/signin' # Example ``` RedirectURL will always be \/signin. This needs to match the configuration on the provider side. ### ClaimName ```toml ClaimName = 'groups' # Default ``` ClaimName is the name of the field in the id_token where to find the user's ID claims. ### AdminClaim ```toml AdminClaim = 'NodeAdmins' # Default ``` AdminClaim is string label of the id claim that maps the core node's 'Admin' role ### EditClaim ```toml EditClaim = 'NodeEditors' # Default ``` EditClaim is string label of the id claim that maps the core node's 'Edit' role ### RunClaim ```toml RunClaim = 'NodeRunners' # Default ``` RunClaim is string label of the id claim that maps the core node's 'Run' role ### ReadClaim ```toml ReadClaim = 'NodeReadOnly' # Default ``` ReadClaim is string label of the id claim that maps the core node's 'Read' role ### SessionTimeout ```toml SessionTimeout = '15m0s' # Default ``` SessionTimeout determines the amount of idle time to elapse before session cookies expire. This signs out GUI users from their sessions. ### UserAPITokenEnabled ```toml UserAPITokenEnabled = false # Default ``` UserAPITokenEnabled enables the users to issue API tokens with the same access of their role ### UserAPITokenDuration ```toml UserAPITokenDuration = '240h0m0s' # Default ``` UserAPITokenDuration is the duration of time an API token is active for before expiring ## WebServer.LDAP ```toml [WebServer.LDAP] ServerTLS = true # Default SessionTimeout = '15m0s' # Default QueryTimeout = '2m0s' # Default BaseUserAttr = 'uid' # Default BaseDN = 'dc=custom,dc=example,dc=com' # Example UsersDN = 'ou=users' # Default GroupsDN = 'ou=groups' # Default ActiveAttribute = '' # Default ActiveAttributeAllowedValue = '' # Default AdminUserGroupCN = 'NodeAdmins' # Default EditUserGroupCN = 'NodeEditors' # Default RunUserGroupCN = 'NodeRunners' # Default ReadUserGroupCN = 'NodeReadOnly' # Default UserApiTokenEnabled = false # Default UserAPITokenDuration = '240h0m0s' # Default UpstreamSyncInterval = '0s' # Default UpstreamSyncRateLimit = '2m0s' # Default ``` Optional LDAP config if WebServer.AuthenticationMethod is set to 'ldap' LDAP queries are all parameterized to support custom LDAP 'dn', 'cn', and attributes ### ServerTLS ```toml ServerTLS = true # Default ``` ServerTLS defines the option to require the secure ldaps ### SessionTimeout ```toml SessionTimeout = '15m0s' # Default ``` SessionTimeout determines the amount of idle time to elapse before session cookies expire. This signs out GUI users from their sessions. ### QueryTimeout ```toml QueryTimeout = '2m0s' # Default ``` QueryTimeout defines how long queries should wait before timing out, defined in seconds ### BaseUserAttr ```toml BaseUserAttr = 'uid' # Default ``` BaseUserAttr defines the base attribute used to populate LDAP queries such as "uid=$", default is example ### BaseDN ```toml BaseDN = 'dc=custom,dc=example,dc=com' # Example ``` BaseDN defines the base LDAP 'dn' search filter to apply to every LDAP query, replace example,com with the appropriate LDAP server's structure ### UsersDN ```toml UsersDN = 'ou=users' # Default ``` UsersDN defines the 'dn' query to use when querying for the 'users' 'ou' group ### GroupsDN ```toml GroupsDN = 'ou=groups' # Default ``` GroupsDN defines the 'dn' query to use when querying for the 'groups' 'ou' group ### ActiveAttribute ```toml ActiveAttribute = '' # Default ``` ActiveAttribute is an optional user field to check truthiness for if a user is valid/active. This is only required if the LDAP provider lists inactive users as members of groups ### ActiveAttributeAllowedValue ```toml ActiveAttributeAllowedValue = '' # Default ``` ActiveAttributeAllowedValue is the value to check against for the above optional user attribute ### AdminUserGroupCN ```toml AdminUserGroupCN = 'NodeAdmins' # Default ``` AdminUserGroupCN is the LDAP 'cn' of the LDAP group that maps the core node's 'Admin' role ### EditUserGroupCN ```toml EditUserGroupCN = 'NodeEditors' # Default ``` EditUserGroupCN is the LDAP 'cn' of the LDAP group that maps the core node's 'Edit' role ### RunUserGroupCN ```toml RunUserGroupCN = 'NodeRunners' # Default ``` RunUserGroupCN is the LDAP 'cn' of the LDAP group that maps the core node's 'Run' role ### ReadUserGroupCN ```toml ReadUserGroupCN = 'NodeReadOnly' # Default ``` ReadUserGroupCN is the LDAP 'cn' of the LDAP group that maps the core node's 'Read' role ### UserApiTokenEnabled ```toml UserApiTokenEnabled = false # Default ``` UserApiTokenEnabled enables the users to issue API tokens with the same access of their role ### UserAPITokenDuration ```toml UserAPITokenDuration = '240h0m0s' # Default ``` UserAPITokenDuration is the duration of time an API token is active for before expiring ### UpstreamSyncInterval ```toml UpstreamSyncInterval = '0s' # Default ``` UpstreamSyncInterval is the interval at which the background LDAP sync task will be called. A '0s' value disables the background sync being run on an interval. This check is already performed during login/logout actions, all sessions and API tokens stored in the local ldap tables are updated to match the remote server ### UpstreamSyncRateLimit ```toml UpstreamSyncRateLimit = '2m0s' # Default ``` UpstreamSyncRateLimit defines a duration to limit the number of query/API calls to the upstream LDAP provider. It prevents the sync functionality from being called multiple times within the defined duration ## WebServer.RateLimit ```toml [WebServer.RateLimit] Authenticated = 1000 # Default AuthenticatedPeriod = '1m' # Default Unauthenticated = 5 # Default UnauthenticatedPeriod = '20s' # Default ``` ### Authenticated ```toml Authenticated = 1000 # Default ``` Authenticated defines the threshold to which authenticated requests get limited. More than this many authenticated requests per `AuthenticatedRateLimitPeriod` will be rejected. ### AuthenticatedPeriod ```toml AuthenticatedPeriod = '1m' # Default ``` AuthenticatedPeriod defines the period to which authenticated requests get limited. ### Unauthenticated ```toml Unauthenticated = 5 # Default ``` Unauthenticated defines the threshold to which authenticated requests get limited. More than this many unauthenticated requests per `UnAuthenticatedRateLimitPeriod` will be rejected. ### UnauthenticatedPeriod ```toml UnauthenticatedPeriod = '20s' # Default ``` UnauthenticatedPeriod defines the period to which unauthenticated requests get limited. ## WebServer.MFA ```toml [WebServer.MFA] RPID = 'localhost' # Example RPOrigin = 'http://localhost:6688/' # Example ``` The Operator UI frontend supports enabling Multi Factor Authentication via Webauthn per account. When enabled, logging in will require the account password and a hardware or OS security key such as Yubikey. To enroll, log in to the operator UI and click the circle purple profile button at the top right and then click **Register MFA Token**. Tap your hardware security key or use the OS public key management feature to enroll a key. Next time you log in, this key will be required to authenticate. ### RPID ```toml RPID = 'localhost' # Example ``` RPID is the FQDN of where the Operator UI is served. When serving locally, the value should be `localhost`. ### RPOrigin ```toml RPOrigin = 'http://localhost:6688/' # Example ``` RPOrigin is the origin URL where WebAuthn requests initiate, including scheme and port. When serving locally, the value should be `http://localhost:6688/`. ## WebServer.TLS ```toml [WebServer.TLS] CertPath = '~/.cl/certs' # Example Host = 'tls-host' # Example KeyPath = '/home/$USER/.chainlink/tls/server.key' # Example HTTPSPort = 6689 # Default ForceRedirect = false # Default ListenIP = '0.0.0.0' # Default ``` The TLS settings apply only if you want to enable TLS security on your Chainlink node. ### CertPath ```toml CertPath = '~/.cl/certs' # Example ``` CertPath is the location of the TLS certificate file. ### Host ```toml Host = 'tls-host' # Example ``` Host is the hostname configured for TLS to be used by the Chainlink node. This is useful if you configured a domain name specific for your Chainlink node. ### KeyPath ```toml KeyPath = '/home/$USER/.chainlink/tls/server.key' # Example ``` KeyPath is the location of the TLS private key file. ### HTTPSPort ```toml HTTPSPort = 6689 # Default ``` HTTPSPort is the port used for HTTPS connections. Set this to `0` to disable HTTPS. Disabling HTTPS also relieves Chainlink nodes of the requirement for a TLS certificate. ### ForceRedirect ```toml ForceRedirect = false # Default ``` ForceRedirect forces TLS redirect for unencrypted connections. ### ListenIP ```toml ListenIP = '0.0.0.0' # Default ``` ListenIP specifies the IP to bind the HTTPS server to ## JobDistributor ```toml [JobDistributor] DisplayName = "cre-workflow-1-chainlinklabs" # Example ``` Job Distributor stores the configuration for Job Distributor ### DisplayName ```toml DisplayName = "cre-workflow-1-chainlinklabs" # Example ``` DisplayName is a friendly, fully qualified name set by the NOP to clearly identify the node in Job Distributor. It should uniquely and unambiguously represent the node for clear communication between Job Distributor maintainers/operators ↔ NOPs. ## JobPipeline ```toml [JobPipeline] ExternalInitiatorsEnabled = false # Default MaxRunDuration = '10m' # Default MaxSuccessfulRuns = 10000 # Default ReaperInterval = '1h' # Default ReaperThreshold = '24h' # Default ResultWriteQueueDepth = 100 # Default VerboseLogging = true # Default ``` ### ExternalInitiatorsEnabled ```toml ExternalInitiatorsEnabled = false # Default ``` ExternalInitiatorsEnabled enables the External Initiator feature. If disabled, `webhook` jobs can ONLY be initiated by a logged-in user. If enabled, `webhook` jobs can be initiated by a whitelisted external initiator. ### MaxRunDuration ```toml MaxRunDuration = '10m' # Default ``` MaxRunDuration is the maximum time allowed for a single job run. If it takes longer, it will exit early and be marked errored. If set to zero, disables the time limit completely. ### MaxSuccessfulRuns ```toml MaxSuccessfulRuns = 10000 # Default ``` MaxSuccessfulRuns caps the number of completed successful runs per pipeline spec in the database. You can set it to zero as a performance optimisation; this will avoid saving any successful run. Note this is not a hard cap, it can drift slightly larger than this but not by more than 5% or so. ### ReaperInterval ```toml ReaperInterval = '1h' # Default ``` ReaperInterval controls how often the job pipeline reaper will run to delete completed jobs older than ReaperThreshold, in order to keep database size manageable. Set to `0` to disable the periodic reaper. ### ReaperThreshold ```toml ReaperThreshold = '24h' # Default ``` ReaperThreshold determines the age limit for job runs. Completed job runs older than this will be automatically purged from the database. ### ResultWriteQueueDepth ```toml ResultWriteQueueDepth = 100 # Default ``` ResultWriteQueueDepth controls how many writes will be buffered before subsequent writes are dropped, for jobs that write results asynchronously for performance reasons, such as OCR. ### VerboseLogging ```toml VerboseLogging = true # Default ``` VerboseLogging enables detailed logging of pipeline execution steps. This can be useful for debugging failed runs without relying on the UI or database. You may disable if this results in excessive log volume. ## JobPipeline.HTTPRequest ```toml [JobPipeline.HTTPRequest] DefaultTimeout = '15s' # Default MaxSize = '32768' # Default ``` ### DefaultTimeout ```toml DefaultTimeout = '15s' # Default ``` DefaultTimeout defines the default timeout for HTTP requests made by `http` and `bridge` adapters. ### MaxSize ```toml MaxSize = '32768' # Default ``` MaxSize defines the maximum size for HTTP requests and responses made by `http` and `bridge` adapters. ## FluxMonitor ```toml [FluxMonitor] DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default ``` ### DefaultTransactionQueueDepth ```toml DefaultTransactionQueueDepth = 1 # Default ``` DefaultTransactionQueueDepth controls the queue size for `DropOldestStrategy` in Flux Monitor. Set to 0 to use `SendEvery` strategy instead. ### SimulateTransactions ```toml SimulateTransactions = false # Default ``` SimulateTransactions enables transaction simulation for Flux Monitor. ## OCR2 ```toml [OCR2] Enabled = false # Default ContractConfirmations = 3 # Default BlockchainTimeout = '20s' # Default ContractPollInterval = '1m' # Default ContractSubscribeInterval = '2m' # Default ContractTransmitterTransmitTimeout = '10s' # Default DatabaseTimeout = '10s' # Default KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000' # Example CaptureEATelemetry = false # Default CaptureAutomationCustomTelemetry = true # Default AllowNoBootstrappers = false # Default DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default TraceLogging = false # Default SampleTelemetry = false # Default KeyValueStoreRootDir = '~/.chainlink-data' # Default ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enables OCR2 jobs. ### ContractConfirmations ```toml ContractConfirmations = 3 # Default ``` ContractConfirmations is the number of block confirmations to wait for before enacting an on-chain configuration change. This value doesn't need to be very high (in particular, it does not need to protect against malicious re-orgs). Since configuration changes create some overhead, and mini-reorgs are fairly common, recommended values are between two and ten. Malicious re-orgs are not any more of concern here than they are in blockchain applications in general: Since nodes check the contract for the latest config every ContractConfigTrackerPollInterval.Seconds(), they will come to a common view of the current config within any interval longer than that, as long as the latest setConfig transaction in the longest chain is stable. They will thus be able to continue reporting after the poll interval, unless an adversary is able to repeatedly re-org the transaction out during every poll interval, which would amount to the capability to censor any transaction. Note that 1 confirmation implies that the transaction/event has been mined in one block. 0 confirmations would imply that the event would be recognised before it has even been mined, which is not currently supported. e.g. Current block height: 42 Changed in block height: 43 Contract config confirmations: 1 STILL PENDING Current block height: 43 Changed in block height: 43 Contract config confirmations: 1 CONFIRMED ### BlockchainTimeout ```toml BlockchainTimeout = '20s' # Default ``` BlockchainTimeout is the timeout for blockchain queries (mediated through ContractConfigTracker and ContractTransmitter). (This is necessary because an oracle's operations are serialized, so blocking forever on a chain interaction would break the oracle.) ### ContractPollInterval ```toml ContractPollInterval = '1m' # Default ``` ContractPollInterval is the polling interval at which ContractConfigTracker is queried for# updated on-chain configurations. Recommended values are between fifteen seconds and two minutes. ### ContractSubscribeInterval ```toml ContractSubscribeInterval = '2m' # Default ``` ContractSubscribeInterval is the interval at which we try to establish a subscription on ContractConfigTracker if one doesn't exist. Recommended values are between two and five minutes. ### ContractTransmitterTransmitTimeout ```toml ContractTransmitterTransmitTimeout = '10s' # Default ``` ContractTransmitterTransmitTimeout is the timeout for ContractTransmitter.Transmit calls. ### DatabaseTimeout ```toml DatabaseTimeout = '10s' # Default ``` DatabaseTimeout is the timeout for database interactions. (This is necessary because an oracle's operations are serialized, so blocking forever on an observation would break the oracle.) ### KeyBundleID ```toml KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000' # Example ``` KeyBundleID is a sha256 hexadecimal hash identifier. ### CaptureEATelemetry ```toml CaptureEATelemetry = false # Default ``` CaptureEATelemetry toggles collecting extra information from External Adapters ### CaptureAutomationCustomTelemetry ```toml CaptureAutomationCustomTelemetry = true # Default ``` CaptureAutomationCustomTelemetry toggles collecting automation specific telemetry ### AllowNoBootstrappers ```toml AllowNoBootstrappers = false # Default ``` AllowNoBootstrappers enables single-node consensus without bootstrapper nodes (i.e. f=0, n=1) ### DefaultTransactionQueueDepth ```toml DefaultTransactionQueueDepth = 1 # Default ``` DefaultTransactionQueueDepth controls the queue size for `DropOldestStrategy` in OCR2. Set to 0 to use `SendEvery` strategy instead. ### SimulateTransactions ```toml SimulateTransactions = false # Default ``` SimulateTransactions enables transaction simulation for OCR2. ### TraceLogging ```toml TraceLogging = false # Default ``` TraceLogging enables trace level logging. ### SampleTelemetry ```toml SampleTelemetry = false # Default ``` SampleTelemetry enables telemetry sampling. ### KeyValueStoreRootDir ```toml KeyValueStoreRootDir = '~/.chainlink-data' # Default ``` KeyValueStoreRootDir is the root directory for the key-value store used by OCR3.1. This directory must be writable by the Chainlink node process and should support long-term persistence. ## OCR ```toml [OCR] Enabled = false # Default ObservationTimeout = '5s' # Default BlockchainTimeout = '20s' # Default ContractPollInterval = '1m' # Default ContractSubscribeInterval = '2m' # Default DefaultTransactionQueueDepth = 1 # Default KeyBundleID = 'acdd42797a8b921b2910497badc5000600000000000000000000000000000000' # Example SimulateTransactions = false # Default TransmitterAddress = '0xa0788FC17B1dEe36f057c42B6F373A34B014687e' # Example CaptureEATelemetry = false # Default TraceLogging = false # Default ConfigLogValidation = false # Default ``` This section applies only if you are running off-chain reporting jobs. ### Enabled ```toml Enabled = false # Default ``` Enabled enables OCR jobs. ### ObservationTimeout ```toml ObservationTimeout = '5s' # Default ``` ObservationTimeout is the timeout for making observations using the DataSource.Observe method. (This is necessary because an oracle's operations are serialized, so blocking forever on an observation would break the oracle.) ### BlockchainTimeout ```toml BlockchainTimeout = '20s' # Default ``` BlockchainTimeout is the timeout for blockchain queries (mediated through ContractConfigTracker and ContractTransmitter). (This is necessary because an oracle's operations are serialized, so blocking forever on a chain interaction would break the oracle.) ### ContractPollInterval ```toml ContractPollInterval = '1m' # Default ``` ContractPollInterval is the polling interval at which ContractConfigTracker is queried for updated on-chain configurations. Recommended values are between fifteen seconds and two minutes. ### ContractSubscribeInterval ```toml ContractSubscribeInterval = '2m' # Default ``` ContractSubscribeInterval is the interval at which we try to establish a subscription on ContractConfigTracker if one doesn't exist. Recommended values are between two and five minutes. ### DefaultTransactionQueueDepth ```toml DefaultTransactionQueueDepth = 1 # Default ``` DefaultTransactionQueueDepth controls the queue size for `DropOldestStrategy` in OCR. Set to 0 to use `SendEvery` strategy instead. ### KeyBundleID ```toml KeyBundleID = 'acdd42797a8b921b2910497badc5000600000000000000000000000000000000' # Example ``` KeyBundleID is the default key bundle ID to use for OCR jobs. If you have an OCR job that does not explicitly specify a key bundle ID, it will fall back to this value. ### SimulateTransactions ```toml SimulateTransactions = false # Default ``` SimulateTransactions enables transaction simulation for OCR. ### TransmitterAddress ```toml TransmitterAddress = '0xa0788FC17B1dEe36f057c42B6F373A34B014687e' # Example ``` TransmitterAddress is the default sending address to use for OCR. If you have an OCR job that does not explicitly specify a transmitter address, it will fall back to this value. ### CaptureEATelemetry ```toml CaptureEATelemetry = false # Default ``` CaptureEATelemetry toggles collecting extra information from External Adapters ### TraceLogging ```toml TraceLogging = false # Default ``` TraceLogging enables trace level logging. ### ConfigLogValidation ```toml ConfigLogValidation = false # Default ``` ConfigLogValidation ensures contract configuration logs are accessible when validating OCR jobs. Enable this when using RPC providers that don't maintain complete historical logs. ## P2P ```toml [P2P] IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default EnableExperimentalRageP2P = false # Default ``` P2P has a versioned networking stack. Currently only `[P2P.V2]` is supported. All nodes in the OCR network should share the same networking stack. ### IncomingMessageBufferSize ```toml IncomingMessageBufferSize = 10 # Default ``` IncomingMessageBufferSize is the per-remote number of incoming messages to buffer. Any additional messages received on top of those already in the queue will be dropped. ### OutgoingMessageBufferSize ```toml OutgoingMessageBufferSize = 10 # Default ``` OutgoingMessageBufferSize is the per-remote number of outgoing messages to buffer. Any additional messages send on top of those already in the queue will displace the oldest. NOTE: OutgoingMessageBufferSize should be comfortably smaller than remote's IncomingMessageBufferSize to give the remote enough space to process them all in case we regained connection and now send a bunch at once ### PeerID ```toml PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example ``` PeerID is the default peer ID to use for OCR jobs. If unspecified, uses the first available peer ID. ### TraceLogging ```toml TraceLogging = false # Default ``` TraceLogging enables trace level logging. ### EnableExperimentalRageP2P ```toml EnableExperimentalRageP2P = false # Default ``` EnableExperimentalRageP2P needs to be enabled for ocr3.1 components ## P2P.V2 ```toml [P2P.V2] Enabled = true # Default AnnounceAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example DefaultBootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example DeltaDial = '15s' # Default DeltaReconcile = '1m' # Default ListenAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` ### Enabled ```toml Enabled = true # Default ``` Enabled enables P2P V2. Note: V1.Enabled is true by default, so it must be set false in order to run V2 only. ### AnnounceAddresses ```toml AnnounceAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` AnnounceAddresses is the addresses the peer will advertise on the network in `host:port` form as accepted by the TCP version of Go's `net.Dial`. The addresses should be reachable by other nodes on the network. When attempting to connect to another node, a node will attempt to dial all of the other node's AnnounceAddresses in round-robin fashion. ### DefaultBootstrappers ```toml DefaultBootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example ``` DefaultBootstrappers is the default bootstrapper peers for libocr's v2 networking stack. Oracle nodes typically only know each other's PeerIDs, but not their hostnames, IP addresses, or ports. DefaultBootstrappers are special nodes that help other nodes discover each other's `AnnounceAddresses` so they can communicate. Nodes continuously attempt to connect to bootstrappers configured in here. When a node wants to connect to another node (which it knows only by PeerID, but not by address), it discovers the other node's AnnounceAddresses from communications received from its DefaultBootstrappers or other discovered nodes. To facilitate discovery, nodes will regularly broadcast signed announcements containing their PeerID and AnnounceAddresses. ### DeltaDial ```toml DeltaDial = '15s' # Default ``` DeltaDial controls how far apart Dial attempts are ### DeltaReconcile ```toml DeltaReconcile = '1m' # Default ``` DeltaReconcile controls how often a Reconcile message is sent to every peer. ### ListenAddresses ```toml ListenAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` ListenAddresses is the addresses the peer will listen to on the network in `host:port` form as accepted by `net.Listen()`, but the host and port must be fully specified and cannot be empty. You can specify `0.0.0.0` (IPv4) or `::` (IPv6) to listen on all interfaces, but that is not recommended. ## Capabilities.RateLimit ```toml [Capabilities.RateLimit] GlobalRPS = 200 # Default GlobalBurst = 200 # Default PerSenderRPS = 200 # Default PerSenderBurst = 200 # Default ``` ### GlobalRPS ```toml GlobalRPS = 200 # Default ``` GlobalRPS is the global rate limit for the dispatcher. ### GlobalBurst ```toml GlobalBurst = 200 # Default ``` GlobalBurst is the global burst limit for the dispatcher. ### PerSenderRPS ```toml PerSenderRPS = 200 # Default ``` PerSenderRPS is the per-sender rate limit for the dispatcher. ### PerSenderBurst ```toml PerSenderBurst = 200 # Default ``` PerSenderBurst is the per-sender burst limit for the dispatcher. ## Capabilities.WorkflowRegistry ```toml [Capabilities.WorkflowRegistry] Address = '0x0' # Example NetworkID = 'evm' # Default ChainID = '1' # Default ContractVersion = '1.0.0' # Default MaxBinarySize = '20.00mb' # Default MaxEncryptedSecretsSize = '26.40kb' # Default MaxConfigSize = '50.00kb' # Default SyncStrategy = 'event' # Default MaxConcurrency = 12 # Default ``` ### Address ```toml Address = '0x0' # Example ``` Address is the address for the workflow registry contract. ### NetworkID ```toml NetworkID = 'evm' # Default ``` NetworkID identifies the target network where the remote registry is located. ### ChainID ```toml ChainID = '1' # Default ``` ChainID identifies the target chain id where the remote registry is located. ### ContractVersion ```toml ContractVersion = '1.0.0' # Default ``` ContractVersion identifies semantic version of the WorkflowRegistry contract. ### MaxBinarySize ```toml MaxBinarySize = '20.00mb' # Default ``` MaxBinarySize is the maximum size of a binary that can be fetched from the registry. ### MaxEncryptedSecretsSize ```toml MaxEncryptedSecretsSize = '26.40kb' # Default ``` MaxEncryptedSecretsSize is the maximum size of encrypted secrets that can be fetched from the given secrets url. ### MaxConfigSize ```toml MaxConfigSize = '50.00kb' # Default ``` MaxConfigSize is the maximum size of a config that can be fetched from the given config url. ### SyncStrategy ```toml SyncStrategy = 'event' # Default ``` SyncStrategy is the strategy that will be used to bring the node up to date with the latest Workflow Registry contract state. Options are: event which watches for contract events or reconciliation which diffs workflow metadata state. ### MaxConcurrency ```toml MaxConcurrency = 12 # Default ``` MaxConcurrency controls the maximum number of concurrent event handlers in the workflow registry syncer. ## Capabilities.WorkflowRegistry.WorkflowStorage ```toml [Capabilities.WorkflowRegistry.WorkflowStorage] URL = "localhost:4566" # Example TLSEnabled = true # Default ArtifactStorageHost = 'artifact.cre.chain.link' # Example ``` ### URL ```toml URL = "localhost:4566" # Example ``` URL is the location for the workflow storage service to be communicated with. ### TLSEnabled ```toml TLSEnabled = true # Default ``` TLSEnabled enables TLS to be used to secure communication with the workflow storage service. This is enabled by default. ### ArtifactStorageHost ```toml ArtifactStorageHost = 'artifact.cre.chain.link' # Example ``` ArtifactStorageHost is the host name that, when present within the workflow metadata binary or config URL, designates that a signed URL should be retrieved from the workflow storage service. ## Capabilities.WorkflowRegistry.AdditionalSources ```toml [[Capabilities.WorkflowRegistry.AdditionalSources]] URL = 'localhost:50051' # Example TLSEnabled = true # Default Name = 'my-workflow-source' # Example ``` ### URL ```toml URL = 'localhost:50051' # Example ``` URL is the GRPC endpoint for the additional workflow metadata source. This allows workflows to be loaded from sources other than the on-chain registry contract. ### TLSEnabled ```toml TLSEnabled = true # Default ``` TLSEnabled enables TLS for the GRPC connection. Defaults to true. ### Name ```toml Name = 'my-workflow-source' # Example ``` Name is a required unique identifier for this workflow source. Each additional source must have a distinct name to prevent workflow reconciliation conflicts. Names like 'ContractWorkflowSource' are reserved for internal use. ## Workflows ```toml [Workflows] ``` ## Workflows.Limits ```toml [Workflows.Limits] Global = 200 # Default PerOwner = 200 # Default ``` ### Global ```toml Global = 200 # Default ``` Global is the maximum number of workflows that can be registered globally. ### PerOwner ```toml PerOwner = 200 # Default ``` PerOwner is the maximum number of workflows that can be registered per owner. ## Capabilities.ExternalRegistry ```toml [Capabilities.ExternalRegistry] Address = '0x0' # Example NetworkID = 'evm' # Default ChainID = '1' # Default ContractVersion = '1.0.0' # Default ``` ### Address ```toml Address = '0x0' # Example ``` Address is the address for the capabilities registry contract. ### NetworkID ```toml NetworkID = 'evm' # Default ``` NetworkID identifies the target network where the remote registry is located. ### ChainID ```toml ChainID = '1' # Default ``` ChainID identifies the target chain id where the remote registry is located. ### ContractVersion ```toml ContractVersion = '1.0.0' # Default ``` ContractVersion identifies semantic version of the CapabilitiesRegistry contract. ## Capabilities.Dispatcher ```toml [Capabilities.Dispatcher] SupportedVersion = 1 # Default ReceiverBufferSize = 10000 # Default SendToSharedPeer = false # Default ``` ### SupportedVersion ```toml SupportedVersion = 1 # Default ``` SupportedVersion is the version of the version of message schema. ### ReceiverBufferSize ```toml ReceiverBufferSize = 10000 # Default ``` ReceiverBufferSize is the size of the buffer for incoming messages. ### SendToSharedPeer ```toml SendToSharedPeer = false # Default ``` SendToSharedPeer sends all messages ONLY to the SharedPeer and not to legacy ExternalPeer. ## Capabilities.Dispatcher.RateLimit ```toml [Capabilities.Dispatcher.RateLimit] GlobalRPS = 800 # Default GlobalBurst = 1000 # Default PerSenderRPS = 10 # Default PerSenderBurst = 50 # Default ``` ### GlobalRPS ```toml GlobalRPS = 800 # Default ``` GlobalRPS is the global rate limit for the dispatcher. ### GlobalBurst ```toml GlobalBurst = 1000 # Default ``` GlobalBurst is the global burst limit for the dispatcher. ### PerSenderRPS ```toml PerSenderRPS = 10 # Default ``` PerSenderRPS is the per-sender rate limit for the dispatcher. ### PerSenderBurst ```toml PerSenderBurst = 50 # Default ``` PerSenderBurst is the per-sender burst limit for the dispatcher. ## Capabilities.Peering ```toml [Capabilities.Peering] IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default EnableExperimentalRageP2P = false # Default ``` ### IncomingMessageBufferSize ```toml IncomingMessageBufferSize = 10 # Default ``` IncomingMessageBufferSize is the per-remote number of incoming messages to buffer. Any additional messages received on top of those already in the queue will be dropped. ### OutgoingMessageBufferSize ```toml OutgoingMessageBufferSize = 10 # Default ``` OutgoingMessageBufferSize is the per-remote number of outgoing messages to buffer. Any additional messages send on top of those already in the queue will displace the oldest. NOTE: OutgoingMessageBufferSize should be comfortably smaller than remote's IncomingMessageBufferSize to give the remote enough space to process them all in case we regained connection and now send a bunch at once ### PeerID ```toml PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example ``` PeerID is the default peer ID to use for OCR jobs. If unspecified, uses the first available peer ID. ### TraceLogging ```toml TraceLogging = false # Default ``` TraceLogging enables trace level logging. ### EnableExperimentalRageP2P ```toml EnableExperimentalRageP2P = false # Default ``` EnableExperimentalRageP2P needs to be enabled for ocr3.1 components ## Capabilities.Peering.V2 ```toml [Capabilities.Peering.V2] Enabled = false # Default AnnounceAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example DefaultBootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example DeltaDial = '15s' # Default DeltaReconcile = '1m' # Default ListenAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enables P2P V2. ### AnnounceAddresses ```toml AnnounceAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` AnnounceAddresses is the addresses the peer will advertise on the network in `host:port` form as accepted by the TCP version of Go's `net.Dial`. The addresses should be reachable by other nodes on the network. When attempting to connect to another node, a node will attempt to dial all of the other node's AnnounceAddresses in round-robin fashion. ### DefaultBootstrappers ```toml DefaultBootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example ``` DefaultBootstrappers is the default bootstrapper peers for libocr's v2 networking stack. Oracle nodes typically only know each other's PeerIDs, but not their hostnames, IP addresses, or ports. DefaultBootstrappers are special nodes that help other nodes discover each other's `AnnounceAddresses` so they can communicate. Nodes continuously attempt to connect to bootstrappers configured in here. When a node wants to connect to another node (which it knows only by PeerID, but not by address), it discovers the other node's AnnounceAddresses from communications received from its DefaultBootstrappers or other discovered nodes. To facilitate discovery, nodes will regularly broadcast signed announcements containing their PeerID and AnnounceAddresses. ### DeltaDial ```toml DeltaDial = '15s' # Default ``` DeltaDial controls how far apart Dial attempts are ### DeltaReconcile ```toml DeltaReconcile = '1m' # Default ``` DeltaReconcile controls how often a Reconcile message is sent to every peer. ### ListenAddresses ```toml ListenAddresses = ['1.2.3.4:9999', '[a52d:0:a88:1274::abcd]:1337'] # Example ``` ListenAddresses is the addresses the peer will listen to on the network in `host:port` form as accepted by `net.Listen()`, but the host and port must be fully specified and cannot be empty. You can specify `0.0.0.0` (IPv4) or `::` (IPv6) to listen on all interfaces, but that is not recommended. ## Capabilities.GatewayConnector ```toml [Capabilities.GatewayConnector] ChainIDForNodeKey = '11155111' # Example NodeAddress = '0x68902d681c28119f9b2531473a417088bf008e59' # Example DonID = 'example_don' # Example WSHandshakeTimeoutMillis = 1000 # Example AuthMinChallengeLen = 10 # Example AuthTimestampToleranceSec = 10 # Example ``` ### ChainIDForNodeKey ```toml ChainIDForNodeKey = '11155111' # Example ``` ChainIDForNodeKey is the ChainID of the network associated with a private key to be used for authentication with Gateway nodes ### NodeAddress ```toml NodeAddress = '0x68902d681c28119f9b2531473a417088bf008e59' # Example ``` NodeAddress is the address of the desired private key to be used for authentication with Gateway nodes ### DonID ```toml DonID = 'example_don' # Example ``` DonID is the Id of the Don ### WSHandshakeTimeoutMillis ```toml WSHandshakeTimeoutMillis = 1000 # Example ``` WSHandshakeTimeoutMillis is Websocket handshake timeout ### AuthMinChallengeLen ```toml AuthMinChallengeLen = 10 # Example ``` AuthMinChallengeLen is the minimum number of bytes in authentication challenge payload ### AuthTimestampToleranceSec ```toml AuthTimestampToleranceSec = 10 # Example ``` AuthTimestampToleranceSec is Authentication timestamp tolerance ## Capabilities.GatewayConnector.Gateways ```toml [[Capabilities.GatewayConnector.Gateways]] ID = 'example_gateway' # Example URL = 'wss://localhost:8081/node' # Example ``` ### ID ```toml ID = 'example_gateway' # Example ``` ID of the Gateway ### URL ```toml URL = 'wss://localhost:8081/node' # Example ``` URL of the Gateway ## Capabilities.SharedPeering ```toml [Capabilities.SharedPeering] Enabled = false # Default Bootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enabled SharedPeer ### Bootstrappers ```toml Bootstrappers = ['12D3KooWMHMRLQkgPbFSYHwD3NBuwtS1AmxhvKVUrcfyaGDASR4U@1.2.3.4:9999', '12D3KooWM55u5Swtpw9r8aFLQHEtw7HR4t44GdNs654ej5gRs2Dh@example.com:1234'] # Example ``` Bootstrappers overrides bootstrap nodes for SharedPeer peer groups. If empty, default bootstrappers from P2P.V2 will be used. ## Capabilities.SharedPeering.StreamConfig ```toml [Capabilities.SharedPeering.StreamConfig] IncomingMessageBufferSize = 500 # Default OutgoingMessageBufferSize = 500 # Default MaxMessageLenBytes = 500000 # Default MessageRateLimiterRate = 100.0 # Default MessageRateLimiterCapacity = 500 # Default BytesRateLimiterRate = 5000000.0 # Default BytesRateLimiterCapacity = 10000000 # Default ``` ### IncomingMessageBufferSize ```toml IncomingMessageBufferSize = 500 # Default ``` IncomingMessageBufferSize is the max number of enqueued incoming messages awaiting processing. ### OutgoingMessageBufferSize ```toml OutgoingMessageBufferSize = 500 # Default ``` OutgoingMessageBufferSize is the max number of outgoing messages. ### MaxMessageLenBytes ```toml MaxMessageLenBytes = 500000 # Default ``` MaxMessageLenBytes is the max size of a message in bytes. ### MessageRateLimiterRate ```toml MessageRateLimiterRate = 100.0 # Default ``` MessageRateLimiterRate is the max number of processed messages per second. ### MessageRateLimiterCapacity ```toml MessageRateLimiterCapacity = 500 # Default ``` MessageRateLimiterCapacity is the "burst" of the message rate limiter. ### BytesRateLimiterRate ```toml BytesRateLimiterRate = 5000000.0 # Default ``` BytesRateLimiterRate is the max size of precessed messages per second. ### BytesRateLimiterCapacity ```toml BytesRateLimiterCapacity = 10000000 # Default ``` BytesRateLimiterCapacity is the "burst" of the message rate limiter (in bytes). ## Capabilities.Local ```toml [Capabilities.Local] RegistryBasedLaunchAllowlist = [] # Default ``` ### RegistryBasedLaunchAllowlist ```toml RegistryBasedLaunchAllowlist = [] # Default ``` RegistryBasedLaunchAllowlist contains regex patterns that match capability IDs to be launched from the on-chain capabilities registry instead of via job specs. Adding a pattern to this list has two effects: 1. Disables job-spec-based launching - the delegate refuses to start matching capabilities via job specs 2. Enables registry-based launching - the LocalCapabilityManager starts matching capabilities from on-chain registry This allows staged rollout: capabilities not matching any pattern continue launching via job specs, while matching capabilities transition to registry-based launching. Examples (using single-quoted TOML strings where backslashes are literal): - '^cron\@1.0.0$' matches exactly "cron\@1.0.0" - '^http-action\@.\*$' matches any version of http-action - '.\*' matches all capabilities Per-capability configuration. Each capability ID can have its own configuration section. Capability IDs must be in the format "name\@version". [Capabilities.Local.Capabilities."http-action\@1.0.0"] BinaryPathOverride overrides the default binary path for a LOOP capability. BinaryPathOverride = '/opt/chainlink/binaries/http_action' # Example [Capabilities.Local.Capabilities."http-action\@1.0.0".Config] Capability-specific configuration as key-value pairs. proxyMode = 'gateway' # Example allowedPorts = '443,8443' # Example ## AutoPprof ```toml [AutoPprof] Enabled = false # Default ProfileRoot = 'prof/root' # Example PollInterval = '10s' # Default GatherDuration = '10s' # Default GatherTraceDuration = '5s' # Default MaxProfileSize = '100mb' # Default CPUProfileRate = 1 # Default MemProfileRate = 1 # Default BlockProfileRate = 1 # Default MutexProfileFraction = 1 # Default MemThreshold = '4gb' # Default GoroutineThreshold = 5000 # Default ``` The Chainlink node is equipped with an internal "nurse" service that can perform automatic `pprof` profiling when the certain resource thresholds are exceeded, such as memory and goroutine count. These profiles are saved to disk to facilitate fine-grained debugging of performance-related issues. In general, if you notice that your node has begun to accumulate profiles, forward them to the Chainlink team. To learn more about these profiles, read the [Profiling Go programs with pprof](https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/) guide. ### Enabled ```toml Enabled = false # Default ``` Enabled enables the automatic profiling service. ### ProfileRoot ```toml ProfileRoot = 'prof/root' # Example ``` ProfileRoot sets the location on disk where pprof profiles will be stored. Defaults to `RootDir`. ### PollInterval ```toml PollInterval = '10s' # Default ``` PollInterval is the interval at which the node's resources are checked. ### GatherDuration ```toml GatherDuration = '10s' # Default ``` GatherDuration is the duration for which profiles are gathered when profiling starts. ### GatherTraceDuration ```toml GatherTraceDuration = '5s' # Default ``` GatherTraceDuration is 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. ### MaxProfileSize ```toml MaxProfileSize = '100mb' # Default ``` MaxProfileSize is the maximum amount of disk space that profiles may consume before profiling is disabled. ### CPUProfileRate ```toml CPUProfileRate = 1 # Default ``` CPUProfileRate sets the rate for CPU profiling. See [https://pkg.go.dev/runtime#SetCPUProfileRate](https://pkg.go.dev/runtime#SetCPUProfileRate). ### MemProfileRate ```toml MemProfileRate = 1 # Default ``` MemProfileRate sets the rate for memory profiling. See [https://pkg.go.dev/runtime#pkg-variables](https://pkg.go.dev/runtime#pkg-variables). ### BlockProfileRate ```toml BlockProfileRate = 1 # Default ``` BlockProfileRate sets the fraction of blocking events for goroutine profiling. See [https://pkg.go.dev/runtime#SetBlockProfileRate](https://pkg.go.dev/runtime#SetBlockProfileRate). ### MutexProfileFraction ```toml MutexProfileFraction = 1 # Default ``` MutexProfileFraction sets the fraction of contention events for mutex profiling. See [https://pkg.go.dev/runtime#SetMutexProfileFraction](https://pkg.go.dev/runtime#SetMutexProfileFraction). ### MemThreshold ```toml MemThreshold = '4gb' # Default ``` MemThreshold sets the maximum amount of memory the node can actively consume before profiling begins. ### GoroutineThreshold ```toml GoroutineThreshold = 5000 # Default ``` GoroutineThreshold is the maximum number of actively-running goroutines the node can spawn before profiling begins. ## Pyroscope ```toml [Pyroscope] ServerAddress = 'http://localhost:4040' # Example Environment = 'mainnet' # Default LinkTracesToProfiles = false # Default ``` ### ServerAddress ```toml ServerAddress = 'http://localhost:4040' # Example ``` ServerAddress sets the address that will receive the profile logs. It enables the profiling service. ### Environment ```toml Environment = 'mainnet' # Default ``` Environment sets the target environment tag in which profiles will be added to. ### LinkTracesToProfiles ```toml LinkTracesToProfiles = false # Default ``` LinkTracesToProfiles enables linking traces to profiles in Grafana when Pyroscope and Tracing are enabled. ## Sentry ```toml [Sentry] Debug = false # Default DSN = 'sentry-dsn' # Example Environment = 'my-custom-env' # Example Release = 'v1.2.3' # Example ``` ### Debug ```toml Debug = false # Default ``` Debug enables printing of Sentry SDK debug messages. ### DSN ```toml DSN = 'sentry-dsn' # Example ``` DSN is the data source name where events will be sent. Sentry is completely disabled if this is left blank. ### Environment ```toml Environment = 'my-custom-env' # Example ``` Environment overrides the Sentry environment to the given value. Otherwise autodetects between dev/prod. ### Release ```toml Release = 'v1.2.3' # Example ``` Release overrides the Sentry release to the given value. Otherwise uses the compiled-in version number. ## Insecure ```toml [Insecure] DevWebServer = false # Default OCRDevelopmentMode = false # Default InfiniteDepthQueries = false # Default DisableRateLimiting = false # Default ``` Insecure config family is only allowed in development builds. ### DevWebServer ```toml DevWebServer = false # Default ``` DevWebServer skips secure configuration for webserver AllowedHosts, SSL, etc. ### OCRDevelopmentMode ```toml OCRDevelopmentMode = false # Default ``` OCRDevelopmentMode run OCR in development mode. ### InfiniteDepthQueries ```toml InfiniteDepthQueries = false # Default ``` InfiniteDepthQueries skips graphql query depth limit checks. ### DisableRateLimiting ```toml DisableRateLimiting = false # Default ``` DisableRateLimiting skips ratelimiting on asset requests. ## Tracing ```toml [Tracing] Enabled = false # Default CollectorTarget = 'localhost:4317' # Example NodeID = 'NodeID' # Example SamplingRatio = 1.0 # Example Mode = 'tls' # Default TLSCertPath = '/path/to/cert.pem' # Example ``` ### Enabled ```toml Enabled = false # Default ``` Enabled turns trace collection on or off. On requires an OTEL Tracing Collector. ### CollectorTarget ```toml CollectorTarget = 'localhost:4317' # Example ``` CollectorTarget is the logical address of the OTEL Tracing Collector. ### NodeID ```toml NodeID = 'NodeID' # Example ``` NodeID is an unique name for this node relative to any other node traces are collected for. ### SamplingRatio ```toml SamplingRatio = 1.0 # Example ``` SamplingRatio is the ratio of traces to sample for this node. ### Mode ```toml Mode = 'tls' # Default ``` Mode is a string value. `tls` or `unencrypted` are the only values allowed. If set to `unencrypted`, `TLSCertPath` can be unset, meaning traces will be sent over plaintext to the collector. ### TLSCertPath ```toml TLSCertPath = '/path/to/cert.pem' # Example ``` TLSCertPath is the file path to the TLS certificate used for secure communication with an OTEL Tracing Collector. ## Tracing.Attributes ```toml [Tracing.Attributes] env = 'test' # Example ``` Tracing.Attributes are user specified key-value pairs to associate in the context of the traces ### env ```toml env = 'test' # Example ``` env is an example user specified key-value pair ## Mercury ```toml [Mercury] VerboseLogging = false # Default ``` ### VerboseLogging ```toml VerboseLogging = false # Default ``` VerboseLogging enables detailed logging of mercury/LLO operations. These logs can be expensive since they may serialize large structs, so they are disabled by default. ## Mercury.Cache ```toml [Mercury.Cache] LatestReportTTL = "1s" # Default MaxStaleAge = "1h" # Default LatestReportDeadline = "5s" # Default ``` Mercury.Cache controls settings for the price retrieval cache querying a mercury server ### LatestReportTTL ```toml LatestReportTTL = "1s" # Default ``` 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. ### MaxStaleAge ```toml MaxStaleAge = "1h" # 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. ### LatestReportDeadline ```toml LatestReportDeadline = "5s" # Default ``` LatestReportDeadline controls how long to wait for a response from the mercury server before retrying. Setting this to zero will wait indefinitely. ## Mercury.TLS ```toml [Mercury.TLS] CertFile = "/path/to/client/certs.pem" # Example ``` Mercury.TLS controls client settings for when the node talks to traditional web servers or load balancers. ### CertFile ```toml CertFile = "/path/to/client/certs.pem" # Example ``` CertFile is the path to a PEM file of trusted root certificate authority certificates ## Mercury.Transmitter ```toml [Mercury.Transmitter] Protocol = "grpc" # Default TransmitQueueMaxSize = 250_000 # Default TransmitTimeout = "5s" # Default TransmitConcurrency = 100 # Default ReaperFrequency = "1h" # Default ReaperMaxAge = "48h" # Default ``` Mercury.Transmitter controls settings for the mercury transmitter ### Protocol ```toml Protocol = "grpc" # Default ``` Protocol is the protocol to use for the transmitter. Options are either: - "wsrpc" for the legacy websocket protocol - "grpc" for the gRPC protocol ### TransmitQueueMaxSize ```toml TransmitQueueMaxSize = 250_000 # Default ``` TransmitQueueMaxSize controls the size of the transmit queue. This is scoped per OCR instance. If the queue is full, the transmitter will start dropping the oldest messages in order to make space. This is useful if mercury server goes offline and the nop needs to buffer transmissions. ### TransmitTimeout ```toml TransmitTimeout = "5s" # Default ``` TransmitTimeout controls how long the transmitter will wait for a response when sending a message to the mercury server, before aborting and considering the transmission to be failed. ### TransmitConcurrency ```toml TransmitConcurrency = 100 # Default ``` TransmitConcurrency is the max number of concurrent transmits to each server. Only has effect with LLO jobs. ### ReaperFrequency ```toml ReaperFrequency = "1h" # Default ``` ReaperFrequency controls how often the stale transmission reaper will run. Setting to 0 disables the reaper. ### ReaperMaxAge ```toml ReaperMaxAge = "48h" # Default ``` ReaperMaxAge controls how old a transmission can be before it is considered stale. Setting to 0 disables the reaper. ## Telemetry ```toml [Telemetry] Enabled = false # Default Endpoint = 'example.com/collector' # Example CACertFile = 'cert-file' # Example InsecureConnection = false # Default TraceSampleRatio = 0.01 # Default EmitterBatchProcessor = true # Default EmitterExportTimeout = '1s' # Default AuthHeadersTTL = '0s' # Default ChipIngressEndpoint = '' # Default ChipIngressInsecureConnection = false # Default HeartbeatInterval = '1s' # Default LogLevel = "info" # Default LogStreamingEnabled = false # Default LogBatchProcessor = true # Default LogExportTimeout = '1s' # Default LogExportMaxBatchSize = 512 # Default LogExportInterval = '1s' # Default LogMaxQueueSize = 2048 # Default ``` Telemetry holds OTEL settings. This data includes open telemetry metrics, traces, & logs. It does not currently include prometheus metrics or standard out logs, but may in the future. ### Enabled ```toml Enabled = false # Default ``` Enabled turns telemetry collection on or off. ### Endpoint ```toml Endpoint = 'example.com/collector' # Example ``` Endpoint of the OTEL Collector. ### CACertFile ```toml CACertFile = 'cert-file' # Example ``` CACertFile is the file path of the TLS certificate used for secure communication with the OTEL Collector. Required unless InescureConnection is true. ### InsecureConnection ```toml InsecureConnection = false # Default ``` InsecureConnection bypasses the TLS CACertFile requirement and uses an insecure connection instead. Only available in dev mode. ### TraceSampleRatio ```toml TraceSampleRatio = 0.01 # Default ``` TraceSampleRatio is the rate at which to sample traces. Must be between 0 and 1. ### EmitterBatchProcessor ```toml EmitterBatchProcessor = true # Default ``` EmitterBatchProcessor enables batching for telemetry events ### EmitterExportTimeout ```toml EmitterExportTimeout = '1s' # Default ``` EmitterExportTimeout sets timeout for exporting telemetry events ### AuthHeadersTTL ```toml AuthHeadersTTL = '0s' # Default ``` AuthHeadersTTL is the time-to-live for rotating authentication headers used with telemetry endpoints. Set to 0 to use static authentication headers. ### ChipIngressEndpoint ```toml ChipIngressEndpoint = '' # Default ``` ChipIngressEndpoint enables sending custom messages to CHIP Ingress. ### ChipIngressInsecureConnection ```toml ChipIngressInsecureConnection = false # Default ``` ChipIngressInsecureConnection disables TLS when connecting to CHIP Ingress. ### HeartbeatInterval ```toml HeartbeatInterval = '1s' # Default ``` HeartbeatInterval is the interval at which a the application heartbeat is sent to telemetry backends. ### LogLevel ```toml LogLevel = "info" # Default ``` LogLevel sets the log level for telemetry streaming (debug, info, warn, error, crit, panic, fatal) ### LogStreamingEnabled ```toml LogStreamingEnabled = false # Default ``` LogStreamingEnabled enables log streaming to the OTel log exporter ### LogBatchProcessor ```toml LogBatchProcessor = true # Default ``` LogBatchProcessor enables batching for telemetry logs ### LogExportTimeout ```toml LogExportTimeout = '1s' # Default ``` LogExportTimeout sets timeout for exporting telemetry logs ### LogExportMaxBatchSize ```toml LogExportMaxBatchSize = 512 # Default ``` LogExportMaxBatchSize sets the maximum batch size of every batch export ### LogExportInterval ```toml LogExportInterval = '1s' # Default ``` LogExportInterval sets the maximum duration between batched exports ### LogMaxQueueSize ```toml LogMaxQueueSize = 2048 # Default ``` LogMaxQueueSize sets the maximum queue size used by the batcher ## Telemetry.ResourceAttributes ```toml [Telemetry.ResourceAttributes] foo = "bar" # Example ``` ResourceAttributes are global metadata to include with all telemetry. ### foo ```toml foo = "bar" # Example ``` foo is an example resource attribute ## CRE.Streams ```toml [CRE.Streams] WsURL = "streams.url" # Example RestURL = "streams.url" # Example ``` ### WsURL ```toml WsURL = "streams.url" # Example ``` WsURL is the websockets url for the streams sdk config ### RestURL ```toml RestURL = "streams.url" # Example ``` RestURL is the REST url for the streams sdk config ## CRE.WorkflowFetcher ```toml [CRE.WorkflowFetcher] URL = '' # Default ``` ### URL ```toml URL = '' # Default ``` URL is override URL for the workflow fetcher service. ## CRE.Linking ```toml [CRE.Linking] URL = "" # Default TLSEnabled = true # Default ``` ### URL ```toml URL = "" # Default ``` URL is the locator for the Chainlink linking service. ### TLSEnabled ```toml TLSEnabled = true # Default ``` TLSEnabled enables TLS to be used to secure communication with the linking service. This is enabled by default. ## Billing ```toml [Billing] URL = "localhost:4319" # Default TLSEnabled = true # Default ``` Billing holds settings for connecting to the billing service. ### URL ```toml URL = "localhost:4319" # Default ``` URL is the locator for the Chainlink billing service. ### TLSEnabled ```toml TLSEnabled = true # Default ``` TLSEnabled enables TLS to be used to secure communication with the billing service. This is enabled by default. ## BridgeStatusReporter ```toml [BridgeStatusReporter] Enabled = false # Default StatusPath = "/status" # Default PollingInterval = "5m" # Default IgnoreInvalidBridges = true # Default IgnoreJoblessBridges = false # Default ``` BridgeStatusReporter holds settings for the Bridge Status Reporter service. ### Enabled ```toml Enabled = false # Default ``` Enabled enables the Bridge Status Reporter service that polls bridge status endpoints. ### StatusPath ```toml StatusPath = "/status" # Default ``` StatusPath is the path to append to bridge URLs for status polling. ### PollingInterval ```toml PollingInterval = "5m" # Default ``` PollingInterval is how often to poll bridge status endpoints for status. ### IgnoreInvalidBridges ```toml IgnoreInvalidBridges = true # Default ``` IgnoreInvalidBridges skips bridges that return HTTP errors or invalid responses. ### IgnoreJoblessBridges ```toml IgnoreJoblessBridges = false # Default ``` IgnoreJoblessBridges skips bridges that have no associated jobs. ## JobSpecReporter ```toml [JobSpecReporter] Enabled = false # Default PollingInterval = "1h" # Default EnabledOCR2PluginTypes = ["median"] # Default ``` JobSpecReporter holds settings for the Job Spec Reporter service, which periodically emits job spec telemetry. ### Enabled ```toml Enabled = false # Default ``` Enabled enables the Job Spec Reporter service. ### PollingInterval ```toml PollingInterval = "1h" # Default ``` PollingInterval is how often to emit a heartbeat event for each tracked job. ### EnabledOCR2PluginTypes ```toml EnabledOCR2PluginTypes = ["median"] # Default ``` EnabledOCR2PluginTypes restricts OCR2 telemetry to jobs with these plugin types. An empty list disables all OCR2 telemetry. Use ["all"] to enable all OCR2 plugin types. ## CRE ```toml [CRE] UseLocalTimeProvider = true # Default EnableDKGRecipient = false # Default DebugMode = false # Default ``` ### UseLocalTimeProvider ```toml UseLocalTimeProvider = true # Default ``` UseLocalTimeProvider should be set true if the DON Time OCR Plugin is not running ### EnableDKGRecipient ```toml EnableDKGRecipient = false # Default ``` EnableDKGRecipient should be set to true if the DON runs a capability that uses a DKG result package. ### DebugMode ```toml DebugMode = false # Default ``` DebugMode enables additional tracing and logging for workflow engines. ## CRE.ConfidentialRelay ```toml [CRE.ConfidentialRelay] Enabled = false # Default ``` ### Enabled ```toml Enabled = false # Default ``` Enabled controls whether the confidential relay gateway handler should be configured. ## Sharding ```toml [Sharding] ShardingEnabled = false # Default ArbiterPort = 9876 # Default ArbiterPollInterval = '12s' # Default ArbiterRetryInterval = '12s' # Default ShardIndex = 0 # Default ShardOrchestratorPort = 50051 # Default ShardOrchestratorAddress = '' # Default ``` Sharding holds settings for node sharding configuration. ### ShardingEnabled ```toml ShardingEnabled = false # Default ``` ShardingEnabled enables workflow sharding across multiple nodes. When false (default), all workflows are processed by this node (backwards compatible mode). When true, workflows are distributed across shards based on ShardIndex and shard orchestrator mappings. ### ArbiterPort ```toml ArbiterPort = 9876 # Default ``` ArbiterPort is the port the Arbiter gRPC server listens on. ### ArbiterPollInterval ```toml ArbiterPollInterval = '12s' # Default ``` ArbiterPollInterval is how often to poll the ShardConfig contract. ### ArbiterRetryInterval ```toml ArbiterRetryInterval = '12s' # Default ``` ArbiterRetryInterval is the retry interval when contract reader is unavailable. ### ShardIndex ```toml ShardIndex = 0 # Default ``` ShardIndex is the index of this shard (0-based). If 0, no shard orchestration client is created. If greater than 0, a shard orchestration client is created and connects to ShardOrchestratorAddress. ### ShardOrchestratorPort ```toml ShardOrchestratorPort = 50051 # Default ``` ShardOrchestratorPort is the port for the shard orchestrator gRPC server. When a ring OCR job is created, the shard orchestrator server is spun up on this port. ### ShardOrchestratorAddress ```toml ShardOrchestratorAddress = '' # Default ``` ShardOrchestratorAddress is the URL that the shard orchestration client will try to connect to. Required when ShardingEnabled=true and ShardIndex > 0. ## LOOPP ```toml [LOOPP] GRPCServerMaxRecvMsgSize = '32mb' # Default ``` Local Out-Of-Process Plugins ### GRPCServerMaxRecvMsgSize ```toml GRPCServerMaxRecvMsgSize = '32mb' # Default ``` GRPCServerMaxRecvMsgSize is the maximum received message size configured for grpc servers. We use a higher limit than the grpc default of 4mb. ## EVM EVM defaults depend on ChainID: ### Ethereum Mainnet (1) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' OperatorFactoryAddress = '0x3E64Cd889482443324F91bFA9c84fE72A511f48A' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '9m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '5m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 10500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Ropsten (3) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x20fE562d797A42Dcb3399062AE9546cd06f63280' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Rinkeby (4) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x01BE23585060835E02B77ef475b0Cc51aA1e0709' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Goerli (5) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x326C977E6efc84E512bB9C30f76E30c160eD06FB' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Optimism Mainnet (10) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '13m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Kovan (42) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xa36085F69e2889c224210F603D836748e7dC0088' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' OperatorFactoryAddress = '0x8007e24251b1D2Fc518Eb843A701d9cD21fe0aA3' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### BSC Mainnet (56) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x404460C6A5EdE2D891e8297795264fDe62ADBB75' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '45s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '100 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '2s' DatabaseTimeout = '2s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '500ms' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### OKX Testnet (65) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### OKX Mainnet (66) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Astar Shibuya (81) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 100 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xe74037112db8807B3B4B3895F5790e5bc1866a29' LogBackfillBatchSize = 1000 LogPollInterval = '6s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '100 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### BSC Testnet (97) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '40s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '1 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '2s' DatabaseTimeout = '2s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '500ms' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Gnosis Mainnet (100) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'gnosis' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '2m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '1 gwei' PriceMax = '500 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Shibarium Mainnet (109) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = false LinkContractAddress = '0x71052BAe71C25C78E37fD12E5ff1101A71d9018F' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '10 gwei' PriceMax = '10 micro' PriceMin = '2 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = true FeeCapDefault = '10 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '3s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Heco Mainnet (128) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x404460C6A5EdE2D891e8297795264fDe62ADBB75' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '5 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '2s' DatabaseTimeout = '2s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '500ms' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hashkey Testnet (133) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x8418c4d7e8e17ab90232DC72150730E6c4b84F57' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '8s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Polygon Mainnet (137) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xb0897686c545045aFc77CF20eC7A532E3120E0F1' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '6m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 5000 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '30 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '30 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '20 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Sonic Mainnet (146) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x71052BAe71C25C78E37fD12E5ff1101A71d9018F' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 500 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 10 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Shibarium Testnet (157) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = false LinkContractAddress = '0x44637eEfD71A090990f89faEC7022fc74B2969aD' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '10 gwei' PriceMax = '10 micro' PriceMin = '2 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = true FeeCapDefault = '10 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '3s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hashkey Mainnet (177) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x71052BAe71C25C78E37fD12E5ff1101A71d9018F' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '8s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### XLayer Sepolia (195) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'xlayer' FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x724593f6FCb0De4E6902d4C55D7C74DaA2AF0E55' LogBackfillBatchSize = 1000 LogPollInterval = '30s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '12m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 15 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '20 mwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 12 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### XLayer Mainnet (196) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'xlayer' FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x8aF9711B44695a5A081F25AB9903DDB73aCf8FA9' LogBackfillBatchSize = 1000 LogPollInterval = '30s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '6m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 15 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '100 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 mwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 12 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Bsquared Mainnet (223) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 2000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x709229D9587886a1eDFeE6b5cE636E1D70d1cE39' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h10m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mind Mainnet (228) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '5 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Lens Mainnet (232) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x2Ea38D6cDb6774992d4A62fe622f4405663729Dd' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '7m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 40 BumpThreshold = 1 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '5s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Fantom Mainnet (250) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x6F43FF82CCA38001B6699a8AC47A2d0E66939407' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 3800000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Fraxtal Mainnet (252) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Kroma Mainnet (255) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'kroma' FinalityDepth = 400 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xC1F6f7622ad37C3f46cDF6F8AA0344ADE80BF450' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x4200000000000000000000000000000000000005' [HeadTracker] HistoryDepth = 400 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### ZKsync Goerli (280) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xD29F4Cc763A064b6C563B8816f09351b3Fbb61A0' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '18.446744073709551615 ether' PriceMin = '0' LimitDefault = 100000000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hedera Mainnet (295) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'hedera' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x7Ce6bb2Cc2D3Fd45a974Da6a0F29236cb9513a98' LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '2m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = true BumpMin = '10 gwei' BumpPercent = 20 BumpThreshold = 0 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hedera Testnet (296) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'hedera' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x90a386d59b9A6a4795a011e8f032Fc21ED6FEFb6' LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '2m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = true BumpMin = '10 gwei' BumpPercent = 20 BumpThreshold = 0 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### ZKsync Sepolia (300) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x23A1aFD896c8c8876AF46aDc38521f4432658d1e' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '18.446744073709551615 ether' PriceMin = '0' LimitDefault = 100000000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 11000000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### ZKsync Mainnet (324) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x52869bae3E091e36b0915941577F2D47d8d8B534' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '18.446744073709551615 ether' PriceMin = '0' LimitDefault = 100000000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 11000000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Optimism Goerli (420) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xdc2CC710e42857672E7907CF474a69B63B93089f' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Worldchain Mainnet (480) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 2500 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x915b648e994d5f31059B38223b9fbe98ae185473' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h30m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Metis Rinkeby (588) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'metis' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Astar Mainnet (592) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'astar' FinalityDepth = 100 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x31EFB841d5e0b4082F7E1267dab8De1b853f2A9d' LogBackfillBatchSize = 1000 LogPollInterval = '6s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '100 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mode Sepolia (919) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x925a4bfE64AE2bFAC8a02b35F78e60C29743755d' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '3s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Klaytn Testnet (1001) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '750 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Metis Mainnet (1088) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xd2FE54D1E5F568eB710ba9d898Bf4bD02C7c0353' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Polygon Zkevm Mainnet (1101) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zkevm' FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xdB7A504CF869484dd6aC5FaF925c8386CBF7573D' LogBackfillBatchSize = 1000 LogPollInterval = '30s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '6m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 15 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### WeMix Mainnet (1111) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'wemix' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = false LinkContractAddress = '0x80f1FcdC96B55e459BF52b998aBBE2c364935d69' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '40s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '100 gwei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### WeMix Testnet (1112) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'wemix' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = false LinkContractAddress = '0x3580c7A817cCD41f7e02143BFa411D4EeAE78093' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '40s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '100 gwei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Core Testnet (1114) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 7 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x6C475841d1D7871940E93579E5DBaE01634e17aA' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '35 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Core Mainnet (1116) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 27 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '30 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Bsquared Testnet (1123) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 2000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x436a1907D9e6a65E6db73015F08f9C66F6B63E45' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h10m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Unichain Testnet (1301) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 2000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xda40816f278Cd049c137F6612822D181065EBfB4' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '45m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Simulated (1337) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '100' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '0s' ResendAfterThreshold = '0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FixedPrice' PriceDefault = '1 gwei' PriceMax = '1 gwei' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 0 EIP1559DynamicFees = false FeeCapDefault = '1 gwei' TipCapDefault = '1 mwei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 10 MaxBufferSize = 100 SamplingInterval = '0s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = false DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Pharos Mainnet (1672) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'pharos' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Soneium Mainnet (1868) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x32D8F819C8080ae44375F8d383Ffd39FC642f3Ec' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '2h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '1 mwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Soneium Sepolia (1946) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x7ea13478Ea3961A0e8b538cb05a9DF0477c79Cd2' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '2h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '1 mwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ronin Mainnet (2020) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x3902228D6A3d2Dc44731fD9d45FeE6a61c722D0b' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ronin Saigon (2021) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x5bB50A6888ee6a67E22afFDFD9513be7740F1c15' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Private Testnet Andesite (2024) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 1 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = false RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = false [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '0' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 250000000 LimitMax = 250000000 LimitMultiplier = '4' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '0' TipCapDefault = '0' TipCapMin = '0' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Kroma Sepolia (2358) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'kroma' FinalityDepth = 400 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xa75cCA5b404ec6F4BB6EC4853D177FE7057085c8' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x4200000000000000000000000000000000000005' [HeadTracker] HistoryDepth = 400 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Polygon Zkevm Cardona (2442) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zkevm' FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x5576815a38A3706f37bf815b261cCc7cCA77e975' LogBackfillBatchSize = 1000 LogPollInterval = '30s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '12m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Fraxtal Testnet (2522) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Botanix Testnet (3636) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x7311DED199CC28D80E58e81e8589aa160199FCD2' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '100 wei' PriceMax = '50 mwei' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '50 mwei' TipCapDefault = '0' TipCapMin = '0' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Botanix Mainnet (3637) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x30e85A5c9525AD9a7A0FA5C74df4Baf0b01aD241' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '100 wei' PriceMax = '800 kwei' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '800 kwei' TipCapDefault = '0' TipCapMin = '0' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Fantom Testnet (4002) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xfaFedb041c0DD4fA2Dc0d87a6B0979Ee6FA7af5F' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 3800000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Merlin Mainnet (4200) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zkevm' FinalityDepth = 1000 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '4s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Worldchain Testnet (4801) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 2500 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xC82Ea35634BcE95C394B6BC00626f827bB0F4801' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h30m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mantle Mainnet (5000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 1200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xfe36cF0B43aAe49fBc5cFC5c0AF22a623114E043' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '40m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '0' TipCapMin = '0' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 200 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 EIP1559FeeCapBufferBlocks = 0 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 1250 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mantle Sepolia (5003) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 1200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x22bdEdEa0beBdD7CfFC95bA53826E55afFE9DE04' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '0' TipCapMin = '0' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 200 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 EIP1559FeeCapBufferBlocks = 0 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 1250 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Klaytn Mainnet (8217) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '750 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Base Mainnet (8453) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '15m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Monad Testnet (10143) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 120 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 100 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = false RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Gnosis Chiado (10200) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'gnosis' FinalityDepth = 100 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xDCA67FD8324990792C0bfaE95903B8A64097754F' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '2m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '500 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### L3X Mainnet (12324) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x79f531a3D07214304F259DC28c7191513223bcf3' LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### L3X Sepolia (12325) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xa71848C99155DA0b245981E5ebD1C94C4be51c43' LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Holesky (17000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x685cE6742351ae9b618F383883D6d1e0c5A31B4B' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '3s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mode Mainnet (34443) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x183E3691EfF3524B2315D3703D94F922CbE51F54' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 2 PollSuccessThreshold = 0 PollInterval = '3s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Lens Sepolia (37111) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 40 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x7f1b9eE544f9ff9bB521Ab79c205d79C55250a36' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '10m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '7m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 40 BumpThreshold = 1 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '5s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 250 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [NodePool.Errors] TerminallyUnderpriced = '(?:: |^)(max fee per gas less than block base fee|virtual machine entered unexpected state. (?:P|p)lease contact developers and provide transaction details that caused this error. Error description: (?:The operator included transaction with an unacceptable gas price|Assertion error: Fair pubdata price too high))$' [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Arbitrum Mainnet (42161) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xf97f4df75117a78c1A5a0DBb814Af92458539FB4' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 14500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Celo Mainnet (42220) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'celo' FinalityDepth = 2750 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xd07294e6E917e07dfDcee882dd1e2565085C2ae0' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '45m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '5 gwei' PriceMax = '500 gwei' PriceMin = '5 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '2 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 50 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hemi Mainnet (43111) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '4s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = false RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '30m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '2m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 50 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Avalanche Fuji (43113) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '1m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '1 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Avalanche Mainnet (43114) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x5947BB275c521040051D82396192181b413227A3' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 2 FinalizedBlockOffset = 2 NoNewFinalizedHeadsThreshold = '1m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '1 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Celo Testnet (44787) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'celo' FinalityDepth = 2750 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x32E08557B14FaD8908025619797221281D439071' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '45m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '5 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 200 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Zircuit Sepolia (48899) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zircuit' FinalityDepth = 1000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xDEE94506570cA186BC1e3516fCf4fd719C312cCD' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '40m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true Threshold = 90 MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Zircuit Mainnet (48900) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zircuit' FinalityDepth = 1000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x5D6d033B4FbD2190D99D930719fAbAcB64d2439a' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '40m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true Threshold = 90 MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Sonic Testnet (57054) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x61876F0429726D7777B46f663e1C9ab75d08Fc56' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 500 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 10 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ink Mainnet (57073) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 3000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x71052BAe71C25C78E37fD12E5ff1101A71d9018F' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Linea Goerli (59140) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 15 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Linea Sepolia (59141) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 900 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xF64E6E064a71B45514691D397ad4204972cD6508' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true Threshold = 50 MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 1000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Linea Mainnet (59144) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 300 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xa18152629128738a5c081eb226335FEd4B9C95e9' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true Threshold = 50 MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '400 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '500 mwei' BumpPercent = 40 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 350 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Metis Sepolia (59902) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x9870D6a0e05F867EAAe696e106741843F7fD116D' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'SuggestedPrice' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### BOB Mainnet (60808) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 3150 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x5aB885CDa7216b163fb6F813DEC1E1532516c833' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h50m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Treasure Mainnet (61166) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '5m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '25 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 250 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Polygon Mumbai (80001) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x326C977E6efc84E512bB9C30f76E30c160eD06FB' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 5000 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '25 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '25 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '20 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Polygon Amoy (80002) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 500 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x0Fd9e8d3aF1aaee056EB9e802c3A762a667b1904' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 5 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 10 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '12m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 5000 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '25 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '25 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '20 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Berachain Testnet (80084) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x52CEEed7d3f8c6618e4aaD6c6e555320d0D83271' LogBackfillBatchSize = 1000 LogPollInterval = '6s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '5m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Berachain Mainnet (80094) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x52CEEed7d3f8c6618e4aaD6c6e555320d0D83271' LogBackfillBatchSize = 1000 LogPollInterval = '6s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '5m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Blast Mainnet (81457) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x93202eC683288a9EA75BB829c6baCFb2BfeA9013' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 4 PollSuccessThreshold = 0 PollInterval = '4s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Base Goerli (84531) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Base Sepolia (84532) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xE4aB69C077896252FAFBD49EFD26B5D171A32410' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '12m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Plume Mainnet (98866) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '10m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '13h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 mwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Plume Sepolia (98867) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '6m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h10m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 mwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Katana Testnet (129399) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '45m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Taiko Mainnet (167000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '6m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 10 BumpThreshold = 2 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '5s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '5s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '1m0s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Taiko Testnet (167009) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '6m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '1 micro' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 10 BumpThreshold = 2 EIP1559DynamicFees = true FeeCapDefault = '50 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '5s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '5s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '1m0s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Mind Testnet (192940) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xd8A9246e84903e82CA01e42774b01A7CdD465BFa' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '5 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Bitlayer Testnet (200810) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 21 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x2A5bACb2440BC17D53B7b9Be73512dDf92265e48' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '1 gwei' PriceMax = '1 gwei' PriceMin = '40 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '1 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Bitlayer Mainnet (200901) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 21 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x56B275c0Ec034a229a1deD8DB17089544bc276D9' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '1 gwei' PriceMax = '1 gwei' PriceMin = '40 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '1 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Arbitrum Rinkeby (421611) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x615fBe6372676474d9e6933d310469c9b68e9726' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Arbitrum Goerli (421613) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0xd14838A68E8AFBAdE5efb411d5871ea0011AFd28' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 14500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Arbitrum Sepolia (421614) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xb1D4538B4571d411F07960EF2838Ce337FE1E80E' LogBackfillBatchSize = 1000 LogPollInterval = '1s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 5 EIP1559DynamicFees = false FeeCapDefault = '1 micro' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 0 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 14500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Scroll Sepolia (534351) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'scroll' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x231d45b53C905c3d6201318156BDC725c9c3B9B1' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true DetectionApiUrl = 'https://sepolia-venus.scroll.io' [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '1 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x5300000000000000000000000000000000000002' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Scroll Mainnet (534352) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'scroll' FinalityDepth = 10 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x548C6944cba02B9D1C0570102c89de64D258d3Ac' LogBackfillBatchSize = 1000 LogPollInterval = '5s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true DetectionApiUrl = 'https://venus.scroll.io' [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '1 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 24 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x5300000000000000000000000000000000000002' [HeadTracker] HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Merlin Testnet (686868) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zkevm' FinalityDepth = 1000 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '4s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 100 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '3m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = true MinAttempts = 3 [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Hemi Testnet (743111) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '4s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = false RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '30m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '2m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 50 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Katana Mainnet (747474) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '1m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '45m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ink Testnet (763373) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 3000 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x3423C922911956b1Ccbc2b5d4f38216a6f4299b4' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h0m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '2s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### BOB Testnet (808813) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 3150 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xcd2AfB2933391E35e8682cbaaF75d9CA7339b183' LogBackfillBatchSize = 1000 LogPollInterval = '3s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '1h50m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'FeeHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 100 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '4s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Treasure Testnet (978658) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'zksync' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LogBackfillBatchSize = 1000 LogPollInterval = '10s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '10m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '100 mwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'zksync' [HeadTracker] HistoryDepth = 250 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Ethereum Sepolia (11155111) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x779877A7B0D9E8603169DdbD7836e478b4624789' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.1 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 4 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 50 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 10500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Optimism Sepolia (11155420) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0xE4aB69C077896252FAFBD49EFD26B5D171A32410' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '40s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '15m0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '30s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 wei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = true FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 60 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = false PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 10 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 6500000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Corn Mainnet (21000000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x7311DED199CC28D80E58e81e8589aa160199FCD2' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '1 micro' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Corn Testnet (21000001) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'arbitrum' FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x996EfAb6011896Be832969D91E9bc1b3983cfdA1' LogBackfillBatchSize = 1000 LogPollInterval = '15s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'Arbitrum' PriceDefault = '100 mwei' PriceMax = '1 micro' PriceMin = '0' LimitDefault = 500000 LimitMax = 1000000000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'arbitrum' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Blast Sepolia (168587773) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false ChainType = 'optimismBedrock' FinalityDepth = 200 SafeDepth = 0 FinalityTagEnabled = true SafeTagSupported = true LinkContractAddress = '0x02c359ebf98fc8BF793F970F9B8302bb373BdF32' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 3 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '3m0s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '20 gwei' PriceMax = '120 gwei' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '100 wei' BumpPercent = 20 BumpThreshold = 60 EIP1559DynamicFees = true FeeCapDefault = '120 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [GasEstimator.DAOracle] OracleType = 'opstack' OracleAddress = '0x420000000000000000000000000000000000000F' [HeadTracker] HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 4 PollSuccessThreshold = 0 PollInterval = '4s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Harmony Mainnet (1666600000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x218532a12a389a4a92fC0C5Fb22901D1c19198aA' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '5 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### Harmony Testnet (1666700000) ```toml AutoCreateKey = true BlockBackfillDepth = 10 BlockBackfillSkip = false FinalityDepth = 50 SafeDepth = 0 FinalityTagEnabled = false SafeTagSupported = true LinkContractAddress = '0x8b12Ac23BFe11cAb03a634C1F117D64a7f2cFD3e' LogBackfillBatchSize = 1000 LogPollInterval = '2s' LogPollerSkipEmptyBlocks = false LogKeepBlocksDepth = 100000 LogPrunePageSize = 0 BackupLogPollerBlockDelay = 100 MinIncomingConfirmations = 1 MinContractPayment = '0.00001 link' NonceAutoSync = true NoNewHeadsThreshold = '30s' LogBroadcasterEnabled = true RPCDefaultBatchSize = 250 RPCBlockQueryDelay = 1 FinalizedBlockOffset = 0 NoNewFinalizedHeadsThreshold = '0s' [Transactions] Enabled = true ForwardersEnabled = false MaxInFlight = 16 MaxQueued = 250 ReaperInterval = '1h0m0s' ReaperThreshold = '168h0m0s' ResendAfterThreshold = '1m0s' ConfirmationTimeout = '1m0s' [Transactions.AutoPurge] Enabled = false [Transactions.TransactionManagerV2] Enabled = false [BalanceMonitor] Enabled = true [GasEstimator] Mode = 'BlockHistory' PriceDefault = '5 gwei' PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' PriceMin = '1 gwei' LimitDefault = 500000 LimitMax = 500000 LimitMultiplier = '1' LimitTransfer = 21000 EstimateLimit = false BumpMin = '5 gwei' BumpPercent = 20 BumpThreshold = 3 EIP1559DynamicFees = false FeeCapDefault = '100 gwei' TipCapDefault = '1 wei' TipCapMin = '1 wei' [GasEstimator.BlockHistory] BatchSize = 25 BlockHistorySize = 8 CheckInclusionBlocks = 12 CheckInclusionPercentile = 90 TransactionPercentile = 60 [GasEstimator.FeeHistory] CacheTimeout = '10s' [HeadTracker] HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' MaxAllowedFinalityDepth = 10000 FinalityTagBypass = false PersistenceEnabled = true PersistenceBatchSize = 100 [NodePool] PollFailureThreshold = 5 PollSuccessThreshold = 0 PollInterval = '10s' SelectionMode = 'HighestHead' SyncThreshold = 5 LeaseDuration = '0s' NodeIsSyncingEnabled = false FinalizedBlockPollInterval = '5s' EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 ContractTransmitterTransmitTimeout = '10s' DatabaseTimeout = '10s' DeltaCOverride = '168h0m0s' DeltaCJitterOverride = '1h0m0s' ObservationGracePeriod = '1s' [OCR2] [OCR2.Automation] GasLimit = 5400000 [Workflow] GasLimitDefault = 400000 TxAcceptanceState = 2 PollPeriod = '2s' AcceptanceTimeout = '30s' ``` ### ChainID ```toml ChainID = '1' # Example ``` ChainID is the EVM chain ID. Mandatory. ### Enabled ```toml Enabled = true # Default ``` Enabled enables this chain. ### AutoCreateKey ```toml AutoCreateKey = true # Default ``` AutoCreateKey, if set to true, will ensure that there is always at least one transmit key for the given chain. ### BlockBackfillDepth ```toml BlockBackfillDepth = 10 # Default ``` BlockBackfillDepth specifies the number of blocks before the current HEAD that the log broadcaster will try to re-consume logs from. ### BlockBackfillSkip ```toml BlockBackfillSkip = false # Default ``` BlockBackfillSkip enables skipping of very long backfills. ### ChainType ```toml ChainType = 'arbitrum' # Example ``` ChainType is automatically detected from chain ID. Set this to force a certain chain type regardless of chain ID. Available types: `arbitrum`, `celo`, `gnosis`, `hedera`, `kroma`, `metis`, `optimismBedrock`, `scroll`, `wemix`, `xlayer`, `zksync` ### SafeDepth ```toml SafeDepth = 0 # Default ``` SafeDepth is the number of blocks after which an ethereum transaction is considered "safe." Note that this setting is only used for chains with FinalityTags = false This number represents a number of blocks we consider large enough that reorgs are generally not likely to happen. Note that this number is different from FinalityDepth, which is the number of blocks after which a transaction is considered final. It is used in cases where we don't want to wait for finality. Special cases: `SafeDepth`=0 would imply that its value will fall back to the `FinalityDepth` value, if FinalityTagEnabled is false. Examples: Transaction sending: A transaction is sent at block height 42 `SafeDepth` is set to 5, FinalityTagEnabled = false, and FinalityDepth = 10 At block height 47, the transaction is considered safe, but not final. At block height 52, the transaction is considered final. ### FinalityDepth ```toml FinalityDepth = 50 # Default ``` FinalityDepth is the number of blocks after which an ethereum transaction is considered "final". Note that the default is automatically set based on chain ID, so it should not be necessary to change this under normal operation. BlocksConsideredFinal determines how deeply we look back to ensure that transactions are confirmed onto the longest chain There is not a large performance penalty to setting this relatively high (on the order of hundreds) It is practically limited by the number of heads we store in the database and should be less than this with a comfortable margin. If a transaction is mined in a block more than this many blocks ago, and is reorged out, we will NOT retransmit this transaction and undefined behaviour can occur including gaps in the nonce sequence that require manual intervention to fix. Therefore, this number represents a number of blocks we consider large enough that no re-org this deep will ever feasibly happen. Special cases: `FinalityDepth`=0 would imply that transactions can be final even before they were mined into a block. This is not supported. `FinalityDepth`=1 implies that transactions are final after we see them in one block. Examples: Transaction sending: A transaction is sent at block height 42 `FinalityDepth` is set to 5 A re-org occurs at height 44 starting at block 41, transaction is marked for rebroadcast A re-org occurs at height 46 starting at block 41, transaction is marked for rebroadcast A re-org occurs at height 47 starting at block 41, transaction is NOT marked for rebroadcast ### FinalityTagEnabled ```toml FinalityTagEnabled = false # Default ``` FinalityTagEnabled means that the chain supports the finalized block tag when querying for a block. If FinalityTagEnabled is set to true for a chain, then FinalityDepth field is ignored. Finality for a block is solely defined by the finality related tags provided by the chain's RPC API. This is a placeholder and hasn't been implemented yet. ### SafeTagSupported ```toml SafeTagSupported = true # Default ``` SafeTagSupported means that the chain supports the safe block tag when querying for a block. When FinalityTagEnabled is true and SafeTagSupported is false, LatestSafeBlock will return the finalized block instead of safe block. When SafeTagSupported is true, LatestSafeBlock will return the safe block from the chain. When FinalityTagEnabled is false, SafeTagSupported is ignored and LatestSafeBlock uses SafeDepth. ### FlagsContractAddress ```toml FlagsContractAddress = '0xae4E781a6218A8031764928E88d457937A954fC3' # Example ``` FlagsContractAddress can optionally point to a [Flags contract](https://github.com/smartcontractkit/chainlink-evm/blob/develop/contracts/src/v0.8/l2ep/Flags.sol). If set, the node will lookup that contract for each job that supports flags contracts (currently OCR and FM jobs are supported). If the job's contractAddress is set as hibernating in the FlagsContractAddress address, it overrides the standard update parameters (such as heartbeat/threshold). ### LinkContractAddress ```toml LinkContractAddress = '0x538aAaB4ea120b2bC2fe5D296852D948F07D849e' # Example ``` LinkContractAddress is the canonical ERC-677 LINK token contract address on the given chain. Note that this is usually autodetected from chain ID. ### LogBackfillBatchSize ```toml LogBackfillBatchSize = 1000 # Default ``` LogBackfillBatchSize sets the batch size for calling FilterLogs when we backfill missing logs. ### LogPollInterval ```toml LogPollInterval = '15s' # Default ``` LogPollInterval works in conjunction with Feature.LogPoller. Controls how frequently the log poller polls for logs. Defaults to the block production rate. ### LogKeepBlocksDepth ```toml LogKeepBlocksDepth = 100000 # Default ``` LogKeepBlocksDepth works in conjunction with Feature.LogPoller. Controls how many blocks the poller will keep, must be greater than FinalityDepth+1. ### LogPollerSkipEmptyBlocks ```toml LogPollerSkipEmptyBlocks = false # Default ``` LogPollerSkipEmptyBlocks defines if LogPoller should persist or skip blocks that do not contain logs matching any of registered filters. Setting this to true can reduce the load on the database and improve performance for fast chains. ### LogPrunePageSize ```toml LogPrunePageSize = 0 # Default ``` LogPrunePageSize defines size of the page for pruning logs. Controls how many logs/blocks (at most) are deleted in a single prune tick. Default value 0 means no paging, delete everything at once. ### BackupLogPollerBlockDelay ```toml BackupLogPollerBlockDelay = 100 # Default ``` BackupLogPollerBlockDelay works in conjunction with Feature.LogPoller. Controls the block delay of Backup LogPoller, affecting how far behind the latest finalized block it starts and how often it runs. BackupLogPollerDelay=0 will disable Backup LogPoller (*not recommended for production environment*). ### MinContractPayment ```toml MinContractPayment = '10000000000000 juels' # Default ``` MinContractPayment is the minimum payment in LINK required to execute a direct request job. This can be overridden on a per-job basis. ### MinIncomingConfirmations ```toml MinIncomingConfirmations = 3 # Default ``` MinIncomingConfirmations is the minimum required confirmations before a log event will be consumed. ### NonceAutoSync ```toml NonceAutoSync = true # Default ``` NonceAutoSync enables automatic nonce syncing on startup. Chainlink nodes will automatically try to sync its local nonce with the remote chain on startup and fast forward if necessary. This is almost always safe but can be disabled in exceptional cases by setting this value to false. ### NoNewHeadsThreshold ```toml NoNewHeadsThreshold = '3m' # Default ``` NoNewHeadsThreshold controls how long to wait after receiving no new heads before `NodePool` marks rpc endpoints as out-of-sync, and `HeadTracker` logs warnings. Set to zero to disable out-of-sync checking. ### OperatorFactoryAddress ```toml OperatorFactoryAddress = '0xa5B85635Be42F21f94F28034B7DA440EeFF0F418' # Example ``` OperatorFactoryAddress is the address of the canonical operator forwarder contract on the given chain. Note that this is usually autodetected from chain ID. ### RPCDefaultBatchSize ```toml RPCDefaultBatchSize = 250 # Default ``` RPCDefaultBatchSize is the default batch size for batched RPC calls. ### RPCBlockQueryDelay ```toml RPCBlockQueryDelay = 1 # Default ``` RPCBlockQueryDelay controls the number of blocks to trail behind head in the block history estimator and balance monitor. For example, if this is set to 3, and we receive block 10, block history estimator will fetch block 7. CAUTION: You might be tempted to set this to 0 to use the latest possible block, but it is possible to receive a head BEFORE that block is actually available from the connected node via RPC, due to race conditions in the code of the remote ETH node. In this case you will get false "zero" blocks that are missing transactions. ### FinalizedBlockOffset ```toml FinalizedBlockOffset = 0 # Default ``` FinalizedBlockOffset defines the number of blocks by which the latest finalized block will be shifted/delayed. For example, suppose RPC returns block 100 as the latest finalized. In that case, the CL Node will treat block `100 - FinalizedBlockOffset` as the latest finalized block and `latest - FinalityDepth - FinalizedBlockOffset` in case of `FinalityTagEnabled = false.` With `EnforceRepeatableRead = true,` RPC is considered healthy only if its most recent finalized block is larger or equal to the highest finalized block observed by the CL Node minus `FinalizedBlockOffset.` Higher values of `FinalizedBlockOffset` with `EnforceRepeatableRead = true` reduce the number of false `FinalizedBlockOutOfSync` declarations on healthy RPCs that are slightly lagging behind due to network delays. This may increase the number of healthy RPCs and reduce the probability that the CL Node will not have any healthy alternatives to the active RPC. CAUTION: Setting this to values higher than 0 may delay transaction creation in products (e.g., CCIP, Automation) that base their decision on finalized on-chain events. PoS chains with `FinalityTagEnabled=true` and batched (epochs) blocks finalization (e.g., Ethereum Mainnet) must be treated with special care as a minor increase in the `FinalizedBlockOffset` may lead to significant delays. For example, let's say that `FinalizedBlockOffset = 1` and blocks are finalized in batches of 32. The latest finalized block on chain is 64, so block 63 is the latest finalized for CL Node. Block 64 will be treated as finalized by CL Node only when chain's latest finalized block is 65. As chain finalizes blocks in batches of 32, CL Node has to wait for a whole new batch to be finalized to treat block 64 as finalized. ### LogBroadcasterEnabled ```toml LogBroadcasterEnabled = true # Default ``` LogBroadcasterEnabled is a feature flag for LogBroadcaster, by default it's true. ### NoNewFinalizedHeadsThreshold ```toml NoNewFinalizedHeadsThreshold = '0' # Default ``` NoNewFinalizedHeadsThreshold controls how long to wait for new finalized block before `NodePool` marks rpc endpoints as out-of-sync. Only applicable if `FinalityTagEnabled=true` Set to zero to disable. ## EVM.Transactions ```toml [EVM.Transactions] ConfirmationTimeout = '60s' # Default Enabled = true # Default ForwardersEnabled = false # Default MaxInFlight = 16 # Default MaxQueued = 250 # Default ReaperInterval = '1h' # Default ReaperThreshold = '168h' # Default ResendAfterThreshold = '1m' # Default ``` ### ConfirmationTimeout ```toml ConfirmationTimeout = '60s' # Default ``` ConfirmationTimeout time to wait for a TX to get into a block in the blockchain. This is used for the EVMService.SubmitTransaction operation. ### Enabled ```toml Enabled = true # Default ``` Enabled is a feature flag for the Transaction Manager. This flag also enables or disables the gas estimator since it is dependent on the TXM to start it. ### ForwardersEnabled ```toml ForwardersEnabled = false # Default ``` ForwardersEnabled enables or disables sending transactions through forwarder contracts. ### MaxInFlight ```toml MaxInFlight = 16 # Default ``` MaxInFlight controls how many transactions are allowed to be "in-flight" i.e. broadcast but unconfirmed at any one time. You can consider this a form of transaction throttling. The default is set conservatively at 16 because this is a pessimistic minimum that both geth and parity will hold without evicting local transactions. If your node is falling behind and you need higher throughput, you can increase this setting, but you MUST make sure that your ETH node is configured properly otherwise you can get nonce gapped and your node will get stuck. 0 value disables the limit. Use with caution. ### MaxQueued ```toml MaxQueued = 250 # Default ``` MaxQueued is the maximum number of unbroadcast transactions per key that are allowed to be enqueued before jobs will start failing and rejecting send of any further transactions. This represents a sanity limit and generally indicates a problem with your ETH node (transactions are not getting mined). Do NOT blindly increase this value thinking it will fix things if you start hitting this limit because transactions are not getting mined, you will instead only make things worse. In deployments with very high burst rates, or on chains with large re-orgs, you *may* consider increasing this. 0 value disables any limit on queue size. Use with caution. ### ReaperInterval ```toml ReaperInterval = '1h' # Default ``` ReaperInterval controls how often the EthTx reaper will run. ### ReaperThreshold ```toml ReaperThreshold = '168h' # Default ``` ReaperThreshold indicates how old an EthTx ought to be before it can be reaped. ### ResendAfterThreshold ```toml ResendAfterThreshold = '1m' # Default ``` ResendAfterThreshold controls how long to wait before re-broadcasting a transaction that has not yet been confirmed. ## EVM.Transactions.AutoPurge ```toml [EVM.Transactions.AutoPurge] Enabled = false # Default DetectionApiUrl = 'https://example.api.io' # Example Threshold = 5 # Example MinAttempts = 3 # Example ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enables or disables automatically purging transactions that have been identified as terminally stuck (will never be included on-chain). This feature is only expected to be used by ZK chains. ### DetectionApiUrl ```toml DetectionApiUrl = 'https://example.api.io' # Example ``` DetectionApiUrl configures the base url of a custom endpoint used to identify terminally stuck transactions. ### Threshold ```toml Threshold = 5 # Example ``` Threshold configures the number of blocks a transaction has to remain unconfirmed before it is evaluated for being terminally stuck. This threshold is only applied if there is no custom API to identify stuck transactions provided by the chain. ### MinAttempts ```toml MinAttempts = 3 # Example ``` MinAttempts configures the minimum number of broadcasted attempts a transaction has to have before it is evaluated further for being terminally stuck. This threshold is only applied if there is no custom API to identify stuck transactions provided by the chain. Ensure the gas estimator configs take more bump attempts before reaching the configured max gas price. ## EVM.Transactions.TransactionManagerV2 ```toml [EVM.Transactions.TransactionManagerV2] Enabled = false # Default BlockTime = '10s' # Example CustomURL = 'https://example.api.io' # Example DualBroadcast = false # Example ReadRequestsToMultipleNodes = false # Example Bundles = false # Example FastlaneAuctionRequestTimeout = '5s' # Example FeeBoost = false # Default ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enables TransactionManagerV2. ### BlockTime ```toml BlockTime = '10s' # Example ``` BlockTime controls the frequency of the backfill loop of TransactionManagerV2. ### CustomURL ```toml CustomURL = 'https://example.api.io' # Example ``` CustomURL configures the base url of a custom endpoint used by the ChainDualBroadcast chain type. ### DualBroadcast ```toml DualBroadcast = false # Example ``` DualBroadcast enables DualBroadcast functionality. ### ReadRequestsToMultipleNodes ```toml ReadRequestsToMultipleNodes = false # Example ``` ReadRequestsToMultipleNodes controls whether txm chain client reads use multiplexed calls. ### Bundles ```toml Bundles = false # Example ``` Bundles enables Bundles functionality for SVR. ### FastlaneAuctionRequestTimeout ```toml FastlaneAuctionRequestTimeout = '5s' # Example ``` FastlaneAuctionRequestTimeout configures the timeout for fastlane auction requests. ### FeeBoost ```toml FeeBoost = false # Default ``` FeeBoost enables node to immediately boost txs to the max gas price configured ## EVM.BalanceMonitor ```toml [EVM.BalanceMonitor] Enabled = true # Default ``` ### Enabled ```toml Enabled = true # Default ``` Enabled balance monitoring for all keys. ## EVM.GasEstimator ```toml [EVM.GasEstimator] Mode = 'BlockHistory' # Default PriceDefault = '20 gwei' # Default PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' # Default PriceMin = '1 gwei' # Default LimitDefault = 500_000 # Default LimitMax = 500_000 # Default LimitMultiplier = '1.0' # Default LimitTransfer = 21_000 # Default EstimateLimit = false # Default SenderAddress = '0x00c11c11c11C11c11C11c11c11C11C11c11C11c1' # Example BumpMin = '5 gwei' # Default BumpPercent = 20 # Default BumpThreshold = 3 # Default BumpTxDepth = 16 # Example EIP1559DynamicFees = false # Default FeeCapDefault = '100 gwei' # Default TipCapDefault = '1 wei' # Default TipCapMin = '1 wei' # Default ``` ### Mode ```toml Mode = 'BlockHistory' # Default ``` Mode controls what type of gas estimator is used. - `FixedPrice` uses static configured values for gas price (can be set via API call). - `BlockHistory` dynamically adjusts default gas price based on heuristics from mined blocks. - `L2Suggested` mode is deprecated and replaced with `SuggestedPrice`. - `SuggestedPrice` is a mode which uses the gas price suggested by the rpc endpoint via `eth_gasPrice`. - `Arbitrum` is a special mode only for use with Arbitrum blockchains. It uses the suggested gas price (up to `ETH_MAX_GAS_PRICE_WEI`, with `1000 gwei` default) as well as an estimated gas limit (up to `ETH_GAS_LIMIT_MAX`, with `1,000,000,000` default). Chainlink nodes decide what gas price to use using an `Estimator`. It ships with several simple and battle-hardened built-in estimators that should work well for almost all use-cases. Note that estimators will change their behaviour slightly depending on if you are in EIP-1559 mode or not. You can also use your own estimator for gas price by selecting the `FixedPrice` estimator and using the exposed API to set the price. An important point to note is that the Chainlink node does *not* ship with built-in support for go-ethereum's `estimateGas` call. This is for several reasons, including security and reliability. We have found empirically that it is not generally safe to rely on the remote ETH node's idea of what gas price should be. ### PriceDefault ```toml PriceDefault = '20 gwei' # Default ``` PriceDefault is the default gas price to use when submitting transactions to the blockchain. Will be overridden by the built-in `BlockHistoryEstimator` if enabled, and might be increased if gas bumping is enabled. (Only applies to legacy transactions) Can be used with the `chainlink setgasprice` to be updated while the node is still running. ### PriceMax ```toml PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' # Default ``` PriceMax is the maximum gas price. Chainlink nodes will never pay more than this for a transaction. This applies to both legacy and EIP1559 transactions. Note that it is impossible to disable the maximum limit. Setting this value to zero will prevent paying anything for any transaction (which can be useful in some rare cases). Most chains by default have the maximum set to 2\*\*256-1 Wei which is the maximum allowed gas price on EVM-compatible chains, and is so large it may as well be unlimited. ### PriceMin ```toml PriceMin = '1 gwei' # Default ``` PriceMin is the minimum gas price. Chainlink nodes will never pay less than this for a transaction. (Only applies to legacy transactions) It is possible to force the Chainlink node to use a fixed gas price by setting a combination of these, e.g. ```toml EIP1559DynamicFees = false PriceMax = 100 PriceMin = 100 PriceDefault = 100 BumpThreshold = 0 Mode = 'FixedPrice' ``` ### LimitDefault ```toml LimitDefault = 500_000 # Default ``` LimitDefault sets default gas limit for outgoing transactions. This should not need to be changed in most cases. Some job types, such as Keeper jobs, might set their own gas limit unrelated to this value. ### LimitMax ```toml LimitMax = 500_000 # Default ``` LimitMax sets a maximum for *estimated* gas limits. This currently only applies to `Arbitrum` `GasEstimatorMode`. ### LimitMultiplier ```toml LimitMultiplier = '1.0' # Default ``` LimitMultiplier is the factor by which a transaction's GasLimit is multiplied before transmission. So if the value is 1.1, and the GasLimit for a transaction is 10, 10% will be added before transmission. This factor is always applied, so includes L2 transactions which uses a default gas limit of 1 and is also applied to `LimitDefault`. ### LimitTransfer ```toml LimitTransfer = 21_000 # Default ``` LimitTransfer is the gas limit used for an ordinary ETH transfer. ### EstimateLimit ```toml EstimateLimit = false # Default ``` EstimateLimit enables estimating gas limits for transactions. This feature respects the gas limit provided during transaction creation as an upper bound. ### SenderAddress ```toml SenderAddress = '0x00c11c11c11C11c11C11c11c11C11C11c11C11c1' # Example ``` SenderAddress is optional and can be set to a specific sender address for gas limit estimation (i.e. `EstimateLimit = true`). If gas limit estimation is not enabled, this parameter is ignored. If you are using gas limit estimation: - Setting SenderAddress is optional for most products. If it is set, the from address for the transaction for gas estimation will be set to the inputted SenderAddress. If it is not set, the actual address the transaction is sent from is used if available. - Setting SenderAddress is necessary for gas limit estimation to function correctly for CCIP. Gas limit estimation works only in CCIP 1.6 and above if SenderAddress is set to the given example value (0x00c11c11c11C11c11C11c11c11C11C11c11C11c1). This value is hardcoded in the CCIP 1.6 contracts and is not needed for other products. ### BumpMin ```toml BumpMin = '5 gwei' # Default ``` BumpMin is the minimum fixed amount of wei by which gas is bumped on each transaction attempt. ### BumpPercent ```toml BumpPercent = 20 # Default ``` BumpPercent is the percentage by which to bump gas on a transaction that has exceeded `BumpThreshold`. The larger of `BumpPercent` and `BumpMin` is taken for gas bumps. The `SuggestedPriceEstimator` adds the larger of `BumpPercent` and `BumpMin` on top of the price provided by the RPC when bumping a transaction's gas. ### BumpThreshold ```toml BumpThreshold = 3 # Default ``` BumpThreshold is the number of blocks to wait for a transaction stuck in the mempool before automatically bumping the gas price. Set to 0 to disable gas bumping completely. ### BumpTxDepth ```toml BumpTxDepth = 16 # Example ``` BumpTxDepth is the number of transactions to gas bump starting from oldest. Set to 0 for no limit (i.e. bump all). Can not be greater than EVM.Transactions.MaxInFlight. If not set, defaults to EVM.Transactions.MaxInFlight. ### EIP1559DynamicFees ```toml EIP1559DynamicFees = false # Default ``` EIP1559DynamicFees forces EIP-1559 transaction mode. Enabling EIP-1559 mode can help reduce gas costs on chains that support it. This is supported only on official Ethereum mainnet and testnets. It is not recommended to enable this setting on Polygon because the EIP-1559 fee market appears to be broken on all Polygon chains and EIP-1559 transactions are less likely to be included than legacy transactions. #### Technical details Chainlink nodes include experimental support for submitting transactions using type 0x2 (EIP-1559) envelope. EIP-1559 mode is enabled by default on the Ethereum Mainnet, but can be enabled on a per-chain basis or globally. This might help to save gas on spikes. Chainlink nodes should react faster on the upleg and avoid overpaying on the downleg. It might also be possible to set `EVM.GasEstimator.BlockHistory.BatchSize` to a smaller value such as 12 or even 6 because tip cap should be a more consistent indicator of inclusion time than total gas price. This would make Chainlink nodes more responsive and should reduce response time variance. Some experimentation is required to find optimum settings. 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](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). Chainlink's implementation of EIP-1559 works as follows: If you are using FixedPriceEstimator: - With gas bumping disabled, it will submit all transactions with `feecap=PriceMax` and `tipcap=GasTipCapDefault` - With gas bumping enabled, it will submit all transactions initially with `feecap=GasFeeCapDefault` and `tipcap=GasTipCapDefault`. If you are using BlockHistoryEstimator (default for most chains): - With gas bumping disabled, it will submit all transactions with `feecap=PriceMax` and `tipcap=` - 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 `EVM.GasEstimator.BlockHistory.EIP1559FeeCapBufferBlocks` but defaults to `gas bump threshold+1` and `tipcap=` Bumping works as follows: - Increase tipcap by `max(tipcap * (1 + BumpPercent), tipcap + BumpMin)` - Increase feecap by `max(feecap * (1 + BumpPercent), feecap + BumpMin)` A quick note on terminology - Chainlink nodes use 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. Be aware that 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 `GasTipCapDefault` instead of `GasPriceDefault` for the tip cap - `FixedPriceEstimator` will use `GasFeeCapDefault` instead of `GasPriceDefault` for the fee cap - `PriceMin` is ignored for new transactions and `GasTipCapMinimum` is used instead (default 0) - `PriceMax` still represents that absolute upper limit that Chainlink will ever spend (total) on a single tx - `Keeper.GasTipCapBufferPercent` is ignored in EIP-1559 mode and `Keeper.GasTipCapBufferPercent` is used instead ### FeeCapDefault ```toml FeeCapDefault = '100 gwei' # Default ``` FeeCapDefault controls the fixed initial fee cap, if EIP1559 mode is enabled and `FixedPrice` gas estimator is used. ### TipCapDefault ```toml TipCapDefault = '1 wei' # Default ``` TipCapDefault is the default gas tip to use when submitting transactions to the blockchain. Will be overridden by the built-in `BlockHistoryEstimator` if enabled, and might be increased if gas bumping is enabled. (Only applies to EIP-1559 transactions) ### TipCapMin ```toml TipCapMin = '1 wei' # Default ``` TipCapMinimum is the minimum gas tip to use when submitting transactions to the blockchain. (Only applies to EIP-1559 transactions) ## EVM.GasEstimator.DAOracle ```toml [EVM.GasEstimator.DAOracle] OracleType = 'opstack' # Example OracleAddress = '0x420000000000000000000000000000000000000F' # Example CustomGasPriceCalldata = '' # Default ``` ### OracleType ```toml OracleType = 'opstack' # Example ``` OracleType refers to the oracle family this config belongs to. Currently the available oracle types are: 'opstack', 'arbitrum', 'zksync', and 'custom_calldata'. ### OracleAddress ```toml OracleAddress = '0x420000000000000000000000000000000000000F' # Example ``` OracleAddress is the address of the oracle contract. ### CustomGasPriceCalldata ```toml CustomGasPriceCalldata = '' # Default ``` CustomGasPriceCalldata is optional and can be set to call a custom gas price function at the given OracleAddress. ## EVM.GasEstimator.LimitJobType ```toml [EVM.GasEstimator.LimitJobType] OCR = 100_000 # Example OCR2 = 100_000 # Example DR = 100_000 # Example VRF = 100_000 # Example FM = 100_000 # Example Keeper = 100_000 # Example ``` ### OCR ```toml OCR = 100_000 # Example ``` OCR overrides LimitDefault for OCR jobs. ### OCR2 ```toml OCR2 = 100_000 # Example ``` OCR2 overrides LimitDefault for OCR2 jobs. ### DR ```toml DR = 100_000 # Example ``` DR overrides LimitDefault for Direct Request jobs. ### VRF ```toml VRF = 100_000 # Example ``` VRF overrides LimitDefault for VRF jobs. ### FM ```toml FM = 100_000 # Example ``` FM overrides LimitDefault for Flux Monitor jobs. ### Keeper ```toml Keeper = 100_000 # Example ``` Keeper overrides LimitDefault for Keeper jobs. ## EVM.GasEstimator.BlockHistory ```toml [EVM.GasEstimator.BlockHistory] BatchSize = 25 # Default BlockHistorySize = 8 # Default CheckInclusionBlocks = 12 # Default CheckInclusionPercentile = 90 # Default EIP1559FeeCapBufferBlocks = 13 # Example TransactionPercentile = 60 # Default ``` These settings allow you to configure how your node calculates gas prices when using the block history estimator. In most cases, leaving these values at their defaults should give good results. ### BatchSize ```toml BatchSize = 25 # Default ``` BatchSize sets the maximum number of blocks to fetch in one batch in the block history estimator. If the `BatchSize` variable is set to 0, it defaults to `EVM.RPCDefaultBatchSize`. ### BlockHistorySize ```toml BlockHistorySize = 8 # Default ``` BlockHistorySize controls the number of past blocks to keep in memory to use as a basis for calculating a percentile gas price. ### CheckInclusionBlocks ```toml CheckInclusionBlocks = 12 # Default ``` CheckInclusionBlocks is the number of recent blocks to use to detect if there is a transaction propagation/connectivity issue, and to prevent bumping in these cases. This can help avoid the situation where RPC nodes are not propagating transactions for some non-price-related reason (e.g. go-ethereum bug, networking issue etc) and bumping gas would not help. Set to zero to disable connectivity checking completely. ### CheckInclusionPercentile ```toml CheckInclusionPercentile = 90 # Default ``` CheckInclusionPercentile controls the percentile that a transaction must have been higher than for all the blocks in the inclusion check window in order to register as a connectivity issue. For example, if CheckInclusionBlocks=12 and CheckInclusionPercentile=90 then further bumping will be prevented for any transaction with any attempt that has a higher price than the 90th percentile for the most recent 12 blocks. ### EIP1559FeeCapBufferBlocks ```toml EIP1559FeeCapBufferBlocks = 13 # Example ``` EIP1559FeeCapBufferBlocks 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. (Only applies to EIP-1559 transactions) ### TransactionPercentile ```toml TransactionPercentile = 60 # Default ``` TransactionPercentile specifies gas price to choose. E.g. if the block history contains four transactions with gas prices `[100, 200, 300, 400]` then picking 25 for this number will give a value of 200. If the calculated gas price is higher than `GasPriceDefault` then the higher price will be used as the base price for new transactions. Must be in range 0-100. Only has an effect if gas updater is enabled. Think of this number as an indicator of how aggressive you want your node to price its transactions. Setting this number higher will cause the Chainlink node to select higher gas prices. Setting it lower will tend to set lower gas prices. ## EVM.GasEstimator.FeeHistory ```toml [EVM.GasEstimator.FeeHistory] CacheTimeout = '10s' # Default ``` ### CacheTimeout ```toml CacheTimeout = '10s' # Default ``` CacheTimeout is the time to wait in order to refresh the cached values stored in the FeeHistory estimator. A small jitter is applied so the timeout won't be exactly the same each time. You want this value to be close to the block time. For slower chains, like Ethereum, you can set it to 12s, the same as the block time. For faster chains you can skip a block or two and set it to two times the block time i.e. on Optimism you can set it to 4s. Ideally, you don't want to go lower than 1s since the RTT times of the RPC requests will be comparable to the timeout. The estimator is already adding a buffer to account for a potential increase in prices within one or two blocks. On the other hand, slower frequency will fail to refresh the prices and end up in stale values. ## EVM.HeadTracker ```toml [EVM.HeadTracker] HistoryDepth = 100 # Default MaxBufferSize = 3 # Default SamplingInterval = '1s' # Default FinalityTagBypass = false # Default MaxAllowedFinalityDepth = 10000 # Default PersistenceEnabled = true # Default PersistenceBatchSize = 100 # Default ``` The head tracker continually listens for new heads from the chain. In addition to these settings, it log warnings if `EVM.NoNewHeadsThreshold` is exceeded without any new blocks being emitted. ### HistoryDepth ```toml HistoryDepth = 100 # Default ``` HistoryDepth tracks the top N blocks on top of the latest finalized block to keep in the `heads` database table. Note that this can easily result in MORE than `N + finality depth` records since in the case of re-orgs we keep multiple heads for a particular block height. Higher values help reduce number of RPC requests performed by TXM's Finalizer and improve TXM's Confirmer reorg protection on restarts. At the same time, setting the value too high could lead to higher CPU consumption. The following formula could be used to calculate the optimal value: `expected_downtime_on_restart/block_time`. ### MaxBufferSize ```toml MaxBufferSize = 3 # Default ``` MaxBufferSize is the maximum number of heads that may be buffered in front of the head tracker before older heads start to be dropped. You may think of it as something like the maximum permittable "lag" for the head tracker before we start dropping heads to keep up. ### SamplingInterval ```toml SamplingInterval = '1s' # Default ``` SamplingInterval means that head tracker callbacks will at maximum be made once in every window of this duration. This is a performance optimisation for fast chains. Set to 0 to disable sampling entirely. ### FinalityTagBypass ```toml FinalityTagBypass = false # Default ``` FinalityTagBypass disables FinalityTag support in HeadTracker and makes it track blocks up to FinalityDepth from the most recent head. It should only be used on chains with an extremely large actual finality depth (the number of blocks between the most recent head and the latest finalized block). Has no effect if `FinalityTagsEnabled` = false ### MaxAllowedFinalityDepth ```toml MaxAllowedFinalityDepth = 10000 # Default ``` MaxAllowedFinalityDepth - defines maximum number of blocks between the most recent head and the latest finalized block. If actual finality depth exceeds this number, HeadTracker aborts backfill and returns an error. Has no effect if `FinalityTagsEnabled` = false ### PersistenceEnabled ```toml PersistenceEnabled = true # Default ``` PersistenceEnabled defines whether HeadTracker needs to store heads in the database. Persistence is helpful on chains with large finality depth, where fetching blocks from the latest to the latest finalized takes a lot of time. On chains with fast finality, the persistence layer does not improve the chain's load time and only consumes database resources (mainly IO). NOTE: persistence should not be disabled for products that use LogBroadcaster, as it might lead to missed on-chain events. ### PersistenceBatchSize ```toml PersistenceBatchSize = 100 # Default ``` PersistenceBatchSize is used to batch head tracker db transactions (inserts and deletes). If set to 100, the head tracker will insert and delete to the db every 100 heads. If the head tracker crashes before the batch size is reached (i.e it fails to write the current batch to the db). Then it will have to load that batch of heads from the rpc on startup (check PersistenceEnabled above). To limit that initial fetch while also improving db usage, 100 is the default for now. ## EVM.KeySpecific ```toml [[EVM.KeySpecific]] Key = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example GasEstimator.PriceMax = '79 gwei' # Example ``` ### Key ```toml Key = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example ``` Key is the account to apply these settings to ### PriceMax ```toml GasEstimator.PriceMax = '79 gwei' # Example ``` GasEstimator.PriceMax overrides the maximum gas price for this key. See EVM.GasEstimator.PriceMax. ## EVM.NodePool ```toml [EVM.NodePool] PollFailureThreshold = 5 # Default PollSuccessThreshold = 0 # Default PollInterval = '10s' # Default SelectionMode = 'HighestHead' # Default SyncThreshold = 5 # Default LeaseDuration = '0s' # Default NodeIsSyncingEnabled = false # Default FinalizedBlockPollInterval = '5s' # Default EnforceRepeatableRead = true # Default DeathDeclarationDelay = '1m' # Default NewHeadsPollInterval = '0s' # Default VerifyChainID = true # Default ExternalRequestMaxResponseSize = 1000000 # Default ``` The node pool manages multiple RPC endpoints. In addition to these settings, `EVM.NoNewHeadsThreshold` controls how long to wait after receiving no new heads before marking the node as out-of-sync. ### PollFailureThreshold ```toml PollFailureThreshold = 5 # Default ``` PollFailureThreshold indicates how many polls must fail beyond those that succeed in order to mark a node as unreachable. Set to zero to disable poll checking. ### PollSuccessThreshold ```toml PollSuccessThreshold = 0 # Default ``` PollSuccessThreshold indicates how many consecutive polls must succeed in order to mark a node as alive once it has been marked as unreachable. Set to zero to require no successful polls (previous behavior). ### PollInterval ```toml PollInterval = '10s' # Default ``` PollInterval controls how often to poll the node to check for liveness. Set to zero to disable poll checking. ### SelectionMode ```toml SelectionMode = 'HighestHead' # Default ``` SelectionMode controls node selection strategy: - HighestHead: use the node with the highest head number - RoundRobin: rotate through nodes, per-request - PriorityLevel: use the node with the smallest order number - TotalDifficulty: use the node with the greatest total difficulty ### SyncThreshold ```toml SyncThreshold = 5 # Default ``` SyncThreshold 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`, `PriorityLevel`), or total difficulty (`TotalDifficulty`). Set to 0 to disable this check. ### LeaseDuration ```toml LeaseDuration = '0s' # Default ``` LeaseDuration is the minimum duration that the selected "best" node (as defined by SelectionMode) will be used, before switching to a better one if available. It also controls how often the lease check is done. Setting this to a low value (under 1m) might cause RPC to switch too aggressively. Recommended value is over 5m Set to '0s' to disable ### NodeIsSyncingEnabled ```toml NodeIsSyncingEnabled = false # Default ``` NodeIsSyncingEnabled is a flag that enables `syncing` health check on each reconnection to an RPC. Node transitions and remains in `Syncing` state while RPC signals this state (In case of Ethereum `eth_syncing` returns anything other than false). All of the requests to node in state `Syncing` are rejected. Set true to enable this check ### FinalizedBlockPollInterval ```toml FinalizedBlockPollInterval = '5s' # Default ``` FinalizedBlockPollInterval controls how often to poll RPC for new finalized blocks. The finalized block is only used to report to the `pool_rpc_node_highest_finalized_block` metric. We plan to use it in RPCs health assessment in the future. If `FinalityTagEnabled = false`, poll is not performed and `pool_rpc_node_highest_finalized_block` is reported based on latest block and finality depth. Set to 0 to disable. ### EnforceRepeatableRead ```toml EnforceRepeatableRead = true # Default ``` EnforceRepeatableRead defines if Core should only use RPCs whose most recently finalized block is greater or equal to `highest finalized block - FinalizedBlockOffset`. In other words, exclude RPCs lagging on latest finalized block. Set false to disable ### DeathDeclarationDelay ```toml DeathDeclarationDelay = '1m' # Default ``` DeathDeclarationDelay defines the minimum duration an RPC must be in unhealthy state before producing an error log message. Larger values might be helpful to reduce the noisiness of health checks like `EnforceRepeatableRead = true', which might be falsely trigger declaration of `FinalizedBlockOutOfSync`due to insignificant network delays in broadcasting of the finalized state among RPCs. Should be greater than`FinalizedBlockPollInterval\`. Unhealthy RPC will not be picked to handle a request even if this option is set to a nonzero value. ### NewHeadsPollInterval ```toml NewHeadsPollInterval = '0s' # Default ``` NewHeadsPollInterval define an interval for polling new block periodically using http client rather than subscribe to ws feed Set to 0 to disable. ### VerifyChainID ```toml VerifyChainID = true # Default ``` VerifyChainID enforces RPC Client ChainIDs to match configured ChainID ### ExternalRequestMaxResponseSize ```toml ExternalRequestMaxResponseSize = 1000000 # Default ``` ExternalRequestMaxResponseSize sets the maximum allowed size (in bytes) for responses to external requests. Responses larger than this value will be rejected to prevent the node from being overloaded. Only CRE workflow requests are considered external requests. Only applies for RPCs configured with HTTP urls. There is no limit for WS only RPCs. Set to 0 to disable the size check and allow responses of any size. ## EVM.NodePool.Errors ```toml [EVM.NodePool.Errors] NonceTooLow = '(: |^)nonce too low' # Example NonceTooHigh = '(: |^)nonce too high' # Example ReplacementTransactionUnderpriced = '(: |^)replacement transaction underpriced' # Example LimitReached = '(: |^)limit reached' # Example TransactionAlreadyInMempool = '(: |^)transaction already in mempool' # Example TerminallyUnderpriced = '(: |^)terminally underpriced' # Example InsufficientEth = '(: |^)insufficeint eth' # Example TxFeeExceedsCap = '(: |^)tx fee exceeds cap' # Example L2FeeTooLow = '(: |^)l2 fee too low' # Example L2FeeTooHigh = '(: |^)l2 fee too high' # Example L2Full = '(: |^)l2 full' # Example TransactionAlreadyMined = '(: |^)transaction already mined' # Example Fatal = '(: |^)fatal' # Example ServiceUnavailable = '(: |^)service unavailable' # Example TooManyResults = '(: |^)too many results' # Example MissingBlocks = '(: |^)missing blocks' # Example ``` Errors enable the node to provide custom regex patterns to match against error messages from RPCs. ### NonceTooLow ```toml NonceTooLow = '(: |^)nonce too low' # Example ``` NonceTooLow is a regex pattern to match against nonce too low errors. ### NonceTooHigh ```toml NonceTooHigh = '(: |^)nonce too high' # Example ``` NonceTooHigh is a regex pattern to match against nonce too high errors. ### ReplacementTransactionUnderpriced ```toml ReplacementTransactionUnderpriced = '(: |^)replacement transaction underpriced' # Example ``` ReplacementTransactionUnderpriced is a regex pattern to match against replacement transaction underpriced errors. ### LimitReached ```toml LimitReached = '(: |^)limit reached' # Example ``` LimitReached is a regex pattern to match against limit reached errors. ### TransactionAlreadyInMempool ```toml TransactionAlreadyInMempool = '(: |^)transaction already in mempool' # Example ``` TransactionAlreadyInMempool is a regex pattern to match against transaction already in mempool errors. ### TerminallyUnderpriced ```toml TerminallyUnderpriced = '(: |^)terminally underpriced' # Example ``` TerminallyUnderpriced is a regex pattern to match against terminally underpriced errors. ### InsufficientEth ```toml InsufficientEth = '(: |^)insufficeint eth' # Example ``` InsufficientEth is a regex pattern to match against insufficient eth errors. ### TxFeeExceedsCap ```toml TxFeeExceedsCap = '(: |^)tx fee exceeds cap' # Example ``` TxFeeExceedsCap is a regex pattern to match against tx fee exceeds cap errors. ### L2FeeTooLow ```toml L2FeeTooLow = '(: |^)l2 fee too low' # Example ``` L2FeeTooLow is a regex pattern to match against l2 fee too low errors. ### L2FeeTooHigh ```toml L2FeeTooHigh = '(: |^)l2 fee too high' # Example ``` L2FeeTooHigh is a regex pattern to match against l2 fee too high errors. ### L2Full ```toml L2Full = '(: |^)l2 full' # Example ``` L2Full is a regex pattern to match against l2 full errors. ### TransactionAlreadyMined ```toml TransactionAlreadyMined = '(: |^)transaction already mined' # Example ``` TransactionAlreadyMined is a regex pattern to match against transaction already mined errors. ### Fatal ```toml Fatal = '(: |^)fatal' # Example ``` Fatal is a regex pattern to match against fatal errors. ### ServiceUnavailable ```toml ServiceUnavailable = '(: |^)service unavailable' # Example ``` ServiceUnavailable is a regex pattern to match against service unavailable errors. ### TooManyResults ```toml TooManyResults = '(: |^)too many results' # Example ``` TooManyResults is a regex pattern to match an eth_getLogs error indicating the result set is too large to return ### MissingBlocks ```toml MissingBlocks = '(: |^)missing blocks' # Example ``` MissingBlocks is a regex pattern to match an eth_getLogs error indicating the rpc server is permanently missing some blocks in the requested block range ## EVM.OCR ```toml [EVM.OCR] ContractConfirmations = 4 # Default ContractTransmitterTransmitTimeout = '10s' # Default DatabaseTimeout = '10s' # Default DeltaCOverride = "168h" # Default DeltaCJitterOverride = "1h" # Default ObservationGracePeriod = '1s' # Default ``` ### ContractConfirmations ```toml ContractConfirmations = 4 # Default ``` ContractConfirmations sets `OCR.ContractConfirmations` for this EVM chain. ### ContractTransmitterTransmitTimeout ```toml ContractTransmitterTransmitTimeout = '10s' # Default ``` ContractTransmitterTransmitTimeout sets `OCR.ContractTransmitterTransmitTimeout` for this EVM chain. ### DatabaseTimeout ```toml DatabaseTimeout = '10s' # Default ``` DatabaseTimeout sets `OCR.DatabaseTimeout` for this EVM chain. ### DeltaCOverride ```toml DeltaCOverride = "168h" # Default ``` DeltaCOverride (and `DeltaCJitterOverride`) determine the config override DeltaC. DeltaC is the maximum age of the latest report in the contract. If the maximum age is exceeded, a new report will be created by the report generation protocol. ### DeltaCJitterOverride ```toml DeltaCJitterOverride = "1h" # Default ``` DeltaCJitterOverride is the range for jitter to add to `DeltaCOverride`. ### ObservationGracePeriod ```toml ObservationGracePeriod = '1s' # Default ``` ObservationGracePeriod sets `OCR.ObservationGracePeriod` for this EVM chain. ## EVM.Nodes ```toml [[EVM.Nodes]] Name = 'foo' # Example WSURL = 'wss://web.socket/test' # Example HTTPURL = 'https://foo.web' # Example HTTPURLExtraWrite = 'https://foo.web/extra' # Example SendOnly = false # Default Order = 100 # Default IsLoadBalancedRPC = false # Default ``` ### Name ```toml Name = 'foo' # Example ``` Name is a unique (per-chain) identifier for this node. ### WSURL ```toml WSURL = 'wss://web.socket/test' # Example ``` WSURL is the WS(S) endpoint for this node. Required for primary nodes when `LogBroadcasterEnabled` is `true` ### HTTPURL ```toml HTTPURL = 'https://foo.web' # Example ``` HTTPURL is the HTTP(S) endpoint for this node. Required for all nodes. ### HTTPURLExtraWrite ```toml HTTPURLExtraWrite = 'https://foo.web/extra' # Example ``` HTTPURLExtraWrite is the HTTP(S) endpoint used for chains that require a separate endpoint for writing on-chain. ### SendOnly ```toml SendOnly = false # Default ``` SendOnly limits usage to sending transaction broadcasts only. With this enabled, only HTTPURL is required, and WSURL is not used. ### Order ```toml Order = 100 # Default ``` Order of the node in the pool, will takes effect if `SelectionMode` is `PriorityLevel` or will be used as a tie-breaker for `HighestHead` and `TotalDifficulty` ### IsLoadBalancedRPC ```toml IsLoadBalancedRPC = false # Default ``` IsLoadBalancedRPC indicates whether the http/ws url above has multiple rpc's behind it. If true, we should try reconnecting to the node even when its the only node in the Nodes list. If false and its the only node in the nodes list, we will mark it alive even when its out of sync, because it might still be able to send txs. ## EVM.OCR2.Automation ```toml [EVM.OCR2.Automation] GasLimit = 5400000 # Default ``` ### GasLimit ```toml GasLimit = 5400000 # Default ``` GasLimit controls the gas limit for transmit transactions from ocr2automation job. ## EVM.Workflow ```toml [EVM.Workflow] FromAddress = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example ForwarderAddress = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example GasLimitDefault = 400_000 # Default TxAcceptanceState = 2 # Default PollPeriod = '2s' # Default AcceptanceTimeout = '30s' # Default ``` ### FromAddress ```toml FromAddress = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example ``` FromAddress is Address of the transmitter key to use for workflow writes. ### ForwarderAddress ```toml ForwarderAddress = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' # Example ``` ForwarderAddress is the keystone forwarder contract address on chain. ### GasLimitDefault ```toml GasLimitDefault = 400_000 # Default ``` GasLimitDefault is the default gas limit for workflow transactions. ### TxAcceptanceState ```toml TxAcceptanceState = 2 # Default ``` TxAcceptanceState is the default acceptance state for writer DON tranmissions. ### PollPeriod ```toml PollPeriod = '2s' # Default ``` PollPeriod is the default poll period for checking transmission state ### AcceptanceTimeout ```toml AcceptanceTimeout = '30s' # Default ``` AcceptanceTimeout is the default timeout for a tranmission to be accepted on chain ## Cosmos ```toml [[Cosmos]] ChainID = 'Malaga-420' # Example Enabled = true # Default Bech32Prefix = 'wasm' # Default BlockRate = '6s' # Default BlocksUntilTxTimeout = 30 # Default ConfirmPollPeriod = '1s' # Default FallbackGasPrice = '0.015' # Default GasToken = 'ucosm' # Default GasLimitMultiplier = '1.5' # Default MaxMsgsPerBatch = 100 # Default OCR2CachePollPeriod = '4s' # Default OCR2CacheTTL = '1m' # Default TxMsgTimeout = '10m' # Default ``` ### ChainID ```toml ChainID = 'Malaga-420' # Example ``` ChainID is the Cosmos chain ID. Mandatory. ### Enabled ```toml Enabled = true # Default ``` Enabled enables this chain. ### Bech32Prefix ```toml Bech32Prefix = 'wasm' # Default ``` Bech32Prefix is the human-readable prefix for addresses on this Cosmos chain. See [https://docs.cosmos.network/v0.47/spec/addresses/bech32](https://docs.cosmos.network/v0.47/spec/addresses/bech32). ### BlockRate ```toml BlockRate = '6s' # Default ``` BlockRate is the average time between blocks. ### BlocksUntilTxTimeout ```toml BlocksUntilTxTimeout = 30 # Default ``` BlocksUntilTxTimeout is the number of blocks to wait before giving up on the tx getting confirmed. ### ConfirmPollPeriod ```toml ConfirmPollPeriod = '1s' # Default ``` ConfirmPollPeriod sets how often check for tx confirmation. ### FallbackGasPrice ```toml FallbackGasPrice = '0.015' # Default ``` FallbackGasPrice sets a fallback gas price to use when the estimator is not available. ### GasToken ```toml GasToken = 'ucosm' # Default ``` GasToken is the token denomination which is being used to pay gas fees on this chain. ### GasLimitMultiplier ```toml GasLimitMultiplier = '1.5' # Default ``` GasLimitMultiplier scales the estimated gas limit. ### MaxMsgsPerBatch ```toml MaxMsgsPerBatch = 100 # Default ``` MaxMsgsPerBatch limits the numbers of messages per transaction batch. ### OCR2CachePollPeriod ```toml OCR2CachePollPeriod = '4s' # Default ``` OCR2CachePollPeriod is the rate to poll for the OCR2 state cache. ### OCR2CacheTTL ```toml OCR2CacheTTL = '1m' # Default ``` OCR2CacheTTL is the stale OCR2 cache deadline. ### TxMsgTimeout ```toml TxMsgTimeout = '10m' # Default ``` TxMsgTimeout is the maximum age for resending transaction before they expire. ## Cosmos.Nodes ```toml [[Cosmos.Nodes]] Name = 'primary' # Example TendermintURL = 'http://tender.mint' # Example ``` ### Name ```toml Name = 'primary' # Example ``` Name is a unique (per-chain) identifier for this node. ### TendermintURL ```toml TendermintURL = 'http://tender.mint' # Example ``` TendermintURL is the HTTP(S) tendermint endpoint for this node. ## Solana ```toml [[Solana]] ChainID = 'mainnet' # Example Enabled = true # Default BlockTime = '500ms' # Default BalancePollPeriod = '5s' # Default ConfirmPollPeriod = '500ms' # Default OCR2CachePollPeriod = '1s' # Default OCR2CacheTTL = '1m' # Default TxTimeout = '1m' # Default TxRetryTimeout = '10s' # Default TxConfirmTimeout = '30s' # Default TxExpirationRebroadcast = false # Default TxRetentionTimeout = '0s' # Default SkipPreflight = true # Default Commitment = 'confirmed' # Default MaxRetries = 0 # Default FeeEstimatorMode = 'fixed' # Default ComputeUnitPriceMax = 1000 # Default ComputeUnitPriceMin = 0 # Default ComputeUnitPriceDefault = 0 # Default FeeBumpPeriod = '3s' # Default BlockHistoryPollPeriod = '5s' # Default BlockHistorySize = 1 # Default BlockHistoryBatchLoadSize = 20 # Default ComputeUnitLimitDefault = 200_000 # Default EstimateComputeUnitLimit = false # Default LogPollerStartingLookback = '24h0m0s' # Default LogPollerCPIEventsEnabled = true # Default LogPollerSlotsBatchSize = 100 # Default ``` ### ChainID ```toml ChainID = 'mainnet' # Example ``` ChainID is the Solana chain ID. Must be one of: mainnet, testnet, devnet, localnet. Mandatory. ### Enabled ```toml Enabled = true # Default ``` Enabled enables this chain. ### BlockTime ```toml BlockTime = '500ms' # Default ``` BlockTime specifies the average time between blocks on this chain ### BalancePollPeriod ```toml BalancePollPeriod = '5s' # Default ``` BalancePollPeriod is the rate to poll for SOL balance and update Prometheus metrics. ### ConfirmPollPeriod ```toml ConfirmPollPeriod = '500ms' # Default ``` ConfirmPollPeriod is the rate to poll for signature confirmation. ### OCR2CachePollPeriod ```toml OCR2CachePollPeriod = '1s' # Default ``` OCR2CachePollPeriod is the rate to poll for the OCR2 state cache. ### OCR2CacheTTL ```toml OCR2CacheTTL = '1m' # Default ``` OCR2CacheTTL is the stale OCR2 cache deadline. ### TxTimeout ```toml TxTimeout = '1m' # Default ``` TxTimeout is the timeout for sending txes to an RPC endpoint. ### TxRetryTimeout ```toml TxRetryTimeout = '10s' # Default ``` TxRetryTimeout is the duration for tx manager to attempt rebroadcasting to RPC, before giving up. ### TxConfirmTimeout ```toml TxConfirmTimeout = '30s' # Default ``` TxConfirmTimeout is the duration to wait when confirming a tx signature, before discarding as unconfirmed. ### TxExpirationRebroadcast ```toml TxExpirationRebroadcast = false # Default ``` TxExpirationRebroadcast enables or disables transaction rebroadcast if expired. Expiration check is performed every `ConfirmPollPeriod` A transaction is considered expired if the blockhash it was sent with is 150 blocks older than the latest blockhash. ### TxRetentionTimeout ```toml TxRetentionTimeout = '0s' # Default ``` TxRetentionTimeout is the duration to retain transactions in storage after being marked as finalized or errored. Set to 0 to immediately drop transactions. ### SkipPreflight ```toml SkipPreflight = true # Default ``` SkipPreflight enables or disables preflight checks when sending txs. ### Commitment ```toml Commitment = 'confirmed' # Default ``` Commitment is the confirmation level for solana state and transactions. ([documentation](https://docs.solana.com/developing/clients/jsonrpc-api#configuring-state-commitment)) ### MaxRetries ```toml MaxRetries = 0 # Default ``` MaxRetries is the maximum number of times the RPC node will automatically rebroadcast a tx. The default is 0 for custom txm rebroadcasting method, set to -1 to use the RPC node's default retry strategy. ### FeeEstimatorMode ```toml FeeEstimatorMode = 'fixed' # Default ``` FeeEstimatorMode is the method used to determine the base fee ### ComputeUnitPriceMax ```toml ComputeUnitPriceMax = 1000 # Default ``` ComputeUnitPriceMax is the maximum price per compute unit that a transaction can be bumped to ### ComputeUnitPriceMin ```toml ComputeUnitPriceMin = 0 # Default ``` ComputeUnitPriceMin is the minimum price per compute unit that transaction can have ### ComputeUnitPriceDefault ```toml ComputeUnitPriceDefault = 0 # Default ``` ComputeUnitPriceDefault is the default price per compute unit price, and the starting base fee when FeeEstimatorMode = 'fixed' ### FeeBumpPeriod ```toml FeeBumpPeriod = '3s' # Default ``` FeeBumpPeriod is the amount of time before a tx is retried with a fee bump. WARNING: If FeeBumpPeriod is shorter than blockhash expiration, multiple valid transactions can exist in parallel. This can result in higher costs and can cause unexpected behaviors if contracts do not de-dupe txs ### BlockHistoryPollPeriod ```toml BlockHistoryPollPeriod = '5s' # Default ``` BlockHistoryPollPeriod is the rate to poll for blocks in the block history fee estimator ### BlockHistorySize ```toml BlockHistorySize = 1 # Default ``` BlockHistorySize is the number of blocks to take into consideration when using FeeEstimatorMode = 'blockhistory' to determine compute unit price. If set to 1, the compute unit price will be determined by the median of the last block's compute unit prices. If set N > 1, the compute unit price will be determined by the average of the medians of the last N blocks' compute unit prices. DISCLAIMER: If set to a value greater than BlockHistoryBatchLoadSize, initial estimations during startup would be over smaller block ranges until the cache is filled. ### BlockHistoryBatchLoadSize ```toml BlockHistoryBatchLoadSize = 20 # Default ``` BlockHistoryBatchLoadSize is the number of latest blocks to fetch from the chain to store in the cache every BlockHistoryPollPeriod. This config is only relevant if BlockHistorySize > 1 and if BlockHistorySize is greater than BlockHistoryBatchLoadSize. Ensure the value is greater than the number of blocks that would be produced between each BlockHistoryPollPeriod to avoid gaps in block history. ### ComputeUnitLimitDefault ```toml ComputeUnitLimitDefault = 200_000 # Default ``` ComputeUnitLimitDefault is the compute units limit applied to transactions unless overridden during the txm enqueue ### EstimateComputeUnitLimit ```toml EstimateComputeUnitLimit = false # Default ``` EstimateComputeUnitLimit enables or disables compute unit limit estimations per transaction. If estimations return 0 used compute, the ComputeUnitLimitDefault value is used, if set. ### LogPollerStartingLookback ```toml LogPollerStartingLookback = '24h0m0s' # Default ``` LogPollerStartingLookback ### LogPollerCPIEventsEnabled ```toml LogPollerCPIEventsEnabled = true # Default ``` LogPollerCPIEventsEnabled enables the LogPoller to listen for CPI (Cross-Program Invocation) events. ### LogPollerSlotsBatchSize ```toml LogPollerSlotsBatchSize = 100 # Default ``` LogPollerSlotsBatchSize is the number of slots to process in a batch when polling for logs. Setting this value too high may increase memory usage, while setting it too low may increase the number of RPC calls and decrease performance. ## Solana.Workflow ```toml [Solana.Workflow] AcceptanceTimeout = '45s' # Default ForwarderAddress = '14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5' # Example ForwarderState = '14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5' # Example FromAddress = '4BJXYkfvg37zEmBbsacZjeQDpTNx91KppxFJxRqrz48e' # Example GasLimitDefault = 300_000 # Default Local = false # Default PollPeriod = '3s' # Default TxAcceptanceState = 3 # Default ``` ### AcceptanceTimeout ```toml AcceptanceTimeout = '45s' # Default ``` AcceptanceTimeout is the default timeout for a tranmission to be accepted on chain ### ForwarderAddress ```toml ForwarderAddress = '14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5' # Example ``` ForwarderAddress is the keystone forwarder program address on chain. Deprecated: ignored at runtime; use capability config. Kept for TOML compatibility. ### ForwarderState ```toml ForwarderState = '14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5' # Example ``` ForwarderState is the keystone forwarder program state account on chain. Deprecated: ignored at runtime; use capability config. Kept for TOML compatibility. ### FromAddress ```toml FromAddress = '4BJXYkfvg37zEmBbsacZjeQDpTNx91KppxFJxRqrz48e' # Example ``` FromAddress is Address of the transmitter key to use for workflow writes. Deprecated: ignored at runtime; use capability / transmitter config. Kept for TOML compatibility. ### GasLimitDefault ```toml GasLimitDefault = 300_000 # Default ``` GasLimitDefault is the default gas limit for workflow transactions. ### Local ```toml Local = false # Default ``` Local defines if relayer runs against local devnet ### PollPeriod ```toml PollPeriod = '3s' # Default ``` PollPeriod is the default poll period for checking transmission state ### TxAcceptanceState ```toml TxAcceptanceState = 3 # Default ``` TxAcceptanceState is the default acceptance state for writer DON tranmissions. ## Solana.MultiNode ```toml [Solana.MultiNode] Enabled = false # Default PollFailureThreshold = 5 # Default PollInterval = '10s' # Default SelectionMode = 'PriorityLevel' # Default SyncThreshold = 5 # Default NodeIsSyncingEnabled = false # Default LeaseDuration = '1m0s' # Default NewHeadsPollInterval = '10s' # Default FinalizedBlockPollInterval = '10s' # Default EnforceRepeatableRead = true # Default DeathDeclarationDelay = '10s' # Default VerifyChainID = true # Default NodeNoNewHeadsThreshold = '10s' # Default NoNewFinalizedHeadsThreshold = '10s' # Default FinalityDepth = 0 # Default FinalityTagEnabled = true # Default FinalizedBlockOffset = 0 # Default ``` ### Enabled ```toml Enabled = false # Default ``` Enabled enables the multinode feature. ### PollFailureThreshold ```toml PollFailureThreshold = 5 # Default ``` PollFailureThreshold is the number of poll failures beyond poll successes before a node is considered unhealthy. ### PollInterval ```toml PollInterval = '10s' # Default ``` PollInterval is the rate to poll for node health. ### SelectionMode ```toml SelectionMode = 'PriorityLevel' # Default ``` SelectionMode is the method used to select the next best node to use. ### SyncThreshold ```toml SyncThreshold = 5 # Default ``` SyncThreshold is the number of blocks behind the best node that a node can be before it is considered out of sync. ### NodeIsSyncingEnabled ```toml NodeIsSyncingEnabled = false # Default ``` NodeIsSyncingEnabled enables the feature to avoid sending transactions to nodes that are syncing. Not relevant for Solana. ### LeaseDuration ```toml LeaseDuration = '1m0s' # Default ``` LeaseDuration is the max duration a node can be leased for. ### NewHeadsPollInterval ```toml NewHeadsPollInterval = '10s' # Default ``` NewHeadsPollInterval is the rate to poll for new heads. ### FinalizedBlockPollInterval ```toml FinalizedBlockPollInterval = '10s' # Default ``` FinalizedBlockPollInterval is the rate to poll for the finalized block. ### EnforceRepeatableRead ```toml EnforceRepeatableRead = true # Default ``` EnforceRepeatableRead enforces the repeatable read guarantee for multinode. ### DeathDeclarationDelay ```toml DeathDeclarationDelay = '10s' # Default ``` DeathDeclarationDelay is the duration to wait before declaring a node dead. ### VerifyChainID ```toml VerifyChainID = true # Default ``` VerifyChainID enforces RPC Client ChainIDs to match configured ChainID ### NodeNoNewHeadsThreshold ```toml NodeNoNewHeadsThreshold = '10s' # Default ``` NodeNoNewHeadsThreshold is the duration to wait before declaring a node unhealthy due to no new heads. ### NoNewFinalizedHeadsThreshold ```toml NoNewFinalizedHeadsThreshold = '10s' # Default ``` NoNewFinalizedHeadsThreshold is the duration to wait before declaring a node unhealthy due to no new finalized heads. ### FinalityDepth ```toml FinalityDepth = 0 # Default ``` FinalityDepth is not used when finality tags are enabled. ### FinalityTagEnabled ```toml FinalityTagEnabled = true # Default ``` FinalityTagEnabled enables the use of finality tags. ### FinalizedBlockOffset ```toml FinalizedBlockOffset = 0 # Default ``` FinalizedBlockOffset is the offset from the finalized block to use for finality tags. ## Solana.Nodes ```toml [[Solana.Nodes]] Name = 'primary' # Example URL = 'http://solana.web' # Example SendOnly = false # Default Order = 100 # Default IsLoadBalancedRPC = false # Default ``` ### Name ```toml Name = 'primary' # Example ``` Name is a unique (per-chain) identifier for this node. ### URL ```toml URL = 'http://solana.web' # Example ``` URL is the HTTP(S) endpoint for this node. ### SendOnly ```toml SendOnly = false # Default ``` SendOnly is a multinode config that only sends transactions to a node and does not read state ### Order ```toml Order = 100 # Default ``` Order specifies the priority for each node. 1 is highest priority down to 100 being the lowest. ### IsLoadBalancedRPC ```toml IsLoadBalancedRPC = false # Default ``` IsLoadBalancedRPC indicates whether the http/ws url above has multiple rpc's behind it. If true, we should try reconnecting to the node even when its the only node in the Nodes list. If false and its the only node in the nodes list, we will mark it alive even when its out of sync, because it might still be able to send txs. ## Starknet ```toml [[Starknet]] ChainID = 'foobar' # Example FeederURL = 'http://feeder.url' # Example Enabled = true # Default OCR2CachePollPeriod = '5s' # Default OCR2CacheTTL = '1m' # Default RequestTimeout = '10s' # Default TxTimeout = '10s' # Default ConfirmationPoll = '5s' # Default ``` ### ChainID ```toml ChainID = 'foobar' # Example ``` ChainID is the Starknet chain ID. ### FeederURL ```toml FeederURL = 'http://feeder.url' # Example ``` FeederURL is required to get tx metadata (that the RPC can't) ### Enabled ```toml Enabled = true # Default ``` Enabled enables this chain. ### OCR2CachePollPeriod ```toml OCR2CachePollPeriod = '5s' # Default ``` OCR2CachePollPeriod is the rate to poll for the OCR2 state cache. ### OCR2CacheTTL ```toml OCR2CacheTTL = '1m' # Default ``` OCR2CacheTTL is the stale OCR2 cache deadline. ### RequestTimeout ```toml RequestTimeout = '10s' # Default ``` RequestTimeout is the RPC client timeout. ### TxTimeout ```toml TxTimeout = '10s' # Default ``` TxTimeout is the timeout for sending txes to an RPC endpoint. ### ConfirmationPoll ```toml ConfirmationPoll = '5s' # Default ``` ConfirmationPoll is how often to confirmer checks for tx inclusion on chain. ## Starknet.Nodes ```toml [[Starknet.Nodes]] Name = 'primary' # Example URL = 'http://stark.node' # Example APIKey = 'key' # Example ``` ### Name ```toml Name = 'primary' # Example ``` Name is a unique (per-chain) identifier for this node. ### URL ```toml URL = 'http://stark.node' # Example ``` URL is the base HTTP(S) endpoint for this node. ### APIKey ```toml APIKey = 'key' # Example ``` APIKey Header is optional and only required for Nethermind RPCs --- # Role-Based Access Control (RBAC) Source: https://docs.chain.link/chainlink-nodes/v1/roles-and-access Chainlink Nodes allow the root admin CLI user and any additional admin users to create and assign tiers of role-based access to new users. These new API users can able to log in to the Operator UI independently. Each user has a specific role assigned to their account. There are four roles: `admin`, `edit`, `run`, and `view`. If there are multiple users who need specific access to manage the Chainlink Node instance, permissions and level of access can be set here. User management is configured through the use of the admin `chainlink admin users` command. Run `chainlink admin login` before you set user roles for other accounts. For example, a view-only user can be created with the following command: ```shell chainlink admin users create --email=operator-ui-view-only@test.com --role=view ``` To modify permissions or delete existing users, run the `admin users chrole` or `admin users delete` commands. Use the `-h` flag to get a full list of options for these commands: ```shell chainlink admin users chrole -h ``` ```shell chainlink admin users delete -h ``` Specific actions are enabled to check role-based access before they execute. The following table lists the actions that have role-based access and the role that is required to run that action: | Action | View | Run | Edit | Admin | | :-------------------------------------------- | :--: | :-: | :--: | :---: | | Update password | X | X | X | X | | Create self API token | X | X | X | X | | Delete self API token | X | X | X | X | | List external initiators | X | X | X | X | | Create external initiator | | | X | X | | Delete external initiator | | | X | X | | List bridges | X | X | X | X | | View bridge | X | X | X | X | | Create bridge | | | X | X | | Edit bridge | | | X | X | | Delete bridge | | | X | X | | View config | X | X | X | X | | Update config | | | | X | | Dump env/config | | | | X | | View transaction attempts | X | X | X | X | | View transaction attempts EVM | X | X | X | X | | View transactions | X | X | X | X | | Replay a specific block number | | X | X | X | | List keys (CSA,ETH,OCR(2),P2P,Solana,Terra) | X | X | X | X | | Create keys (CSA,ETH,OCR(2),P2P,Solana,Terra) | | | X | X | | Delete keys (CSA,ETH,OCR(2),P2P,Solana,Terra) | | | | X | | Import keys (CSA,ETH,OCR(2),P2P,Solana,Terra) | | | | X | | Export keys (CSA,ETH,OCR(2),P2P,Solana,Terra) | | | | X | | List jobs | X | X | X | X | | View job | X | X | X | X | | Create job | | | X | X | | Delete job | | | X | X | | List pipeline runs | X | X | X | X | | View job runs | X | X | X | X | | Delete job spec errors | | | X | X | | View features | X | X | X | X | | View log | X | X | X | X | | Update log | | | | X | | List chains | X | X | X | X | | View chain | X | X | X | X | | Create chain | | | X | X | | Update chain | | | X | X | | Delete chain | | | X | X | | View nodes | X | X | X | X | | Create node | | | X | X | | Update node | | | X | X | | Delete node | | | X | X | | View forwarders | X | X | X | X | | Create forwarder | | | X | X | | Delete forwarder | | | X | X | | Create job run | | X | X | X | | Create Transfer EVM | | | | X | | Create Transfer Terra | | | | X | | Create Transfer Solana | | | | X | | Create user | | | | X | | Delete user | | | | X | | Edit user | | | | X | | List users | | | | X | The run command allows for minimal interaction and only enables the ability to replay a specific block number and kick off a job run. --- # Running a Chainlink Node Source: https://docs.chain.link/chainlink-nodes/v1/running-a-chainlink-node This guide will teach you how to run a Chainlink node locally using [Docker](#using-docker). The Chainlink node will be configured to connect to the Ethereum Sepolia. > **NOTE: Running from source** > > To run a Chainlink node from source, use the [following > instructions](https://github.com/smartcontractkit/chainlink#install). However, it's recommended to run the Chainlink > node with Docker. This is because we continuously build and deploy the code from our repository on Github, which means > you don't need a complete development environment to run a node. > **NOTE: Supported networks** > > Chainlink is a blockchain agnostic technology. The [LINK Token Contracts](/resources/link-token-contracts) page details networks which support the LINK token. You can set up your node to provide data to any of these blockchains. > > Ganache is a mock testnet. Although you can run nodes on Ganache, it is not officially supported. Most node operators > should use one of the supported [testnets](/resources/link-token-contracts) for development and testing. ## Requirements - As explained in the [requirements page](/chainlink-nodes/resources/requirements), make sure there are enough resources to run a Chainlink node and a PostgreSQL database. - Install [Docker Desktop](https://docs.docker.com/get-docker/). You will run the Chainlink node and PostgreSQL in Docker containers. - Chainlink nodes must be able to connect to an Ethereum client with an active websocket connection. See [Running an Ethereum Client](/chainlink-nodes/resources/run-an-ethereum-client) for details. In this tutorial, you can [use an external service](/chainlink-nodes/resources/run-an-ethereum-client/#external-services) as your client. ## Using Docker ### Run PostgreSQL 1. Run PostgreSQL in a Docker container. You can replace `mysecretpassword` with your own password. ```shell docker run --name cl-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres ``` 2. Confirm that the container is running. Note the `5432` port is [published](https://docs.docker.com/config/containers/container-networking/#published-ports) `0.0.0.0:5432->5432/tcp` and therefore accessible outside of Docker. ```shell docker ps -a -f name=cl-postgres ``` If the container is running successfully, the output shows a healthy status: ```shell CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc08cfad2a16 postgres "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp cl-postgres ``` ### Run Chainlink node #### Configure your node 1. Create a local directory to hold the Chainlink data: ### Sepolia ```shell Sepolia mkdir ~/.chainlink-sepolia ``` 2. Run the following as a command to create a `config.toml` file and populate with variables specific to the network you're running on. For a full list of available configuration variables, see the [Node Config](/chainlink-nodes/v1/node-config) page. Be sure to update the value for `CHANGEME` to the value given by your [external Ethereum provider](/chainlink-nodes/resources/run-an-ethereum-client/#external-services). ### Sepolia ```shell Sepolia echo "[Log] Level = 'warn' [WebServer] AllowOrigins = '\*' SecureCookies = false [WebServer.TLS] HTTPSPort = 0 [[EVM]] ChainID = '11155111' [[EVM.Nodes]] Name = 'Sepolia' WSURL = 'wss://CHANGE_ME' HTTPURL = 'https://CHANGE_ME' " > ~/.chainlink-sepolia/config.toml ``` 3. Create a `secrets.toml` file with a keystore password and the URL to your database. Update the value for `mysecretpassword` to the chosen password in [Run PostgreSQL](#run-postgresql). Specify a complex keystore password. This will be your wallet password that you can use to unlock the keystore file generated for you. ### Sepolia ```shell Sepolia echo "[Password] Keystore = 'mysecretkeystorepassword' [Database] URL = 'postgresql://postgres:mysecretpassword@host.docker.internal:5432/postgres?sslmode=disable' " > ~/.chainlink-sepolia/secrets.toml ``` > **TIP: Important** > > Because you are testing locally, add `?sslmode=disable` to the end of your `DATABASE_URL`. However you should *never* > do this on a production node. 4. Optionally, you can create an `.api` file with the credentials for the node's API and Operator Interface. The node stores the credentials from the `.api` file in the database only the first time you run the container using the database. The `.api` file cannot override credentials for an existing user in the database. Create the file in the same directory as your TOML config files and list your API credentials. Change the values for API email and password. The user must be an email address with an `@` character and the password must be 16-50 characters in length. ### Sepolia ```shell Sepolia echo "CHANGE_THIS_EXAMPLE_EMAIL CHANGE_THIS_EXAMPLE_PASSWORD " > ~/.chainlink-sepolia/.api ``` 5. Start the Chainlink Node by running the Docker image. Change the version number in `smartcontract/chainlink:2.26.0` with the version of the Docker image that you need to run. For most new nodes, use version `2.0.0` or later. Tag versions are available in the [Chainlink Docker hub](https://hub.docker.com/r/smartcontract/chainlink/tags). *The `latest` version does not work.* Chainlink Nodes running `2.0.0` and later require the `-config` and `-secrets` flags after the `node` part of the command. If you created an `.api` file with your API and Operator UI login credentials, add `-a /chainlink/.api` to the end of the `docker run` command. Otherwise, the node will ask you for these credentials when you start it for the first time. These credentials are stored in the database only when you run a container for the first time against that database. If you need to remove the `.api` file, delete the container, and start it again without `-a /chainlink/.api`. ### Sepolia ```shell Sepolia cd ~/.chainlink-sepolia && docker run --platform linux/x86_64/v8 --name chainlink -v ~/.chainlink-sepolia:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink:2.26.0 node -config /chainlink/config.toml -secrets /chainlink/secrets.toml start ``` 6. Detach from the container by pressing the Ctrl+P command and then the Ctrl-Q command. 7. Confirm that the container is running. Note that the `6688` port is [published](https://docs.docker.com/config/containers/container-networking/#published-ports) `0.0.0.0:6688->6688/tcp` and is accessible outside of Docker. ```shell docker ps -a -f name=chainlink ``` If the container is running, the output shows a healthy status: ```shell CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 867e792d6f78 smartcontract/chainlink:2.26.0 "chainlink node -con…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:6688->6688/tcp, :::6688->6688/tcp chainlink ``` 8. You can now connect to your Chainlink node's UI interface by navigating to [http://localhost:6688](http://localhost:6688). Use the API credentials you set up earlier to log in. If you are using a VPS, you can create an [SSH tunnel](https://www.howtogeek.com/168145/how-to-use-ssh-tunneling/) to your node for `6688:localhost:6688` to enable connectivity to the GUI. Typically this is done with `ssh -i $KEY $USER@$REMOTE-IP -L 6688:localhost:6688 -N`. An SSH tunnel is recommended over opening public-facing ports specific to the Chainlink node. See the [Security and Operation Best Practices](/chainlink-nodes/resources/best-security-practices) page for more details about securing your node. ## Configure users and roles You can create several users with different [role-based access tiers](/chainlink-nodes/v1/roles-and-access). This allows you to grant access to several users without granting admin privileges to every user. Role-based access can be configured only by using the CLI. 1. Open an interactive bash shell on the container that is running your node: ```shell docker exec -it chainlink /bin/bash ``` 2. Log into the Chainlink CLI. The CLI prompts you for the admin credentials that you configured for your node. ```shell chainlink admin login ``` 3. Add a user with view-only permissions on the node. The CLI prompts you for the new user's credentials. ```shell chainlink admin users create --email=operator-ui-view-only@test.com --role=view ``` This user can now log into the UI and query the API, but cannot change any settings or jobs. 4. Confirm the current list of users: ```shell chainlink admin users list ``` 5. Log out of the CLI. This prevents users with access to the shell from executing admin commands. ```shell chainlink admin logout ``` 6. Exit from the container. ```shell exit ``` To learn how to modify user roles and see the full list of available roles, read the [Role-Based Access Control](/chainlink-nodes/v1/roles-and-access) page. --- # Secrets Config (TOML) Source: https://docs.chain.link/chainlink-nodes/v1/secrets-config [//]: # "Documentation generated from docs/secrets.toml - DO NOT EDIT." This document describes the TOML format for secrets. Each secret has an alternative corresponding environment variable. See also: [Node Config](/chainlink-nodes/v1/node-config) ## Example ```toml [Database] URL = 'postgresql://user:pass@localhost:5432/dbname?sslmode=disable' # Required [Password] Keystore = 'keystore_pass' # Required ``` ## Database ```toml [Database] URL = "postgresql://user:pass@localhost:5432/dbname?sslmode=disable" # Example BackupURL = "postgresql://user:pass@read-replica.example.com:5432/dbname?sslmode=disable" # Example AllowSimplePasswords = false # Default ``` ### URL ```toml URL = "postgresql://user:pass@localhost:5432/dbname?sslmode=disable" # Example ``` URL is the PostgreSQL URI to connect to your database. Chainlink nodes require Postgres versions >= 11. See [Running a Chainlink Node](https://docs.chain.link/docs/running-a-chainlink-node/#set-the-remote-database_url-config) for an example. Environment variable: `CL_DATABASE_URL` ### BackupURL ```toml BackupURL = "postgresql://user:pass@read-replica.example.com:5432/dbname?sslmode=disable" # Example ``` BackupURL is where the automatic database backup will pull from, rather than the main CL_DATABASE_URL. It is recommended to set this value to a read replica if you have one to avoid excessive load on the main database. Environment variable: `CL_DATABASE_BACKUP_URL` ### AllowSimplePasswords ```toml AllowSimplePasswords = false # Default ``` AllowSimplePasswords skips the password complexity check normally enforced on URL & BackupURL. Environment variable: `CL_DATABASE_ALLOW_SIMPLE_PASSWORDS` ## WebServer.OIDC ```toml [WebServer.OIDC] clientSecret = "secret" # Example ``` Optional OIDC config ### clientSecret ```toml clientSecret = "secret" # Example ``` clientSecret is the secret value sent to the OIDC provider to exchange authorization code for ID token ## WebServer.LDAP ```toml [WebServer.LDAP] ServerAddress = 'ldaps://127.0.0.1' # Example ReadOnlyUserLogin = 'viewer@example.com' # Example ReadOnlyUserPass = 'password' # Example ``` Optional LDAP config ### ServerAddress ```toml ServerAddress = 'ldaps://127.0.0.1' # Example ``` ServerAddress is the full ldaps\:// address of the ldap server to authenticate with and query ### ReadOnlyUserLogin ```toml ReadOnlyUserLogin = 'viewer@example.com' # Example ``` ReadOnlyUserLogin is the username of the read only root user used to authenticate the requested LDAP queries ### ReadOnlyUserPass ```toml ReadOnlyUserPass = 'password' # Example ``` ReadOnlyUserPass is the password for the above account ## Password ```toml [Password] Keystore = "keystore_pass" # Example VRF = "VRF_pass" # Example ``` ### Keystore ```toml Keystore = "keystore_pass" # Example ``` Keystore is the password for the node's account. Environment variable: `CL_PASSWORD_KEYSTORE` ### VRF ```toml VRF = "VRF_pass" # Example ``` VRF is the password for the vrf keys. Environment variable: `CL_PASSWORD_VRF` ## Pyroscope ```toml [Pyroscope] AuthToken = "pyroscope-token" # Example ``` ### AuthToken ```toml AuthToken = "pyroscope-token" # Example ``` AuthToken is the API key for the Pyroscope server. Environment variable: `CL_PYROSCOPE_AUTH_TOKEN` ## Prometheus ```toml [Prometheus] AuthToken = "prometheus-token" # Example ``` ### AuthToken ```toml AuthToken = "prometheus-token" # Example ``` AuthToken is the authorization key for the Prometheus metrics endpoint. Environment variable: `CL_PROMETHEUS_AUTH_TOKEN` ## Mercury.Credentials.Name ```toml [Mercury.Credentials.Name] Username = "A-Mercury-Username" # Example Password = "A-Mercury-Password" # Example URL = "https://example.com" # Example LegacyURL = "https://example.v1.com" # Example ``` ### Username ```toml Username = "A-Mercury-Username" # Example ``` Username is used for basic auth of the Mercury endpoint ### Password ```toml Password = "A-Mercury-Password" # Example ``` Password is used for basic auth of the Mercury endpoint ### URL ```toml URL = "https://example.com" # Example ``` URL is the Mercury endpoint base URL used to access Mercury price feed ### LegacyURL ```toml LegacyURL = "https://example.v1.com" # Example ``` LegacyURL is the Mercury legacy endpoint base URL used to access Mercury v0.2 price feed ## Threshold ```toml [Threshold] ThresholdKeyShare = "A-Threshold-Decryption-Key-Share" # Example ``` ### ThresholdKeyShare ```toml ThresholdKeyShare = "A-Threshold-Decryption-Key-Share" # Example ``` ThresholdKeyShare used by the threshold decryption OCR plugin ## CRE.Streams ```toml [CRE.Streams] ApiKey = "streams-api-key" # Example ApiSecret = "streams-api-secret" # Example ``` ### ApiKey ```toml ApiKey = "streams-api-key" # Example ``` ApiKey is the API key used for authenticating with the CLL Data Streams SDK. ### ApiSecret ```toml ApiSecret = "streams-api-secret" # Example ``` ApiSecret is the API secret used for authenticating with the CLL Data Streams SDK. ## CRE.LocalSecretOverrides ```toml [CRE.LocalSecretOverrides] "0000000000000000000000000000000000000000" = { "my-secret-id" = "my-plaintext-value" } # Example ``` LocalSecretOverrides maps workflow owner to (secret id -> secret value) map. When non-empty, overrides are used as fallback when Vault calls fail. --- # Forwarder tutorial Source: https://docs.chain.link/chainlink-nodes/v1/using-forwarder > **NOTE: Prerequisites** > > This guide assumes you have a running Chainlink node. See the [Running a Chainlink Node locally](/chainlink-nodes/v1/running-a-chainlink-node) guide to learn how to run a Chainlink node. **Note**: For this example to work, you must use Chainlink node version *1.12.0* or above. > > Also, you must be familiar with these concepts: > > - [Forwarder](/chainlink-nodes/contracts/forwarder) contracts. > - [Operator](/chainlink-nodes/contracts/operator) contracts. > - [OperatorFactory](/chainlink-nodes/contracts/operatorfactory) contracts. ![Image](/images/chainlink-nodes/node-operators/forwarder/forwarder-directrequest-example.webp) In this tutorial, you will configure your Chainlink node with a simple transaction-sending strategy on the Sepolia testnet: - Your node has two externally owned accounts (EOA). - Your node has two [direct request](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs) jobs. One job returns *uint256*, and the other returns *string*. - Each job uses a different EOA. - You use a [forwarder](/chainlink-nodes/contracts/forwarder) contract to fulfill requests with two EOAs that look like a single address. > **NOTE** > > Here you are using a forwarder contract and two EOAs for two [direct > request](/chainlink-nodes/oracle-jobs/all-jobs#direct-request-jobs) jobs. You can use the same strategy for different > job types, VRF and OCR. Supporting different job types on the same Chainlink node reduces your infrastructure and > maintenance costs. ## Check your Chainlink node is running On your terminal, check that your Chainlink node is running: ```shell docker ps -a -f name=chainlink CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES feff39f340d6 smartcontract/chainlink:1.12.0 "chainlink local n" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:6688->6688/tcp chainlink ``` Your Chainlink Operator Interface is accessible on [http://localhost:6688](http://localhost:6688). If using a VPS, you can create a [SSH tunnel](https://www.howtogeek.com/168145/how-to-use-ssh-tunneling/) to your node for `6688:localhost:6688` to enable connectivity to the GUI. Typically this is done with `ssh -i $KEY $USER@$REMOTE-IP -L 6688:localhost:6688 -N`. A SSH tunnel is recommended over opening up ports specific to the Chainlink node to be public facing. See the [Security and Operation Best Practices](/chainlink-nodes/resources/best-security-practices) page for more details on how to secure your node. If you don't have a running Chainlink node, follow the [Running a Chainlink Node Locally](/chainlink-nodes/v1/running-a-chainlink-node) guide. ## Set up multiple EOAs 1. Access the shell of your Chainlink node container: ```shell docker exec -it chainlink /bin/bash ``` ```shell chainlink@1d095e4ceb09:~$ ``` 2. You can now log in by running: ```shell chainlink admin login ``` You will be prompted to enter your API email and password. If successful, the prompt will appear again. 3. Check the number of available EOA: ```shell chainlink keys eth list ``` You should see one EOA: ```shell 🔑 ETH keys ------------------------------------------------------------------------------------------------- Address: 0x71a1Eb6534054E75F0D6fD0A3B0A336228DD5cFc EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-03-02 09:28:26.872791 +0000 UTC Updated: 2023-03-02 09:28:26.872791 +0000 UTC Max Gas Price Wei: 115792089237316195423570985008687907853269984665640564039457584007913129639935chainlink@22480bec8986 ``` 4. Create a new EOA for your Chainlink node: ```shell chainlink keys eth create ``` ```shell ETH key created. 🔑 New key ------------------------------------------------------------------------------------------------- Address: 0x259c49E65644a020C2A642260a4ffB0CD862cb24 EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-03-02 11:36:48.717074 +0000 UTC Updated: 2023-03-02 11:36:48.717074 +0000 UTC Max Gas Price Wei: 115792089237316195423570985008687907853269984665640564039457584007913129639935 ``` 5. At this point, there are two EOAs: ```shell chainlink keys eth list ``` ```shell 🔑 ETH keys ------------------------------------------------------------------------------------------------- Address: 0x259c49E65644a020C2A642260a4ffB0CD862cb24 EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-03-02 11:36:48.717074 +0000 UTC Updated: 2023-03-02 11:36:48.717074 +0000 UTC Max Gas Price Wei: 115792089237316195423570985008687907853269984665640564039457584007913129639935 ------------------------------------------------------------------------------------------------- Address: 0x71a1Eb6534054E75F0D6fD0A3B0A336228DD5cFc EVM Chain ID: 11155111 Next Nonce: 0 ETH: 0.000000000000000000 LINK: 0 Disabled: false Created: 2023-03-02 09:28:26.872791 +0000 UTC Updated: 2023-03-02 09:28:26.872791 +0000 UTC Max Gas Price Wei: 115792089237316195423570985008687907853269984665640564039457584007913129639935chainlink@22480bec8986 ``` 6. Fund the two addresses with *0.5* Sepolia ETH each. You can obtain testnet ETH from the faucets listed on the [Link Token Contracts](/resources/link-token-contracts) page. 7. Note the two addresses, as you will need them later. ## Deploy operator and forwarder Use the [operator factory](/chainlink-nodes/contracts/operatorfactory) to deploy both the [forwarder](/chainlink-nodes/contracts/forwarder) and the [operator](/chainlink-nodes/contracts/operator) contracts. You can find the factory address for each network on the [addresses](/chainlink-nodes/contracts/addresses) page. 1. Open contract [0x447Fd5eC2D383091C22B8549cb231a3bAD6d3fAf](https://sepolia.etherscan.io/address/0x447Fd5eC2D383091C22B8549cb231a3bAD6d3fAf) to display the factory in the Sepolia block explorer. 2. Click the *Contract* tab. Then, click *Write Contract* to display the *write* transactions on the factory. ![Image](/images/chainlink-nodes/node-operators/forwarder/factorytransactions.jpg) 3. Click the *Connect to Web3* button to connect your wallet. ![Image](/images/chainlink-nodes/node-operators/forwarder/factorytransactionsconnected.jpg) 4. Click the `deployNewOperatorAndForwarder` function to expand it and then click the *Write* button to run the function. Metamask prompts you to confirm the transaction. 5. Click *View your transaction*. *Etherscan* will open a new tab. Wait for the transaction to be successful. ![Image](/images/chainlink-nodes/node-operators/forwarder/factoryviewtransaction.jpg) ![Image](/images/chainlink-nodes/node-operators/forwarder/deployfromfactorysuccess.jpg) 6. On the *Transaction Details* page, click *Logs* to display the list of transaction events. Notice the `OperatorCreated` and `AuthorizedForwarderCreated` events. ![Image](/images/chainlink-nodes/node-operators/forwarder/factorycreatetransactions.jpg) 7. Right-click on each contract address and open it in a new tab. 8. At this point, you should have one tab displaying the operator contract and one tab displaying the forwarder contract. ![Image](/images/chainlink-nodes/node-operators/forwarder/operator.jpg) ![Image](/images/chainlink-nodes/node-operators/forwarder/forwarder.jpg) 9. Record the operator and forwarder addresses. You will need them later. ## Access control setup As explained in the [forwarder](/chainlink-nodes/contracts/forwarder) page: - The owner of a forwarder contract is an [operator](/chainlink-nodes/contracts/operator) contract. The owner of the operator contract is a more secure address, such as a hardware wallet or a multisig wallet. Therefore, node operators can manage a set of forwarder contracts through an operator contract using a secure account such as hardware or a multisig wallet. - Forwarder contracts distinguish between owners and authorized senders. Authorized senders are hot wallets (Chainlink nodes' EOAs). For this example to run, you will have to: - Allow the forwarder contract to call the operator's [fulfillOracleRequest2](/chainlink-nodes/contracts/operator#fulfilloraclerequest2) function by calling the [setauthorizedsenders](/chainlink-nodes/contracts/receiver#setauthorizedsenders) function on the operator contract. Specify the forwarder address as a parameter. - Allow the two Chainlink node EOAs to call the forwarder's [forward](/chainlink-nodes/contracts/forwarder#forward) function. Because the operator contract owns the forwarder contract, call [acceptAuthorizedReceivers](/chainlink-nodes/contracts/operator#acceptauthorizedreceivers) on the operator contract. Specify the forwarder contract address and the two Chainlink node EOAs as parameters. This call makes the operator contract accept ownership of the forwarder contract and authorizes the Chainlink node EOAs to call the forwarder contract by calling [setauthorizedsenders](/chainlink-nodes/contracts/receiver#setauthorizedsenders). ### Whitelist the forwarder In the blockchain explorer, view the operator contract and call the `setAuthorizedSenders` method with the address of your forwarder contract. The parameter is an array. For example, `["0xA3f07D6773514480b918C2742b027b3acD9E44fA"]`. Metamask prompts you to confirm the transaction. ![Image](/images/chainlink-nodes/node-operators/forwarder/operatorsetauthorizedsenders.jpg) ### Whitelist the Chainlink node EOAs In the blockchain explorer, view the operator contract and call the `acceptAuthorizedReceivers` method with the following parameters: - `targets`: Specify an array of forwarder addresses. For example, `["0xA3f07D6773514480b918C2742b027b3acD9E44fA"]` - `sender`: Specify an array with the two Chainlink node EOAs. For example, `["0x259c49E65644a020C2A642260a4ffB0CD862cb24","0x71a1Eb6534054E75F0D6fD0A3B0A336228DD5cFc"]`. MetaMask prompts you to confirm the transaction. ![Image](/images/chainlink-nodes/node-operators/forwarder/acceptAuthorizedReceivers.jpg) ## Activate the forwarder 1. In the shell of your Chainlink node, enable the forwarder using the Chainlink CLI. Replace `forwarderAddress` with the forwarder address that was created by the factory. Replace `chainId` with the EVM chain ID. (`11155111` for Sepolia): ```shell chainlink forwarders track --address forwarderAddress --evmChainID chainId ``` In this example, the command is: ```shell chainlink forwarders track --address 0xA3f07D6773514480b918C2742b027b3acD9E44fA --evmChainID 11155111 ``` ```shell Forwarder created ------------------------------------------------------ ID: 1 Address: 0xA3f07D6773514480b918C2742b027b3acD9E44fA Chain ID: 11155111 Created At: 2023-03-02T11:41:43Zchainlink@22480bec8986 ``` 2. Exit the shell of your Chainlink node: ```shell exit ``` 3. Stop your Chainlink node: ```shell docker stop chainlink && docker rm chainlink ``` 4. Update your environment file. If you followed [Running a Chainlink Node locally](/chainlink-nodes/v1/running-a-chainlink-node) guide then add `ETH_USE_FORWARDERS=true` and `FEATURE_LOG_POLLER=true` to your environment file: ```shell echo "ETH_USE_FORWARDERS=true FEATURE_LOG_POLLER=true" >> ~/.chainlink-sepolia/.env ``` - `ETH_USE_FORWARDERS` enables sending transactions through forwarder contracts. - `FEATURE_LOG_POLLER` enables polling forwarder contracts logs to detect any changes to the authorized senders. 5. Start the Chainlink node: ```shell cd ~/.chainlink-sepolia && docker run --platform linux/x86_64/v8 --name chainlink -v ~/.chainlink-sepolia:/chainlink -it --env-file=.env -p 6688:6688 smartcontract/chainlink:1.12.0 local n ``` 6. You will be prompted to enter the key store password: ```shell 2022-12-22T16:18:04.706Z [WARN] P2P_LISTEN_PORT was not set, listening on random port 59763. A new random port will be generated on every boot, for stability it is recommended to set P2P_LISTEN_PORT to a fixed value in your environment config/p2p_v1_config.go:84 logger=1.10.0@aeb8c80.GeneralConfig p2pPort=59763 2022-12-22T16:18:04.708Z [DEBUG] Offchain reporting disabled chainlink/application.go:373 logger=1.10.0@aeb8c80 2022-12-22T16:18:04.709Z [DEBUG] Offchain reporting v2 disabled chainlink/application.go:422 logger=1.10.0@aeb8c80 Enter key store password: ``` 7. Enter the key store password and wait for your Chainlink node to start. ## Create directRequest jobs This section is similar to the [Fulfilling Requests](/chainlink-nodes/v1/fulfilling-requests) guide. 1. Open the Chainlink Operator UI. 2. On the **Jobs** tab, click **New Job**. 3. Create the `uint256` job. Replace: - `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address. - `EOA_ADDRESS` with the **first** Chainlink node EOA. ```toml # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. # DO NOT USE THIS CODE IN PRODUCTION. # evmChainID for Sepolia Testnet evmChainID = "11155111" contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" forwardingAllowed = true maxTaskDuration = "0s" minIncomingConfirmations = 0 name = "Get > Uint256" observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, uint256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)" from="[\\"EOA_ADDRESS\\"]"] decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx """ schemaVersion = 1 type = "directrequest" ``` 4. Create the `string` job. Replace: - `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address. - `EOA_ADDRESS` with the **second** Chainlink node EOA. ```toml # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. # DO NOT USE THIS CODE IN PRODUCTION. # evmChainID for Sepolia Testnet evmChainID = "11155111" contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" forwardingAllowed = true maxTaskDuration = "0s" minIncomingConfirmations = 0 name = "Get > String" observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] encode_data [type="ethabiencode" abi="(bytes32 requestId, string value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse) }"] encode_tx [type="ethabiencode" abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" ] submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)" from="[\\"EOA_ADDRESS\\"]"] decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx """ schemaVersion = 1 type = "directrequest" ``` 5. After you create the jobs, record the two job IDs. > **NOTE** > > Note that both jobs have the attribute `forwardingAllowed = true`. This attribute will make the jobs attempt to run > through the forwarder before falling back to default mode. For example, if the Chainlink node tracks no forwarder, the > job falls back to the default mode. ## Test the transaction-sending strategy ### Create API requests 1. Open [APIConsumerForwarder.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/APIRequests/APIConsumerForwarder.sol) in the Remix IDE. 2. Note that `_setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789)` is configured for *Sepolia*. 3. On the **Compiler** tab, click the **Compile** button for `APIConsumerForwarder.sol`. 4. On the **Deploy and Run** tab, configure the following settings: - Select *Injected Provider* as your environment. Make sure your metamask is connected to Sepolia. - Select *APIConsumerForwarder* from the **Contract** menu. 5. Click **Deploy**. MetaMask prompts you to confirm the transaction. 6. Fund the contract by sending LINK to the contract's address. See the [Fund Your Contracts](/resources/fund-your-contract) page for instructions. The address for the `ATestnetConsumer` contract is on the list of your deployed contracts in Remix. You can fund your contract with 1 LINK. 7. After you fund the contract, create a request. Input your operator contract address and the job ID for the `Get > Uint256` job into the `requestEthereumPrice` request method **without dashes**. The job ID is the `externalJobID` parameter, which you can find on your job's definition page in the Node Operators UI. 8. Click the **transact** button for the `requestEthereumPrice` function and approve the transaction in Metamask. The `requestEthereumPrice` function asks the node to retrieve `uint256` data specifically from [https://min-api.cryptocompare.com/data/price?fsym=ETH\&tsyms=USD](https://min-api.cryptocompare.com/data/price?fsym=ETH\&tsyms=USD). 9. After the transaction processes, open the **Runs** page in the Node Operators UI. You can see the details for the completed the job run. 10. In Remix, click the `currentPrice` variable to see the current price updated on your consumer contract. 11. Input your operator contract address and the job ID for the `Get > String` job into the `requestFirstId` request method **without dashes**. The job ID is the `externalJobID` parameter, which you can find on your job's definition page in the Node Operators UI. 12. Click the **transact** button for the `requestFirstId` function and approve the transaction in Metamask. The `requestFirstId` function asks the node to retrieve the first `id` from [https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd\&per_page=10](https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd\&per_page=10). 13. After the transaction processes, you can see the details for the complete the job run the **Runs** page in the Node Operators UI. 14. In Remix, click the `id` variable to see the current price updated on your consumer contract. ### Check the forwarder Confirm the following information: - The Chainlink node submitted the callbacks to the forwarder contract. - Each callback used a different account. - The forwarder contract forwarded the callbacks to the operator contract. Open your forwarder contract in the block explorer. Two [forward](/chainlink-nodes/contracts/forwarder#forward) transactions exist. ![Image](/images/chainlink-nodes/node-operators/forwarder/forward-transactions.jpg) Click on both transaction hashes and note that the `From` addresses differ. In this example, `0x259c49E65644a020C2A642260a4ffB0CD862cb24` is the EOA used in the `uint256` job, and `0x71a1Eb6534054E75F0D6fD0A3B0A336228DD5cFc` is the EOA used in the `string` job: ![Image](/images/chainlink-nodes/node-operators/forwarder/forward1.jpg) ![Image](/images/chainlink-nodes/node-operators/forwarder/forward2.jpg) Then click on the `Logs` tab to display the list of events. Notice the [OracleResponse](/chainlink-nodes/contracts/operator#oracleresponse) events. The operator contract emitted them when the Forward contract called it ![Image](/images/chainlink-nodes/node-operators/forwarder/forward1-logs.jpg) ![Image](/images/chainlink-nodes/node-operators/forwarder/forward2-logs.jpg)