💰 Bản đồ tài chính — DauSim

Toàn bộ luồng tiền trong hệ thống đấu giá SIM. Cập nhật: 29/04/2026

Tiền vào (available ↑ hoặc inflow ↑)
Tiền ra (available ↓ hoặc outflow ↑)
Đóng băng (available ↓, pending ↑)
Giải phóng (pending ↓, available ↑)
Người bán (Seller)
Người bid (Bidder)
Người thắng (Winner)
Sàn (Platform) — có ví riêng quản lý bởi admin
Nạp tiền & Rút tiền

Người dùng nạp tiền qua PayOS — sàn xác nhận webhook rồi cộng vào ví. Rút tiền phải qua duyệt admin.

Sự kiệnChủ thểavailablependingEntry TypeGhi chú
Nạp tiền thành công (PayOS webhook) User + amount DEPOSIT inflowDelta + amount
Yêu cầu rút tiền User − amount + amount WITHDRAW_HOLD Tiền bị đóng băng chờ duyệt
Admin duyệt rút tiền User − amount WITHDRAW_APPROVED outflowDelta + amount — tiền ra khỏi hệ thống
Admin từ chối rút tiền User + amount − amount WITHDRAW_RELEASE Hoàn lại về available
Admin cộng tiền cho user (+) UserSàn + amount ADJUSTMENT Tiền lấy từ ví sàn → ví user. Ví sàn OUT − amount
Admin trừ tiền của user (−) UserSàn − amount ADJUSTMENT Tiền thu hồi về ví sàn. Ví sàn IN + amount

Tạo phiên đấu giá PENDING_APPROVAL → SCHEDULED / LIVE

Seller trả phí tạo phiên (cố định) và đặt cọc (% startPrice). Nếu admin duyệt → phiên chạy; từ chối → hoàn toàn bộ.

auctionFee = policy.auctionFeeFixed   // giảm theo tier seller
sellerDeposit = max(startPrice × sellerDepositPercent, sellerDepositMin)
Sự kiệnChủ thểavailablependingEntry Type
Tạo phiên (seller submit) Seller − auctionFee AUCTION_FEE
Tạo phiên (seller submit) Seller − sellerDeposit + sellerDeposit SELLER_DEPOSIT_HOLD
Admin từ chối phiên Seller + auctionFee AUCTION_FEE_REFUND
Admin từ chối phiên Seller + sellerDeposit − sellerDeposit SELLER_DEPOSIT_RELEASE

Đặt bid (lần đầu tiên vào phiên) LIVE

Bid đầu tiên của mỗi người trong phiên → đóng băng cọc tham gia cố định. Các lần bid sau không tốn thêm tiền.

Sự kiệnChủ thểavailablependingEntry Type
Bid đầu tiên vào phiên Bidder − bidderEntryDeposit + bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_HOLD
Up Top phiên (seller): Seller trả phí up top bất cứ lúc nào. UPTOP_FEE → seller.available −= (phút × giá/phút)

④a Phiên kết thúc — Không có bid / Giá thấp hơn sàn LIVE → CANCELLED

Cron job kiểm tra mỗi phút. Phiên hết giờ mà không có bid hợp lệ → hủy, hoàn toàn bộ tiền đóng băng.

Sự kiệnChủ thểavailablependingEntry Type
Hoàn cọc seller Seller + sellerDeposit − sellerDeposit SELLER_DEPOSIT_RELEASE
Hoàn cọc tham gia cho tất cả bidder Bidder + bidderEntryDeposit − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_RELEASE
⚠ Phí tạo phiên (AUCTION_FEE) không tự động hoàn — trừ trường hợp admin chủ động hủy phiên và chọn hoàn phí. Nếu phiên tự hết giờ (cron), AUCTION_FEE không hoàn.

④b Phiên kết thúc — Có bid hợp lệ LIVEWAITING_DEPOSIT

