Trang này được dịch tự động. Bản gốc tiếng Anh là phiên bản chính thức. Đọc bằng tiếng Anh →
Chuyển đến nội dung chính

Bảo vệ nhà tạo lập thị trường (MMP)

Giới hạn khớp lệnh theo cửa sổ thời gian và cơ chế tự động hủy lệnh dành cho nhà tạo lập thị trường.

Mọi endpoint MMP theo phạm vi ví đều yêu cầu xác thực EIP-712. Các thao tác ghi cấu hình chấp nhận chủ sở hữu ví hoặc một agent được ủy quyền cho ví đó. Các thao tác đọc chỉ dành cho chủ sở hữu và từ chối chữ ký của agent được ủy quyền.

MMP áp dụng cho tài khoản giao dịch sở hữu các lệnh khớp. Đối với manager ký quỹ danh mục (portfolio margin), các thao tác đọc và ghi được ký bằng ví manager sẽ được ánh xạ tới tài khoản giao dịch Account.sol của nó, cũng chính là tài khoản mà việc đặt lệnh sử dụng. Phản hồi trả về tài khoản đó trong wallet_address, và chuỗi nonce MMP thuộc về tài khoản đó.

Để đảm bảo tính nhất quán đọc-sau-ghi, hãy gửi X-Hypercall-Fence-Wait: 1 với mọi thao tác thay đổi MMP. Khi đó phản hồi thành công sẽ bao gồm X-Hypercall-Fence; hãy gửi lại giá trị đó dưới dạng X-Hypercall-Fence trong yêu cầu GET đã xác thực. Các thao tác thay đổi không có header chờ tùy chọn này sẽ không trả về fence, đây là hành vi có chủ đích.

Tổng quan​

MMP bảo vệ nhà tạo lập thị trường khỏi các lệnh khớp bất lợi dồn dập bằng cách:

  1. Theo dõi các chỉ số khớp lệnh tích lũy trong một cửa sổ thời gian trượt
  2. Hủy lệnh khi vượt quá giới hạn
  3. Tự động hủy tất cả các lệnh bật MMP khác của cùng cặp ví + tài sản cơ sở

Cấu hình​

Thiết lập cấu hình MMP​

Endpoint: POST /mmp-config

Request: SetMmpConfigRequest

{
"wallet": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": "1000000",
"delta_limit": "10.0",
"vega_limit": "5.0",
"nonce": 1,
"signature": "0x..."
}

Các trường:

  • wallet: Địa chỉ ví
  • currency: Đồng tiền của tài sản cơ sở (ví dụ: "BTC", "ETH")
  • interval_ms: Độ dài cửa sổ trượt tính bằng mili giây
  • frozen_time_ms: Thời gian đóng băng sau khi kích hoạt (mili giây)
  • qty_limit: Giới hạn khối lượng tùy chọn (đơn vị hợp đồng), được tuần tự hóa dưới dạng chuỗi thập phân
  • delta_limit: Giới hạn delta tùy chọn, được tuần tự hóa dưới dạng chuỗi thập phân
  • vega_limit: Giới hạn vega tùy chọn, được tuần tự hóa dưới dạng chuỗi thập phân
  • nonce: Nonce chống phát lại, phải lớn hơn đúng một đơn vị so với nonce đã cam kết gần nhất được trả về từ thao tác đọc đã xác thực
  • signature: Chữ ký EIP-712 SetMmpConfig trên toàn bộ các trường của request

Response: ApiResponse<MmpConfigData>

Lấy cấu hình MMP​

Endpoint: GET /mmp-config?wallet=...&currency=...

Tham số truy vấn:

  • wallet (bắt buộc)
  • currency (bộ lọc tùy chọn)

Header bắt buộc:

  • X-Hypercall-Expires-At-Ms: Thời điểm hết hạn Unix tính bằng mili giây, không quá 60 giây trong tương lai
  • X-Hypercall-Signature: Chữ ký GetMmpConfig trên wallet, currency (chuỗi rỗng nếu bỏ qua) và thời điểm hết hạn trong header

Người ký được khôi phục phải là chủ sở hữu ví. Chữ ký của agent được ủy quyền không được chấp nhận cho thao tác đọc này.

Response: MmpConfigResponse

{
"success": true,
"data": [
{
"wallet_address": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": "1000000",
"delta_limit": "10.0",
"vega_limit": "5.0",
"enabled": true,
"nonce": 1
}
]
}

Xóa cấu hình MMP​

Endpoint: DELETE /mmp-config

Request: DeleteMmpConfigRequest

{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}

Response: ApiResponse<String>. Một lệnh thành công sẽ vô hiệu hóa trạng thái authority dạng số của cặp ví/tài sản cơ sở. Với header request X-Hypercall-Fence-Wait: 1, phản hồi sẽ bao gồm X-Hypercall-Fence cho thao tác đọc dựa trên projection.

Đặt lại trạng thái MMP​

Endpoint: POST /mmp-config/reset

Request: ResetMmpRequest

{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}

