edaf874174
* ts: get yarn lock from dev Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * v0.19.20 * ts: add missing dependency Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * ts: add error when no free token position is found (#707) Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Mc/tcs improvements (#706) * ts: additional tcs helpers Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Fixes from review Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Revert "Fixes from review" This reverts commit 1def10353511802c030a100fd23b2c2f4f198eaa. --------- Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * v0.19.21 * v0.19.22 * ts: tcs fix price display input to tx Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * v0.19.23 * v0.19.25 * script: log all Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * ts: fix tcs order price limits Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * v0.19.27 * ts: fix getTimeToNextBorrowLimitWindowStartsTs (#710) * ts: fix getTimeToNextBorrowLimitWindowStartsTs Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Fixes from review Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> --------- Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Mc/keeper (#714) * v0.19.28 * ts: tokenWithdrawAllDepositForMint Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Fix Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Fix Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * rust: dont include tokens with errors in crank Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * Fixes from review Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * review fixes * Fixes from review Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> --------- Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> Co-authored-by: Christian Kamm <mail@ckamm.de> * v0.19.29 * ts: update debug script Signed-off-by: microwavedcola1 <microwavedcola@gmail.com> * release 19.1 -> deploy + serum3 open orders estimation ts patch (#719) * Serum3 open orders: Fix health overestimation (#716) When bids or asks crossed the oracle price, the serum3 health would be overestimated before. The health code has no access to the open order quantites or prices and used to assume all orders are at oracle price. Now we track an account's max bid and min ask in each market and use that as a worst-case price. The tracking isn't perfect for technical reasons (compute cost, no notifications on fill) but produces an upper bound on bids (lower bound on asks) that is sufficient to make health not overestimate. The tracked price is reset every time the serum3 open orders on a book side are completely cleared. (cherry picked from commit |
||
---|---|---|
.. | ||
conf | ||
src | ||
Cargo.toml | ||
README.md |
README.md
service-mango-orderbook
This module parses bookside accounts and exposes L2 and L3 data and updates on a websocket
Public API: https://api.mngo.cloud/orderbook/v1/
API Reference
Get a list of markets
{
"command": "getMarkets"
}
{
"ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2": "SOL-PERP",
"HwhVGkfsSQ9JSQeQYu2CbkRCLvsh3qRZxG6m4oMVwZpN": "BTC-PERP",
"Fgh9JSZ2qfSjCw9RPJ85W2xbihsp2muLvfRztzoVR7f1": "ETH-PERP",
}
L2 Data
Subscribe to L2 updates
{
"command": "subscribe",
"marketId": "MARKET_PUBKEY",
"subscriptionType": "level",
}
{
"success": true,
"message": "subscribed to level updates for MARKET_PUBKEY"
}
L2 Checkpoint - Sent upon initial subscription
{
"market": "ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2",
"bids":
[22.17, 8.86],
[22.15, 88.59],
],
"asks": [
[22.19, 9.17],
[22.21, 91.7],
],
"slot": 190826373,
"write_version": 688377208758
}
L2 Update - Sent per side
{
"market": "ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2",
"bids": // or asks
[22.18, 6], // new level added
[22.17, 1], // level changed
[22.15, 0], // level removed
],
"slot": 190826375,
"write_version": 688377208759
}
L3 Data
Subscribe to L3 updates
⚠️ If the subscribed market is a perp market, ownerPubkey
corresponds to a mangoAccount
, if the subscribed market is a spot market, ownerPubkey
corresponds to an open orders account.
{
"command": "subscribe",
"marketId": "MARKET_PUBKEY",
"subscriptionType": "book",
}
{
"success": true,
"message": "subscribed to book updates for MARKET_PUBKEY"
}
L3 Checkpoint - Sent upon initial subscription
{
"market": "ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2",
"bids": [
{
"price": 20.81,
"quantity": 1.3,
"ownerPubkey": "F1SZxEDxxCSLVjEBbMEjDYqajWRJQRCZBwPQnmcVvTLV"
},
{
"price": 20.81,
"quantity": 62.22,
"ownerPubkey": "BGYWnqfaauCeebFQXEfYuDCktiVG8pqpprrsD4qfqL53"
},
{
"price": 20.8,
"quantity": 8,
"ownerPubkey": "CtHuPg2ctVVV7nqmvVEcMtcWyJAgtZw9YcNHFQidjPgF"
}
],
"asks": [
{
"price": 20.94,
"quantity": 62.22,
"ownerPubkey": "BGYWnqfaauCeebFQXEfYuDCktiVG8pqpprrsD4qfqL53"
},
{
"price": 20.95,
"quantity": 1.3,
"ownerPubkey": "F1SZxEDxxCSLVjEBbMEjDYqajWRJQRCZBwPQnmcVvTLV"
},
{
"price": 21.31,
"quantity": 30,
"ownerPubkey": "5gHsqmFsMaguM3HMyEmnME4NMQKj6NrJWUGv6VKnc2Hk"
}
],
"slot": 190826373,
"write_version": 688377208758
}
L3 Update - Sent per side
{
"market": "ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2",
"side": "ask",
"additions": [
{
"price": 20.92,
"quantity": 61.93,
"ownerPubkey": "BGYWnqfaauCeebFQXEfYuDCktiVG8pqpprrsD4qfqL53"
}
],
"removals": [
{
"price": 20.92,
"quantity": 61.910000000000004,
"ownerPubkey": "BGYWnqfaauCeebFQXEfYuDCktiVG8pqpprrsD4qfqL53"
}
],
"slot": 197077534,
"write_version": 727782187614
}
Setup
Local
-
Prepare the connector configuration file.
bind_ws_addr
is the listen port for the websocket clientsrpc_ws_url
is unused and can stay empty.connection_string
for yourgrpc_sources
must point to the gRPC server address configured for the plugin.rpc_http_url
must point to the JSON-RPC URL.program_id
must match what is configured for the gRPC plugin
-
Start the service binary.
Pass the path to the config file as the first argument. It logs to stdout. It should be restarted on exit.
-
Monitor the logs
WARN
messages can be recovered from.ERROR
messages need attention. The logs are very spammy changing the default log level is recommended when you dont want to analyze performance of the service.