Skip to content

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.

Status: Awaiting deposit — not fundedStatus: FundedStatus: ReleasedorStatus: Refunded

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.

Who can do what

One signature, from one specific person.

Nobody else’s signature counts. Not a stranger’s, not ours.

ActionWho signsAllowed whenMoney movesStatus after
CreatePayerAmount above zero, recipient isn’t the payer, deadline in the future and within 365 daysNothing yetStatus: Awaiting deposit — not funded
DepositPayerAwaiting deposit, before the deadline, not pausedPayer to contractStatus: Funded
CancelPayerAwaiting deposit, any timeNothingStatus: Cancelled
ReleasePayer onlyFunded or in disputeContract to recipient, full amountStatus: Released
RefundRecipient onlyFunded or in disputeContract to payer, full amountStatus: Refunded
ReclaimPayer onlyFunded, deadline passed, no disputeContract to payer, full amountStatus: Refunded
DisputePayer or recipientFunded, before the deadline, arbiter namedNothingStatus: In dispute
ResolveArbiter onlyIn disputeSplit as the arbiter decidesStatus: ReleasedStatus: RefundedStatus: Split
ViewAnyoneAlwaysNothingNo change

What the contract refuses

The transaction fails and the money stays exactly where it was.

  • A release signed by anyone except the payer.
  • A refund signed by anyone except the recipient.
  • A second deposit into an escrow that’s already funded.
  • Any release, refund or reclaim once it’s Released or Refunded.
  • A release or refund before anything is deposited.
  • A reclaim before the deadline, or a deposit after it.
  • An escrow for zero USDC, or one where you pay yourself.
  • A dispute on an escrow with no arbiter, or after the deadline.
  • A decision by anyone except the escrow’s arbiter, or before a dispute.

No back door

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.

Status follows the chain

The app changes status only after Stellar confirms. If a transaction fails, the escrow stays exactly as it was and the app says why.

Why the payer can reclaim

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.

Proof on Stellar Testnet

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.

Contract
CB65…K7MGExplorer
Deploy
43c2…5f07

A. Two-step happy path

Status: Released

The payer creates it, deposits with a second signature, then releases. Escrow #0003

  1. CreateSucceeded: Createdfd34…e6ac
  2. Deposit #3Succeeded: Funded4378…5af2
  3. Release #3Succeeded: Released7c44…b5eb

B. Recipient refund

Status: Refunded

Created and funded in one signature. The recipient sends it back. Escrow #0004

  1. Create and depositSucceeded: Funded2981…6f9c
  2. Refund #4Succeeded: Refunded02db…3071

C. Unauthorized

Status: Released

Six calls by the wrong signer, all refused with the money untouched. Then the payer releases. Escrow #0005

  1. Create and deposit (arbiter)Succeeded: Fundedbb2b…3abd
  2. Release #5 by recipientRefused: Not yours to sign (auth error)2c18…3a13
  3. Release #5 by strangerRefused: Not yours to sign (auth error)0881…30b5
  4. Refund #5 by payerRefused: Not yours to sign (auth error)9d74…37cc
  5. Decide #5 by strangerRefused: Not yours to sign (auth error)fc77…bc4a
  6. Reclaim #5 by recipientRefused: Not yours to sign (auth error)9fdf…e343
  7. Pause the contract by strangerRefused: Not yours to sign (auth error)add4…1f16
  8. Check #5: status and the contract’s USDCSucceeded: Still Funded, funds unchangedRead, no transaction
  9. Release #5 by payerSucceeded: Released633d…f134

D. Duplicates

3 refused

The same release, refund and deposit sent a second time. Escrow #0003, #0004

  1. Release #3 againRefused: Already moved on (error #101 InvalidStatus)9f2b…2285
  2. Refund #4 againRefused: Already moved on (error #101 InvalidStatus)95b4…237b
  3. Deposit #3 againRefused: Already moved on (error #101 InvalidStatus)af6d…34b7

E. Dispute and split

Status: Split

The recipient opens a dispute. The payer can’t reclaim, and the arbiter splits it 0.6 / 0.4. Escrow #0001

  1. Create and deposit (arbiter, 90s)Succeeded: Funded703a…69d6
  2. Open a dispute on #1Succeeded: Disputed88d4…a8e3
  3. Decide #1 by strangerRefused: Not yours to sign (auth error)20fb…9644
  4. Reclaim #1 after deadlineRefused: Already moved on (error #101 InvalidStatus)5a43…f06f
  5. Decide #1 (0.6 / 0.4)Succeeded: Splite29d…a96b

F. Deadline reclaim

Status: Refunded

The payer tries to take it back early, then does after the deadline. Escrow #0002

  1. Create and deposit (60s deadline)Succeeded: Fundedbfbd…b346
  2. Reclaim #2 earlyRefused: Not yet (error #103 DeadlineNotReached)991a…c2bd
  3. Reclaim #2Succeeded: Refunded4804…cc8c

G. Cancel

Status: Cancelled

Cancelled before any deposit. A deposit after that is refused. Escrow #0006

  1. CreateSucceeded: Createda760…1ee9
  2. Cancel #6Succeeded: Cancelled66f3…3f65
  3. Deposit #6 after cancelRefused: Already moved on (error #101 InvalidStatus)cd95…6cd4

About this contract

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.

Contract
CB65…K7MGExplorer
Version
Admin
Upgrade notice period
Upgrades
Escrows created
Locked in escrows
Contract’s USDC balance
Code hash (wasm), as deployed99693d7da2c0ebb52043e97ca8342590b296b5aa83f6d682d345c3d627a34aadCheck it yourself: the output must equal the hash above, or the one in the latest upgrade event.stellar contract fetch --id CB65NNEWX53VH7GFZYCIAKIUZIRTS645YVWXSUZCC2VCFB6NFOX7K7MG --network testnet | shasum -a 256