diff --git a/pages/builders/chain-operators/deploy/smart-contracts.mdx b/pages/builders/chain-operators/deploy/smart-contracts.mdx
index ecae8d2f1..2eb101cd4 100644
--- a/pages/builders/chain-operators/deploy/smart-contracts.mdx
+++ b/pages/builders/chain-operators/deploy/smart-contracts.mdx
@@ -27,7 +27,7 @@ JSON file. For the full set of options, you can see the [rollup configuration pa
The smart contracts are deployed using [foundry](https://github.com/foundry-rs)
and you can find the script's source code in the monorepo at
-[packages/contracts-bedrock/scripts/Deploy.s.sol](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol).
+[packages/contracts-bedrock/scripts/deploy/Deploy.s.sol](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol).
### State Diff
diff --git a/pages/builders/chain-operators/tools/_meta.json b/pages/builders/chain-operators/tools/_meta.json
index cef5e367d..d859c48d9 100644
--- a/pages/builders/chain-operators/tools/_meta.json
+++ b/pages/builders/chain-operators/tools/_meta.json
@@ -1,3 +1,4 @@
{
+ "op-challenger": "Configure Challenger For Your Chain",
"explorer": "Block Explorer"
}
diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx
new file mode 100644
index 000000000..df759f879
--- /dev/null
+++ b/pages/builders/chain-operators/tools/op-challenger.mdx
@@ -0,0 +1,192 @@
+---
+title: How to Configure Challenger For Your Chain
+lang: en-US
+description: Learn how to configure challenger for your OP Stack chain.
+---
+
+import { Callout, Steps } from 'nextra/components'
+
+# How to Configure Challenger For Your Chain
+
+This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for a general overview of this fault proofs feature.
+
+
+ ### Build the Executable
+
+ * Clone the monorepo
+
+ ```bash
+ git clone https://github.com/ethereum-optimism/optimism.git
+ ```
+
+ * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases/tag/op-challenger%2Fv1.0.1) and use the commit to deploy. Alternatively, chain operators can use the prebuilt [challenger docker images](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.0.1).
+ If a Docker image is used, it already comes with `op-program` server and an executable for Cannon embedded, so the Cannon bin doesn't need to be specified.
+
+ ```bash
+ git checkout op-challenger/vX.Y.Z
+ ```
+
+
+ Chain operators need to specify the arguments and `op-program` server if `op-challenger` is running outside of Docker, but there's a Cannon server option which points to `op-program`'s executable.
+
+
+ * Build challenger
+
+ ```bash
+ cd optimism
+ pnpm install
+ make op-challenger
+ ```
+
+ ### Configure Challenger
+
+ * Configure challenger with the required flags. Tip: Use the `op-challenger --help` to view all subcommands, command line, and environment variable options.
+ * The example config file below shows the flags to configure in this step:
+
+ ```docker
+ challenger:
+ user: "1000"
+ image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v0.2.11
+ command:
+ - "op-challenger"
+ - "--l1-eth-rpc=http://sepolia-el-1:8545"
+ - "--l1-beacon=http://sepolia-cl-1:5051"
+ - "--l2-eth-rpc=http://op-sepolia-el-1:8545"
+ - "--rollup-rpc=http://op-sepolia-cl-1:5051"
+ - "--selective-claim-resolution"
+ - "--private-key=...."
+ - "--network=..."
+ - "--datadir=/data"
+ - "--cannon-prestates-url=..."
+ volumes:
+ - "./challenger-data:/data"
+ ```
+
+ #### `--l1-eth-rpc`
+
+ * This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions.
+ * Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger.
+
+ #### `--l1-beacon`
+
+ * This is needed just to get blobs from.
+ * In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs:
+ * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played.
+ * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain.
+
+ #### `--l2-eth-rpc`
+
+ * This needs to be `op-geth` archive node, with `debug` enabled.
+ * Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress.
+
+ #### `--rollup-rpc`
+
+ * This needs to be an`op-node` archive node because challenger needs access to output roots from back when the games start.
+
+ #### `--private-key`
+
+ * Chain operators must specify a private key or use something else (like `op-signer`).
+ * This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options:
+ * a mnemonic
+ * a private key
+ * `op-signer` endpoints
+
+ #### `--network`
+
+ * This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`.
+ * When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/chainList.json).
+ * When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config.
+ * For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/chainList.json), the `--game-factory-address` and rollup must be specified, as follows:
+
+ ```
+ --cannon-rollup-config rollup.json \
+ --cannon-l2-genesis genesis-l2.json \
+ # use this if running challenger outside of the docker image
+ --cannon-server ./op-program/bin/op-program \
+ # json or url, version of op-program deployed on chain
+ # if you use the wrong one, you will lose the game
+ # if you deploy your own contracts, you specify the hash, the root of the json file
+ # op mainnet are tagged versions of op-program
+ # make reproducable prestate
+ # challenger verifies that onchain
+ --cannon-prestate ./op-program/bin/prestate.json \
+ # load the game factory address from system config or superchain registry
+ # point the game factory address at the dispute game factory proxy
+ --game-factory-address
+ ```
+
+
+ These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used.
+
+
+ #### `--datadir`
+
+ * This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory.
+ * If running in docker, it should point to a docker volume or mountpoint, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing.
+
+ #### `--cannon-prestates-url`
+
+ The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file.
+
+ All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`.
+
+ * There are two ways to specify the prestate to use:
+ * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file
+ * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash.
+ * Example final Url for a prestate:
+ * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json)
+ * This file contains the cannon memory state.
+
+
+ Challenger will refuse to interact with any games if it doesn't have the matching prestate.
+
+
+ ### Execute Challenger
+
+ The final step is to execute challenger with the required flags. It will look something like this (but with required flags added):
+
+ ```bash
+ ./op-challenger/bin/op-challenger \
+ --trace-type cannon \
+ --l1-eth-rpc http://localhost:8545 \
+ --rollup-rpc http://localhost:9546 \
+ --game-factory-address $DISPUTE_GAME_FACTORY \
+ --datadir temp/challenger-data \
+ --cannon-rollup-config .devnet/rollup.json \
+ --cannon-l2-genesis .devnet/genesis-l2.json \
+ --cannon-bin ./cannon/bin/cannon \
+ --cannon-server ./op-program/bin/op-program \
+ --cannon-prestate ./op-program/bin/prestate.json \
+ --l2-eth-rpc http://localhost:9545 \
+ --mnemonic "test test test test test test test test test test test junk" \
+ --hd-path "m/44'/60'/0'/0/8" \
+ ```
+
+ ### Test and Debug Challenger (Optional)
+
+ This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the fault proof system onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways:
+
+ * create games yourself, and it doesn't matter if the games are valid or invalid.
+ * perform moves in games and then claim and resolve things.
+
+ Here's the list of op-challenger subcommands:
+
+ | subcommand | description |
+ | --------------- | -------------------------------------------------------- |
+ | `list-games` | List the games created by a dispute game factory |
+ | `list-claims` | List the claims in a dispute game |
+ | `list-credits` | List the credits in a dispute game |
+ | `create-game` | Creates a dispute game via the factory |
+ | `move` | Creates and sends a move transaction to the dispute game |
+ | `resolve` | Resolves the specified dispute game if possible |
+ | `resolve-claim` | Resolves the specified claim if possible |
+
+ Additionally, chain operators should consider running `op-dispute-mon`. It's an incredibly useful securities monitoring service to keep an eye on games, basically giving chain operators visibility into all the status of the games for the last 28 days.
+ Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/grafana/dispute-monitor-1718214549035.json).
+
+
+## Next Steps
+
+* Additional questions? See the FAQ section in the [OP Challenger Explainer](/stack/protocol/fault-proofs/challenger).
+* For more detailed info on `op-challenger`, see the [specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html).
+* If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions).
diff --git a/pages/stack/protocol/fault-proofs/_meta.json b/pages/stack/protocol/fault-proofs/_meta.json
index c3e2e06ed..344cdb1d7 100644
--- a/pages/stack/protocol/fault-proofs/_meta.json
+++ b/pages/stack/protocol/fault-proofs/_meta.json
@@ -2,6 +2,7 @@
"explainer": "Fault Proofs Explainer",
"fp-components": "FP System Components",
"cannon": "FPVM: Cannon",
+ "challenger": "OP-Challenger",
"mips": "MIPS.sol",
"fp-security": "FP Mainnet Security"
}
\ No newline at end of file
diff --git a/pages/stack/protocol/fault-proofs/cannon.mdx b/pages/stack/protocol/fault-proofs/cannon.mdx
index 4b912fbd2..315bbb774 100644
--- a/pages/stack/protocol/fault-proofs/cannon.mdx
+++ b/pages/stack/protocol/fault-proofs/cannon.mdx
@@ -35,7 +35,7 @@ single L2 block state transition that they disagree on.
### OP-Challenger \<> Cannon
-Once an active fault dispute game reaches a depth below attacking / defending L2 block state transitions, OP-Challenger will run
+Once an active fault dispute game reaches a depth below attacking / defending L2 block state transitions, [OP-Challenger](/stack/protocol/fault-proofs/challenger) will run
Cannon to begin processing MIPS instructions within the FPVM. As part of processing MIPS instructions, Cannon will generate state
witness hashes, which are the commitment to the results of the MIPS instructions' computation within the FPVM. Now, in the bisection game, OP-Challenger will provide the generated hashes
until a single MIPS instruction is identified as the root disagreement between participants in the active dispute. Cannon will then
diff --git a/pages/stack/protocol/fault-proofs/challenger.mdx b/pages/stack/protocol/fault-proofs/challenger.mdx
new file mode 100644
index 000000000..3f23d83f3
--- /dev/null
+++ b/pages/stack/protocol/fault-proofs/challenger.mdx
@@ -0,0 +1,124 @@
+---
+title: OP-Challenger Explainer
+lang: en-US
+description: Learn about OP-Challenger and how it operates within the OP Stack's fault proof system.
+---
+
+import { Callout } from 'nextra/components'
+import Image from 'next/image'
+
+# OP-Challenger Explainer
+
+The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)).
+
+Specifically, `op-challenger` performs the following actions:
+
+* monitors and interacts with dispute games
+* defends valid output root proposals
+* challenges invalid output root proposals
+* assists `op-proposer` by resolving claims and games once chess clocks expire
+* claims paid out bonds for both the challenger and proposer
+
+## Architecture
+This diagram illustrates how `op-challenger` monitors dispute games, defends valid proposals, and challenges invalid ones. It also shows its interaction with the `op-proposer` in resolving claims.
+
+```mermaid
+graph TD;
+ OP[OP-Challenger] -->|Monitors| DG[Dispute Games]
+ OP -->|Defends| ORP[Valid Output Root Proposals]
+ OP -->|Challenges| IORP[Invalid Output Root Proposals]
+ OP -->|Assists| OPP[OP-Proposer]
+ OPP -->|Resolves Claims| DG
+ DG -->|Claims Paid| Bonds[Bonds for Challenger and Proposer]
+
+ classDef default fill:#00,stroke:#FF0420,stroke-width:2px;
+```
+
+
+ The `cannon` and `op-program` executables are run in the `op-challenger` docker container as sub-processes when required to generate game trace data.
+
+
+## Fault Detection Responses
+
+`op-challenger` assesses each claim's validity, countering only those deemed invalid, following this logic:
+
+1. If the trusted node agrees with the output, `op-challenger` takes no action. An honest challenger does nothing because there are no claims it disagrees with. It continues to monitor the game in case someone posts a counter-claim to the valid root claim, in which case the challenger will participate in the game to defend the proposal.
+2. If the trusted node disagrees, `op-challenger` posts a counter-claim to challenge the proposed output. In contrast to the above, an honest challenger aims to delete any output roots that its trusted node disagrees with in order to claim the bond attached to it. The honest challenger assumes that their rollup node is synced to the canonical state and that the fault proof program is correct, so it is willing to put its money on the line to counter any faults.
+
+## Fault Dispute Game Responses
+
+`op-challenger` iterates through claims as stored in the contract, ensuring ancestors are processed before their descendants. For each claim, the honest challenger determines and tracks the set of honest responses to all claims, regardless of whether that response already exists in the full game state.
+
+### Root Claim
+
+The root claim is considered to be an honest claim if and only if it has a [state witness Hash](https://specs.optimism.io/fault-proof/stage-one/fault-dispute-game.html#claims) that agrees with the honest challenger's state witness hash for the root claim.
+
+### Counter Claims
+
+When a new claim is made in a dispute game, the honest challenger processes it and performs a response. The honest challenger should counter a claim if and only if:
+
+1. The claim is a child of a claim in the set of honest responses
+2. The set of honest responses, contains a sibling to the claim with a trace index greater than or equal to the claim's trace index
+
+
+ This implies the honest challenger never counters its own claim, since there is at most one honest counter to each claim, so an honest claim never has an honest sibling.
+
+
+### Possible Moves
+
+The challenger monitors each game as new claims are added and reacts according to the [honest actor algorithm](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) to defend valid proposals and invalidate invalid proposals. A **move** is a challenge against an existing claim and must include an alternate claim asserting a different trace (e.g., attack, defend, or step).
+
+
+
+
+
+
+ See the [specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) for the full scope of the honest actor algorithm.
+
+
+## Resolution
+
+When one side of a `FaultDisputeGame`'s chess clock runs out, the honest challenger's responsibility is to resolve each claim in the game by calling the `resolveClaim` function on the `FaultDisputeGame` contract. Once the root claim's subgame is resolved, the challenger then finally calls the `resolve` function to resolve the entire game.
+
+The `FaultDisputeGame` does not put a time cap on resolution - because of the liveness assumption on honest challengers and the bonds attached to the claims they've countered, challengers are economically motivated to resolve the game quickly, thereby liquidating their funds and securing rewards.
+
+## Next Steps
+
+* Ready to get started? Read our guide on how to [configure `op-challenger` on your OP Stack chain](/builders/chain-operators/tools/op-challenger).
+* For more info about how `op-challenger` works under the hood, [check out the specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html).
+
+## FAQs
+
+### If I don't have a blob archiver with access to historical data, can I lose the game?
+
+Most likely, yes. If nobody has access to the historical data. All the honest actors work together without needing to coordinate offense because they're all trying to play the same moves. So, if there's only one honest actor that lacks a blob archiver, and the actor gets pushed down to the bottom half of the game (\~ 32 claims deep in the game), then challenger would log errors and wouldn't be able to respond without the blob archiver. The actor would have 3.5 days on their side of the game to address the problem by switching to a beacon node that does have blobs, and could then proceed as usual.
+
+Note: An actor would only be pushed down to the bottom half of the game if the block being disputed is older than the blob retention period (\~18 days). If valid proposals are resolving regularly, this is not possible because each valid proposal becomes the starting point for newly created dispute games. So if there are regular valid proposals, then only \~3.5 days worth of blocks are normally being disputed, which is well within the retention period.
+
+### How many CPUs should I run for challenger to work efficiently?
+
+The default `--max-concurrency` setting suits most operators. Increase it if the challenger lags, or decrease it if it overloads with requests.
+
+### How much ETH do you need to challenge in a game?
+
+The honest challengers need to have more combined ETH than the attacker, or they may run out of funds and be unable to respond to games (requiring the security overrides to be used to protect funds). So, there's no strict amount challengers need to have, but here are some general guidelines chain operators can use to estimate:
+
+* Generally speaking, a minimum to play 1 game = bond amount \* game max depth + gas costs for each move
+* To play one game all the way down to the final step call in a single "chain" costs just over 631.2 ETH in total, so about 315.6 ETH per "side".
+
+### What is the bond? What is the bond's role in the FP system?
+
+Each *claim* pays a bond, including the root claim created when the game is created (thus the bond is paid when the game is created). Every time a new claim posts to the game, an additional bond must be paid based on the depth of the claim being posted. It is not necessary to prepay bonds (i.e., its not like staking). Instead, the bond amount is sent as the value of the transaction when calling `attack` or `defend` on `FaultDisputeGame` or calling `create` on `DisputeGameFactory`.
+
+Claims that are found to be correct have their bonds refunded. Claims that are found to be incorrect have their bonds paid to the account that posted the left-most uncountered child claim of the incorrect claim. More importantly, the bond for invalid claims is paid to whoever successfully counters the claim, but its setup so that the bond is only ever paid to a single person and never shared.
+
+* There is a delay on claiming bonds of 7 days after the claim is resolved.
+* The 7-day period restarts each time a new bond from that game is paid to the same user. Typically this means that bonds are claimable 7 days after the game is resolved.
+
+The calculation for the bond amounts are hard-coded in the [`FaultDisputeGame` contract](https://github.com/ethereum-optimism/optimism/blob/547ea72d9849e13ce169fd31df0f9197651b3f86/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L99-L100), and there's a `getRequiredBond` method on the contract that suggests what bond to use.
+
+### How much ETH is required for the challenger bond?
+
+The dispute game factory has the bond value set. To ensure correct game outcomes, the combined funding of all honest actors must be more than the funding available to an attacker. Otherwise the attacker can just post so many claims that the honest actors run out of funds and can no longer counter them. There isn't a fixed amount that guarantees this, so chain operators should have significant funds available at short notice to respond to claims.
+
+Given the guardian can intervene and reallocate bond payments if needed, attackers who try to outspend the honest actors are guaranteed to lose their funds because the guardian will just intervene and pay all their bonds to the honest actors which is a very strong disincentive against trying to win games by outspending people.
diff --git a/public/grafana/dispute-monitor-1718214549035.json b/public/grafana/dispute-monitor-1718214549035.json
new file mode 100644
index 000000000..4914240b9
--- /dev/null
+++ b/public/grafana/dispute-monitor-1718214549035.json
@@ -0,0 +1,2730 @@
+{
+ "__inputs": [
+ {
+ "name": "DS_GRAFANACLOUD-OPTIMISTIC-PROM",
+ "label": "grafanacloud-optimistic-prom",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "prometheus",
+ "pluginName": "Prometheus"
+ },
+ {
+ "name": "DS_GRAFANACLOUD-OPTIMISTIC-LOGS",
+ "label": "grafanacloud-optimistic-logs",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "loki",
+ "pluginName": "Loki"
+ }
+ ],
+ "__elements": {},
+ "__requires": [
+ {
+ "type": "panel",
+ "id": "alertlist",
+ "name": "Alert list",
+ "version": ""
+ },
+ {
+ "type": "grafana",
+ "id": "grafana",
+ "name": "Grafana",
+ "version": "11.1.0-71799"
+ },
+ {
+ "type": "panel",
+ "id": "logs",
+ "name": "Logs",
+ "version": ""
+ },
+ {
+ "type": "datasource",
+ "id": "loki",
+ "name": "Loki",
+ "version": "1.0.0"
+ },
+ {
+ "type": "panel",
+ "id": "piechart",
+ "name": "Pie chart",
+ "version": ""
+ },
+ {
+ "type": "datasource",
+ "id": "prometheus",
+ "name": "Prometheus",
+ "version": "1.0.0"
+ },
+ {
+ "type": "panel",
+ "id": "stat",
+ "name": "Stat",
+ "version": ""
+ },
+ {
+ "type": "panel",
+ "id": "timeseries",
+ "name": "Time series",
+ "version": ""
+ }
+ ],
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "grafana",
+ "uid": "-- Grafana --"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "Display metrics from op-dispute-mon",
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 1,
+ "id": null,
+ "links": [
+ {
+ "asDropdown": false,
+ "icon": "external link",
+ "includeVars": true,
+ "keepTime": false,
+ "tags": [],
+ "targetBlank": true,
+ "title": "View Dispute Mon Logs",
+ "tooltip": "",
+ "type": "link",
+ "url": "https://optimistic.grafana.net/explore?schemaVersion=1&panes=%7B%22jze%22:%7B%22datasource%22:%22grafanacloud-logs%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bcluster%3D%5C%22${cluster}%5C%22,%20namespace%3D%5C%22${namespace}%5C%22%7D%20%7C%20logfmt%20%7C%20label_format%20level%3Dlvl%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22grafanacloud-logs%22%7D,%22editorMode%22:%22code%22%7D%5D,%22range%22:%7B%22from%22:%22now-1h%22,%22to%22:%22now%22%7D%7D%7D&orgId=1"
+ }
+ ],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 34,
+ "panels": [],
+ "title": "Overview",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 0,
+ "y": 1
+ },
+ "id": 30,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "instant": false,
+ "legendFormat": "Total",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, completion=\"in_progress\"})",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "In Progress",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_ignored_games{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "Ignored",
+ "range": true,
+ "refId": "C"
+ }
+ ],
+ "title": "Monitored Games",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "orange",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 1
+ },
+ "id": 40,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, result_correctness=\"incorrect\", completion=\"in_progress\"})",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "Forecast",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Incorrect Forecast",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 120
+ },
+ {
+ "color": "red",
+ "value": 310
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 1
+ },
+ "id": 16,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "min(time() - op_dispute_mon_last_output_fetch{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "format": "time_series",
+ "instant": true,
+ "legendFormat": "__auto",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Last Output Root Fetch Time",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "#EAB839",
+ "value": 604800
+ },
+ {
+ "color": "red",
+ "value": 605800
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 1
+ },
+ "id": 36,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "min(time() - op_dispute_mon_latest_proposal{root_agreement=\"disagree\", cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Latest Invalid Proposal",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "#EAB839",
+ "value": 86400
+ },
+ {
+ "color": "red",
+ "value": 605800
+ }
+ ]
+ },
+ "unit": "string"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 4,
+ "x": 20,
+ "y": 1
+ },
+ "id": 43,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "name",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "op_dispute_mon_info{cluster=${cluster:doublequote},namespace=${namespace:doublequote}}",
+ "instant": true,
+ "legendFormat": "{{version}}",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Version",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "description": "",
+ "gridPos": {
+ "h": 6,
+ "w": 4,
+ "x": 20,
+ "y": 3
+ },
+ "id": 42,
+ "options": {
+ "alertInstanceLabelFilter": "{cluster=${cluster:doublequote}, namespace=${namespace:doublequote}}",
+ "alertName": "",
+ "dashboardAlerts": false,
+ "groupBy": [],
+ "groupMode": "default",
+ "maxItems": 20,
+ "sortOrder": 1,
+ "stateFilter": {
+ "error": true,
+ "firing": true,
+ "noData": false,
+ "normal": false,
+ "pending": true
+ },
+ "viewMode": "list"
+ },
+ "title": "Dispute Mon Alerts",
+ "type": "alertlist"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 5
+ },
+ "id": 35,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, result_correctness=\"incorrect\", completion=\"complete\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Incorrect Result",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 8,
+ "x": 12,
+ "y": 5
+ },
+ "id": 37,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "min(op_dispute_mon_up{namespace=\"op-dispute-mon\"}) > 0",
+ "instant": false,
+ "legendFormat": "1 if dispute mon is up",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Up",
+ "type": "timeseries"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 9
+ },
+ "id": 31,
+ "panels": [],
+ "title": "Alerts",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 10
+ },
+ "id": 23,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_credits{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, credit=\"above\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Credits Exceeding Expectation",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 5,
+ "y": 10
+ },
+ "id": 24,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_credits{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, credit=\"below\", withdrawable=\"non_withdrawable\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Insufficient Credits",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 10,
+ "y": 10
+ },
+ "id": 17,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "name",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (delayedWETH) (op_dispute_mon_bond_collateral_available{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, balance=\"insufficient\"}) > 0",
+ "instant": true,
+ "legendFormat": "{{delayedWETH}}",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Underfunded WETH Contract Addrs",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 15,
+ "y": 10
+ },
+ "id": 21,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_claims{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, resolved=\"resolved\", game_time_period=\"first_half\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Early Claim Resolution",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 10
+ },
+ "id": 11,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, result_correctness=\"incorrect\", completion=\"in_progress\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Wrong Leader",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "Number of withdrawal requests that diverge from the credits mapping.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 13
+ },
+ "id": 25,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_withdrawal_requests{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, credits=\"divergent\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Divergent Credits",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "Number of bonds lost by an honest actor.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 5,
+ "y": 13
+ },
+ "id": 26,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_honest_actor_bonds{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, state=\"lost\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Lost Bonds",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "Count of invalid claims made by honest actors.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 10,
+ "y": 13
+ },
+ "id": 27,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_honest_actor_claims{cluster=${cluster:doublequote},namespace=${namespace:doublequote},state=\"invalid\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Honest Actor Errors",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 500
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 15,
+ "y": 13
+ },
+ "id": 22,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum(op_dispute_mon_claims{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, resolved=\"unresolved\", resolvable=\"resolvable\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Resolvable Claims",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 13
+ },
+ "id": 38,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.1.0-71799",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace, job) (op_dispute_mon_l2_block_challenges{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, root_agreement=\"agree\"})",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Invalid L2 Block Challenge",
+ "type": "stat"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 16
+ },
+ "id": 33,
+ "panels": [],
+ "title": "Game Overview",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "Tracked games broken down by actual status",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 17
+ },
+ "id": 1,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, completion=\"in_progress\"})",
+ "legendFormat": "In Progress",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, completion=\"complete\", status=~\".*challenger_wins\"})",
+ "hide": false,
+ "legendFormat": "Challenger Wins",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}, completion=\"complete\", status=~\".*defender_wins\"})",
+ "hide": false,
+ "legendFormat": "Defender Wins",
+ "range": true,
+ "refId": "C"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace) (op_dispute_mon_ignored_games{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "legendFormat": "Ignored",
+ "range": true,
+ "refId": "D"
+ }
+ ],
+ "title": "Games",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ }
+ },
+ "mappings": []
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "in_progress"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "text",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "agree_challenger_wins"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "disagree_challenger_wins"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "agree_defender_wins"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "disagree_defender_wins"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "agree_defender_ahead"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "light-green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "agree_challenger_ahead"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "disagree_challenger_ahead"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "light-green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "disagree_defender_ahead"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 17
+ },
+ "id": 6,
+ "options": {
+ "legend": {
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true,
+ "values": [
+ "value"
+ ]
+ },
+ "pieType": "pie",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (status) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "instant": true,
+ "legendFormat": "{{status}}",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Current Status Agreement",
+ "type": "piechart"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "description": "Tracked games broken down by actual status",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 27
+ },
+ "id": 2,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (status, cluster, namespace, job) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "legendFormat": "{{status}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Game Agreement",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ }
+ },
+ "mappings": []
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "correct"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "incorrect"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 27
+ },
+ "id": 3,
+ "options": {
+ "legend": {
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true,
+ "values": [
+ "value"
+ ]
+ },
+ "pieType": "pie",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (result_correctness) (op_dispute_mon_games_agreement{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "instant": true,
+ "legendFormat": "__auto",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Forecast Expected Result",
+ "type": "piechart"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 37
+ },
+ "id": 32,
+ "panels": [],
+ "title": "Honest Actions",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepBefore",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 38
+ },
+ "id": 19,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "max by (cluster, namespace, job, honest_actor_address, state) (op_dispute_mon_honest_actor_claims{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "legendFormat": "{{honest_actor_address}} {{state}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Honest Claims",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepBefore",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ }
+ ]
+ },
+ "unit": "ETH"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 38
+ },
+ "id": 20,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "max by (cluster, namespace, job, honest_actor_address, state) (op_dispute_mon_honest_actor_bonds{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "legendFormat": "{{honest_actor_address}} {{state}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Honest Bonds",
+ "type": "timeseries"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 46
+ },
+ "id": 28,
+ "panels": [],
+ "title": "Bonds",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepBefore",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "ETH"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 47
+ },
+ "id": 14,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace, job, delayedWETH) (op_dispute_mon_bond_collateral_required{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "legendFormat": "Required {{delayedWETH}}",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "expr": "sum by (cluster, namespace, job, delayedWETH) (op_dispute_mon_bond_collateral_available{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "hide": false,
+ "legendFormat": "Available {{delayedWETH}}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Bond Collateral",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ }
+ },
+ "mappings": []
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "insufficient"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "sufficient"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 47
+ },
+ "id": 13,
+ "options": {
+ "legend": {
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true,
+ "values": [
+ "value"
+ ]
+ },
+ "pieType": "pie",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (balance) (op_dispute_mon_bond_collateral_required{cluster=${cluster:doublequote},namespace=${namespace:doublequote}})",
+ "instant": true,
+ "legendFormat": "{{balance}}",
+ "range": false,
+ "refId": "A"
+ }
+ ],
+ "title": "Bond Collateralisation",
+ "type": "piechart"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 55
+ },
+ "id": 29,
+ "panels": [],
+ "title": "Logs",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "error"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "info"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "warn"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "yellow",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 56
+ },
+ "id": 5,
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max",
+ "sum"
+ ],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "maxHeight": 600,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "editorMode": "code",
+ "expr": "count_over_time ({cluster=\"$cluster\", app=\"op-dispute-mon\"} | logfmt lvl | label_format level=lvl | level != \"\" | drop node_name, pod [5m])",
+ "legendFormat": "{{level}}",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Log Rate",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 64
+ },
+ "id": 4,
+ "options": {
+ "dedupStrategy": "numbers",
+ "enableLogDetails": true,
+ "prettifyLogMessage": false,
+ "showCommonLabels": false,
+ "showLabels": false,
+ "showTime": false,
+ "sortOrder": "Descending",
+ "wrapLogMessage": false
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "editorMode": "code",
+ "expr": "{cluster=\"$cluster\", namespace=\"$namespace\"} |= `` | logfmt | lvl =~ `err?or` | label_format level=lvl",
+ "legendFormat": "",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Error Logs",
+ "type": "logs"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 72
+ },
+ "id": 12,
+ "options": {
+ "dedupStrategy": "numbers",
+ "enableLogDetails": true,
+ "prettifyLogMessage": false,
+ "showCommonLabels": false,
+ "showLabels": false,
+ "showTime": false,
+ "sortOrder": "Descending",
+ "wrapLogMessage": false
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "editorMode": "code",
+ "expr": "{cluster=\"$cluster\", namespace=\"$namespace\"} |= `` | logfmt | lvl = `warn` | label_format level=lvl",
+ "legendFormat": "",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Warn Logs",
+ "type": "logs"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "gridPos": {
+ "h": 17,
+ "w": 24,
+ "x": 0,
+ "y": 80
+ },
+ "id": 41,
+ "options": {
+ "dedupStrategy": "none",
+ "enableLogDetails": true,
+ "prettifyLogMessage": false,
+ "showCommonLabels": false,
+ "showLabels": false,
+ "showTime": false,
+ "sortOrder": "Descending",
+ "wrapLogMessage": false
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-LOGS}"
+ },
+ "editorMode": "code",
+ "expr": "{cluster=\"$cluster\", namespace=\"$namespace\"} |= `` | logfmt | label_format level=lvl",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Full Logs",
+ "type": "logs"
+ }
+ ],
+ "refresh": "10s",
+ "schemaVersion": 39,
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {},
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "definition": "label_values(op_dispute_mon_up,cluster)",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": {
+ "qryType": 1,
+ "query": "label_values(op_dispute_mon_up,cluster)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "type": "query"
+ },
+ {
+ "current": {},
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_GRAFANACLOUD-OPTIMISTIC-PROM}"
+ },
+ "definition": "label_values(op_dispute_mon_up{cluster=\"$cluster\"},namespace)",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "namespace",
+ "options": [],
+ "query": {
+ "qryType": 1,
+ "query": "label_values(op_dispute_mon_up{cluster=\"$cluster\"},namespace)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "type": "query"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "utc",
+ "title": "Dispute Monitor",
+ "uid": "edc89b93vev40c",
+ "version": 74,
+ "weekStart": ""
+}
\ No newline at end of file
diff --git a/public/img/op-stack/protocol/challenger-moves.png b/public/img/op-stack/protocol/challenger-moves.png
new file mode 100644
index 000000000..027b3c2d3
Binary files /dev/null and b/public/img/op-stack/protocol/challenger-moves.png differ
diff --git a/words.txt b/words.txt
index 9afd48b9f..5123fa700 100644
--- a/words.txt
+++ b/words.txt
@@ -132,6 +132,7 @@ ignoreprice
implicity
Inator
inator
+incentivized
INFLUXDBV
influxdbv
initcode
@@ -179,6 +180,7 @@ Mintplex
MIPSEVM
Moralis
Mordor
+mountpoint
MOVN
MOVZ
MTHI
@@ -248,6 +250,7 @@ Preinstalls
preinstalls
Prestate
prestate
+prestates
PRICEBUMP
pricebump
PRICELIMIT
@@ -303,6 +306,7 @@ SRLV
Stablecoins
stablecoins
subcomponents
+subgame
subheaders
SUBU
SUPERCHAIN
@@ -325,6 +329,7 @@ txfeecap
txmgr
TXPOOL
txpool
+uncountered
Unprotect
unsubmitted
UPNP