Cron job phát hiện phiên hết giờ có bid hợp lệ. Winner bị giữ cọc, non-top3 được hoàn ngay. Cọc seller vẫn giữ nguyên — chỉ hoàn khi phiên SUCCESS hoặc CANCELLED.

winnerDepositRequired = currentPrice × winnerDepositPercent
additionalToHold    = winnerDepositRequired − bidderEntryDeposit  // entry deposit đã có trong pending → tính luôn vào, chỉ hold thêm phần còn thiếu
heldNow             = min(winner.available, additionalToHold)
stillNeeded         = additionalToHold − heldNow

// totalPending sau bước này = bidderEntryDeposit + heldNow = winnerDepositRequired (nếu đủ)
// stillNeeded = 0 → WAITING_TRANSACTION (đủ cọc ngay)
// stillNeeded > 0 → WAITING_DEPOSIT + nhắn winner nạp thêm trong x phút
Sự kiệnChủ thểavailablependingEntry TypeGhi chú
Giữ thêm cọc winner (phần chưa có) Winner − heldNow + heldNow WINNER_DEPOSIT_HOLD Entry deposit đã tính vào cọc. Chỉ hold thêm additionalToHold = winnerDepositRequired − bidderEntryDeposit
Winner nạp thêm cho đủ cọc (nếu thiếu) Winner − stillNeeded + stillNeeded WINNER_DEPOSIT_HOLD Khi winner nạp tiền vào ví → tự động giữ phần còn thiếu. Hết hạn → forfeit
Hoàn cọc tham gia (ngoài top 3) Bidder (≥ #4) + bidderEntryDeposit − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_RELEASE Top 3 bị giữ lại phòng winner bỏ cọc
Cọc seller KHÔNG được hoàn ở bước này — vẫn nằm trong pending cho đến khi phiên kết thúc hoàn toàn (SUCCESS hoặc CANCELLED).
Top 3 bidder (kể cả winner) vẫn bị giữ cọc tham gia trong pending. Cọc winner được giải quyết qua winner deposit flow. Cọc Top 2 & 3 được giải quyết khi: bị tịch thu nếu họ lần lượt trở thành winner rồi bỏ cọc; hoặc hoàn lại khi phiên SUCCESS/CANCELLED (ai còn đủ điều kiện).

Winner bỏ cọc / Hết hạn nạp cọc WAITING_DEPOSIT → (vòng lặp)

Winner không nạp cọc trong thời hạn → bị tịch thu cọc, tạo ForfeitedDepositClaim, chuyển winner sang người bid cao thứ 2.

sellerPayout = forfeitAmount × (100 − forfeitPlatformSharePercent) / 100
// Ví dụ: forfeit 200k, platform 50% → seller nhận 100k ngay
Sự kiệnChủ thểavailablependingEntry TypeGhi chú
Tịch thu cọc winner Winner cũ − winnerDeposit WINNER_DEPOSIT_FORFEIT outflow — ra khỏi ví
Tịch thu cọc tham gia (winner cũ) Winner cũ − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_FORFEIT outflow — ra khỏi ví
Seller nhận phần cọc bị tịch thu (admin duyệt ForfeitedClaim) Seller + sellerPayout FORFEITED_DEPOSIT_PAYOUT Phần còn lại sàn giữ (50%)
Admin từ chối payout cho seller Sàn FORFEITED_CLAIM_RETAINED Sàn giữ lại toàn bộ, chỉ ghi audit
Giữ cọc winner MỚI (top2 lên thay) Winner mới − heldNow + heldNow WINNER_DEPOSIT_HOLD Trừ toàn bộ available. Nếu thiếu → nhắn nạp thêm
Vòng lặp kết thúc — không còn ai → phiên CANCELLED:
Lúc này mỗi người trong top 3 đã forfeit ít nhất 1 lần. Trạng thái các khoản tiền:

Admin xác nhận giao SIM — Giao dịch thành công WAITING_TRANSACTIONSUCCESS

Admin xác nhận seller đã giao SIM cho winner. Toàn bộ bước ①②③④ đều trích từ cọc winner đang PENDING — không động đến available của bất kỳ ai. Seller nhận phần còn lại sau khi trừ hết phí.

// Nguồn: winnerDepositRequired = currentPrice × winnerDepositPercent
//         = bidderEntryDeposit (đặt cọc từ bước ③) + additionalHeld (từ bước ④b)
//         → Toàn bộ đang nằm trong PENDING của winner, không cần release entry deposit riêng

// Tính từng khoản phí
floorFee      = floorPrice × platformFeePercent
aboveFloorFee = (currentPrice − floorPrice) × aboveFloorFeePercent  // 0 nếu bid ≤ floorPrice

// Trừ lần lượt từ cọc winner, cap nếu không đủ
floorFeeCharged     = min(floorFee, winnerDepositRequired)
rem1                = winnerDepositRequired − floorFeeCharged
aboveFloorFeeCharged = min(aboveFloorFee, rem1)
rem2                = rem1 − aboveFloorFeeCharged
additionalFeeCharged = min(txAdditionalFee, rem2)
netToSeller         = rem2 − additionalFeeCharged  // phần còn lại → seller

// X (tổng phí khấu trừ) = floorFeeCharged + aboveFloorFeeCharged + additionalFeeCharged
// → netToSeller = winnerDepositRequired − X
BướcChủ thểavailablepending (cọc winner)Entry TypeGhi chú
① Thu phí sàn (% × giá sàn) Winner − floorFeeCharged PLATFORM_FEE Từ cọc winner pending → outflow sàn
② Thu phí vượt sàn (% × phần vượt) Winner − aboveFloorFeeCharged ABOVE_FLOOR_FEE Từ cọc winner pending → outflow sàn. Bỏ qua nếu bid ≤ floorPrice
③ Thu phí phát sinh Winner − additionalFeeCharged TRANSACTION_ADDITIONAL_FEE Từ cọc winner pending → outflow sàn. Bỏ qua nếu admin không nhập
④ Chuyển phần còn lại cho seller Winner − netToSeller WINNER_DEPOSIT_PAYOUT_TO_SELLER Từ cọc winner pending → outflow sang seller
④ Seller nhận tiền (net) Seller + netToSeller WINNER_DEPOSIT_SELLER_INCOME TB seller: nhận netToSeller xu. X (tổng phí khấu trừ) = phí sàn + phí vượt sàn + phí phát sinh
⑤ Hoàn cọc tham gia (ai đủ điều kiện) Bidder (≠ winner) + bidderEntryDeposit − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_RELEASE Quét toàn bộ HOLD của phiên, bỏ qua winner + ai đã FORFEIT/RELEASE. ⚠ Code chưa xử lý
⑥ Hoàn cọc seller Seller + sellerDeposit − sellerDeposit SELLER_DEPOSIT_RELEASE Phiên SUCCESS → seller nhận lại cọc đã đặt khi tạo phiên
Entry deposit của winner đã được tính vào winnerDepositRequired ngay từ bước ④b — không cần release riêng ở đây.
Ví dụ số: Bid 1,200,000 xu · floorPrice 1,000,000 · winnerDepositPercent 100% · bidderEntryDeposit 200,000
winnerDepositRequired = 1,200,000 · additionalHeld ở ④b = 1,000,000 (trừ entry deposit 200,000)
floorFee 2% = 20,000 · aboveFloorFee 5% × 200,000 = 10,000 · phí phát sinh = 5,000
X (tổng phí) = 35,000 → netToSeller = 1,200,000 − 35,000 = 1,165,000 xu
Thông báo seller: "Bạn nhận 1,165,000 xu từ phiên SIM xxx. Đã khấu trừ: phí sàn 20,000 + phí vượt sàn 10,000 + phí phát sinh 5,000 = 35,000 xu"
Bug cần fix: adminConfirmTransaction thiếu bước ⑤ — cọc tham gia của các bidder đủ điều kiện đang bị kẹt pending sau SUCCESS.
Logic: query tất cả BIDDER_ENTRY_DEPOSIT_HOLD của phiên → bỏ qua winner (entry deposit đã tiêu vào cọc) + bỏ qua ai đã có FORFEIT/RELEASE tương ứng → release phần còn lại.
Quy tắc bất biến: mọi tiền cọc phải được giải quyết (release hoặc forfeit) trước khi phiên SUCCESS hoặc CANCELLED.

⑦a Seller / Admin hủy phiên đang LIVE LIVECANCELLED

Phiên bị hủy khi đang chạy. Phí tạo phiên không hoàn. Phí phạt + bồi thường bidder đều trích từ cọc seller — phần còn lại trả lại seller.

// Policy fields mới cần thêm
cancelPenalty           = policy.cancelPenaltyFixed
compensationPerBidder = policy.cancelCompensationPerBidder
maxCompensatedBidders = policy.cancelCompensationMaxBidders

// Tính toán
compensatedCount   = min(actualBidderCount, maxCompensatedBidders)
totalCompensation  = compensationPerBidder × compensatedCount

// Cap nếu cọc không đủ
penaltyCharged     = min(cancelPenalty, sellerDeposit)
rem1               = sellerDeposit − penaltyCharged
compensationCharged = min(totalCompensation, rem1)
netReturnToSeller  = rem1 − compensationCharged
BướcChủ thểavailablependingEntry TypeGhi chú
① Thu phí phạt hủy từ cọc seller Seller − penaltyCharged CANCEL_PENALTY Trích từ pending (cọc), không phải available
② Bồi thường cho mỗi bidder từ cọc seller Seller − compensationCharged CANCEL_PENALTY Tổng bồi thường trích từ cọc, chia đều cho N bidder
② Bidder nhận bồi thường Bidder (tối đa N người) + compensationPerBidder CANCEL_PENALTY_INCOME N = min(actualBidders, maxCompensatedBidders) trong policy
③ Hoàn phần cọc còn lại cho seller Seller + netReturnToSeller − netReturnToSeller SELLER_DEPOSIT_RELEASE Phần dư sau khi trừ phí phạt + bồi thường
④ Hoàn cọc tham gia tất cả bidder Bidder + bidderEntryDeposit − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_RELEASE Toàn bộ bidder đã tham gia phiên
⑤ Hoàn phí tạo phiên (tuỳ chọn) Seller + auctionFee AUCTION_FEE_REFUND Admin chọn hoàn hoặc không khi xác nhận hủy phiên
Ví dụ số: sellerDeposit = 500,000 xu · cancelPenalty = 200,000 · compensationPerBidder = 50,000 · 3 bidder (maxCompensated = 5)
→ penaltyCharged = 200,000 · compensationCharged = 150,000 · netReturnToSeller = 150,000 xu
Phí tạo phiên (AUCTION_FEE) — admin có lựa chọn hoàn hoặc không khi hủy phiên. UI hiển thị checkbox "Hoàn phí tạo phiên cho seller" khi admin thực hiện hủy.
SELLER_DEPOSIT_FORFEIT không còn dùng cho flow này — cọc không bị tịch thu toàn bộ, chỉ trích phần phí + bồi thường.
Policy fields cần thêm: cancelCompensationPerBidder (xu/người) và cancelCompensationMaxBidders (số lượng người tối đa được bồi thường).

⑦b Seller không giao SIM (admin hủy WAITING_TRANSACTION) WAITING_TRANSACTIONCANCELLED

Seller đã nhận cọc nhưng không giao SIM → bị phạt bồi thường cho winner, winner lấy lại cọc.

// Nguồn bồi thường = cọc sim seller đang nằm trong PENDING
compensationAmount = sellerDeposit  // toàn bộ cọc sim bị tịch thu → bồi thường cho winner
// Tạo ForfeitedDepositClaim (SELLER_FORFEITED) → admin duyệt trả winner
BướcChủ thểavailablependingEntry TypeGhi chú
① Tịch thu cọc sim seller Seller − sellerDeposit SELLER_DEPOSIT_FORFEIT Cọc sim pending → outflow. Tạo ForfeitedDepositClaim
② Admin duyệt → bồi thường cho winner Winner + sellerDeposit FORFEITED_DEPOSIT_PAYOUT Toàn bộ cọc sim → winner (không chia cho sàn)
③ Hoàn cọc winner Winner + winnerDeposit − winnerDeposit WINNER_DEPOSIT_RELEASE Toàn bộ pending winner deposit → available
④ Hoàn cọc tham gia (ai đủ điều kiện) Winner + Top 2 & 3 + bidderEntryDeposit − bidderEntryDeposit BIDDER_ENTRY_DEPOSIT_RELEASE Quét HOLD chưa FORFEIT/RELEASE — áp dụng quy tắc bất biến

Bảng tổng hợp tất cả Entry Types

Mỗi dòng ledger (WalletLedger) thuộc một trong các loại sau. Dấu + = tăng, − = giảm.

Entry Typeavailablependinginflow/outflowÝ nghĩa
DEPOSIT+inflow +Nạp tiền PayOS thành công
WITHDRAW_HOLD+Yêu cầu rút, đóng băng chờ duyệt
WITHDRAW_RELEASE+Admin từ chối → hoàn về
WITHDRAW_APPROVEDoutflow +Admin duyệt → tiền ra ngoài
AUCTION_FEEoutflow +Phí tạo phiên (cố định, giảm theo tier)
AUCTION_FEE_REFUND+inflow +Hoàn phí tạo phiên (phiên không bid)
SELLER_DEPOSIT_HOLD+Cọc seller khi tạo phiên
SELLER_DEPOSIT_RELEASE+Hoàn cọc seller (phiên kết thúc hợp lệ)
SELLER_DEPOSIT_FORFEIToutflow +Tịch thu cọc seller (vi phạm)
BIDDER_ENTRY_DEPOSIT_HOLD+Cọc tham gia đầu khi bid lần đầu
BIDDER_ENTRY_DEPOSIT_RELEASE+Hoàn cọc tham gia
BIDDER_ENTRY_DEPOSIT_FORFEIToutflow +Tịch thu cọc tham gia (winner bỏ)
WINNER_DEPOSIT_HOLD+Cọc winner sau khi trúng bid
WINNER_DEPOSIT_RELEASE+Hoàn cọc winner (seller hủy)
WINNER_DEPOSIT_FORFEIToutflow +Tịch thu cọc winner (bỏ cọc)
WINNER_DEPOSIT_PAYOUT_TO_SELLERoutflow +Cọc winner → chuyển cho seller (net)
WINNER_DEPOSIT_SELLER_INCOME+inflow +Seller nhận tiền từ cọc winner (net)
PLATFORM_FEEoutflow +Phí sàn (% × floorPrice), trừ từ cọc winner
ABOVE_FLOOR_FEEoutflow +Phí vượt sàn (% × phần bid > floor), trừ từ cọc winner
TRANSACTION_ADDITIONAL_FEEoutflow +Phí phát sinh admin nhập, trừ từ cọc winner
CANCEL_PENALTYoutflow +Phí phạt hủy phiên (từ available seller)
CANCEL_PENALTY_INCOME+inflow +Bidder nhận bồi thường khi seller hủy LIVE
SELLER_CANCEL_COMPENSATIONoutflow +Seller bồi thường winner (hủy WAITING_TRANSACTION)
FORFEITED_DEPOSIT_PAYOUT+inflow +Seller nhận cọc bị tịch thu (admin duyệt)
FORFEITED_CLAIM_RETAINEDSàn giữ lại (admin từ chối payout)
UPTOP_FEEoutflow +Phí up top phiên (seller trả)
ADJUSTMENT±inflow/outflowĐiều chỉnh thủ công (admin)

$ Doanh thu sàn (Platform Revenue)

Sàn thu tiền khi các khoản outflow từ user không tương ứng với inflow của user khác.

NguồnEntry TypeĐiều kiện
Phí tạo phiênAUCTION_FEEMỗi phiên được duyệt. Hoàn nếu phiên không có bid.
Phí sàn (% × giá sàn)PLATFORM_FEEKhi giao dịch SUCCESS. Trừ từ cọc winner.
Phí vượt sàn (% × phần bid > floor)ABOVE_FLOOR_FEEKhi bid vượt floorPrice. Trừ từ cọc winner.
Phí phát sinhTRANSACTION_ADDITIONAL_FEEAdmin nhập khi confirm giao SIM. Trừ từ cọc winner.
Phí up topUPTOP_FEESeller mua up top bất kỳ lúc nào.
Phần cọc bị tịch thu (giữ lại)WINNER_DEPOSIT_FORFEIT (50%)Winner bỏ cọc — sàn giữ 50% (default).
Phí phạt hủy phiên LIVECANCEL_PENALTYTrích từ cọc seller. Sàn giữ phần penaltyCharged.
Claim giữ lạiFORFEITED_CLAIM_RETAINEDAdmin từ chối payout cho seller.

Lịch sử hành động admin (Audit Trail)

Vì nhiều admin cùng quản trị, mọi hành động phải được ghi lại: ai làm, làm gì, lúc nào, trên đối tượng nào. Model AuditLog đã tồn tại — cần đảm bảo mọi action đều được bắt.

AuditLog { id, actorUserId, actorRole, action, resourceType, resourceId, payload(JSON), ipAddress, createdAt }
Đã log
ActionMô tả
APPROVE_AUCTIONDuyệt phiên đấu giá
REJECT_AUCTIONTừ chối phiên
ADMIN_FORCE_CANCEL_LIVEHủy phiên đang LIVE
ADMIN_CANCEL_SCHEDULEDHủy phiên SCHEDULED
CONFIRM_DEPOSITXác nhận winner đã nạp cọc
CONFIRM_TRANSACTIONXác nhận giao SIM thành công
MANUAL_CONFIRM_DEPOSITXác nhận nạp tiền PayOS thủ công
ADMIN_MESSAGE_REPLYTrả lời tin nhắn user
CHAT_SESSION_OPEN/CLOSEMở/đóng phiên chat
APPROVE/REJECT_AUCTION_TGDuyệt/từ chối qua Telegram
RESOLVE_FORFEITED_CLAIMXử lý claim cọc bị tịch thu
CANCEL_WAITING_TRANSACTIONHủy khi seller không giao SIM
Còn thiếu — cần bổ sung
ActionMô tả
ADJUST_USER_BALANCEAdmin cộng/trừ xu thủ công cho user
UPDATE_AUCTION_POLICYThay đổi policy đấu giá
LOCK_USER / UNLOCK_USERKhóa/mở tài khoản user
CHANGE_USER_ROLEThay đổi role user
APPROVE_WITHDRAWDuyệt yêu cầu rút tiền
REJECT_WITHDRAWTừ chối yêu cầu rút tiền
PLATFORM_WALLET_ADJUSTĐiều chỉnh thủ công ví sàn
ADMIN_LOGINAdmin đăng nhập (kèm IP)
ipAddress: Field đã có trong schema nhưng chưa được populate. Cần lấy từ request header (X-Forwarded-For hoặc req.ip) và ghi vào mọi audit log.
Admin UI: Trang /admin/activity hiện đã có — cần đảm bảo hiển thị đủ các action mới, có filter theo admin/action/thời gian.

Ví sàn (Platform Wallet) Đang thiết kế — chưa implement

Ví riêng của sàn theo dõi toàn bộ tiền sàn đang giữ. Mọi khoản thu/chi của sàn đều tạo một dòng lịch sử rõ ràng. Admin quản lý qua trang riêng.

Tại sao cần? Hiện tại phí thu từ user chỉ ghi là outflow khỏi ví user — không có ví thực để biết sàn đang giữ bao nhiêu, không thể điều chỉnh thủ công, không có lịch sử chi tiêu của sàn.
Schema DB
// Singleton — luôn 1 bản ghi duy nhất
PlatformWallet { id="singleton", balance, updatedAt }

PlatformLedger {
  direction: IN | OUT
  amount, balanceBefore, balanceAfter
  entryType  // "PLATFORM_FEE", "ADMIN_ADJUSTMENT", ...
  referenceType, referenceId
  description, createdByAdminId
}
API Admin
GET  /admin/platform-wallet
  → số dư + tổng IN/OUT theo kỳ

GET  /admin/platform-wallet/ledger
  → lịch sử (page, filter by type/date)

POST /admin/platform-wallet/adjust
  → điều chỉnh thủ công (SUPER/FINANCE)
Tiền VÀO ví sàn (IN)
Sự kiệnEntry Type (user)Phần sàn nhậnNơi gọi
Seller nộp phí tạo phiên AUCTION_FEE Toàn bộ amount wallet.service.chargeAuctionFee()
Thu phí sàn từ cọc winner PLATFORM_FEE Toàn bộ floorFeeCharged wallet.service.chargePlatformFeeFromDeposit()
Thu phí vượt sàn từ cọc winner ABOVE_FLOOR_FEE Toàn bộ aboveFloorFeeCharged wallet.service.chargeAboveFloorFeeFromDeposit()
Thu phí phát sinh từ cọc winner TRANSACTION_ADDITIONAL_FEE Toàn bộ additionalFeeCharged wallet.service.chargeAdditionalFeeFromDeposit()
Seller mua up top UPTOP_FEE Toàn bộ amount wallet.service.chargeUpTopFee()
Winner bỏ cọc (phần sàn) WINNER_DEPOSIT_FORFEIT amount × forfeitPlatformSharePercent% call site winner forfeit flow
Tịch thu cọc tham gia winner BIDDER_ENTRY_DEPOSIT_FORFEIT Toàn bộ (sàn giữ hết) call site winner forfeit flow
Tịch thu cọc seller vi phạm SELLER_DEPOSIT_FORFEIT Toàn bộ (sàn giữ hết) auctions.service seller cancel
Seller bị phạt hủy phiên LIVE CANCEL_PENALTY Toàn bộ (trả bidder sau) auctions.service seller cancel
Tiền RA khỏi ví sàn (OUT)
Sự kiệnEntry Type (user)Sàn trả raNơi gọi
Hoàn phí tạo phiên cho seller AUCTION_FEE_REFUND Toàn bộ amount wallet.service.refundAuctionFee()
Bồi thường bidder khi seller hủy LIVE CANCEL_PENALTY_INCOME Phần chia cho từng bidder auctions.service seller cancel
Admin duyệt payout cọc bị tịch thu FORFEITED_DEPOSIT_PAYOUT Phần của seller/winner (sau trừ platform share) admin.service.adminResolveForfeit()
Admin cộng tiền cho user (ADJUSTMENT +) ADJUSTMENT Toàn bộ amount cộng cho user Tự động khi admin gọi adjustUserBalance(+)
Tiền VÀO ví sàn bổ sung (từ ADJUSTMENT)
Sự kiệnEntry Type (user)Sàn nhậnNơi gọi
Admin trừ tiền của user (ADJUSTMENT −) ADJUSTMENT Toàn bộ amount trừ từ user Tự động khi admin gọi adjustUserBalance(−)
Số dư âm không được phép. Mọi debit phải kiểm tra balance >= amount trước khi thực hiện — nếu không đủ sẽ throw lỗi để admin xử lý.
Dữ liệu cũ: Balance bắt đầu từ 0 khi deploy feature — không backfill lịch sử trước đó.

DauSim Finance Map · Sinh từ source code · 29/04/2026