Skip to content

Commit

Permalink
Merge branch 'main' into chore/update-actions-cache
Browse files Browse the repository at this point in the history
  • Loading branch information
app-token-issuer-data-feeds[bot] authored Feb 17, 2025
2 parents b57f3ce + da27cc8 commit 1f57200
Show file tree
Hide file tree
Showing 14 changed files with 928 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .changeset/fast-cobras-sell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chainlink/layer2-sequencer-health-adapter': minor
---

Added support for Ink, Mantle, Unichain and Soneium
22 changes: 19 additions & 3 deletions packages/sources/layer2-sequencer-health/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,32 @@ Adapter that checks the Layer 2 Sequencer status
| | `ZKSYNC_HEALTH_ENDPOINT` | zkSync Health Endpoint | | |
| | `ZKSYNC_CHAIN_ID` | The chain id to connect to zkSync | | 324 |
| | `ZKSYNC_DELTA` | Maximum time in milliseconds from last seen block to consider zkSync sequencer healthy | | 120000 (2 min) |
| | `INK_RPC_ENDPOINT` | Ink RPC Endpoint | | https://rpc-gel.inkonchain.com |
| | `INK_HEALTH_ENDPOINT` | Ink Health Endpoint | | |
| | `INK_CHAIN_ID` | The chain id to connect to Ink | | 57073 |
| | `INK_DELTA` | Maximum time in milliseconds from last seen block to consider Ink sequencer healthy | | 120000 (2 min) |
| | `MANTLE_RPC_ENDPOINT` | Mantle RPC Endpoint | | https://rpc.mantle.xyz |
| | `MANTLE_HEALTH_ENDPOINT` | Mantle Health Endpoint | | |
| | `MANTLE_CHAIN_ID` | The chain id to connect to Mantle | | 5000 |
| | `MANTLE_DELTA` | Maximum time in milliseconds from last seen block to consider Mantle sequencer healthy | | 120000 (2 min) |
| | `UNICHAIN_RPC_ENDPOINT` | Unichain RPC Endpoint | | https://mainnet.unichain.org |
| | `UNICHAIN_HEALTH_ENDPOINT` | Unichain Health Endpoint | | |
| | `UNICHAIN_CHAIN_ID` | The chain id to connect to Unichain | | 130 |
| | `UNICHAIN_DELTA` | Maximum time in milliseconds from last seen block to consider Unichain sequencer healthy | | 120000 (2 min) |
| | `SONEIUM_RPC_ENDPOINT` | Soneium RPC Endpoint | | https://rpc.soneium.org |
| | `SONEIUM_HEALTH_ENDPOINT` | Soneium Health Endpoint | | |
| | `SONEIUM_CHAIN_ID` | The chain id to connect to Soneium | | 1868 |
| | `SONEIUM_DELTA` | Maximum time in milliseconds from last seen block to consider Soneium sequencer healthy | | 120000 (2 min) |

For the adapter to be useful on the desired network, at least one endpoint (RPC or HEALTH) needs to provided

---

### Input Parameters

| Required? | Name | Description | Options | Defaults to |
| :-------: | :-----: | :----------------------: | :-------------------------------------------------------------------------------: | :---------: |
|| network | Layer 2 Network to check | `arbitrum`, `optimism`, `base`, `linea`, `metis`, `scroll`, `starkware`, `zksync` | |
| Required? | Name | Description | Options | Defaults to |
| :-------: | :-----: | :----------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :---------: |
|| network | Layer 2 Network to check | `arbitrum`, `optimism`, `base`, `linea`, `metis`, `scroll`, `starkware`, `zksync`, `ink`, `mantle`, `unichain`, `soneium` | |

---

