A deposit shows up on a block explorer within seconds. Crediting it that early is how platforms lose money: blocks can be replaced, and a transaction you saw can disappear. Valtu separates seen from final, and tells you which is which.
The statuses
- PENDING: seen on the chain, not yet deep enough. Show "processing", but don't credit it.
- CONFIRMED: deep enough and still on the canonical chain. This is the only status to credit on.
- ORPHANED: dropped by a chain reorganization before it was final. Don't credit it.
- NEEDS_REVIEW: dropped after it was confirmed, which means the depth was too shallow for that chain. The team looks into it.
Each status has its own webhook, and Valtu checks that every block links to the one before it.
How deep is deep enough
| Network | A deposit is final at |
|---|---|
| Ethereum | 12 blocks |
| BNB Chain | 15 blocks |
| Polygon | 64 blocks |
| Base | 12 blocks |
| Lisk | 12 blocks |
| Tron | the solidified block |
| Bitcoin | 3 blocks |
These are defaults. The values in force are what GET /v1/networks reports, and the security docs keep the full table, including networks that aren't live yet. Solana is paused for now.
Crediting safely
A few rules keep a ledger correct no matter what the chain does:
- Credit on
deposit.confirmed, once. Key the credit on the deposit's id, so a repeated webhook can't credit twice. - Treat webhooks as a notification, not the record. Reconcile regularly with
GET /v1/deposits?after=…. - Handle the edge cases. Payments that don't match an open order, under- and overpayments: send them to a review queue rather than guessing.
Why it matters for payouts too
Withdrawals are confirmed at the same depth. A payout is CONFIRMED only when it's as final as a deposit would be, so the status you show your customer means the same thing in both directions.
Read more in the security docs and the deposits API.