Simulations
Every test helper call creates a simulation. It records what you asked for, the transaction it put on the simulated chain, and every Stridge object and webhook that came of it.

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"
}
FieldDescription
kindWhich helper created it: uda_deposit, vault_deposit, payout, payout_release, or payout_fail
presetThe preset you named, or null
requestWhat you asked for, with defaults filled in
stateHow far it has got; see below
chainThe transaction it put on the simulated chain, or null before there is one
causedEvery Stridge object it produced (deposit, settlement, routing, payout), each with its current status and the last webhook event_type it sent
epochThe sandbox's reset count when the simulation was created
errorWhy the simulation itself failed: world refused or timed out
outcomeWhy a completed deposit stopped short of a settlement; null when the flow ran its full course

States

StateMeaning
runningThe transfer is on its way; Stridge has not recorded anything yet
observedStridge recorded the first object the transfer produced
completedThe flow reached its end. An outcome you chose, such as a failed settlement, still ends completed
failedThe simulation could not finish. error says why. A simulation that takes longer than 10 minutes fails with timed out
expiredYour 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:

settlementWhat happensWebhooks
success (default)The deposit settles to the UDA's destinationdeposit.confirmed, uda.settlement.created, uda.settlement.completed
retry_then_successThe first settlement attempt fails, and Stridge's retry succeedsdeposit.confirmed, uda.settlement.created, uda.settlement.retrying, uda.settlement.completed
failEvery settlement attempt fails, so the settlement fails for good after Stridge's retriesdeposit.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.

PresetThe depositWhat happens
underpaid1 whole unit of an asset the UDA acceptsSettles normally; use it to test small amounts
overpaid1000 whole units of an asset the UDA acceptsSettles normally; use it to test large amounts
wrong_networkA payment on a simulated network the UDA is not payable onStridge detects it and settles none of it
wrong_asset10 units of an asset the UDA does not acceptStridge records the deposit and settles none of it. The simulation completes with outcome: "asset not accepted"
dustAn amount below the network's minimum depositStridge 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:

outcomeMeaning
asset not acceptedThe deposit was in an asset the UDA does not accept. It was recorded and not settled
not settledStridge recorded the deposit and did not settle it for another reason, such as a payment no route carries
not recordedA 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:

outcomeWhat happensWebhooksSimulation completes
successThe transaction confirmspayout.confirmedWhen the payout is final
failThe transaction fails on chainpayout.failedWhen the payout is final
holdThe transaction is broadcast and held outside the chainNone yetWhen the chain holds the transaction

A held payout waits for your decision:

  • POST /v1/test_helpers/payouts/{payout_id}/release lets the transaction into a block. The payout confirms and sends payout.confirmed.
  • POST /v1/test_helpers/payouts/{payout_id}/fail fails it. The payout sends payout.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.

Next steps

Was this page helpful?