A. Two-step happy path
Status: ReleasedThe payer creates it, deposits with a second signature, then releases. Escrow #0003
Everything here is enforced by the Sisonke contract on Stellar. The app only offers what the contract accepts, and the contract refuses the rest, even if someone skips the app entirely.
With an arbiter: Funded → In dispute → Released, Refunded or Split. Unfunded escrows can be Cancelled.
Status only moves forward. Released, Refunded, Split and Cancelled are final.
Nobody else’s signature counts. Not a stranger’s, not ours.
| Action | Who signs | Allowed when | Money moves | Status after |
|---|---|---|---|---|
| Create | Payer | Amount above zero, recipient isn’t the payer, deadline in the future and within 365 days | Nothing yet | Status: Awaiting deposit — not funded |
| Deposit | Payer | Awaiting deposit, before the deadline, not paused | Payer to contract | Status: Funded |
| Cancel | Payer | Awaiting deposit, any time | Nothing | Status: Cancelled |
| Release | Payer only | Funded or in dispute | Contract to recipient, full amount | Status: Released |
| Refund | Recipient only | Funded or in dispute | Contract to payer, full amount | Status: Refunded |
| Reclaim | Payer only | Funded, deadline passed, no dispute | Contract to payer, full amount | Status: Refunded |
| Dispute | Payer or recipient | Funded, before the deadline, arbiter named | Nothing | Status: In dispute |
| Resolve | Arbiter only | In dispute | Split as the arbiter decides | Status: ReleasedStatus: RefundedStatus: Split |
| View | Anyone | Always | Nothing | No change |
The transaction fails and the money stays exactly where it was.
No admin function can move, freeze or redirect money in an escrow. The code can be upgraded only after a public notice period of 1 hour, and every page warns you while an upgrade is pending, so you can settle first. The website holds no keys. If it disappeared tomorrow, every escrow would still work from Stellar Lab.
The app changes status only after Stellar confirms. If a transaction fails, the escrow stays exactly as it was and the app says why.
It’s the one time someone can send money to themselves. Without it, money would be stuck forever if the recipient vanished. It only works after the deadline both people saw at the start, if no dispute was opened before it.
Seven scenarios, run end to end on the live contract. Every hash opens on Stellar Expert, the refused ones too: they were sent on-chain and failed there.
The payer creates it, deposits with a second signature, then releases. Escrow #0003
Created and funded in one signature. The recipient sends it back. Escrow #0004
Six calls by the wrong signer, all refused with the money untouched. Then the payer releases. Escrow #0005
The same release, refund and deposit sent a second time. Escrow #0003, #0004
The recipient opens a dispute. The payer can’t reclaim, and the arbiter splits it 0.6 / 0.4. Escrow #0001
The payer tries to take it back early, then does after the deadline. Escrow #0002
Cancelled before any deposit. A deposit after that is refused. Escrow #0006
Read live from the contract on Stellar Testnet. The admin can pause new escrows and deposits, and can upgrade the code only after the public notice period below. It can’t move, freeze or redirect an escrow.
stellar contract fetch --id CB65NNEWX53VH7GFZYCIAKIUZIRTS645YVWXSUZCC2VCFB6NFOX7K7MG --network testnet | shasum -a 256