Using the WEBSOCKET connection, it is possible to:
Streampublic/RFQ quotes from the orderbook in realtime
Publish an RFQ requests (for market takers) to receive personalized quotes
Stream RFQ requests (for market makers) to subsequently provide personalize quotes
Authorize Websocket
Upon connection with the Websocket server, users must send an AUTH message with an api key. If this step is not done, any requests to Stream quotes or Publish RFQ requests will be denied.
Subscribing to quotes allows a user to stream real time quotes that are published to the orderbook along with any private quotes that may also be available from an RFQ request. By default, ALL public quotes are subscribed to upon authorization of a websocket connection. FILTER messages are required.
// Javascript Sample Codeconst { WebSocket } =require('ws')const { parseEther } =require("ethers");constwsUrl='test.quotes.premia.finance'constMOCK_API_KEY='3423ee2bfd89491f82b351404ea8c3b7'constauthMessage= { type:"AUTH", apiKey:MOCK_API_KEY, body:null}/*Optional params in body include:poolAddress -> specific option marketsize -> stringified 10^18 valueside -> 'bid' or 'ask'taker -> taker address (use if publishing RFQ and want to receive personal quotes)provider -> quote provider address */constfilterMessage= { type:'FILTER', channel:'QUOTES', body: { chainId:'421613', poolAddress:'0xeB785e131784ea28b6B64B605CF8aa83D69793b5' }}constws=newWebSocket(`wss://${wsUrl}`)functionconnectWebsocket() {ws.onopen= (event) => {console.log("Websocket connection open")ws.send(JSON.stringify(authMessage))ws.onmessage= (event) => {console.log(JSON.parse(event.data).message)sendMessage(filterMessage) } }}functionsendMessage(_message){ws.onmessage= (event) => {console.log(JSON.parse(event.data).message) }ws.send(JSON.stringify(_message))setTimeout(() => {console.log("Closing connection")ws.close() },1000)}connectWebsocket()
Publish RFQ Request(s)
If the desire is to send an RFQ request to receive personalized quotes, it must be done by sending an RFQ message type. Please note that in order to RECEIVE these personalized quotes via websocket, the FILTER message when subscribing to quotes must include the taker address. Alternatively, it is possible to use the get rfqQuotes REST API endpoint.
// Javascript Sample Codeconst { WebSocket } =require('ws')const { parseEther } =require("ethers");constwsUrl='test.quotes.premia.finance'// or quotes.premia.finance for prod environmentconstMOCK_API_KEY='3423ee2bfd89491f82b351404ea8c3b7'constauthMessage= { type:"AUTH", apiKey:MOCK_API_KEY, body:null}// All fields are requiredconstrfqPublishMessage= { type:'RFQ', body: { poolKey: { base:'0x7F5bc2250ea57d8ca932898297b1FF9aE1a04999' quote: '0x53421DB1f41368E028A4239954feB5033C7B3729' oracleAdapter: string// serialised bigint strike: parseEther('1700').toString()// make sure maturities either tomorrow, // the day after tomorrow, // each Friday of current month, // last Friday of each next month// 8:00 AM UTC maturity: 1702022400 isCallPool: boolean }, side:'ask', chainId:'421613',// or '42161' for prod environment size:parseEther('1').toString(), taker:'0x3D1dcc44D65C08b39029cA8673D705D7e5c4cFF2' }}constws=newWebSocket(`wss://${wsUrl}`)functionconnectWebsocket() {ws.onopen= (event) => {console.log("Websocket connection open")ws.send(JSON.stringify(authMessage))ws.onmessage= (event) => {console.log(JSON.parse(event.data).message)sendMessage(rfqPublishMessage) } }}functionsendMessage(_message){ws.onmessage= (event) => {console.log(JSON.parse(event.data).message) }ws.send(JSON.stringify(_message))setTimeout(() => {console.log("Closing connection")ws.close() },1000)}connectWebsocket()
Subscribe to RFQ Requests
As a market maker who would like to provide quotes to users who want to utilize RFQ, it will require subscribing to requests to be alerted when a request is made. In order to respond to an RFQ, market maker must publish quotes (via rest api), with the takerAddress populated with the requesters address, otherwise the quote is fillable by any party and will likely be missed by the requester who is listening for quotes with their address populated in the takerAddress field of a quote.