Network
Represents a blockchain network.
Description
A Network object contains the desired configuration of a blockchain network and reports its ongoing status via status.
To provision a network, create a network object. The following request will create an Ethereum network with default configurations and install the Chainlink and The Graph plugins:
POST /v1alpha/networks
Content-Type: application/json
{
"metadata": {
"name": "octonet"
},
"spec": {
"chain": {
"type": "Ethereum",
"ethereum": {
"plugins": {
"chainlink": {},
"graph": {}
}
}
}
}
}
The server responds immediately with 201 Created and background controllers will start the provisioning process. For a full list of supported blockchain platforms and their respective plugins, see Supported chains and plugins.
You may request the network you just created:
GET /v1alpha/networks/{id}
And the server responds with:
{
"kind": "Network",
"version": "v1alpha",
"metadata": {
"name": "octonet",
"rev": 1,
"ownerID": <owner_id>,
"createdAt": "2025-07-14T23:48:01.153Z",
"updatedAt": "2025-07-14T23:48:01.153Z",
},
"spec": {
"chain": {
"type": "Ethereum",
"ethereum": {
// ...
}
}
},
"status": {
"state": "Pending",
"message": "Provisioning network",
"execution": {
"currentStep": 15,
"totalSteps": 56,
},
"chainSpecHash": "...",
"lastActivityAt": "2025-07-14T23:48:01.153Z",
"lastWakeUpAt": "2025-07-14T23:48:01.153Z"
}
}
Notice how the network status is reported under status.
If you are using forked networks and want to resync to the latest block height, you may send an update network request with spec.maintenanceRequest:
PUT /v1alpha/networks/{id}
Content-Type: application/json
{
"metadata": {
"name": "octonet"
},
"spec": {
"chain": {
"type": "Ethereum",
"ethereum": {
"plugins": {
"chainlink": {},
"graph": {}
}
}
},
"maintenanceRequest": {
"action": "Resync",
"nonce": 1
}
}
}
Note that nonce must be different from status.observedMaintenanceNonce (0 if not set) for the maintenance action to be applied.
If you no longer need a network, you may delete it:
DELETE /v1alpha/networks/{id}
Supported chains and plugins
We currently support the following chains (or platforms) and plugins:
| Type | Description | Plugins Available | Kurtosis package |
|---|---|---|---|
| Ethereum | Full consensus + execution layer | Chainlink, DFNS, Graph, Uniswap, VRF | ethereum-package |
| Arbitrum | Arbitrum L2 networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Optimism | Optimism L2 networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Polygon | Polygon networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Base | Base L2 networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| BNB | BNB Smart Chain | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Avalanche | Avalanche C-Chain | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Fantom | Fantom networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Mantle | Mantle networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| ZKSync | ZKSync Era networks | Chainlink, DFNS, Graph, VRF | ethereum-package |
| Solana | Solana networks | N/A | solana-package |
| LayerZero | Cross-chain infrastructure | Multi-chain configuration | layerzero-package |
| Thorchain | Thorchain devnets | N/A | thorchain-package |
Persistent network
By default, networks stop shortly after 24 hours since the last wake up. Any activity one the network (viewing, updating, using endpoints) will cause the network to be restarted. At the moment, all data on the network will be lost.
To have networks running permanently with stronger guarantees, set spec.persistent to true, subject to your quota limits. For more information about quotas, see Quota. Persistent networks may take longer to provision due to higher compute constraints.
Operations
GET /v1alpha/networks/{id}
Get network by id
Responses
| HTTP Code | Response |
|---|---|
| 200 OK | Network |
| 404 Not Found | Error |
GET /v1alpha/networks
Get all networks that the current requester has access to.
Query parameters
Selectable fields: status.state, spec.chain.type, metadata.ownerID, spec.persistent
Responses
| HTTP Code | Response |
|---|---|
| 200 OK | NetworkList |
| 404 Not Found | Error |
GET /v1alpha/networks/{id}/endpoints
Get all endpoints that the network exposes.
Responses
| HTTP Code | Response |
|---|---|
| 200 OK | EndpointSet |
| 404 Not Found | Error |
POST /v1alpha/networks
Create a network
Request body
{
"metadata": {
"name": "octonet"
},
"spec": {
"chain": {
"type": "Ethereum",
"ethereum": {
"plugins": {
"chainlink": {},
"graph": {}
}
}
}
}
}
Responses
| HTTP Code | Response |
|---|---|
| 201 Created | Network |
| 400 Bad Request | Error |
PUT /v1alpha/networks/{id}
Update a network in full
Request body
Responses
| HTTP Code | Response |
|---|---|
| 200 OK | Network |
| 400 Bad Request | Error |
| 404 Not Found | Error |
| 409 Conflict | Error |
DELETE /v1alpha/networks/{id}
Delete a network
Responses
| HTTP Code | Response |
|---|---|
| 200 OK | Network |
| 404 Not Found | Error |
| 409 Conflict | Error |
API objects
Network
| Field | Type | Required | Notes |
|---|---|---|---|
metadata | ObjectMeta | Standard object metadata | |
spec.persistent | boolean | Whether the network should be persistent | |
spec.maintenanceRequest.action | Restart | ResetState | Resync | Maintenance action to take | |
spec.maintenanceRequest.nonce | int | Increment to trigger the maintenance action (compare with status.observedMaintenanceNonce) | |
spec.chain.type | Ethereum | Arbitrum | Optimism | Base | BNB | Avalanche | Fantom | Mantle | ZKSync | Solana | LayerZero | Thorchain | Yes | The chain type of the network |
spec.chain.ethereum | EthereumSpec | Yes if spec.chain.type == "Ethereum" | Ethereum chain parameters |
spec.chain.arbitrum | Layer2Spec | Yes if spec.chain.type == "Arbitrum" | Arbitrum chain parameters |
spec.chain.optimism | Layer2Spec | Yes if spec.chain.type == "Optimism" | Optimism chain parameters |
spec.chain.base | Layer2Spec | Yes if spec.chain.type == "Base" | Base chain parameters |
spec.chain.bnb | Layer2Spec | Yes if spec.chain.type == "BNB" | BNB chain parameters |
spec.chain.avalanche | Layer2Spec | Yes if spec.chain.type == "Avalanche" | Avalanche chain parameters |
spec.chain.fantom | Layer2Spec | Yes if spec.chain.type == "Fantom" | Fantom chain parameters |
spec.chain.mantle | Layer2Spec | Yes if spec.chain.type == "Mantle" | Mantle chain parameters |
spec.chain.zksync | Layer2Spec | Yes if spec.chain.type == "ZKSync" | ZKSync chain parameters |
spec.chain.solana | SolanaSpec | Yes if spec.chain.type == "Solana" | Solana chain parameters |
spec.chain.layerzero | LayerZeroSpec | Yes if spec.chain.type == "LayerZero" | LayerZero chain parameters |
spec.chain.thorchain | ThorchainSpec | Yes if spec.chain.type == "Thorchain" | Thorchain chain parameters |
status.enclaveID | string | Internal identifier for the running enclave | |
status.state | Pending | Operational | Stopping | Stopped | Error | Network state | |
status.message | string | Human-readable message of why the network is in this status | |
status.execution.output | string | The output of the package | |
status.execution.currentStep | int | Index of the step currently running | |
status.execution.totalSteps | int | Total number of planned steps | |
status.chainSpecHash | string | Hash of the applied spec.chain | |
status.observedMaintenanceNonce | int | Last processed spec.maintenanceRequest.nonce | |
status.lastActivityAt | string | Last activity time in RFC 3339 format | |
status.lastStoppedAt | string | When the network last reached Stopped in RFC 3339 format | |
status.lastWakeUpAt | string | When the network last resumed from Stopped or started for the first time in RFC 3339 format |
EthereumSpec
| Field | Type | Required | Notes |
|---|---|---|---|
packageVersion | enum | Kurtosis package version | |
chainID | string | Autogenerated if omitted on create | |
blockTime | int | Seconds | |
gasLimit | int | Genesis block gas limit | |
churnLimitQuotient | int | Beacon-chain parameter | |
ejectionBalance | int | Beacon-chain parameter | |
followDistance | int | Beacon-chain parameter | |
minWithdrawalDelay | int | Beacon-chain parameter | |
shardCommitteePeriod | int | Beacon-chain parameter | |
validatorCount | int | Number of validators seeded | |
mnemonicRef | LocalObjectReference | 24-word seed (EL + CL) | |
privateKeyRef | LocalObjectReference | Yes | Fund-holding hot key |
forking.enabled | boolean | Whether this network will fork data from mainnet | |
forking.blockHeight | string | Block height to fork up to | |
plugins.chainlink | object | Chainlink node set-up | |
plugins.uniswap | object | Uniswap config | |
plugins.graph | object | The Graph config | |
plugins.vrf | object | VRF config | |
plugins.vrf.type | vrfv2plus | mpc | VRF type | |
plugins.dfns | object | DFNS config | |
participants | EthereumParticipantSpec[] | Participant parameters |
EthereumParticipantSpec
| Field | Type | Required | Notes |
|---|---|---|---|
elType | geth | reth | nethermind | erigon | besu | N/A | |
elImage | string | N/A | |
elExtraArgs | string | N/A | Extra arguments to pass to the EL container |
clType | lighthouse | teku | nimbus | lodestar | grandine | prysm | N/A | |
clImage | string | N/A | |
clExtraArgs | string | N/A | Extra arguments to pass to the CL container |
count | int | N/A |
Layer2Spec
| Field | Type | Required | Notes |
|---|---|---|---|
chainID | string | Autogenerated if omitted on create | |
privateKeyRef | LocalObjectReference | Fund-holding hot key | |
forking.enabled | boolean | Whether this network will fork data from mainnet | |
forking.blockHeight | string | Block height to fork up to | |
plugins.chainlink | object | Chainlink node set-up | |
plugins.graph | object | The Graph config | |
plugins.vrf | object | VRF config | |
plugins.vrf.type | vrfv2plus | mpc | VRF type | |
plugins.dfns | object | DFNS config |
SolanaSpec
| Field | Type | Required | Notes |
|---|---|---|---|
chainID | string | Autogenerated if omitted on create | |
privateKeyRef | LocalObjectReference | Fund-holding hot key | |
forking.enabled | boolean | Whether this network will fork data from mainnet | |
forking.blockHeight | string | Block height to fork up to |
ThorchainSpec
| Field | Type | Required | Notes |
|---|---|---|---|
chainID | string | Autogenerated if omitted on create | |
privateKeyRef | LocalObjectReference | Fund-holding hot key | |
accountBalance | string | Initial RUNE balance | |
bondAmount | string | Initial bond amount | |
image | string | THORNode image tag | |
blockMaxBytes | int | Tendermint parameter | |
blockMaxGas | int | Tendermint parameter | |
forking.enabled | boolean | Whether this network will fork data from mainnet | |
forking.blockHeight | string | Block height to fork up to |
LayerZeroSpec
NetworkList
| Field | Type | Required | Notes |
|---|---|---|---|
items | Network[] | Yes | The items of this list |
metadata | ListMeta |
EndpointSet
| Field | Type | Required | Notes |
|---|---|---|---|
metadata | ObjectMeta | Standard object metadata | |
map | Record<string, string> | Yes | Maps from service name to their URL |