Response: ApiResponse<String>. Một lệnh thành công sẽ xóa cửa sổ khớp lệnh MMP và trạng thái đóng băng trong authority có thể phát lại. Với header request X-Hypercall-Fence-Wait: 1, phản hồi sẽ bao gồm X-Hypercall-Fence cho thao tác đọc dựa trên projection.

Hành vi của MMP (Cần hiểu rõ)​

Những lệnh khớp nào được tính​

Mọi lệnh khớp đều được tính vào cửa sổ MMP của mỗi bên có lệnh với mmp_enabled=true, bất kể lệnh đó đang nằm trên sổ lệnh (maker) hay là lệnh đến (taker):

  • Báo giá đang chờ: khi một lệnh đến giao dịch với lệnh đang chờ có bật MMP của bạn, lệnh khớp đó được cộng vào cửa sổ của bạn. Đây chính là trường hợp MMP được thiết kế để xử lý: một loạt lệnh khớp dồn dập vào báo giá của bạn sẽ kích hoạt MMP và hủy các báo giá bật MMP còn lại của bạn trên tài sản cơ sở đó.
  • Lệnh đến: một lệnh bật MMP lấy thanh khoản cũng tính các lệnh khớp của chính nó theo cách tương tự.
  • Lệnh combo và lệnh ngụ ý (implied): mỗi bên tham gia được bảo vệ trong một gói tính tất cả các chân mà nó giao dịch, được đánh giá một lần cho mỗi gói.
  • Các lệnh khớp RFQ và RPI hiện chưa được tính vào MMP. Tuy nhiên, trạng thái đóng băng MMP sẽ chặn các giao dịch RFQ mới đối với nhà cung cấp báo giá đang bị đóng băng.

Mỗi lệnh khớp được đo lường từ phía của chính bạn: một lệnh khớp bán call sẽ cộng delta âm vào cửa sổ của người bán và delta dương vào cửa sổ của người mua.

Nếu một lệnh có mmp_enabled=true nhưng ví của nó chưa có cấu hình MMP cho tài sản cơ sở đó, MMP sẽ đóng theo hướng an toàn (fail closed): lệnh khớp đầu tiên sẽ kích hoạt và hủy các lệnh bật MMP của ví đó trên tài sản cơ sở. Hãy cấu hình MMP trước khi gắn cờ cho lệnh.

Thứ tự xử lý lệnh khớp​

MMP được đánh giá SAU KHI KHỚP:

  1. Engine khớp lệnh và chấp nhận lệnh khớp trước
  2. Sau đó MMP kiểm tra các chỉ số tích lũy cho từng bên được bảo vệ của lệnh khớp
  3. Nếu giới hạn của một bên bị vượt quá:
    • MMP được kích hoạt cho ví và tài sản cơ sở của bên đó
    • Engine phát sự kiện MmpTriggered
    • Engine tự động hủy tất cả lệnh mở bật MMP của cặp ví + tài sản cơ sở đó
    • Nếu bên vượt ngưỡng là lệnh đến, phần khối lượng còn lại của nó dừng lại và lệnh chuyển sang CANCELED với lý do "MMP triggered during fill processing"
    • Nếu bên vượt ngưỡng là maker đang chờ, lệnh đến tiếp tục khớp với thanh khoản khác; các báo giá bật MMP khác của maker đã bị hủy

Hệ quả: Bạn có thể nhận các lệnh khớp đẩy bạn vượt quá ngưỡng đã cấu hình trước khi MMP được kích hoạt.

Điều kiện kích hoạt​

MMP được kích hoạt nếu bất kỳ giới hạn nào đã cấu hình bị vượt quá:

  • Giới hạn khối lượng: cumulative_qty > qty_limit
  • Giới hạn delta: |cumulative_delta| > delta_limit
  • Giới hạn vega: |cumulative_vega| > vega_limit

Các chỉ số tích lũy được tính trong cửa sổ trượt (interval_ms).

Hành vi hủy lệnh​

Khi MMP được kích hoạt:

  1. Lệnh đến gây kích hoạt: phần khối lượng còn lại dừng lại, lệnh chuyển sang CANCELED với lý do "MMP triggered during fill processing"
  2. Lệnh đang chờ gây kích hoạt: lệnh khớp vẫn có hiệu lực; phần còn lại của lệnh (nếu có) bị hủy cùng với các lệnh bật MMP khác
  3. Các lệnh khác: Tất cả lệnh mở bật MMP của cùng cặp ví + tài sản cơ sở được tự động hủy với lý do "Order canceled by MMP trigger"

Lưu ý: Chỉ các lệnh bật MMP mới bị hủy. Các lệnh có mmp_enabled=false không bị ảnh hưởng.

Hành vi đóng băng​

Sau khi MMP được kích hoạt:

  • Ví và tài sản cơ sở bị đóng băng trong frozen_time_ms mili giây
  • Trong thời gian đóng băng, ví bị loại khỏi các phiên đấu giá RPI và RFQ trên tài sản cơ sở đó, và các giao dịch combo hoặc implied có thể khớp với ví này sẽ bị từ chối
  • Một lệnh khớp outright trên lệnh bật MMP trong thời gian đóng băng vẫn có hiệu lực, sau đó lại kích hoạt MMP và hủy các lệnh bật MMP của ví đó trên tài sản cơ sở
  • POST /mmp-config/reset kết thúc trạng thái đóng băng sớm

