- • Sole authority on
wallet_account.balance — no other service may write it directly
- • Append-only
wallet_transaction ledger; every balance change leaves a row
- • USDT + BTC balances, freeze/unfreeze, debit/credit with idempotency keys
- • Withdrawal 7-state machine (PENDING → REVIEWING → APPROVED → BROADCASTING → BROADCASTED → CONFIRMED / CHAIN_FAIL)
- • Deposit address persistence per (uid, chain) — TD-65
- • Treasury wallet catalog + daily reconcile job
- • BTC exposure monitor (BtcExposureMonitor @Scheduled, produces chain.btc.exposure.alert)
- Produces:
wallet.deposit.credited — after each successful credit
- Produces:
chain.btc.exposure.alert — BTC threshold monitor @Scheduled 1/min
- Consumes:
chain.deposit.confirmed, chain.deposit.btc.confirmed — on-chain deposit credit
- Consumes:
game.round.sold_out, game.draw.completed, game.round.canceled
- Consumes:
wallet.withdraw.broadcasted / .confirmed / .failed — state machine
- Consumes:
prize.physical.forfeited, user.registered (register bonus)
- • MySQL
one_wallet — 10 tables, V1..V4 migrations
- • Redis — consumer idempotency SETNX, withdrawal rate-limit, address cache
- • Kafka — 2 produced, 9 consumed
- • Feign: IChainService (withdraw broadcast, BTC addr), IUserService, IGameService, IAdminService
- • Feign: IAgentService (v1.1+ commission upline lookup)