Mọi tài sản đều vay được và thế chấp được
Bỏ giới hạn cũ: USD gửi và vay được nhưng không tính là tài sản đảm bảo, ETH/BTC là tài sản đảm bảo nhưng không vay ra được. Sau MR này cả sáu quỹ — USD, USDT, USDC, DAI, ETH, BTC — vừa vay được vừa thế chấp được. DAI là stablecoin thứ ba, cùng lớp rủi ro và đường cong lãi với USDT/USDC.
Spec: docs/superpowers/specs/2026-09-16-lending-universal-collateral-design.md (gitignored; bản sao ở ~/.claude-backups/moanapay-superpowers/specs/).
Thay đổi
| Commit | Nội dung |
|---|---|
7a0b8069 |
Migration 1789600000000: bật cả hai cờ trên sáu market, seed market DAI + rate model + risk params + price symbol. down() từ chối khi có tài khoản đang dựa vào USD làm thế chấp — hạ cờ lúc đó là haircut 100% và tạo candidate thanh lý ngay |
6155ff4d |
Admin API thôi từ chối collateralEnabled: true trên rail FIAT; cả hai cờ mặc định bật ở mọi rail; xoá mã lỗi MARKET_FIAT_COLLATERAL_NOT_ALLOWED
|
697b5e5e |
Spec migration bọc fixture trong transaction rollback thay vì sửa rồi khôi phục dữ liệu thật |
78371146 |
Health scan định giá market FIAT = 1 qua hằng FIAT_UNIT_PRICE dùng chung, nên người gửi USD không còn rơi vào đường chậm mỗi 5 phút |
20768b49 |
Viết lại liquidationPriceFor: giải cho X ở cả hai vế vì X giờ vừa là thế chấp vừa là nợ. Bỏ kill-switch cũ — nó sẽ tắt cột "Giá thanh lý" của toàn bộ khách ngay khi ETH/BTC vay được |
371d77d9 |
Test Postgres: thế chấp USD, nợ ETH, nhà ứng ETH từ kho crypto, tịch thu USD. Không sửa một dòng code production nào — đây là bằng chứng cho khẳng định J5b/J6 độc lập với rail |
1a9a4156 |
FE: icon và tên DAI; sửa các comment viện dẫn luật đã bỏ |
d847cb9b |
Seed debt_dust và max_repay_residual_forgive cho DAI — thiếu thì nợ lẻ DAI không bao giờ được xoá và trả MAX không về được 0 |
69fe2df8 |
Quét nốt tám comment còn viện dẫn "USD không phải tài sản đảm bảo" |
0f78b999 |
Sửa docblock và mô tả Swagger của liquidationPrice cho đúng tập giá trị null mới |
b5d30c98 |
down() giờ cũng chặn khi có lệnh BORROW đang bay chưa ghi sổ — trước đó borrow_principal vẫn bằng 0 nên rollback lọt, rồi transfer settle là tài khoản bị thanh lý ngay |
Không nằm trong MR này
-
PRD chưa commit.
PRD-ahad-loans-money-market.mdđã sửa trong working tree (bảng sáu quỹ, bảng risk, mục "không làm", §8) nhưng cố ý không đưa vào commit vì file đang mang sửa đổi chưa commit của chính tác giả. -
DAI vẫn FROZEN trên staging cho tới khi thêm feed Chainlink + custody asset Fireblocks vào
.env, recreate container và chạy preflight. -
BTC vẫn FROZEN — thiếu dòng Bitcoin Testnet trong
fireblocks_supported_blockchains. - USDT vẫn ẩn trên staging vì Sepolia không có feed Chainlink USDT/USD. Trên mainnet có.
Đã qua hai cổng review
Review toàn nhánh (Opus) ra 4 finding, đã sửa và re-review xác nhận đóng hết. Codex (Sol) ra 4 finding: 3 đã sửa, 1 không thuộc nhánh này (xem dưới).
Hai điều reviewer kiểm chéo và xác nhận sạch, đáng ghi lại vì đó là rủi ro lớn nhất của thay đổi này: không còn chỗ nào trong module lending giả định nợ là stablecoin, và không chỗ nào giả định tài sản tịch thu luôn là crypto.
Kiểm thử
- Unit BE: 132/132 (
lending-account-summary,risk.service,admin-lending.controller). - Postgres: migration 6/6;
liquidation-fiat6/6;margin-callsuite xanh trừ một test đỏ có sẵn trên develop. - FE: 190/190, lint và type-check sạch.
- Mọi test mới đều được mutation-check: sửa hỏng một dòng, xem nó đỏ đúng chỗ, hoàn lại.
Hai lỗi có sẵn trên develop, không thuộc MR này
-
admin-lending.risk.spec.tsđỏ 72 test vì lỗi DI của NestJS. Constructor và file spec đều không bị nhánh này đụng tới..gitlab-ci.ymlkhông có stage test nên không ai bắt được. - Một test trong
margin-call.postgres.spec.tsđếm số người vay trên toàn database dùng chung nên đỏ khi DB local có dữ liệu thật.