Expand Down
56 changes: 56 additions & 0 deletions packages/sources/layer2-sequencer-health/schemas/env.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,62 @@
"description": "The blockchain id to connect to",
"type": "string",
"default": "324"
},
"INK_RPC_ENDPOINT": {
"type": "string",
"default": "https://rpc-gel.inkonchain.com"
},
"INK_HEALTH_ENDPOINT": {
"type": "string",
"default": ""
},
"INK_CHAIN_ID": {
"required": false,
"description": "The blockchain id to connect to",
"type": "string",
"default": "57073"
},
"MANTLE_RPC_ENDPOINT": {
"type": "string",
"default": "https://rpc.mantle.xyz"
},
"MANTLE_HEALTH_ENDPOINT": {
"type": "string",
"default": ""
},
"MANTLE_CHAIN_ID": {
"required": false,
"description": "The blockchain id to connect to",
"type": "string",
"default": "5000"
},
"UNICHAIN_RPC_ENDPOINT": {
"type": "string",
"default": "https://mainnet.unichain.org"
},
"UNICHAIN_HEALTH_ENDPOINT": {
"type": "string",
"default": ""
},
"UNICHAIN_CHAIN_ID": {
"required": false,
"description": "The blockchain id to connect to",
"type": "string",
"default": "130"
},
"SONEIUM_RPC_ENDPOINT": {
"type": "string",
"default": "https://rpc.soneium.org"
},
"SONEIUM_HEALTH_ENDPOINT": {
"type": "string",
"default": ""
},
"SONEIUM_CHAIN_ID": {
"required": false,
"description": "The blockchain id to connect to",
"type": "string",
"default": "1868"
}
},
"allOf": [
Expand Down
60 changes: 60 additions & 0 deletions packages/sources/layer2-sequencer-health/src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ export const ENV_LINEA_RPC_ENDPOINT = 'LINEA_RPC_ENDPOINT'
export const ENV_METIS_RPC_ENDPOINT = 'METIS_RPC_ENDPOINT'
export const ENV_SCROLL_RPC_ENDPOINT = 'SCROLL_RPC_ENDPOINT'
export const ENV_ZKSYNC_RPC_ENDPOINT = 'ZKSYNC_RPC_ENDPOINT'
export const ENV_INK_RPC_ENDPOINT = 'INK_RPC_ENDPOINT'
export const ENV_MANTLE_RPC_ENDPOINT = 'MANTLE_RPC_ENDPOINT'
export const ENV_UNICHAIN_RPC_ENDPOINT = 'UNICHAIN_RPC_ENDPOINT'
export const ENV_SONEIUM_RPC_ENDPOINT = 'SONEIUM_RPC_ENDPOINT'

export const ENV_ARBITRUM_CHAIN_ID = 'ARBITRUM_CHAIN_ID'
export const ENV_OPTIMISM_CHAIN_ID = 'OPTIMISM_CHAIN_ID'
Expand All @@ -39,6 +43,10 @@ export const ENV_LINEA_CHAIN_ID = 'BASE_CHAIN_ID'
export const ENV_METIS_CHAIN_ID = 'METIS_CHAIN_ID'
export const ENV_SCROLL_CHAIN_ID = 'SCROLL_CHAIN_ID'
export const ENV_ZKSYNC_CHAIN_ID = 'ZKSYNC_CHAIN_ID'
export const ENV_INK_CHAIN_ID = 'INK_CHAIN_ID'
export const ENV_MANTLE_CHAIN_ID = 'MANTLE_CHAIN_ID'
export const ENV_UNICHAIN_CHAIN_ID = 'UNICHAIN_CHAIN_ID'
export const ENV_SONEIUM_CHAIN_ID = 'SONEIUM_CHAIN_ID'

export const DEFAULT_ARBITRUM_CHAIN_ID = '42161'
export const DEFAULT_OPTIMISM_CHAIN_ID = '10'
Expand All @@ -47,6 +55,10 @@ export const DEFAULT_LINEA_CHAIN_ID = '59144'
export const DEFAULT_METIS_CHAIN_ID = '1088'
export const DEFAULT_SCROLL_CHAIN_ID = '534352'
export const DEFAULT_ZKSYNC_CHAIN_ID = '324'
export const DEFAULT_INK_CHAIN_ID = '57073'
export const DEFAULT_MANTLE_CHAIN_ID = '5000'
export const DEFAULT_UNICHAIN_CHAIN_ID = '130'
export const DEFAULT_SONEIUM_CHAIN_ID = '1868'

export enum Networks {
Arbitrum = 'arbitrum',
Expand All @@ -57,6 +69,10 @@ export enum Networks {
Scroll = 'scroll',
Starkware = 'starkware',
zkSync = 'zksync',
Ink = 'ink',
Mantle = 'mantle',
Unichain = 'unichain',
Soneium = 'soneium',
}

export type EVMNetworks = Exclude<Networks, Networks.Starkware>
Expand All @@ -68,6 +84,10 @@ const DEFAULT_LINEA_RPC_ENDPOINT = 'https://rpc.linea.build'
const DEFAULT_METIS_RPC_ENDPOINT = 'https://andromeda.metis.io/?owner=1088'
const DEFAULT_SCROLL_RPC_ENDPOINT = 'https://rpc.scroll.io'
const DEFAULT_ZKSYNC_RPC_ENDPOINT = 'https://mainnet.era.zksync.io'
const DEFAULT_INK_RPC_ENDPOINT = 'https://rpc-gel.inkonchain.com'
const DEFAULT_MANTLE_RPC_ENDPOINT = 'https://rpc.mantle.xyz'
const DEFAULT_UNICHAIN_RPC_ENDPOINT = 'https://mainnet.unichain.org'
const DEFAULT_SONEIUM_RPC_ENDPOINT = 'https://rpc.soneium.org'

export const RPC_ENDPOINTS: Record<EVMNetworks, string | undefined> = {
[Networks.Arbitrum]: util.getEnv(ENV_ARBITRUM_RPC_ENDPOINT) || DEFAULT_ARBITRUM_RPC_ENDPOINT,
Expand All @@ -77,6 +97,10 @@ export const RPC_ENDPOINTS: Record<EVMNetworks, string | undefined> = {
[Networks.Metis]: util.getEnv(ENV_METIS_RPC_ENDPOINT) || DEFAULT_METIS_RPC_ENDPOINT,
[Networks.Scroll]: util.getEnv(ENV_SCROLL_RPC_ENDPOINT) || DEFAULT_SCROLL_RPC_ENDPOINT,
[Networks.zkSync]: util.getEnv(ENV_ZKSYNC_RPC_ENDPOINT) || DEFAULT_ZKSYNC_RPC_ENDPOINT,
[Networks.Ink]: util.getEnv(ENV_INK_RPC_ENDPOINT) || DEFAULT_INK_RPC_ENDPOINT,
[Networks.Mantle]: util.getEnv(ENV_MANTLE_RPC_ENDPOINT) || DEFAULT_MANTLE_RPC_ENDPOINT,
[Networks.Unichain]: util.getEnv(ENV_UNICHAIN_RPC_ENDPOINT) || DEFAULT_UNICHAIN_RPC_ENDPOINT,
[Networks.Soneium]: util.getEnv(ENV_SONEIUM_RPC_ENDPOINT) || DEFAULT_SONEIUM_RPC_ENDPOINT,
}

export const CHAIN_IDS: Record<EVMNetworks, number | undefined | string> = {
Expand All @@ -101,6 +125,18 @@ export const CHAIN_IDS: Record<EVMNetworks, number | undefined | string> = {
[Networks.zkSync]:
parseInt(util.getEnv(ENV_ZKSYNC_CHAIN_ID) || DEFAULT_ZKSYNC_CHAIN_ID) ||
util.getEnv(ENV_ZKSYNC_CHAIN_ID),
[Networks.Ink]:
parseInt(util.getEnv(ENV_INK_CHAIN_ID) || DEFAULT_INK_CHAIN_ID) ||
util.getEnv(ENV_INK_CHAIN_ID),
[Networks.Mantle]:
parseInt(util.getEnv(ENV_MANTLE_CHAIN_ID) || DEFAULT_MANTLE_CHAIN_ID) ||
util.getEnv(ENV_MANTLE_CHAIN_ID),
[Networks.Unichain]:
parseInt(util.getEnv(ENV_UNICHAIN_CHAIN_ID) || DEFAULT_UNICHAIN_CHAIN_ID) ||
util.getEnv(ENV_UNICHAIN_CHAIN_ID),
[Networks.Soneium]:
parseInt(util.getEnv(ENV_SONEIUM_CHAIN_ID) || DEFAULT_SONEIUM_CHAIN_ID) ||
util.getEnv(ENV_SONEIUM_CHAIN_ID),
}

export const CHAIN_DELTA: Record<Networks, number> = {
Expand All @@ -112,6 +148,10 @@ export const CHAIN_DELTA: Record<Networks, number> = {
[Networks.Scroll]: Number(util.getEnv('SCROLL_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.Starkware]: Number(util.getEnv('STARKWARE_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.zkSync]: Number(util.getEnv('ZKSYNC_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.Ink]: Number(util.getEnv('INK_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.Mantle]: Number(util.getEnv('MANTLE_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.Unichain]: Number(util.getEnv('UNICHAIN_DELTA')) || DEFAULT_DELTA_TIME,
[Networks.Soneium]: Number(util.getEnv('SONEIUM_DELTA')) || DEFAULT_DELTA_TIME,
}

const DEFAULT_METIS_HEALTH_ENDPOINT = 'https://andromeda-healthy.metisdevops.link/health'
Expand Down Expand Up @@ -167,6 +207,26 @@ export const HEALTH_ENDPOINTS: HeathEndpoints = {
responsePath: [],
processResponse: () => undefined,
},
[Networks.Ink]: {
endpoint: util.getEnv('INK_HEALTH_ENDPOINT'),
responsePath: [],
processResponse: () => undefined,
},
[Networks.Mantle]: {
endpoint: util.getEnv('MANTLE_HEALTH_ENDPOINT'),
responsePath: [],
processResponse: () => undefined,
},
[Networks.Unichain]: {
endpoint: util.getEnv('UNICHAIN_HEALTH_ENDPOINT'),
responsePath: [],
processResponse: () => undefined,
},
[Networks.Soneium]: {
endpoint: util.getEnv('SONEIUM_HEALTH_ENDPOINT'),
responsePath: [],
processResponse: () => undefined,
},
}

const defaultProcessResponse = (data: unknown, network: Networks) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ const defaultRequireTxFailure = {
[Networks.Scroll]: false,
[Networks.Starkware]: true,
[Networks.zkSync]: false,
[Networks.Ink]: false,
[Networks.Mantle]: false,
[Networks.Unichain]: false,
[Networks.Soneium]: false,
}

export type TInputParameters = {
Expand All @@ -43,6 +47,10 @@ export const inputParameters: InputParameters<TInputParameters> = {
Networks.Scroll,
Networks.Starkware,
Networks.zkSync,
Networks.Ink,
Networks.Mantle,
Networks.Unichain,
Networks.Soneium,
],
},
requireTxFailure: {
Expand Down
40 changes: 40 additions & 0 deletions packages/sources/layer2-sequencer-health/src/evm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,30 @@ export const sendEVMDummyTransaction = async (
gasPrice: 0,
to: wallet.address,
},
[Networks.Ink]: {
value: 0,
gasLimit: 0,
gasPrice: 0,
to: wallet.address,
},
[Networks.Mantle]: {
value: 0,
gasLimit: 0,
gasPrice: 0,
to: wallet.address,
},
[Networks.Unichain]: {
value: 0,
gasLimit: 0,
gasPrice: 0,
to: wallet.address,
},
[Networks.Soneium]: {
value: 0,
gasLimit: 0,
gasPrice: 0,
to: wallet.address,
},
}
await race<ethers.providers.TransactionResponse>({
timeout,
Expand Down Expand Up @@ -106,6 +130,22 @@ const lastSeenBlock: Record<EVMNetworks, { block: number; timestamp: number }> =
block: 0,
timestamp: 0,
},
[Networks.Ink]: {
block: 0,
timestamp: 0,
},
[Networks.Mantle]: {
block: 0,
timestamp: 0,
},
[Networks.Unichain]: {
block: 0,
timestamp: 0,
},
[Networks.Soneium]: {
block: 0,
timestamp: 0,
},
}

export const checkOptimisticRollupBlockHeight = (
Expand Down
8 changes: 8 additions & 0 deletions packages/sources/layer2-sequencer-health/src/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ const sequencerOnlineErrors: Record<Networks, string[]> = {
// the network detects a transaction sent with 0 gas.
[Networks.Starkware]: ['Contract not found', 'Known(OutOfRangeFee)'],
[Networks.zkSync]: ['max fee per gas less than block base fee'],
[Networks.Ink]: ['intrinsic gas too low: gas 0'],
[Networks.Mantle]: ['failed to forward tx to sequencer', 'intrinsic gas too low'],
[Networks.Unichain]: ['intrinsic gas too low: gas 0'],
[Networks.Soneium]: ['intrinsic gas too low: gas 0'],
}

export interface NetworkHealthCheck {
Expand Down Expand Up @@ -94,6 +98,10 @@ const isExpectedErrorMessage = (network: Networks, error: Error) => {
[Networks.Scroll]: ['error', 'error', 'message'],
[Networks.Starkware]: ['message'],
[Networks.zkSync]: ['error', 'message'],
[Networks.Ink]: ['error', 'message'],
[Networks.Mantle]: ['error', 'message'],
[Networks.Unichain]: ['error', 'message'],
[Networks.Soneium]: ['error', 'message'],
}
return (Requester.getResult(error, paths[network]) as string) || ''
}
Expand Down
Loading

0 comments on commit 1f57200

Please sign in to comment.