Monaco Protocol SDK v0.8.20
This release improves cross-margin order placement, hardens fee simulation accuracy, and fixes three correctness bugs: stale balances after spot fills, collateral not freed after a downward order replace, and an incorrect error code on unauthorized sub-account spending-limit reads.Changed
Cross margin auto-resolved on order placement
POST /api/v1/orders and POST /api/v1/orders/batch-create with marginMode: "CROSS" now automatically provision or expand the cross risk bucket without any extra setup step:
- No active cross bucket — the API resolves the deterministic cross risk bucket, estimates the required order collateral, and forwards the bucket and collateral amount to matching-engine admission automatically.
- Active cross bucket missing the requested pair — the API adds the
tradingPairIdto the cross bucket’s scope before forwarding the order.
marginMode: "ISOLATED" flows and cross orders placed against a fully-configured bucket are unaffected.
Sub-account spending limit unauthorized read returns 404
GET /api/v1/accounts/sub-accounts/{subAccountId}/limits now returns 404 Not Found (gRPC NOT_FOUND) when the sub-account belongs to a different master, instead of 403 Forbidden (PERMISSION_DENIED). This matches the behavior of the create, update, and delete limit RPCs and makes an unauthorized read indistinguishable from a nonexistent sub-account. No request or response fields changed.
Fixed
balances WebSocket missing spot-fill updates
sdk.ws.balances() (WebSocket channel balances) now emits a trade-reason balance update to both the maker and taker when a spot order fills. Previously the channel only pushed updates on deposits, withdrawals, and collateral transfers, so live balance state went stale after spot trading. No subscription or message-shape changes; the update now arrives where it was already documented to arrive.
simulateFees used flat fee rate instead of your tier rate
sdk.trading.simulateFees now quotes your tier-resolved taker fee — the rate the ledger actually debits — instead of the trading pair’s flat fee column. The affected response fields are monacoTakerFee, totalTakerFees, and takerTotalPayment. If your account is on a tier whose rate exceeds the flat column the estimate was previously under-quoted; no request or response fields changed.
Isolated margin replace to lower notional left collateral stale
Replacing an isolated margin order with a lower notional now immediately returns the freed collateral delta to the parent account. The following reads now reflect the correctfreeCollateral right after the replace:
sdk.marginAccounts.getMarginAccountSummarysdk.marginAccounts.getParentMarginAccountSummarysdk.marginAccounts.getAvailableCollateral
freeCollateral stayed at its pre-replace value until the order was eventually cancelled or filled.

