The simulation object
{
"id": "019a1b2c-3d4e-7f60-8a9b-0c1d2e3f4a5b",
"object": "simulation",
"environment_id": "3f2c1d9e-8a47-4b6e-9c11-2d5e7f8a9b04",
"livemode": false,
"kind": "uda_deposit",
"preset": null,
"request": { "uda_id": "31d32b68-e455-42b7-9d39-d2904adbe1b8", "network_id": "60", "...": "..." },
"state": "completed",
"chain": { "network_id": "60", "hash": "0x9c1e…4b7a" },
"caused": [
{ "livemode": false, "object": "deposit", "id": "bcc2b0c1-f75c-43b2-b1bc-c44437d775f4", "status": "confirmed", "event_type": "deposit.confirmed" },
{ "livemode": false, "object": "settlement", "id": "6a1f0c2b-3e94-4d1e-9b3c-5f2a8d4e1a6f", "status": "completed", "event_type": "uda.settlement.completed" }
],
"epoch": 2,
"error": null,
"outcome": null,
"created_at": "2026-10-25T09:46:50Z",
"updated_at": "2026-10-25T09:47:02Z"
}| Field | Description |
|---|---|
kind | Which helper created it: uda_deposit, vault_deposit, payout, payout_release, or payout_fail |
preset | The preset you named, or null |
request | What you asked for, with defaults filled in |
state | How far it has got; see below |
chain | The transaction it put on the simulated chain, or null before there is one |
caused | Every Stridge object it produced (deposit, settlement, routing, payout), each with its current status and the last webhook event_type it sent |
epoch | The sandbox's reset count when the simulation was created |
error | Why the simulation itself failed: world refused or timed out |
outcome | Why a completed deposit stopped short of a settlement; null when the flow ran its full course |
States
| State | Meaning |
|---|---|
running | The transfer is on its way; Stridge has not recorded anything yet |
observed | Stridge recorded the first object the transfer produced |
completed | The flow reached its end. An outcome you chose, such as a failed settlement, still ends completed |
failed | The simulation could not finish. error says why. A simulation that takes longer than 10 minutes fails with timed out |
expired | Your sandbox was reset after the simulation was created |
running and observed are open; the other three are final. Read a simulation with ?wait=completed to block until it is final, for up to 30 seconds per request. See List and read simulations.
UDA deposits
A UDA deposit is complete when its settlement reaches a final state. Choose the settlement's fate with settlement:
settlement | What happens | Webhooks |
|---|---|---|
success (default) | The deposit settles to the UDA's destination | deposit.confirmed, uda.settlement.created, uda.settlement.completed |
retry_then_success | The first settlement attempt fails, and Stridge's retry succeeds | deposit.confirmed, uda.settlement.created, uda.settlement.retrying, uda.settlement.completed |
fail | Every settlement attempt fails, so the settlement fails for good after Stridge's retries | deposit.confirmed, uda.settlement.created, uda.settlement.retrying, uda.settlement.failed |
Because fail waits out Stridge's retry schedule, it takes longer than the other two. GET /v1/test_helpers/options reports the retry interval and count under timing.
Presets
A preset is a shape of deposit, not a switch. You send the deposit's facts, and Stridge decides what they come to, just as it would for a real payer. Read GET /v1/test_helpers/options?uda_id=… to get each preset's facts for your UDA, then send those facts together with preset.
| Preset | The deposit | What happens |
|---|---|---|
underpaid | 1 whole unit of an asset the UDA accepts | Settles normally; use it to test small amounts |
overpaid | 1000 whole units of an asset the UDA accepts | Settles normally; use it to test large amounts |
wrong_network | A payment on a simulated network the UDA is not payable on | Stridge detects it and settles none of it |
wrong_asset | 10 units of an asset the UDA does not accept | Stridge records the deposit and settles none of it. The simulation completes with outcome: "asset not accepted" |
dust | An amount below the network's minimum deposit | Stridge does not record it. The simulation completes with outcome: "not recorded" about two minutes after the transfer |
A UDA has no expected amount, so underpaid and overpaid are simply a small and a large payment.
Outcomes
When a completed deposit did not settle, outcome says why:
outcome | Meaning |
|---|---|
asset not accepted | The deposit was in an asset the UDA does not accept. It was recorded and not settled |
not settled | Stridge recorded the deposit and did not settle it for another reason, such as a payment no route carries |
not recorded | A dust deposit Stridge never recorded |
Vault deposits
A vault deposit sends vault.deposit.detected and completes when the vault is credited. Use it to fund a vault before you test payouts. The only preset is dust, which completes with outcome: "not recorded".
Payouts
A payout simulation creates a real payout through the payout service, so it is validated, recorded, and reported like any other. You choose what happens to its transaction with outcome:
outcome | What happens | Webhooks | Simulation completes |
|---|---|---|---|
success | The transaction confirms | payout.confirmed | When the payout is final |
fail | The transaction fails on chain | payout.failed | When the payout is final |
hold | The transaction is broadcast and held outside the chain | None yet | When the chain holds the transaction |
A held payout waits for your decision:
POST /v1/test_helpers/payouts/{payout_id}/releaselets the transaction into a block. The payout confirms and sendspayout.confirmed.POST /v1/test_helpers/payouts/{payout_id}/failfails it. The payout sendspayout.failed.
Each decision is its own simulation, of kind payout_release or payout_fail, and spends one simulation from your budget. A payout can be decided once. Decide it soon after the hold completes: a hold that outlives its window is dropped, and a late decision answers 409 (payout not held).
Webhook events a simulation can cause
deposit.confirmed, vault.deposit.detected, uda.settlement.created, uda.settlement.retrying, uda.settlement.completed, uda.settlement.failed, payout.confirmed, payout.failed, payout.expired.
They are the same events, with the same payloads, that live sends. Sandbox deliveries carry livemode: false and reset_epoch. See Events list for the payloads.
Simulations and resets
A reset empties your sandbox and bumps its reset_epoch. A simulation still open when the sandbox is reset ends expired. Its transactions stay on the simulated chain and show in the sandbox explorer as from before the reset.