Built on Stellar Soroban · Open source · Testnet prototype
Payout rights that are funded before they exist.
Torrent lets a savings circle lock its money in a Soroban escrow pool first, then issue payout rights against it. Members can trade when they get paid, never whether the money is there.
- Backing invariant on-chain
- Ledger-derived state
- 4 MIT repositories
Ajo circle
Pool #1 · Stellar Testnet
Funded in escrow
1,000.00 TST
- #1Issued
200.00 TST · Jan 2027
owner GDTF…X3M
- #2IssuedBoth signingTransferred
200.00 TST · Feb 2027
owner GDTF…X3Mowner GDTF…X3M → GBJZ…WDJowner GBJZ…WDJ
- #3Issued
200.00 TST · Mar 2027
owner GC5Q…KDA
reserved 600 ≤ funded − claimed − withdrawn 1,000
Checked by the contract after every call
How it works
Four steps, each one enforced on-chain
The off-chain API organizes people and requests. The Soroban contract decides what actually happens to money and ownership.
- 01
Create a circle
An organizer sets the rules: members, rounds, round length and contribution. The rules are hashed, and that hash is what binds the circle to its on-chain pool.
Contract call
create_pool · allow_member · join_pool - 02
Fund the pool
Members deposit a supported Stellar asset into the Soroban escrow contract. The pool's funded total only grows when the ledger confirms a deposit.
Contract call
deposit - 03
Issue payout rights
Each right has a unique id, owner, amount and maturity. The contract refuses to issue a right that is not covered by unreserved escrow.
Contract call
issue_right - 04
Transfer or claim
Members can swap when they get paid: the owner proposes, the recipient accepts, both sign. At maturity the current owner claims exactly once.
Contract call
propose_transfer · accept_transfer · claim
A savings circle, step by step
From contributions to payouts, with the money there first
An illustrated example with four synthetic members. Use the steps or let it play.
Soroban escrow
held 0 · reserved 0
reserved 0 ≤ funded 0 − claimed 0 − withdrawn 0 ✓
Jan slot
not issued
AdaFeb slot
not issued
BolaMar slot
not issued
ChidiApr slot
not issued
Dayo
Step 1 of 5: Everyone contributes
Try it
Trade your payout date, not your payout
Pick whose slot you hold and the slot you would rather have. Torrent moves ownership of fully funded rights; amounts never change.
- 1Bola proposes the Feb right to Ada; Ada accepts. (2 signatures)
- 2Ada proposes the Jan right to Bola; Bola accepts. (2 signatures)
- 3Bola is now paid in Jan, earlier than before. Both rights stay 100: no interest, no new money.
Only fully funded, unmatured rights can change hands, and an offer expires no later than the right matures. Both parties sign every transfer.
Who it is for
Built for groups that already save together
Torrent is a prototype for the people in a circle, not for speculators: rights only move between members of the same pool.
Savings circles
Ajo, esusu, tanda, chit funds and other rotating groups that want the pot locked before anyone is promised a turn.
Members who need money sooner
Hold a late slot but face a bill now? Ask a member with an earlier, already funded slot to swap.
Members happy to wait
Flexible on timing? Take a later slot and help someone else. The amount you receive stays the same.
Organizers and treasurers
Set the rules once, see coverage straight from the ledger, and never hold anyone's money or keys yourself.
Features
Financial truth first, interface second
Every number in the app traces back to the ledger, and every state says exactly how final it is.
Funded before issued
Rights can only be minted against tokens already locked in escrow. No right represents a future contribution that has not been paid.
Ledger-derived state
Coverage, ownership and balances come from Soroban events reconstructed by the indexer, never from an app database or a client cache.
Honest settlement states
Submitted is not confirmed. A request is shown as settled only after the indexer observes it on the ledger; timeouts reconcile by transaction hash.
Your keys stay yours
Sign in by signing a one-time message. Every request shows the exact contract call before you sign it. The app never asks for a secret key.
Member-only transfers
Both parties sign, offers expire, and a right has exactly one owner at a time. The previous owner cannot claim after a transfer.
Replayable and auditable
The indexer can rebuild from the deployment ledger. Organizers get an append-only audit trail with actor, action and request id.
Under the hood
One check runs after every call
The Soroban contract refuses any change that would leave a right without escrowed money behind it. Drag the slider to try issuing a new right.
reserved 900 ≤ funded 1000 − claimed 0 − withdrawn 0
Accepted: the right is fully backed and right_issued is emitted.
- Claims work even while a pool is paused or closed.
- Upgrades are announced on-chain a week before they can run.
- The indexer rebuilds this state from events and halts on any mismatch.
Trust and safety
One invariant, checked after every call
The escrow contract refuses any deposit, issuance, transfer or claim that would leave a right uncovered. It is tested with property tests over random sequences of actions.
Backing invariant
reserved ≤ funded − claimed − withdrawn
- Rights can only be issued against escrowed tokens.
- An old owner cannot claim after a transfer.
- Nothing is claimable before maturity, or twice.
- No operator backdoor un-reserves an issued right.
Status, plainly
- Network
- Stellar Testnet only
Synthetic funds and members. Escrow contract CBWF73FUJDGXSXOYUVYHP3XAFSPZWX65YGFSXDSSF5VRFLEWFFTQUIJG is deployed on Testnet; the product remains an unaudited prototype.
- Security audit
- Not audited
No third-party review has been performed. Do not use with anything of value.
- Mainnet / real funds
- Not available
Mainnet requires an external security review and legal and compliance work first.
- Wallets
- Freighter or manual signing
The Freighter browser extension (Testnet) or sign elsewhere and paste. The Freighter flow has not yet been run against a live Testnet deployment.
- Source code
- Open source, MIT
Four repositories with independent tests and CI. Cross-repository boundaries are tested against real recorded fixtures.
Architecture and open source
Four repositories, one source of truth
Each repository owns one boundary, ships its own tests and CI, and publishes a versioned interface its siblings test against. The contract is the only source of truth for backing, ownership and payout.
- Torrent998/Torrent-contracts
Escrow pools, fully backed payout rights, member-only transfers and one-time claims.
Rust · SorobanABI v1 · events v1MIT - Torrent998/Torrent-indexer
Ingests contract events with a durable cursor and rebuilds ledger-derived state; replay and reconciliation.
TypeScript · Stellar RPCLedger events schema v1MIT - Torrent998/Torrent-api
Circles, invitations, wallet sign-in and the signing-request state machine. Holds no keys and no balances.
TypeScript · NestJS · SQLiteOpenAPI 3.1 v1MIT - Torrent998/Torrent-web
This app: circle dashboard, coverage, rights, transfers, claims and signing requests.
TypeScript · Next.jsConsumes OpenAPI v1MIT
What problem does Torrent solve?
In a savings circle, everyone contributes and members take turns receiving the pot. Sometimes a member needs their payout earlier, or later. Torrent lets members exchange the timing of a payout, but only for payouts that are already fully funded in escrow.
Is this a traditional rotating savings scheme (ROSCA)?
No. A traditional scheme relies on future contributions that have not been paid yet. Torrent never turns unpaid future contributions into a payout right: a right only exists once an equal amount is locked in the escrow contract.
Is Torrent live? Can I use real money?
No. Torrent is an open-source prototype for Stellar Testnet with synthetic funds. It is not audited, not on Mainnet, and transferability of payout rights would need legal review before any real use.
Does Torrent hold my funds or keys?
No. Funds sit in the Soroban escrow contract, which only releases them according to its rules. The API holds no keys and no balances, and the web app never asks for a secret key or seed phrase.
What happens if a transaction times out?
The request moves to a reconciling state and is resolved by its transaction hash. It is never silently retried with different parameters, and it is never shown as settled until the ledger confirms it.
Which wallets are supported?
The Freighter browser extension, offered when it is installed and set to Testnet, or any tool you sign with yourself and paste the result. A development-only test wallet exists behind a flag and is clearly labeled.
How can I contribute?
Each repository has a CONTRIBUTING guide and a list of scoped contributor issues. Pick the repository that owns the behavior you want to change; cross-repository changes are coordinated through versioned fixtures.
See every number trace back to the ledger
The app talks to a running torrent-api. Run the four services locally against Stellar Testnet, or read the code and pick up a scoped contributor issue.