> For the complete documentation index, see [llms.txt](https://docs.goassay.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.goassay.ai/developers/list-your-api-advanced/dispute-a-stake-penalty.md).

# Dispute a stake penalty on chain

Freeze a pending stake penalty with your wallet and follow the arbiter's on-chain ruling.

If you believe a pending stake penalty is wrong, dispute it with the wallet that owns the stake. A confirmed on-chain dispute freezes that penalty while an arbiter reviews it. The arbiter is a person whose designated wallet signs the ruling.

This is a dispute about a deduction from your stake. Read [Staking and penalties on chain](/developers/list-your-api-advanced/staking-and-penalties.md) for how the penalty is calculated.

## Check the window first

You must land the dispute transaction before the record's `executableAt` time. At that exact time the dispute window is closed. Opening a dialog or preparing a wallet transaction does not freeze the penalty.

| Rule                            | Value                                                         |
| ------------------------------- | ------------------------------------------------------------- |
| Default on-chain proposal delay | 72 hours                                                      |
| Configurable delay              | 10 minutes through 22 days                                    |
| Deadline for an existing record | Its stored `executableAt`; later delay changes do not move it |
| Disputes allowed                | Once per on-chain record                                      |
| Who can dispute                 | The provider wallet named on that record                      |
| Review timeout                  | 30 days from the on-chain dispute time                        |

Use the deadline shown for the particular penalty. Leave enough time for wallet approval and transaction confirmation.

## Submit the dispute

1. Sign in and open **Penalties**. Open **Why this penalty?** to review the calls, amount and deadline.
2. Connect your stake-owning wallet on Robinhood Chain. It needs enough native currency to pay the transaction fee.
3. Click **Dispute** or **Dispute on chain** for the record you want to contest.
4. Read the review sheet and acknowledge that you can dispute only once and cannot add anything later. The dispute carries no message or evidence attachment.
5. Click **Dispute on chain**, approve the wallet transaction and wait for confirmation.

## Check it worked

Look for **Disputed on chain** and the updated penalty state. The contract record must be `Disputed`; preparing an unsigned call alone changes nothing. While it is disputed, that record cannot execute, but its stake reservation remains.

A case can contain several on-chain records, one for each harmed customer. A dispute freezes only the selected record. Review every record you intend to contest before its own deadline; another pending record may still execute.

## Who decides and what happens next

The designated arbiter reviews the record and signs the ruling on chain. The arbiter can uphold it, returning it to pending execution, or cancel it in your favor. The contract also allows its admin to cancel a pending or disputed penalty.

| Outcome                                 | Effect on your stake                                                                                                                                                                                                           |
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Cancelled in your favor                 | Releases the full reservation; nothing is transferred for that record.                                                                                                                                                         |
| Upheld                                  | Keeps the reservation and returns the record to `Pending`. It can execute from the later of its original `executableAt` and the ruling time, subject to the normal execution checks. You cannot dispute the same record again. |
| No ruling within 30 days                | The uphold window closes. Anyone can call `expireSlash` to cancel the record and release its reservation. Time passing alone does not submit that transaction.                                                                 |
| Proposing verifier key becomes unusable | Anyone can expire the pending or disputed record and release its reservation.                                                                                                                                                  |

An upheld penalty still needs a separate execution transaction. It must execute before seven days have passed from its resulting `executableAt`; after that, anyone can expire it. Check the final chain state and executed amounts to see whether money moved.

<details>

<summary>Optional: contract calls and events</summary>

The app prepares `disputeSlashBatch([requestId])`, checks that it targets the expected stake contract and wallet, then asks your wallet to submit it. You can also integrate the single-record `AssayStake.disputeSlash(bytes32 requestId)` call using the deployed contract's ABI and your configured deployment.

Before submission, read `slashRecordOf(requestId)`. Require `Pending`, the provider equal to your signing wallet, `disputedAt == 0`, and chain time strictly below `executableAt`. Successful submission emits `SlashDisputed`. Disputing is permitted even during a pause or account block because it only protects stake.

The arbiter uses `upholdSlash` or `upholdSlashBatch` to uphold. Cancellation uses `cancelSlash` or `cancelSlashBatch`. Read `SlashUpheld`, `SlashCancelled` and `SlashExecuted` together with the record state when tracking outcomes.

Batch calls accept 1–64 record IDs and are atomic: one invalid or repeated ID reverts the whole batch. Precheck every record. The arbiter's uphold changes neither the recorded penalty nor beneficiary. Changing the amount requires a different process; it is not an argument to `upholdSlash`.

</details>

## Errors

| Contract reason                | Meaning and action                                                                                           |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------ |
| `NotSlashedProvider`           | Use the wallet named as provider on the record.                                                              |
| `SlashNotPending`              | Read the current state; an executed, cancelled or already disputed record cannot enter this path.            |
| `SlashAlreadyDisputed`         | The record has used its one dispute, including when a ruling returned it to pending.                         |
| `DisputeWindowClosed`          | The transaction arrived at or after `executableAt`. This record can no longer be disputed through this call. |
| `EmptyBatch` / `BatchTooLarge` | Submit between 1 and 64 eligible IDs.                                                                        |

## Go further

* [Staking and penalties on chain](/developers/list-your-api-advanced/staking-and-penalties.md).
* List your API (optional): [Dispute a stake penalty](https://docs.goassay.ai/list-your-api/penalties).

## Next

* [Architecture](/developers/under-the-hood/architecture.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.goassay.ai/developers/list-your-api-advanced/dispute-a-stake-penalty.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
