serum-machine v0.1.3
Serum Machine
Real-time market data API server for Serum DEX
Architecture

- server runs with multiple
Minionsworker threads* and singleSerum Producerthat runs in the main thread Minionsare responsible for WebSockets subscriptions management that includes handling subscriptions requests and sending data to all connected clientsSerum Produceris responsible for connecting to Serum Node RPC WS API and subscribing all relevant accounts changes (event & request queue, bids & asks) for all supported markets as well as producing market data messages that are then passed to minions and published as WebSocket messages to all subscribed clients
* multi core support via worker_threads is linux only feature which allows multiple threads to bind to the same port, see https://github.com/uNetworking/uWebSockets.js/issues/304 and https://lwn.net/Articles/542629/ - for other OSes there's only one worker thread running
Installation options
npx (requires Node.js >= 12 installed on host machine)
That will start Serum Machine server running on port
8000npx serum-machineIf you'd like to switch to different Serum Node endpoint, change port or run with debug logs enabled, just add one of the available CLI options:
npx serum-machine --endpoint https://solana-api.projectserum.com --debug --port 8080Run
npx serum-machine --helpto see all available startup options (node endpoint url, port etc.)npm (requires Node.js >= 12 installed on host machine)
Installs
serum-machineglobally and runs it on port8000.npm install -g serum-machine serum-machineIf you'd like to switch to different Serum Node endpoint, change port or run with debug logs enabled, just add one of the available CLI options:
serum-machine --endpoint https://solana-api.projectserum.com --debug --port 8080Run
serum-machine --helpto see all available startup options (node endpoint url, port etc.)Docker
Pulls and runs latest version of
tardisdev/serum-machineimage. Serum Matchine server will available on host via8000port (for example http://localhost:8000/v1/markets) with debug logs enabled (TM_DEBUGenv var).docker run -p 8000:8000 -e "SM_ENDPOINT=https://solana-api.projectserum.com" -e "SM_DEBUG=true" -d tardisdev/serum-machine:latest
WebSocket /streams endpoint
Allows subscribing to Serum DEX real-market data streams.
const ws = new WebSocket('ws://localhost:8000/v1/streams')
ws.onmessage = (message) => {
console.log(message)
}
ws.onopen = () => {
const subscribePayload = {
op: 'subscribe',
channel: 'trades',
markets: ['BTC/USDT', 'SRM/USDT']
}
ws.send(JSON.stringify(subscribePayload))
}HTTP endpoints
/markets
Accepts no params and returns supported Serum markets.
Sample request & response
http://localhost:8000/v1/markets
[
{
"name": "ALEPH/USDT",
"address": "EmCzMQfXMgNHcnRoFwAdPe1i2SuiSzMj1mx6wu3KN2uA",
"programId": "4ckmDgGdxQoPDLUkDT3vHgSAkzA3QRdNq5ywwY4sUSJn",
"deprecated": false
},
{
"name": "ALEPH/USDC",
"address": "B37pZmwrwXHjpgvd9hHDAx1yeDsNevTnbbrN9W12BoGK",
"programId": "4ckmDgGdxQoPDLUkDT3vHgSAkzA3QRdNq5ywwY4sUSJn",
"deprecated": false
},
{
"name": "BTC/USDT",
"address": "8AcVjMG2LTbpkjNoyq8RwysokqZunkjy3d5JDzxC6BJa",
"programId": "4ckmDgGdxQoPDLUkDT3vHgSAkzA3QRdNq5ywwY4sUSJn",
"deprecated": false
}
]