Escrow in one sentence
Escrow is a conditional-deposit service: between the moment a trade opens and the moment it ends, the crypto is physically held by the platform and unavailable to the seller. This creates a temporary "neutral zone" where neither side can run with the money or take back what they've already delivered.
In a traditional exchange, the exchange itself plays the escrow role. On a P2P platform, escrow is the platform's code that locks the balance atomically. No human flips switches by hand.
Who is the seller, who is the buyer
The terminology can confuse: every ad has a creator (ad creator, trader) and a client who comes in through the ad. Either party can be the seller or the buyer:
- SELL ad (the trader sells): ad creator = seller, client = buyer.
- BUY ad (the trader buys): ad creator = buyer, client = seller.
In both cases the seller is whoever gives crypto, and the buyer is whoever gives fiat. Escrow works the same: the seller's crypto is locked.
What happens at trade open
When the buyer clicks Open trade, the platform runs a single atomic database transaction (Prisma Serializable isolation — Postgres's strictest level, no races) which:
- Creates the trade record in Open state.
- Debits the seller's "available" balance by
crypto_amount + commission. - Credits the seller's "locked" balance by
crypto_amount + commission. - Posts a system message in the chat with payment details.
commission is calculated from the crypto amount at the platform commission rate, rounded up to 2 decimals for USDT or 8 for BTC. Only the ad creator (trader) pays it, but it's pre-locked in escrow to avoid races at release.
If the seller doesn't have enough "available" to lock — opening the trade is refused with "Amount exceeds seller's available balance". No partial locks — either the whole amount goes into escrow, or the trade isn't created.
What "locked" balance means
In the wallet, each currency shows two numbers:
- Available — what you can spend (withdraw, open new trades).
- Locked — what's currently in escrow across open trades.
Locked funds:
- can't be withdrawn (the form will show a smaller available);
- can't be used in new trades (new trades refuse if "available" is insufficient);
- are visible in the wallet as part of total balance, marked "in trades".
The lock lasts until the trade closes one of four ways: receipt confirmed, cancelled, timer expired, or dispute resolved.
What happens at trade end
Successful release (seller clicked "Confirm receipt")
Inside one Serializable transaction:
- Seller's "locked" balance is debited by
crypto_amount + commission. - Buyer's "available" balance is credited by
crypto_amount. commissionis distributed to the platform. If the ad creator has a referrer, part of the commission is credited to them — see Referral program.- Trade moves to Completed state.
After this, buyer's balance grows by exactly crypto_amount, seller's drops by crypto_amount + commission.
Cancel before payment or timer expiry
- Seller's "locked" balance is debited by
crypto_amount + commission. - Seller's "available" balance is credited by
crypto_amount + commission. - Trade moves to Cancelled state.
So the seller gets back exactly what was locked. No losses — there's no fee on unsuccessful trades.
Dispute
If a trade goes to Dispute state, escrow stays locked until a moderator rules. Three rulings:
- Buyer wins — crypto goes to the buyer (same movement as success), commission charged.
- Seller wins — escrow is released back to the seller.
- Cancelled — escrow is released back to the seller.
In the last two, no commission is charged.
What escrow protects against — and what it doesn't
It protects
- The buyer — from a seller running off with crypto. The crypto is already in escrow. The seller can't move it.
- The seller — from a buyer "receiving crypto and not paying". For crypto to leave, the seller has to click Confirm receipt. Without that, crypto stays in escrow, and a moderator rules in a dispute.
- Both sides — from technical glitches. The atomic Serializable transaction rules out races (a seller can't simultaneously withdraw the crypto and open a trade with it).
It doesn't protect
Escrow is about crypto on our side. It does NOT protect against:
- Card chargeback. If a buyer paid with a stolen card, the real owner can reverse it via the bank days later. The fiat leaves your account; the crypto is already gone. Defence — accept fiat only from the counterparty's listed name.
- Fake screenshots. If you confirmed receipt by screenshot without checking your account, that's your decision. Escrow releases crypto and won't return it.
- Off-platform detail swaps. If a buyer convinced you in Telegram to pay "another seller on their behalf" — that's not a platform trade, escrow isn't involved.
- Social engineering. No code defends against voluntarily handing money to a scammer off-platform.
Why "Serializable" so strictly
BitMoment's financial transactions run at Serializable isolation — Postgres's strictest. In practice this means:
- two parallel requests can't simultaneously debit the same amount from one balance;
- on race, one request errors and is retried;
- "opened two 100-USDT trades on a 100-USDT balance" cannot happen.
This is slower than less-strict levels — and it's the right place for money.
Where you can see this
- Open trade — state Open or Paid, crypto in the seller's "locked". Visible on the trade page and in Wallet.
- Completed trade — state Completed, crypto on buyer's "available", debited from seller. History — Wallet → Operations history.
- Dispute — state Dispute, crypto locked until moderator rules.
- All fund movements — Wallet → Operations history and
/dashboard/transactionswith filters.