Cách tính chỉ số khớp lệnh​

Khối lượng​

  • Nguồn: size của lệnh khớp (đơn vị hợp đồng)
  • Tích lũy: Tổng của tất cả lệnh khớp trong cửa sổ trượt

Delta​

  • Nguồn: Tính từ symbol của lệnh khớp và GreeksCache
  • Tích lũy: Tổng delta của tất cả lệnh khớp trong cửa sổ trượt

Vega​

  • Nguồn: Tính từ symbol của lệnh khớp và GreeksCache
  • Tích lũy: Tổng vega của tất cả lệnh khớp trong cửa sổ trượt

Cửa sổ trượt​

Loại bỏ khỏi cửa sổ​

Các lệnh khớp cũ hơn interval_ms sẽ tự động bị loại khỏi cửa sổ:

  • Việc loại bỏ chạy khi lệnh khớp tiếp theo được xử lý, trước khi lệnh khớp mới được thêm vào
  • Các chỉ số tích lũy được trừ đi khi các lệnh khớp cũ bị loại bỏ

Đặt lại cửa sổ​

Đặt lại trạng thái MMP qua POST /mmp-config/reset:

  • Xóa tất cả lệnh khớp trong cửa sổ
  • Đặt các chỉ số tích lũy về 0
  • Gỡ đóng băng cho đồng tiền

Sự kiện MMP​

Sự kiện MmpTriggered​

Sự kiện nội bộ (hiện chưa được chuyển tiếp tới client WS):

MmpTriggeredMessage {
wallet: WalletAddress,
currency: String,
reason: String, // "MMP triggered during fill processing" | "MMP triggered by a resting order fill"
timestamp: u64,
}

Thực hành tốt nhất​

Cấu hình​

  1. Đặt giới hạn phù hợp: Dựa trên khẩu vị rủi ro và quy mô lệnh khớp thông thường của bạn
  2. Dùng cấu hình theo từng đồng tiền: Cấu hình riêng cho từng tài sản cơ sở (BTC, ETH, v.v.)
  3. Theo dõi các lần kích hoạt MMP: Tần suất kích hoạt cao có thể cho thấy giới hạn bị cấu hình sai hoặc điều kiện thị trường bất lợi

Quản lý lệnh​

  1. Bật MMP có chọn lọc: Chỉ đặt mmp_enabled=true cho những lệnh bạn muốn bảo vệ
  2. Dùng đồng tiền nhất quán: Đảm bảo mọi lệnh cho cùng một tài sản cơ sở dùng cùng đồng tiền trong cấu hình MMP
  3. Xử lý các lệnh hủy do MMP: Triển khai logic để phát hiện các lệnh hủy do MMP kích hoạt và điều chỉnh báo giá

Giám sát​

  1. Theo dõi các lần kích hoạt MMP: Giám sát các lý do "MMP triggered during fill processing" và "Order canceled by MMP trigger"
  2. Xem xét cửa sổ khớp lệnh: Các chỉ số cửa sổ tích lũy hiện chưa được cung cấp qua API; hãy tự theo dõi các lệnh khớp của bạn theo từng tài sản cơ sở
  3. Điều chỉnh giới hạn: Nếu MMP kích hoạt quá thường xuyên, hãy tăng giới hạn; nếu quá hiếm, hãy giảm giới hạn

Các vấn đề thường gặp​

MMP kích hoạt quá thường xuyên​

Nguyên nhân:

  • Giới hạn quá thấp so với quy mô lệnh khớp thông thường
  • Điều kiện thị trường bất lợi
  • Báo giá nhanh dẫn đến nhiều lệnh khớp

Giải pháp:

  • Tăng qty_limit, delta_limit hoặc vega_limit
  • Tăng interval_ms để cho phép nhiều lệnh khớp hơn trong cửa sổ
  • Giảm tần suất báo giá

MMP không kích hoạt​

Nguyên nhân:

  • Giới hạn quá cao
  • MMP chưa được bật trên lệnh (mmp_enabled=false)
  • Đồng tiền không khớp (đồng tiền trong cấu hình MMP != tài sản cơ sở của lệnh)

Giải pháp:

  • Giảm giới hạn
  • Kiểm tra mmp_enabled=true trên các lệnh
  • Kiểm tra đồng tiền trong cấu hình MMP khớp với tài sản cơ sở của lệnh

Lệnh bị hủy ngoài dự kiến​

Triệu chứng: Lệnh bị hủy với lý do "Order canceled by MMP trigger" nhưng bạn không lường trước.

Nguyên nhân: Một lệnh khác của cùng cặp ví + tài sản cơ sở đã kích hoạt MMP.

Giải pháp: Khi MMP kích hoạt, hãy xem xét tất cả các lệnh bật MMP cho cùng tài sản cơ sở.