When it fires
POST /v1/markets/{id}/disputes was called after the dispute window of the market’s proposed resolution ended. Every proposal opens one dispute window, ending at resolution.finalizableAt on GET /v1/markets/{id}. An undisputed proposal is settled when the window ends, so no dispute is accepted afterwards: a later filing could only race the settlement. The check is atomic, so a request that crosses the window’s end is refused rather than recorded.
Why it happens
- The filing was sent after
finalizableAt. - The filing was sent just before
finalizableAtand was processed after it.
How to fix
- There is nothing to retry: the proposal is being settled, and a retry is refused the same way.
- File disputes while
resolution.resolutionStateisproposedandfinalizableAtis still in the future. - Follow the settlement through
GET /v1/markets/{id}.