Code Monkey home page Code Monkey logo

serum-vial's People

Contributors

thaaddeus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

serum-vial's Issues

level2 channel implementation

  • initial l2snapshot for requested markets
  • l2update messages with changes only (deltas)
  • publishes match messages with trades as well

Unhandled exception in serum producer worker

Since yesterday met the following exceptions:

2021-11-24T20:24:32.564Z error: Serum producer worker 10 error occurred: The user aborted a request. undefined
Uncaught Exception thrown { type: 'aborted', message: 'The user aborted a request.' }

take a look at market, it seems that each time it is a different market. looks like the error is from client side.

Trade Id

Hi

qq - I'm in the situation where I need both a tradeId field and fee information on trade events but there doesn't appear to be a message with contains both. Is there anything the prevents the L3 fill event having the tradeId or L2 trade event having fee information?

Thanks

Snapshot Ordering Issue

Hi @thaaddeus , have just run into a strange problem which only occurred in this one case when processing data for SOL/USDC on 20220620; the time ordered sequence of events is given below:

2022-06-20T19:06:45.209Z: open message for order 631339815922709507324380 180.0 @ 34.225, slot 138327374

2022-06-20T19:06:52.228Z: fill message for order 631339815922709507324380, traded for 83.7 against order 340282366920938463463374607431664944666, slot 138327386

2022-06-20T19:06:59.126Z: An orderbook snapshot is written to recover some issue in the data; however, the slot associated with this update is 138327272 - this implies to me that it should be processed before handling the above open and fill, since related to an earlier block. In previous experiments it was found to be necessary to ignore the timestamp on snapshots and order messages by the slot for processing - however...

2022-06-20T19:07:01.134Z: Another open message for order 631339815922709507324380, now for [email protected], slot 138327402

2022-06-20T19:07:01.134Z: A duplicate of the fill messages for order 631339815922709507324380, traded for 83.7 against order 340282366920938463463374607431664944666, slot 138327402

2022-06-20T19:07:01.134Z: done message for 631339815922709507324380 (reason = filled), as expected based on the second set of messages

Need then to confirm the correct way to order the messages when processing historically; currently ordering by slot and then by the order in which the messages were received, which has worked well in all other dates, but the above suggests that, at least for snapshots, the slot may not always be sufficient for sorting the messages, and timestamp may need to be considered... any advice would be appreciated.

This recording was using v1.6.1, I do note that 1.7.0 is now available and will update, but since this has only occurred once since starting to record I won't be able to say whether the issue is resolved by the update - if the update is expected to fix this, please let me know.

mint not found Error: mint not found

Hello,

after the basic installation via
npx serum-vial
or

npm install -g serum-vial
serum-vial

i get the Error Serum producer worker 12 error occurred: mint not found Error: mint not found

Here the full output:

2022-06-11T05:53:26.744Z info: Starting serum-vial server with options {"port":8000,"nodeEndpoint":"https://solana-api.projectserum.com","minionsCount":1,"commitment":"confirmed","bootDelay":500}
2022-06-11T05:53:26.746Z info: Starting single minion worker...
2022-06-11T05:53:27.286Z info: Listening on port 8000 {"minionId":1}
2022-06-11T05:53:27.390Z info: Starting serum producers for 140 markets, rpc endpoint: https://solana-api.projectserum.com
2022-06-11T05:53:27.870Z info: Serum producer starting for soALEPH/USDC market...
2022-06-11T05:53:28.336Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soALEPH/USDC","commitment":"confirmed"}
2022-06-11T05:53:28.435Z info: Serum producer starting for BTC/USDC market...
2022-06-11T05:53:28.755Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"BTC/USDC","commitment":"confirmed"}
2022-06-11T05:53:28.908Z info: Serum producer starting for soETH/USDC market...
2022-06-11T05:53:28.979Z info: Established new RPC WebSocket connection... {"market":"soALEPH/USDC"}
2022-06-11T05:53:28.979Z info: Serum producer started for soALEPH/USDC market...
2022-06-11T05:53:29.259Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soETH/USDC","commitment":"confirmed"}
2022-06-11T05:53:29.375Z info: Established new RPC WebSocket connection... {"market":"BTC/USDC"}
2022-06-11T05:53:29.375Z info: Serum producer started for BTC/USDC market...
2022-06-11T05:53:29.511Z info: Serum producer starting for SRM/USDC market...
2022-06-11T05:53:29.872Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"SRM/USDC","commitment":"confirmed"}
2022-06-11T05:53:29.896Z info: Established new RPC WebSocket connection... {"market":"soETH/USDC"}
2022-06-11T05:53:29.896Z info: Serum producer started for soETH/USDC market...
2022-06-11T05:53:29.987Z info: Serum producer starting for soSUSHI/USDC market...
2022-06-11T05:53:30.306Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soSUSHI/USDC","commitment":"confirmed"}
2022-06-11T05:53:30.514Z info: Established new RPC WebSocket connection... {"market":"SRM/USDC"}
2022-06-11T05:53:30.514Z info: Serum producer starting for soSXP/USDC market...
2022-06-11T05:53:30.514Z info: Serum producer started for SRM/USDC market...
2022-06-11T05:53:30.842Z info: Established new RPC WebSocket connection... {"market":"soSUSHI/USDC"}
2022-06-11T05:53:30.842Z info: Serum producer started for soSUSHI/USDC market...
2022-06-11T05:53:30.876Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soSXP/USDC","commitment":"confirmed"}
2022-06-11T05:53:31.037Z info: Serum producer starting for MSRM/USDC market...
2022-06-11T05:53:31.378Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"MSRM/USDC","commitment":"confirmed"}
2022-06-11T05:53:31.485Z info: Established new RPC WebSocket connection... {"market":"soSXP/USDC"}
2022-06-11T05:53:31.485Z info: Serum producer started for soSXP/USDC market...
2022-06-11T05:53:31.531Z info: Serum producer starting for soFTT/USDC market...
2022-06-11T05:53:31.907Z info: Established new RPC WebSocket connection... {"market":"MSRM/USDC"}
2022-06-11T05:53:31.907Z info: Serum producer started for MSRM/USDC market...
2022-06-11T05:53:31.974Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soFTT/USDC","commitment":"confirmed"}
2022-06-11T05:53:32.045Z info: Serum producer starting for soYFI/USDC market...
2022-06-11T05:53:32.617Z info: Serum producer starting for soLINK/USDC market...
2022-06-11T05:53:32.789Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soYFI/USDC","commitment":"confirmed"}
2022-06-11T05:53:33.171Z info: Serum producer starting for soHGET/USDC market...
2022-06-11T05:53:33.182Z info: Established new RPC WebSocket connection... {"market":"soFTT/USDC"}
2022-06-11T05:53:33.183Z info: Serum producer started for soFTT/USDC market...
2022-06-11T05:53:33.297Z info: Starting RPC client {"nodeWsEndpoint":"wss://solana-api.projectserum.com/","nodeRestEndpoint":"https://solana-api.projectserum.com","marketName":"soLINK/USDC","commitment":"confirmed"}
2022-06-11T05:53:33.678Z info: Serum producer starting for soCREAM/USDC market...
2022-06-11T05:53:33.921Z info: Established new RPC WebSocket connection... {"market":"soYFI/USDC"}
2022-06-11T05:53:33.922Z info: Serum producer started for soYFI/USDC market...
2022-06-11T05:53:33.972Z error: Serum producer worker 12 error occurred: mint not found Error: mint not found
    at throwIfNull (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:1078:15)
    at getMintDecimals (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:1048:22)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Promise.all (index 0)
    at async Function.load (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:143:55)
    at async SerumProducer.run (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\dist\serum_producer.js:36:24)
Uncaught Exception thrown Error: mint not found
    at throwIfNull (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:1078:15)
    at getMintDecimals (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:1048:22)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Promise.all (index 0)
    at async Function.load (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\node_modules\@project-serum\serum\lib\market.js:143:55)
    at async SerumProducer.run (C:\Users\user\AppData\Roaming\npm\node_modules\serum-vial\dist\serum_producer.js:36:24)

Partial Fills w/ Cancellation & Immediate Maker Fills

Hi @thaaddeus, a couple of other possible issues in the message progression which have been encountered:

  1. Quite regularly observe situation where an order is opened, fill messages are received for a part of the order size, and then a done message with reason=filled is received - suspect that these are orders which are partially filled and then cancelled, and so should be flagged as reason=canceled?

  2. There are also regular cases where a fill message is received with maker=true, but no open message for the order has previously been generated. I expect that here the order is opened and immediately filled in full or in part on the same update; I would expect this scenario to produce both an open and a fill for the order (since it doesn't make sense to have a maker fill for an order that hasn't been opened on the book).

Let me know if you need any other info.
Thanks!

Serum producer worker 31 error occurred

Getting this crash with version 1.4.10, node/v16.0.0, using an RPCPool endpoint. Was running fine for a few hours before this:

2021-12-21T18:54:28.116Z info: Established new RPC WebSocket connection... {"market":"HGET/USDC"}
2021-12-21T18:54:28.213Z info: Established new RPC WebSocket connection... {"market":"DXL/USDC"}
2021-12-21T18:54:28.228Z info: Established new RPC WebSocket connection... {"market":"MNGO/USDC"}
2021-12-21T18:54:28.262Z info: Established new RPC WebSocket connection... {"market":"KIN/USDC"}
2021-12-21T18:54:28.263Z info: Established new RPC WebSocket connection... {"market":"ALEPH/USDC"}
2021-12-21T18:54:28.469Z info: Established new RPC WebSocket connection... {"market":"MSOL/USDC"}
2021-12-21T18:54:28.536Z error: Serum producer worker 31 error occurred: _subscribeToAccountsNotifications WS closed Error: _subscribeToAccountsNotifications WS closed
at AccountsChangeNotifications._subscribeToAccountsNotifications (/Users/tnugent/.nvm/versions/node/v16.0.0/lib/node_modules/serum-vial/dist/rpc_client.js:331:23)
at WebSocket.ws.onopen (/Users/tnugent/.nvm/versions/node/v16.0.0/lib/node_modules/serum-vial/dist/rpc_client.js:191:18)
at runMicrotasks ()
at processTicksAndRejections (node:internal/process/task_queues:96:5)
Uncaught Exception thrown Error: _subscribeToAccountsNotifications WS closed
at AccountsChangeNotifications._subscribeToAccountsNotifications (/Users/tnugent/.nvm/versions/node/v16.0.0/lib/node_modules/serum-vial/dist/rpc_client.js:331:23)
at WebSocket.ws.onopen (/Users/tnugent/.nvm/versions/node/v16.0.0/lib/node_modules/serum-vial/dist/rpc_client.js:191:18)
at runMicrotasks ()
at processTicksAndRejections (node:internal/process/task_queues:96:5)
FATAL ERROR: v8::HandleScope::CreateHandle() Cannot create a handle without a HandleScope
1: 0x10d988ee5 node::Abort() (.cold.1) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
2: 0x10c63edc9 node::Abort() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
3: 0x10c63ef2f node::OnFatalError(char const*, char const*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
4: 0x10c7bb1be v8::Utils::ReportApiFailure(char const*, char const*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
5: 0x10c94f9b2 v8::internal::HandleScope::Extend(v8::internal::Isolate*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
6: 0x10c9674d8 v8::internal::FactoryBasev8::internal::Factory::NewRawOneByteString(int, v8::internal::AllocationType) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
7: 0x10c96e10c v8::internal::Factory::NewStringFromOneByte(v8::internal::Vector const&, v8::internal::AllocationType) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
8: 0x10c7df0ef v8::String::NewFromOneByte(v8::Isolate*, unsigned char const*, v8::NewStringType, int) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
9: 0x10c783dc4 node::crypto::TLSWrap::InvokeQueued(int, char const*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
10: 0x10c783a6f node::crypto::TLSWrap::Destroy() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
11: 0x10c783902 node::crypto::TLSWrap::~TLSWrap() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
12: 0x10c783b8e node::crypto::TLSWrap::~TLSWrap() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
13: 0x10c5e021f node::Environment::RunCleanup() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
14: 0x10c573ea4 node::FreeEnvironment(node::Environment*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
15: 0x10c6e3a55 node::worker::Worker::Run() [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
16: 0x10c6e76b2 node::worker::Worker::StartThread(v8::FunctionCallbackInfov8::Value const&)::$_3::__invoke(void*) [/Users/tnugent/.nvm/versions/node/v16.0.0/bin/node]
17: 0x7fff2052f8fc _pthread_start [/usr/lib/system/libsystem_pthread.dylib]
18: 0x7fff2052b443 thread_start [/usr/lib/system/libsystem_pthread.dylib]
Abort trap: 6

Recommended hardware setup

Hi! At first, thank you for the awesome project! I'm testing it for a week now and I see it's all stable, but the CPU load average differs from 16 to 100+ day to day for my setup process 140+ Serum markets. Do you have any recommendations about hardware setup? Thanks!

Unhandled error: The user aborted a request

Hello. I've got the application crash, please find details below. Thank you.

How I got the error

  1. I started serum-vial, please find logs below,
  2. Then opened address http://myinstance.com:8000/v1/markets in a browser.

Logs

$ docker logs -f --timestamps zen_banach                                                              [234/865]
2021-06-02T16:23:34.740003026Z 2021-06-02T16:23:34.732Z info: Starting serum-vial server with options {"port":8000,"nodeEndpoint":"https://api.rpcpool.com","validateL3Diffs":false,"minio
nsCount":2,"commitment":"confirmed"}                                                                                                                                                                       
2021-06-02T16:23:34.740560264Z 2021-06-02T16:23:34.739Z info: Starting 2 minion workers...                                                                                                                 
2021-06-02T16:23:35.937257814Z 2021-06-02T16:23:35.934Z info: Listening on port 8000 {"minionId":2}                                                                                                        
2021-06-02T16:23:36.059843636Z 2021-06-02T16:23:36.057Z info: Listening on port 8000 {"minionId":1}                                                                                                        
2021-06-02T16:23:36.158306117Z 2021-06-02T16:23:36.157Z info: Starting serum producers for 67 markets, rpc endpoint: https://api.rpcpool.com
2021-06-02T16:23:38.084784429Z 2021-06-02T16:23:38.080Z info: Serum producer starting for ALEPH/USDC market...                                  
2021-06-02T16:23:40.025392466Z 2021-06-02T16:23:40.019Z info: Serum producer starting for BTC/USDC market...                                    
2021-06-02T16:23:40.831377811Z 2021-06-02T16:23:40.802Z info: Serum producer starting for ETH/USDC market...                                    
2021-06-02T16:23:41.331070285Z 2021-06-02T16:23:41.328Z info: Serum producer starting for SRM/USDC market...                                    
2021-06-02T16:23:41.563597066Z 2021-06-02T16:23:41.548Z info: Serum producer starting for SUSHI/USDC market...
...
2021-06-02T16:24:42.810154085Z 2021-06-02T16:24:42.808Z info: Serum producer starting for MER/USDC market... 
2021-06-02T16:27:23.750183298Z 2021-06-02T16:27:23.749Z error: Serum producer worker 3 error occurred: The user aborted a request. undefined 
2021-06-02T16:27:23.755628684Z Uncaught Exception thrown Error [ERR_UNHANDLED_ERROR]: Unhandled error. ({ type: 'aborted', message: 'The user aborted a request.' })
2021-06-02T16:27:23.755912112Z     at new NodeError (node:internal/errors:329:5)
2021-06-02T16:27:23.756065527Z     at process.emit (node:events:358:17)
2021-06-02T16:27:23.756075406Z     at emitUnhandledRejectionOrErr (node:internal/event_target:639:11)
2021-06-02T16:27:23.756079143Z     at MessagePort.[nodejs.internal.kHybridDispatch] (node:internal/event_target:464:9)
2021-06-02T16:27:23.756082830Z     at MessagePort.exports.emitMessage (node:internal/per_context/messageport:23:28) {
2021-06-02T16:27:23.756086417Z   code: 'ERR_UNHANDLED_ERROR',
2021-06-02T16:27:23.756090294Z   context: { type: 'aborted', message: 'The user aborted a request.' }
2021-06-02T16:27:23.756094963Z }
2021-06-02T16:27:23.895902761Z uv loop at [0x7f8dbedb2b38] has open handles:
2021-06-02T16:27:23.895977841Z [0x7f8da0414ab0] poll (active)
2021-06-02T16:27:23.895983271Z  Close callback: 0x24 
2021-06-02T16:27:23.895987048Z  Data: 0x7f8da00c4420 
2021-06-02T16:27:23.895990575Z  (First field): 0x7f8da0414ab0 
2021-06-02T16:27:23.895993791Z [0x7f8da01a6660] poll (active)
2021-06-02T16:27:23.895996977Z  Close callback: (nil) 
2021-06-02T16:27:23.896000143Z  Data: 0x7f8da0170f60 
2021-06-02T16:27:23.896003399Z  (First field): 0x7f8da01a6660 
2021-06-02T16:27:23.896006635Z uv loop at [0x7f8dbedb2b38] has 2 open handles in total
2021-06-02T16:27:23.896009931Z node[7]: ../src/debug_utils.cc:322:void node::CheckedUvLoopClose(uv_loop_t*): Assertion `0 && "uv_loop_close() while having open handles"' failed.
2021-06-02T16:27:23.900816718Z  1: 0xa89e60 node::Abort() [node]
2021-06-02T16:27:23.900888581Z  2: 0xa89ede  [node]
2021-06-02T16:27:23.900893972Z  3: 0xa02ed1  [node]
2021-06-02T16:27:23.900897007Z  4: 0xb52980 node::worker::Worker::Run() [node]
2021-06-02T16:27:23.900900303Z  5: 0xb529c8  [node]
2021-06-02T16:27:23.900903459Z  6: 0x7f8dc671a4a4  [/lib/x86_64-linux-gnu/libpthread.so.0]
2021-06-02T16:27:23.900906675Z  7: 0x7f8dc645cd0f clone [/lib/x86_64-linux-gnu/libc.so.6]
2021-06-02T16:27:23.996931626Z Aborted

sync marked state

may subscribe and then get a snapshot?

const { accountsData, slot } = await executeAndRetry(async () => this._fetchAccountsSnapshot(), {

Because with current way, get and than subscribe, can miss some data.

Also, may be periodically push full data from time to time to clients?

trades channel implementation

  • publishes messages with type match
  • perhaps there should be single 'trade' but two fills?
  • data format?
  • produce two matches for each match? or two fills?
  • deduplicate trades returned by event queue

not receive realtime trades forever

  const subscribeL2 = {
    op: 'subscribe',
    channel: 'trades',
    markets: ['BTC/USDC']
  }

  ws.send(JSON.stringify(subscribeL2))
}```

 i receive some trades right after running code

then no trades update anymore, about 2-3 min, it stop

TypeError: BroadcastChannel is not a constructor

I failed run serum-vial. Can anyone help?

$ npx serum-vial 
/mnt/Archive/Downloads/node_modules/serum-vial/dist/helpers.js:85
exports.minionReadyChannel = new BroadcastChannel('MinionReady');
                             ^

TypeError: BroadcastChannel is not a constructor
    at Object.<anonymous> (/mnt/Archive/Downloads/node_modules/serum-vial/dist/helpers.js:85:30)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/mnt/Archive/Downloads/node_modules/serum-vial/dist/boot_server.js:10:19)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
npm ERR! code 1
npm ERR! path /mnt/Archive/Downloads
npm ERR! command failed
npm ERR! command sh -c serum-vial

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/notooth/.npm/_logs/2021-12-26T04_12_48_590Z-debug.log

Which commitment level does the hosted server use?

This is a great project, it's very important for my trading. I use the publicly hosted server but I have a question please:

Do you wait for Finalized slots? Because otherwise it can be sending trades that end up being reversed after a chain fork.

Unhandled Rejection at Promise Error: Out of order notification after publish

Hi there. Thank you for this package.

I get this error after executing either the npx or the global npm setup:

Unhandled Rejection at Promise Error: Out of order notification after publish: market: current slot 41529994, update slot: 41529994
    at AccountsNotification._update (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/dist/serum-producer.js:128:23)
    at Object.callback (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/dist/serum-producer.js:96:22)
    at Connection._wsOnAccountNotification (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/@solana/web3.js/lib/index.cjs.js:5209:17)
    at Client.emit (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/eventemitter3/index.js:181:35)
    at /Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/rpc-websockets/dist/lib/client.js:425:22
    at processTicksAndRejections (internal/process/task_queues.js:93:5) Promise {
  <rejected> Error: Out of order notification after publish: market: current slot 41529994, update slot: 41529994
      at AccountsNotification._update (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/dist/serum-producer.js:128:23)
      at Object.callback (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/dist/serum-producer.js:96:22)
      at Connection._wsOnAccountNotification (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/@solana/web3.js/lib/index.cjs.js:5209:17)
      at Client.emit (/Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/eventemitter3/index.js:181:35)
      at /Users/sully/.nvm/versions/node/v14.13.1/lib/node_modules/serum-machine/node_modules/rpc-websockets/dist/lib/client.js:425:22
      at processTicksAndRejections (internal/process/task_queues.js:93:5)
}

WebSocket connection warnings

Hello. I have the latest dockerized Serum Vial running on a 6 CPU and 16Gb RAM machine that works with a dedicated Solana RPC node querying for 143 markets data. There is a lot of WebSocket connection warning messages as mentioned below. I see they usually appear in 5-10 minutes after an instance starts. Is it a problem and what side I should tune to fix it (Solana RPC, Serum Vial, or connectivity between them)? Let me know if the full log may help. Thank you!

warn: WS send error: write ECONNRESET
warn: WS send error: write EPIPE
warn: WS send error: WebSocket is not open: readyState 2
warn: WS send error: WebSocket is not open: readyState 3 (CLOSED)
warn: Out of order notification for PUBLISHED event: current slot 77095564, update slot: 77095564, resetting... {"market":"SRM/SOL"}

HTTP API is unstable

Hello.

I have 3 Serum Vial instances running. Also, there is monitoring with blackbox_exporter tracks their availability. It checks http://my-serum-vial.net:8000/v1/market request returns a response with HTTP 200 status with 30 seconds timeout.

Frequently all 3 instances don't respond. I see this behavior in instances spinning for more than 2 days. Please find a screenshot from the monitoring dashboard below. Each time plot goes down means an instance gave no response. At the same time, WebSockets API continues to provide data.

image

BroadcastChannel is not a constructor

I am currently trying to set up Serum Vial with my own Solana Validator, and I am getting this error:

/home/linuxbrew/.linuxbrew/lib/node_modules/serum-vial/dist/helpers.js:84
exports.minionReadyChannel = new BroadcastChannel('MinionReady');
^

TypeError: BroadcastChannel is not a constructor

How can I fix this?

1.3.0 broken

I did read you had limited time to test, but 1.3.0 seems to be broken for level3 messages.

The simplest possible test:

  • Run latest serum-vial
  • Connect using websocat or similar and send {"op":"subscribe","channel":"level3","markets":["SOL/USDC"]}

Expected:

  • Receive l3snapshot
  • Receive subscribed
  • Start receiving open / fill / done etc messages

Actual:

  • Receive l3snapshot and subscribed, but no open / fill / done etc messages

Reverting to 1.2.10 and it works.

Failed to run serum-vial

After running solana-test-validator and deploying serum-dex, I still cannot to run serum-vial. Can anyone help?

$ npx serum-vial --endpoint http://127.0.0.1:1024 --ws-endpoint-port 8899
...
2021-12-27T11:48:45.092Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":45.003}
2021-12-27T11:49:00.092Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":60.004}
2021-12-27T11:49:15.093Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":75.004}
2021-12-27T11:49:30.094Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":90.006}
2021-12-27T11:49:45.094Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":105.006}
2021-12-27T11:50:00.094Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":120.006}
2021-12-27T11:50:15.094Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":135.006}
2021-12-27T11:50:30.095Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":150.007}
2021-12-27T11:50:45.095Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":165.007}
2021-12-27T11:51:00.096Z info: No market data published for prolonged time {"lastPublishTimestamp":"2021-12-27T11:48:00.088Z","noDataPublishedForSeconds":180.007}
2021-12-27T11:51:13.691Z error: Serum producer worker 2 error occurred:  Error
    at RPCClient._getAccountInfoRPCResponseRaw (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/rpc_client.js:94:23)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async executeAndRetry (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/helpers.js:97:20)
    at async RPCClient.getAccountInfo (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/rpc_client.js:51:28)
    at async Function.load (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/@project-serum/serum/lib/market.js:133:45)
    at async SerumProducer.run (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/serum_producer.js:36:24) 
Uncaught Exception thrown Error
    at RPCClient._getAccountInfoRPCResponseRaw (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/rpc_client.js:94:23)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async executeAndRetry (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/helpers.js:97:20)
    at async RPCClient.getAccountInfo (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/rpc_client.js:51:28)
    at async Function.load (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/@project-serum/serum/lib/market.js:133:45)
    at async SerumProducer.run (/home/notooth/.npm/_npx/3cad36236d7e47f4/node_modules/serum-vial/dist/serum_producer.js:36:24)
uv loop at [0x7f81737fda98] has open handles:
[0x7f816010e420] poll (active)
        Close callback: 0xfcfa01fc8c400107 
        Data: 0x5b6f740 
        (First field): 0x7f816010e420 
uv loop at [0x7f81737fda98] has 1 open handles in total
node[3060801]: ../src/debug_utils.cc:322:void node::CheckedUvLoopClose(uv_loop_t*): Assertion `0 && "uv_loop_close() while having open handles"' failed.
 1: 0xb00d90 node::Abort() [node]
 2: 0xb00e0e  [node]
 3: 0xa73cd1  [node]
 4: 0xbc9e10 node::worker::Worker::Run() [node]
 5: 0xbc9e58  [node]
 6: 0x7f8182893ea7  [/lib/x86_64-linux-gnu/libpthread.so.0]
 7: 0x7f81827c3def clone [/lib/x86_64-linux-gnu/libc.so.6]
Aborted

Modify markets without restarting

I was just wondering how difficult it would be to extend the rest interface to support adding/removing markets without restarting the feed and potentially causing gaps?

BTW Thanks for the great work, this is super useful!

Getting a solana validator running

From what I hear getting a validator running locally costs as much as 1 SOL per day. Which is quite hefty these days :) is that what you're doing or are you setting up a validator with voting? Can you explain? @thaaddeus ?

Execution ID

Hi

I was just wondering whether there is something equivalent to an execution identifier for fills on Serum? I assume it's possible to get partial fills (?) so the order_id wouldn't be unique and also could receive multiple partials with the same timestamp (?) Perhaps there is a suitable alternative SHA256(blockhash, offset)?

Thanks
Andrew

Question: Performance recommendations

First of all thanks for a great project!

How should I start this application if I need all non-deprecated markets from serum-ts/markets.json? Are there any secrets?
Why it's working so well on your public example?

If I start the application with 10 markets or less โ€” everything works just fine.

If I increase the number of markets to more than 80 โ€” messages come with a delay of up to 5 minutes.

For context, I am trying to build an application, that saves all trades on all markets to DB for generating OHLCV data + generating real-time charts.

Thanks.

FetchError: request to https://api.mainnet-beta.solana.com/ failed, reason: socket hang up

Hello. An unexpected shutdown happened with an error shown below.

2021-05-03T15:28:37.614Z error: Minion worker 2 error occurred: failed to get info about account 2WghiBkDL2yRhHdvm8CpprrkmfguuQGJTCDfPSudKBAZ: FetchError: request to https://api.mainnet-beta.solana.com/ failed, reason: socket hang up Error: failed to get info about account 2WghiBkDL2yRhHdvm8CpprrkmfguuQGJTCDfPSudKBAZ: FetchError: request to https://api.mainnet-beta.solana.com/ failed, reason: socket hang up
    at Connection.getAccountInfo (/usr/local/lib/node_modules/serum-vial/node_modules/@solana/web3.js/lib/index.cjs.js:3535:13)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async Function.load (/usr/local/lib/node_modules/serum-vial/node_modules/@project-serum/serum/lib/market.js:104:45)
    at async /usr/local/lib/node_modules/serum-vial/dist/minion.js:64:102
    at async Promise.all (index 48)
    at async Minion._listMarkets (/usr/local/lib/node_modules/serum-vial/dist/minion.js:62:33) 
Uncaught Exception thrown Error: failed to get info about account 2WghiBkDL2yRhHdvm8CpprrkmfguuQGJTCDfPSudKBAZ: FetchError: request to https://api.mainnet-beta.solana.com/ failed, reason: socket hang up
    at Connection.getAccountInfo (/usr/local/lib/node_modules/serum-vial/node_modules/@solana/web3.js/lib/index.cjs.js:3535:13)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async Function.load (/usr/local/lib/node_modules/serum-vial/node_modules/@project-serum/serum/lib/market.js:104:45)
    at async /usr/local/lib/node_modules/serum-vial/dist/minion.js:64:102
    at async Promise.all (index 48)
    at async Minion._listMarkets (/usr/local/lib/node_modules/serum-vial/dist/minion.js:62:33)
uv loop at [0x7f1f47ffeb38] has open handles:
[0x7f1f3c1b3040] poll (active)
        Close callback: 0x91 
        Data: 0x7f1f3c38c800 
        (First field): 0x7f1f3c1b3040 
uv loop at [0x7f1f47ffeb38] has 1 open handles in total
node[7]: ../src/debug_utils.cc:322:void node::CheckedUvLoopClose(uv_loop_t*): Assertion `0 && "uv_loop_close() while having open handles"' failed.
 1: 0xa89e60 node::Abort() [node]
 2: 0xa89ede  [node]
 3: 0xa02ed1  [node]
 4: 0xb52980 node::worker::Worker::Run() [node]
 5: 0xb529c8  [node]
 6: 0x7f1f5fb524a4  [/lib/x86_64-linux-gnu/libpthread.so.0]
 7: 0x7f1f5f894d0f clone [/lib/x86_64-linux-gnu/libc.so.6]
Aborted

ECONNREFUSED error, while running the docker container

I am currently getting a connection refused error when running serum-vial connected to my local validator after approx. 1 min. (So serum-vial fetches data for 1 min and then errors with the message below.)

I assume it's more related to the node itself (might be wrong though), nevertheless I don't really see why this behaviour occurred. So any pointers would be appreciated.

Error log below:

2021-06-03T14:47:14.463Z error: Serum producer worker 2 error occurred: request to http://localhost:8899/ failed, reason: connect ECONNREFUSED 127.0.0.1:8899 undefined
Uncaught Exception thrown Error [ERR_UNHANDLED_ERROR]: Unhandled error. ({
message: 'request to http://localhost:8899/ failed, reason: connect ECONNREFUSED 127.0.0.1:8899',
type: 'system',
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED'
})

Issue with docker container

docker logs serum_dex_socket

2020-10-08T06:45:58.434Z serum-machine:serum-producer starting...
Unhandled Rejection at Promise Error: Out of order notification after publish: market: current slot 39982060, update slot: 39982060
    at AccountsNotification._update (/usr/local/lib/node_modules/serum-machine/dist/serum-producer.js:128:23)
    at Object.callback (/usr/local/lib/node_modules/serum-machine/dist/serum-producer.js:96:22)
    at Connection._wsOnAccountNotification (/usr/local/lib/node_modules/serum-machine/node_modules/@solana/web3.js/lib/index.cjs.js:5209:17)
    at Client.emit (/usr/local/lib/node_modules/serum-machine/node_modules/eventemitter3/index.js:181:35)
    at /usr/local/lib/node_modules/serum-machine/node_modules/rpc-websockets/dist/lib/client.js:425:22
    at processTicksAndRejections (internal/process/task_queues.js:93:5) Promise {
  <rejected> Error: Out of order notification after publish: market: current slot 39982060, update slot: 39982060
      at AccountsNotification._update (/usr/local/lib/node_modules/serum-machine/dist/serum-producer.js:128:23)
      at Object.callback (/usr/local/lib/node_modules/serum-machine/dist/serum-producer.js:96:22)
      at Connection._wsOnAccountNotification (/usr/local/lib/node_modules/serum-machine/node_modules/@solana/web3.js/lib/index.cjs.js:5209:17)
      at Client.emit (/usr/local/lib/node_modules/serum-machine/node_modules/eventemitter3/index.js:181:35)
      at /usr/local/lib/node_modules/serum-machine/node_modules/rpc-websockets/dist/lib/client.js:425:22
      at processTicksAndRejections (internal/process/task_queues.js:93:5)
}

Support for LUNA

Hi, is LUNA going to be made available? Seems to be available on mango's spot and perp markets

What does increasing minions-count do/performance stats?

Hi,

I was wondering about what exactly the minions-count parameter does, and when it is necessary to increase it past the default of "1" -- The current description in the readme is kind of recursive. How many would I need for how many markets (IE if I am streaming every market with l3snapshot, do I need more than 1?), and what kind of impact does it have on the RPC for increasing it? If it is too low, what errors/symptoms are there?

is there a way to filter my orders?

I'm trying to filter level3 messages which involve orders from my wallet. I thought I would be able to use the account.property but it seems that the account string is not permanently linked to the wallet and get's re-issued periodically. Is there any other way to identify the owner of the bid/ask?

Invalid Market Name Provided

I tried to follow the docs and added a custom markets however i always get invalid market Name ,
image

bellow is my market.json
[ { "address": "GcoKtAmTy5QyuijXSmJKBtFdt99e6Buza18Js7j9AJ6e", "baseMintAddress": "CsZ5LZkDS7h9TDKjrbL7VAwQZ9nsRu8vJLhRYfmGaN8K", "deprecated": false, "name": "ALEPH/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "A8YFbxQYFVqKZaoYJLLUVcQiWP7G2MeEgW5wsAQgMvFw", "baseMintAddress": "9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E", "deprecated": false, "name": "BTC/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4tSvZvnbyzHXLMTiFonMyxZoHmFqau1XArcRCVHLZ5gX", "baseMintAddress": "2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk", "deprecated": false, "name": "ETH/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "ByRys5tuUWDgL73G8JBAEfkdFf8JWBzPBDHsBVQ5vbQA", "baseMintAddress": "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt", "deprecated": false, "name": "SRM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "A1Q9iJDVVS8Wsswr9ajeZugmj64bQVCYLZQLra2TMBMo", "baseMintAddress": "AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy", "deprecated": false, "name": "SUSHI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4LUro5jaPaTurXK737QAxgJywdhABnFAMQkXX4ZyqqaZ", "baseMintAddress": "SF3oTvfWzEP3DTwGSvUXRrGTvr75pdZNnBLAH9bzMuX", "deprecated": false, "name": "SXP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4VKLSYdvrQ5ngQrt1d2VS8o4ewvb2MMUZLiejbnGPV33", "baseMintAddress": "MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L", "deprecated": false, "name": "MSRM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2Pbh1CvRVku1TgewMfycemghf6sU9EyuFDcNXqvRmSxc", "baseMintAddress": "AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3", "deprecated": false, "name": "FTT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7qcCo8jqepnjjvB5swP4Afsr3keVBs6gNpBTNubd1Kr2", "baseMintAddress": "3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB", "deprecated": false, "name": "YFI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3hwH1txjJVS8qv588tWrjHfRxdqNjBykM1kMcit484up", "baseMintAddress": "CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG", "deprecated": false, "name": "LINK/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "88vztw7RTN6yJQchVvxrs6oXUDryvpv9iJaFa1EEmg87", "baseMintAddress": "BtZQfWqDGbk9Wf2rXEiWyQBdBY1etnUUn6zEphvVS7yN", "deprecated": false, "name": "HGET/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7nZP6feE94eAz9jmfakNJWPwEKaeezuKKC5D1vrnqyo2", "baseMintAddress": "5Fu5UUgbjpUvdBveb3a1JTNirL8rXtiYeSMWvKjtUNQv", "deprecated": false, "name": "CREAM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2wr3Ab29KNwGhtzr5HaPCyfU1qGJzTUAN4amCLZWaD1H", "baseMintAddress": "873KLxCbz7s9Kc4ZzgYRtNmhfkQrhfyWGZJBmyCbC3ei", "deprecated": false, "name": "UBXT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CnUV42ZykoKUnMDdyefv5kP6nDSJf7jFd7WXAecC6LYr", "baseMintAddress": "HqB7uswoVg4suaQiDP3wjxob1G5WdZ144zhdStwMCq7e", "deprecated": false, "name": "HNT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9Zx1CvxSVdroKMMWf2z8RwrnrLiQZ9VkQ7Ex3syQqdSH", "baseMintAddress": "9S4t2NEAiJVMvPdRYKVrfJpBafPBLtvbvyS3DecojQHw", "deprecated": false, "name": "FRONT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5CZXTTgVZKSzgSA3AFMN5a2f3hmwmmJ6hU8BHTEJ3PX8", "baseMintAddress": "6WNVCuxCGJzNjmMZoKyhZJwvJ5tYpsLyAtagzYASqBoF", "deprecated": false, "name": "AKRO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6Pn1cSiRos3qhBf54uBP9ZQg8x3JTardm1dL3n4p29tA", "baseMintAddress": "DJafV9qemGp7mLMEn5wrfqaFwxsbLgUsGVS16zKRk9kc", "deprecated": false, "name": "HXRO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6JYHjaQBx6AtKSSsizDMwozAEDEZ5KBsSUzH7kRjGJon", "baseMintAddress": "DEhAasscXF4kEGxFgJ3bq4PpVGp5wyUxMRvn6TzGVHaw", "deprecated": false, "name": "UNI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "J7cPYBrXVy8Qeki2crZkZavcojf2sMRyQU7nx438Mf8t", "baseMintAddress": "GeDS162t9yGJuLEHPWXXGrb1zwkzinCgRwnT8vHYjKza", "deprecated": false, "name": "MATH/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8BdpjpSD5n3nk8DQLqPUyTZvVqFu6kcff5bzUX5dqDpy", "baseMintAddress": "GXMvfY2jpQctDqZ9RoU3oWPhufKiCcFEfchvYumtX7jd", "deprecated": false, "name": "TOMO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4xyWjQ74Eifq17vbue5Ut9xfFNfuVB116tZLEpiZuAn8", "baseMintAddress": "EqWCKXfs3x47uVosDpTRgFniThL9Y8iCztJaapxbEaVX", "deprecated": false, "name": "LUA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "jyei9Fpj2GtHLDDGgcuhDacxYLLiSyxU4TY7KxB2xai", "baseMintAddress": "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt", "deprecated": false, "name": "SRM/SOL", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT", "baseMintAddress": "So11111111111111111111111111111111111111112", "deprecated": false, "name": "SOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "E14BKBhDWD4EuTkWj1ooZezesGxMW8LPCps4W5PuzZJo", "baseMintAddress": "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp", "deprecated": false, "name": "FIDA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Bn6NPyr6UzrFAwC4WmvPvDr2Vm8XSUnFykM2aQroedgn", "baseMintAddress": "kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6", "deprecated": false, "name": "KIN/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3A8XQRWXC7BjLpgLDDBhQJLT5yPCzS16cGYRKHkKxvYo", "baseMintAddress": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb", "deprecated": false, "name": "MAPS/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3rgacody9SvM88QR83GHaNdEEx4Fe2V2ed5GJp2oeKDr", "baseMintAddress": "GUohe4DJUA5FKPWo3joiPgsB7yzer7LpDmt1Vhzy3Zht", "deprecated": false, "name": "KEEP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5nLJ22h1DUfeCfwbFxPYK8zbfbri7nA9bXoDcR8AcJjs", "baseMintAddress": "MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L", "deprecated": false, "name": "MSRM/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7dLVkUfBVfCGkFhSXDCq1ukM9usathSgS716t643iFGF", "baseMintAddress": "2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk", "deprecated": false, "name": "ETH/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8afKwzHR3wJE7W7Y5hvQkngXh6iTepSZuutRMMy96MjR", "baseMintAddress": "SF3oTvfWzEP3DTwGSvUXRrGTvr75pdZNnBLAH9bzMuX", "deprecated": false, "name": "SXP/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "cgani53cMZgYfRMgSrNekJTMaLmccRfspsfTbXWRg7u", "baseMintAddress": "DgHK9mfhMtUwwv54GChRrU54T2Em5cuszq2uMuen1ZVE", "deprecated": false, "name": "CEL/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Gyp1UGRgbrb6z8t7fpssxEKQgEmcJ4pVnWW3ds2p6ZPY", "baseMintAddress": "CsZ5LZkDS7h9TDKjrbL7VAwQZ9nsRu8vJLhRYfmGaN8K", "deprecated": false, "name": "ALEPH/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4ztJEvQyryoYagj2uieep3dyPwG2pyEwb2dKXTwmXe82", "baseMintAddress": "5Fu5UUgbjpUvdBveb3a1JTNirL8rXtiYeSMWvKjtUNQv", "deprecated": false, "name": "CREAM/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HEGnaVL5i48ubPBqWAhodnZo8VsSLzEM3Gfc451DnFj9", "baseMintAddress": "GUohe4DJUA5FKPWo3joiPgsB7yzer7LpDmt1Vhzy3Zht", "deprecated": false, "name": "KEEP/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8FpuMGLtMZ7Wt9ZvyTGuTVwTwwzLYfS5NZWcHxbP1Wuh", "baseMintAddress": "HqB7uswoVg4suaQiDP3wjxob1G5WdZ144zhdStwMCq7e", "deprecated": false, "name": "HNT/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5GAPymgnnWieGcRrcghZdA3aanefqa4cZx1ZSE8UTyMV", "baseMintAddress": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb", "deprecated": false, "name": "MAPS/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "AADohBGxvf7bvixs2HKC3dG2RuU3xpZDwaTzYFJThM8U", "baseMintAddress": "6ry4WBDvAwAnrYJVv6MCog4J8zx6S3cPgSqnTsDZ73AR", "deprecated": false, "name": "TRYB/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "EbV7pPpEvheLizuYX3gUCvWM8iySbSRAhu2mQ5Vz2Mxf", "baseMintAddress": "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp", "deprecated": false, "name": "FIDA/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FcPet5fz9NLdbXwVM6kw2WTHzRAD7mT78UjwTpawd7hJ", "baseMintAddress": "7ncCLJpP3MNww17LW8bRvx8odQQnubNtfNZBL5BgAEHW", "deprecated": false, "name": "RSR/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "AtNnsY1AyRERWJ8xCskfz38YdvruWVJQUVXgScC1iPb", "baseMintAddress": "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt", "deprecated": false, "name": "SRM/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "teE55QrL4a4QSfydR9dnHF97jgCfptpuigbb53Lo95g", "baseMintAddress": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", "deprecated": false, "name": "RAY/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "C1EuT9VokAKLiW7i2ASnZUvxDoKuKkCpDDeNxAptuNe4", "baseMintAddress": "9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E", "deprecated": false, "name": "BTC/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Hr3wzG8mZXNHV7TuL6YqtgfVUesCqMxGYCEyP3otywZE", "baseMintAddress": "AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3", "deprecated": false, "name": "FTT/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HLvRdctRB48F9yLnu9E24LUTRt89D48Z35yi1HcxayDf", "baseMintAddress": "6WNVCuxCGJzNjmMZoKyhZJwvJ5tYpsLyAtagzYASqBoF", "deprecated": false, "name": "AKRO/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2SSnWNrc83otLpfRo792P6P3PESZpdr8cu2r8zCE6bMD", "baseMintAddress": "DEhAasscXF4kEGxFgJ3bq4PpVGp5wyUxMRvn6TzGVHaw", "deprecated": false, "name": "UNI/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "F1T7b6pnR8Pge3qmfNUfW6ZipRDiGpMww6TKTrRU4NiL", "baseMintAddress": "873KLxCbz7s9Kc4ZzgYRtNmhfkQrhfyWGZJBmyCbC3ei", "deprecated": false, "name": "UBXT/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HWHvQhFmJB3NUcu1aihKmrKegfVxBEHzwVX6yZCKEsi1", "baseMintAddress": "So11111111111111111111111111111111111111112", "deprecated": false, "name": "SOL/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "35tV8UsHH8FnSAi3YFRrgCu4K9tb883wKnAXpnihot5r", "baseMintAddress": "EqWCKXfs3x47uVosDpTRgFniThL9Y8iCztJaapxbEaVX", "deprecated": false, "name": "LUA/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6DgQRTpJTnAYBSShngAVZZDq7j9ogRN1GfSQ3cq9tubW", "baseMintAddress": "AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy", "deprecated": false, "name": "SUSHI/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2WghiBkDL2yRhHdvm8CpprrkmfguuQGJTCDfPSudKBAZ", "baseMintAddress": "GeDS162t9yGJuLEHPWXXGrb1zwkzinCgRwnT8vHYjKza", "deprecated": false, "name": "MATH/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "ErQXxiNfJgd4fqQ58PuEw5xY35TZG84tHT6FXf5s4UxY", "baseMintAddress": "BtZQfWqDGbk9Wf2rXEiWyQBdBY1etnUUn6zEphvVS7yN", "deprecated": false, "name": "HGET/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CGC4UgWwqA9PET6Tfx6o6dLv94EK2coVkPtxgNHuBtxj", "baseMintAddress": "9S4t2NEAiJVMvPdRYKVrfJpBafPBLtvbvyS3DecojQHw", "deprecated": false, "name": "FRONT/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GnKPri4thaGipzTbp8hhSGSrHgG4F8MFiZVrbRn16iG2", "baseMintAddress": "GXMvfY2jpQctDqZ9RoU3oWPhufKiCcFEfchvYumtX7jd", "deprecated": false, "name": "TOMO/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6bxuB5N3bt3qW8UnPNLgMMzDq5sEH8pFmYJYGgzvE11V", "baseMintAddress": "dK83wTVypEpa1pqiBbHY3MNuUnT3ADUZM4wk9VZXZEc", "deprecated": false, "name": "AAVE/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7cknqHAuGpfVXPtFoJpFvUjJ8wkmyEfbFusmwMfNy3FE", "baseMintAddress": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb", "deprecated": false, "name": "MAPS/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4absuMsgemvdjfkgdLQq1zKEjw3dHBoCWkzKoctndyqd", "baseMintAddress": "DJafV9qemGp7mLMEn5wrfqaFwxsbLgUsGVS16zKRk9kc", "deprecated": false, "name": "HXRO/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4nCFQr8sahhhL4XJ7kngGFBmpkmyf3xLzemuMhn6mWTm", "baseMintAddress": "kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6", "deprecated": false, "name": "KIN/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3Xg9Q4VtZhD4bVYJbTfgGWFV5zjE3U7ztSHa938zizte", "baseMintAddress": "3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB", "deprecated": false, "name": "YFI/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3yEZ9ZpXSQapmKjLAGKZEzUNA1rcupJtsDp5mPBWmGZR", "baseMintAddress": "CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG", "deprecated": false, "name": "LINK/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "J2XSt77XWim5HwtUM8RUwQvmRXNZsbMKpp5GTKpHafvf", "baseMintAddress": "9F9fNTT6qwjsu4X4yWYKZpsbw5qT7o6yR2i57JF2jagy", "deprecated": false, "name": "SWAG/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "77quYg4MGneUdjgXCunt9GgM1usmrxKY31twEy3WHwcS", "baseMintAddress": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", "deprecated": false, "name": "USDT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GKLev6UHeX1KSDCyo2bzyG6wqhByEzDBkmYTxEdmYJgB", "baseMintAddress": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M", "deprecated": false, "name": "OXY/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HdBhZrnrxpje39ggXnTb6WuTWVvj5YKcSHwYGQCRsVj", "baseMintAddress": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M", "deprecated": false, "name": "OXY/WUSDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GZ3WBFsqntmERPwumFEYgrX2B7J7G11MzNZAy7Hje27X", "baseMintAddress": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M", "deprecated": false, "name": "OXY/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7MpMwArporUHEGW7quUpkPZp5L5cHPs9eKUfKCdaPHq2", "baseMintAddress": "3K6rftdAaQYMPunrtNRHgnK2UAtjm2JwyT2oCiTDouYE", "deprecated": false, "name": "xCOPE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6fc7v3PmjZG9Lk2XTot6BywGyYLkBQuzuFKd4FpCsPxk", "baseMintAddress": "8HGyAAB1yoM1ttS7pXjHMa3dukTFGQggnFFH3hJZgzQh", "deprecated": false, "name": "COPE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6HwcY27nbeb933UkEcxqJejtjWLfNQFWkGCjAVNes6g7", "baseMintAddress": "MERt85fc5boKw3BW1eYdxonEuJNvXbiMbs6hvheau5K", "deprecated": false, "name": "MER/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "G4LcexdCzzJUKZfqyVDQFzpkjhB1JoCNL8Kooxi9nJz5", "baseMintAddress": "MERt85fc5boKw3BW1eYdxonEuJNvXbiMbs6hvheau5K", "deprecated": false, "name": "MER/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "DPfj2jYwPaezkCmUNm5SSYfkrkz8WFqwGLcxDDUsN3gA", "baseMintAddress": "4dmKkXNHdgYsXqBHCuMikNQWwVomZURhYvkkX5c4pQ7y", "deprecated": false, "name": "SNY/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2Gx3UfV831BAh8uQv1FKSPKS9yajfeeD8GJ4ZNb2o2YP", "baseMintAddress": "SLRSSpSLUTP7okbCUBYStWCo1vUgyt775faPqz8HUMr", "deprecated": false, "name": "SLRS/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HrgkuJryyKRserkoz7LBFYkASzhXHWp9XA6fRYCA6PHb", "baseMintAddress": "EL3yFeyHezeNugdKgNWmtSXGgRyCLhczcndm8HR8NCK2", "deprecated": false, "name": "ETHV/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5aoLj1bySDhhWjo7cLfT3pF2gqNGd63uEJ9HMSfASESL", "baseMintAddress": "HZzCWPqGNmDoyL5Q2SxTVTMWgv2LsCaogvzkXa5Lhyi", "deprecated": false, "name": "IETHV/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HXBi8YBwbh4TXF6PjVw81m8Z3Cc4WBofvauj5SBFdgUs", "baseMintAddress": "Saber2gLauYim4Mvftnrasomsv6NvAuncvMEZwcLpD1", "deprecated": false, "name": "SBR/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "74Ciu5yRzhe8TFTHvQuEVbFZJrbnCMRoohBK33NNiPtv", "baseMintAddress": "CDJWUqTcYTVAKXAVXoQZFes5JUFc7owSeq7eMQcDSbo5", "deprecated": false, "name": "renBTC/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5FpKCWYXgHWZ9CdDMHjwxAfqxJLdw2PRXuAmtECkzADk", "baseMintAddress": "ArUkYE2XDKzqy77PRRGjo4wREWwqk6RXTfM9NeqzPvjU", "deprecated": false, "name": "renDOGE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "DYfigimKWc5VhavR4moPBibx9sMcWYVSjVdWvPztBPTa", "baseMintAddress": "GsNzxJfFn6zQdJGeYsupJWzUAm57Ba7335mfhWvFiE9Z", "deprecated": false, "name": "DXL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3d4rzwpy9iGdCZvgxcu7B1YocYffVLsQXPXkBZKt2zLc", "baseMintAddress": "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac", "deprecated": false, "name": "MNGO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6V6y6QFi17QZC9qNRpVp7SaPiHpCTp2skbRQkUyZZXPW", "baseMintAddress": "BRLsMczKuaR5w9vSubF4j8HwEGGprVAyyVgS4EX7DKEg", "deprecated": false, "name": "CYS/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HxFLKUAmAMLz1jtT3hbvCMELwH5H9tpM2QugP8sKyfhW", "baseMintAddress": "poLisWXnNRwC6oBu1vHiuKQzFjGL4XDSu4g9qjz9qVk", "deprecated": false, "name": "POLIS/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Di66GTLsV64JgCCYGVcY21RZ173BHkjJVgPyezNN7P1K", "baseMintAddress": "ATLASXmbPQxBUYbxPsV97usA3fPQYEqzQBUHgiFCUsXx", "deprecated": false, "name": "ATLAS/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3WptgZZu34aiDrLMUiPntTYZGNZ72yT1yxHYxSdbTArX", "baseMintAddress": "3bRTivrVsitbmCTGtqwp7hxXPsybkjn4XLNtPsHqa3zR", "deprecated": false, "name": "LIKE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6oGsL2puUgySccKzn9XA9afqF217LfxP5ocq4B3LWsjy", "baseMintAddress": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So", "deprecated": false, "name": "MSOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "5cLrMai1DsLRYc1Nio9qMTicsWtvzjzZfJPXyAoF4t1Z", "baseMintAddress": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So", "deprecated": false, "name": "MSOL/SOL", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GREiyoFSEM7zMce3VugkCggdUYXVK5MijJgGwn7DkVPF", "baseMintAddress": "CwChm6p9Q3yFrjzVeiLTTbsoJkooscof5SJYZc2CrNqG", "deprecated": false, "name": "ETHBULL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "J2eCTuKaABG91kCzJset2UfQRoggHcY2Cq7Stu7natXr", "baseMintAddress": "5TY71D29Cyuk9UrsSxLXw2quJBpS7xDDFuFu2K9W7Wf9", "deprecated": false, "name": "IBVOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "EnDY66AMMan9FFntp2nNrLW8E8qsXK9Cxi6GZ5QCgRXz", "baseMintAddress": "22xoSp66BDt4x4Q5xqxjaSnirdEyharoBziSFChkLFLy", "deprecated": false, "name": "BCHBULL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7ygqNwjA94Qu8YKxB8j2ePXYEFyWLcYGUUCVzV9puAhJ", "baseMintAddress": "Gnhy3boBT4MA8TTjGip5ND2uNsceh1Wgeaw1rYJo51ZY", "deprecated": false, "name": "MAPSPOOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "G1uoNqQzdasMUvXV66Eki5dwjWv5N9YU8oHKJrE4mfka", "baseMintAddress": "9iDWyYZ5VHBCxxmWZogoY3Z6FSbKsX4WFe37c728krdT", "deprecated": false, "name": "OXYPOOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3V2sfA9rCnBwjfqGca2UDxD4fVvPXW9GNAQCqAepKC9Q", "baseMintAddress": "93a1L7xaEV7vZGzNXCcb9ztZedbpKgUiTHYxmFKJwKvc", "deprecated": false, "name": "RAYPOOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CjsuF2gB28KqgniogCbbpp7FDMBwAkTawEN3gYKsgfS8", "baseMintAddress": "7CnFGR9mZWyAtWxPcVuTewpyC3A3MDW4nLsu5NY6PDbd", "deprecated": false, "name": "SECO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9MFFsTVgw6gKPZ1rpc6CSJSLaiNAonChcS7zCCMrAwEP", "baseMintAddress": "DgHK9mfhMtUwwv54GChRrU54T2Em5cuszq2uMuen1ZVE", "deprecated": false, "name": "CEL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GJWnwZJ599xjf7cRPP93aaVKqD5xUG5PBLNypHgPxitF", "baseMintAddress": "9wRD14AhdZ3qV8et3eBQVsrb3UoBZDUbJGyFckpTg8sj", "deprecated": false, "name": "PAXG/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "E6umfgnsastaGANjpvzb15jaXdZH1wsg4ENHARgbjqUz", "baseMintAddress": "38i2NQxjp5rt5B3KogqrxmBxgrAwaB3W1f1GmiKqh9MS", "deprecated": false, "name": "GRT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "QzB9DfWbNAUpfkwLNMLGfkK1AM2zttkMYGSwx5iCnGe", "baseMintAddress": "3GECTP7H4Tww3w8jEPJCJtXUtXxiZty31S9szs84CcwQ", "deprecated": false, "name": "HOLY/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4FPFh1iAiitKYMCPDBmEQrZVgA1DVMKHZBU2R7wjQWuu", "baseMintAddress": "A6aY2ceogBz1VaXBxm1j2eJuNZMRqrWUAnKecrMH85zj", "deprecated": false, "name": "LQID/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7AHAKkL94Mx2VAkQb2kk74oNsxDnQ6aab4XwKwisfFdB", "baseMintAddress": "D68NB5JkzvyNCZAvi6EGtEcGvSoRNPanU9heYTAUFFRa", "deprecated": false, "name": "PERP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CAww1itfT8rFeTCJCLZqTq9anZ7FpC8NzULNLcJMG4Qa", "baseMintAddress": "dK83wTVypEpa1pqiBbHY3MNuUnT3ADUZM4wk9VZXZEc", "deprecated": false, "name": "AAVE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Dbyf1PPrAXfMe1LdEq57QW9GY1D4nNEt2fKVGEo6S3MU", "baseMintAddress": "Avz2fmevhhu87WYtWQCFj9UjKRjF9Z9QWwN2ih9yF95G", "deprecated": false, "name": "COMP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2xiv8A5xrJ7RnGdxXB42uFEkYHJjszEhaJyKKt4WaLep", "baseMintAddress": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", "deprecated": false, "name": "RAY/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Cm4MmknScg7qbKqytb1mM92xgDxv3TNXos4tKbBqTDy7", "baseMintAddress": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", "deprecated": false, "name": "RAY/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6jx6aoNFbmorwyncVP5V5ESKfuFc9oUYebob1iF6tgN4", "baseMintAddress": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", "deprecated": false, "name": "RAY/ETH", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "C6tp2RVZnxBPFbnAsfTjis8BN9tycESAT4SgDQgbbrsA", "baseMintAddress": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R", "deprecated": false, "name": "RAY/SOL", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3BqiaptVkdDCJWz3gea31z1tC3qYfBktUffrSjXjYHWy", "baseMintAddress": "5TY71D29Cyuk9UrsSxLXw2quJBpS7xDDFuFu2K9W7Wf9", "deprecated": false, "name": "IBVOL/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9wH4Krv8Vim3op3JAu5NGZQdGxU8HLGAHZh3K77CemxC", "baseMintAddress": "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp", "deprecated": false, "name": "FIDA/RAY", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Fcxy8qYgs8MZqiLx2pijjay6LHsSUqXW47pwMGysa3i9", "baseMintAddress": "kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6", "deprecated": false, "name": "KIN/RAY", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HcVjkXmvA1815Es3pSiibsRaFw8r9Gy7BhyzZX83Zhjx", "baseMintAddress": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M", "deprecated": false, "name": "OXY/RAY", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7Q4hee42y8ZGguqKmwLhpFNqVTjeVNNBqhx8nt32VF85", "baseMintAddress": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb", "deprecated": false, "name": "MAPS/RAY", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4Sg1g8U2ZuGnGYxAhc6MmX9MX7yZbrrraPkCQ9MdCPtF", "baseMintAddress": "8PMHT4swUMtBzgHnh5U564N5sjPSiUz2cjEQzFnnP1Fo", "deprecated": false, "name": "ROPE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "97qCB4cAVSTthvJu3eNoEx6AY6DLuRDtCoPm5Tdyg77S", "baseMintAddress": "StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT", "deprecated": false, "name": "STEP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6xC1ia74NbGZdBkySTw93wdxN4Sh2VfULtXh1utPaJDJ", "baseMintAddress": "3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB", "deprecated": false, "name": "YFI/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CDvQqnMrt9rmjAxGGE6GTPUdzLpEhgNuNZ1tWAvPsF3W", "baseMintAddress": "AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3", "deprecated": false, "name": "FTT/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HfsedaWauvDaLPm6rwgMc6D5QRmhr8siqGtS6tf2wthU", "baseMintAddress": "9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E", "deprecated": false, "name": "BTC/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FGYAizUhNEC9GBmj3UyxdiRWmGjR3TfzMq2dznwYnjtH", "baseMintAddress": "AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy", "deprecated": false, "name": "SUSHI/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FafaYTnhDbLAFsr5qkD2ZwapRxaPrEn99z59UG4zqRmZ", "baseMintAddress": "CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG", "deprecated": false, "name": "LINK/SRM", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FR3SPJmgfRSKKQ2ysUZBu7vJLpzTixXnjzb84bY3Diif", "baseMintAddress": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU", "deprecated": false, "name": "SAMO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FfiqqvJcVL7oCCu8WQUMHLUC2dnHQPAPjTdSzsERFWjb", "baseMintAddress": "ETAtLmCmsoiEEKfNrHKJ2kYy3MoABhU6NQvpSfij5tDs", "deprecated": false, "name": "MEDIA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8GufnKq7YnXKhnB3WNhgy5PzU9uvHbaaRrZWQK6ixPxW", "baseMintAddress": "TuLipcqtGVXP9XR62wM8WWCm6a9vhLs7T1uoWBk6FDs", "deprecated": false, "name": "TULIP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GqQLxU1Dc6a7NYWRWdgbcGSTHirjy4quFivxXJGDzDCz", "baseMintAddress": "8KK6NLSnfGN87rpM9UNWid2kUjFdYYK6qD1RDNuEhCSb", "deprecated": false, "name": "MERPOOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GekRdc4eD9qnfPTjUMK5NdQDho8D9ByGrtnqhMNCTm36", "baseMintAddress": "xxxxa1sKNGwFtw2kFn8XauW9xq8hBZ5kVtcSesTT9fW", "deprecated": false, "name": "SLIM/SOL", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Eg35DZcYLx6JvZfrEAWgDPfSXJbx2N7hbEwVD56RiXnk", "baseMintAddress": "FETUGUMHsz8ivDmc3pZuFeAf3e3YFvGPbygziW7iTTc4", "deprecated": false, "name": "SNYPOOL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "GX26tyJyDxiFj5oaKvNB9npAHNgdoV9ZYHs5ijs5yG2U", "baseMintAddress": "51tMb3zBKDiQhNwGqpgwbavaGH54mk8fXFzxTc1xnasg", "deprecated": false, "name": "APEX/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FLKUQGh9VAG4otn4njLPUf5gaUPx5aAZ2Q6xWiD3hH5u", "baseMintAddress": "4wjPQJ6PrkC4dHhYghwJzGBVP78DkBzA2U3kHoFNBuhj", "deprecated": false, "name": "LIQ/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7gZNLDbWE73ueAoHuAeFoSu7JqmorwCLpNTBXHtYSFTa", "baseMintAddress": "E5ndSkaB17Dm7CsD22dvcjfrYSDLCxFcMd6z8ddCk5wp", "deprecated": false, "name": "CCAI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Cud48DK2qoxsWNzQeTL5D8sAiHsGwG8Ev1VMNcYLayxt", "baseMintAddress": "EdAhkbj5nF9sRM7XN7ewuW8C9XEUMs8P7cnoQ57SYE96", "deprecated": false, "name": "FAB/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8N1KkhaCYDpj3awD58d85n973EwkpeYnRp84y1kdZpMX", "baseMintAddress": "orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE", "deprecated": false, "name": "ORCA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Aubv1QBFh4bwB2wbP1DaPW21YyQBLfgjg8L4PHTaPzRc", "baseMintAddress": "SUNNYWgPQmFxe9wTZzNK7iPnJ3vYDrkgnxJRJm1s3ag", "deprecated": false, "name": "SUNNY/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7MmPwD1K56DthW14P1PnWZ4zPCbPWemGs3YggcT1KzsM", "baseMintAddress": "BLwTnYKqf7u4qjgZrrsKeNs2EzWkMLqVCu6j8iHyrNA3", "deprecated": false, "name": "BOP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2Si6XDdpv5zcvYna221eZZrsjsp5xeYoz9W1TVdMdbnt", "baseMintAddress": "Amt5wUJREJQC5pX7Z48YSK812xmu4j3sQVupNhtsEuY8", "deprecated": false, "name": "FROG/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CwK9brJ43MR4BJz2dwnDM7EXCNyHhGqCJDrAdsEts8n5", "baseMintAddress": "9nEqaUcb16sQ3Tn1psbkWqyhPdLmfHWjKGymREjsAgTE", "deprecated": false, "name": "WOOF/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "FhiqrjSsQuEEe2FUMxzkwFadsAwA9ea9YMJLivEFKFbQ", "baseMintAddress": "HAgX1HSfok8DohiNCS54FnC2UJkDSrRVnT38W3iWFwc8", "deprecated": false, "name": "sCAT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7MtgLYSEgsq626pvcEAwaDqs2KiZsaJUX2qGpRZbcDWY", "baseMintAddress": "J8K4k3wPtpeimFxzQ3fLAe963Sy8rH33H7XB6pTa6D22", "deprecated": false, "name": "DGEN/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4zffJaPyeXZ2wr4whHgP39QyTfurqZ2BEd4M5W6SEuon", "baseMintAddress": "GHvFFSZ9BctWsEc5nujR1MTmmJWY7tgQz2AXE6WVFtGN", "deprecated": false, "name": "SOLAPE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9fe1MWiKqUdwift3dEpxuRHWftG72rysCRHbxDy6i9xB", "baseMintAddress": "5p2zjqCd1WJzAVgcEnjhb9zWDU7b9XVhFhx4usiyN7jB", "deprecated": false, "name": "CATO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9G2bAA5Uv8JyPZteuP73GJLUGg5CMbhMLCRSBUBLoXyt", "baseMintAddress": "7fCzz6ZDHm4UWC9Se1RPLmiyeuQ6kStxpcAP696EuE1E", "deprecated": false, "name": "SHBL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HSpeWWRqBJ4HH2FPyfDhoN1AUq3gYoDenQGZASSqzYW1", "baseMintAddress": "AMdnw9H5DFtQwZowVFr4kUgSXJzLokKSinvgGiUoLSps", "deprecated": false, "name": "MOLA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HSfEpP3ciPBC5bBdtjBDa8BxsUW32zUzRGLPpPuDyVY4", "baseMintAddress": "xxxxa1sKNGwFtw2kFn8XauW9xq8hBZ5kVtcSesTT9fW", "deprecated": false, "name": "SLIM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6hwK66FfUdyhncdQVxWFPRqY8y6usEvzekUaqtpKEKLr", "baseMintAddress": "6kwTqmdQkJd8qRr9RjSnUX9XJ24RmJRSrU1rsragP97Y", "deprecated": false, "name": "SAIL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4vvPk9cDzYVSs2rygf2gWAhRVo5DFYtFMSgz5FzypCcs", "baseMintAddress": "bhog3BmBLwqWz9Pah7xeeFDL4kjJGDYXaoxCZ3452ex", "deprecated": false, "name": "BHOG/SOL", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "E3U6GzZwQMDXtd7ABdsfxYx6oeLyaeh6dc6Ez91ZXQrG", "baseMintAddress": "9MhNoxy1PbmEazjPo9kiZPCcG7BiFbhi3bWZXZgacfpp", "deprecated": false, "name": "ACMN/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "J4oPt5Q3FYxrznkXLkbosAWrJ4rZLqJpGqz7vZUL4eMM", "baseMintAddress": "FgX1WD9WzMU3yLwXaFSarPfkgzjLb2DZCqmkx9ExpuvJ", "deprecated": false, "name": "NINJA/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "BeF2PKq2jmTJraWEhP28H8BQHUVtuzTyFogtKkxi6D6", "baseMintAddress": "Lrxqnh6ZHKbGy3dcrCED43nsoLkM1LTzU2jRfWe8qUC", "deprecated": false, "name": "LARIX/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "CsNZMtypiGgxm6JrmYVJWnLnJNsERrmT3mQqujLsGZj", "baseMintAddress": "PRT88RkA4Kg5z7pKnezeNH4mafTvtQdfFgpQTGRjz44", "deprecated": false, "name": "PRT/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2Ux1EYeWsxywPKouRCNiALCZ1y3m563Tc4hq1kQganiq", "baseMintAddress": "E5rk3nmgLUuKUiS94gg4bpWwWwyjCMtddsAXkTFLtHEy", "deprecated": false, "name": "WOO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9cuBrXXSH9Uw51JB9odLqEyeF5RQSeRpcfXbEW2L8X6X", "baseMintAddress": "FnKE9n6aGjQoNWRBZXy4RW6LZVao7qwBonUbiD7edUmZ", "deprecated": false, "name": "SYP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "DNxn3qM61GZddidjrzc95398SCWhm5BUyt8Y8SdKYr8W", "baseMintAddress": "ALMmmmbt5KNrPPUBFE4dAKUKSPWTop5s3kUGCdF69gmw", "deprecated": false, "name": "ALM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Gne8eeLRXF4PgY3N3L2sMsaWDGJgoWZuPDTm7n6p1oe8", "baseMintAddress": "7dHX7nVDtytz5ng9DNyiDMud9gcYimfjngKHrVvH6C4", "deprecated": false, "name": "MEOW/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "G3Bss3a2tif6eHNzWCh14g5k2H4rwBAmE42tbckUWG5T", "baseMintAddress": "5jFnsfx36DyGk8uVGrbXnVUMTsBkPXGpx6e69BiGFzko", "deprecated": false, "name": "INU/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "KrGK6ZHyE7Nt35D7GqAKJYAYUPUysGtVBgTXsJuAxMT", "baseMintAddress": "4SZjjNABoqhbd4hnapbvoEPEqT8mnNkfbEoAwALf1V8t", "deprecated": false, "name": "CAVE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Ak1UDskYAjztX5YkxW8dmERjLwS9fYmk1b3G6fpWDxp6", "baseMintAddress": "PoLEXM5xikzieXENFvP7WwHJPorcFiCUVuMo9BAGZT3", "deprecated": false, "name": "POLE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9tr5uMYHgtJ5yG4SeqHA6kJUdzXrK6QCNGYgewQevuuS", "baseMintAddress": "FoqP7aTaibT5npFKYKQQdyonL99vkW8YALNPwWepdvf5", "deprecated": false, "name": "BIP/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "7oFXusrpvDzbY6gMM81RjS6YEALETXTwWdUKXXBVojgu", "baseMintAddress": "FaiPGacTM7YBmacumbg4ZnDx7sKtGcG3LkcVoqfddEA7", "deprecated": false, "name": "BULL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9oCx3vFm5ERDVdjmJHsqE5BJ4eLP4g1aTpf5T4RyRqVy", "baseMintAddress": "BYLotMdQmq579hhP9xDcuCJky9kmMrbp77eoktmm7a5Y", "deprecated": false, "name": "CKG/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "eju5JDyaf29jYNfq7VrVAocVxGayDEHVHHiM7MYc331", "baseMintAddress": "3m7A2A8HHdqmiDrjAfaddj7Hxd88FrBHA1KSoqjoELtu", "deprecated": false, "name": "WAGMI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4M1uP9mYnbraCvw4JuiqFas63K1o74LeoJwpVDW3AAmG", "baseMintAddress": "EZF2sPJRe26e8iyXaCrmEefrGVBkqqNGv9UPGG9EnTQz", "deprecated": false, "name": "FUM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "4JP75nztBEo5rYhW1LTQyc4qfjPB33jMWEUvp2DGrQQR", "baseMintAddress": "HEhMLvpSdPviukafKwVN8BnBUTamirptsQ6Wxo5Cyv8s", "deprecated": false, "name": "FTR/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "Dvm8jjdAy8uyXn9WXjS2p1mcPeFTuYS6yW2eUL9SJE8p", "baseMintAddress": "CN7qFa5iYkHz99PTctvT4xXUHnxwjQ5MHxCuTJtPN5uS", "deprecated": false, "name": "BOKU/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9oXkdAWFyjDH8BbYrDVJ77r6GWPmUWo9ZYYpE25SZ2td", "baseMintAddress": "2Kc38rfQ49DFaKHQaWbijkE7fcymUMLY5guUiUsDmFfn", "deprecated": false, "name": "KURO/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "2wgi2FabNsSDdb8dke9mHFB67QtMYjYa318HpSqyJLDD", "baseMintAddress": "GFX1ZjR2P15tmrSwow6FjyDYcEkoFb4p4gJCpLBjaxHD", "deprecated": false, "name": "GOFX/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "BHqcTEDhCoZgvXcsSbwnTuzPdxv1HPs6Kz4AnPpNrGuq", "baseMintAddress": "5tN42n9vMi6ubp67Uy4NnmM5DMZYN8aS8GeB3bEDHr6E", "deprecated": false, "name": "WAG/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HYM1HS6MM4E1NxgHPH4Wnth7ztXsYTpbB2Rh9raje8Xq", "baseMintAddress": "Bx1fDtvTN6NvE4kjdPHQXtmGSg582bZx9fGy4DQNMmAT", "deprecated": false, "name": "SOLC/USDT", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "85CTDt8gNfJhmqE3Xm2smDm54HmeT1jvLfPVBTkX8BTX", "baseMintAddress": "GpYMp8eP3HADY8x1jLVfFVBVYqxFNxT5mFhZAZt9Poco", "deprecated": false, "name": "CAPE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "3DEfX1JPAPWKgeBW2XUr7Z1ztNNwbYhhD5EinGC7x1Lf", "baseMintAddress": "7JYZmXjHenJxgLUtBxgYsFfoABmWQFA1fW3tHQKUBThV", "deprecated": false, "name": "WEED/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "8pJg7JGfvEfBc14a9wtfAi39doTEeyJHMwqdJrtxsqVx", "baseMintAddress": "Ac7GiHwC7vZU2y97GRh9rqCqqnKAAgopYrTAtKccHxUk", "deprecated": false, "name": "SINU/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "ArKuemtzjpqP5H3P4S21nzhtLZtsq7nMCN6ecA9yvMX9", "baseMintAddress": "cqNTpypmbwghrf1G9VGvSENcw7M7wGSQ7JS8UTQWXwb", "deprecated": false, "name": "SCUM/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "6zH7zwXKyTCUFEGGSjzr4ndegLLPGRAhT2mfcWc6wP1w", "baseMintAddress": "6cH34XtzNgCDwb7NFbiji1a1N8F3FgmXTrFxvzBZNVui", "deprecated": false, "name": "KINGSHIB/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HY9J1nsJxrem6w4uBRaWi2A7iNruNFEooMFopfM584Mv", "baseMintAddress": "AVKnbqNQgXDY8kbnno9eSGfwpVz5idimBnDKiz1vbWAh", "deprecated": false, "name": "PART/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "91WiupLKLjP8ENihdgiZ53j49aosNm1EYXdLbRD6GAY4", "baseMintAddress": "BKGp1At3yLDK1NE2gfMuwv1QMAHBwnqgSdULsyzjUagA", "deprecated": false, "name": "SHIBETOSHI/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9BrQcZ8wMDJ7ibsQKckCd85x5mkqEXL56hnTuvyziPY3", "baseMintAddress": "DiJWJ6hgV7Vm5JP6SU7xvo7nULR14UvrGoWmSu34fEvZ", "deprecated": false, "name": "SolBullDog/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "ESd3PskTov69tkW5MmfdV8K7hXR35EXRYorWMNn61dD3", "baseMintAddress": "5L2YboFbHAUpBDDJjvDB5M6pu9CW2FRjyDB2asZyvjtE", "deprecated": false, "name": "PIXL/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "HCvX4un57v1SdYQ2LFywaDYyZySqLHMQ5cojq5kQJM3y", "baseMintAddress": "6F9XriABHfWhit6zmMUYAQBSy6XK5VF1cHXuW5LDpRtC", "deprecated": false, "name": "RUN/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }, { "address": "9d2NsCGUidYc4b4JD8vc9hbhm1HdTfGpCByUAUakGHCB", "baseMintAddress": "J7WYVzFNynk9D28eBCccw2EYkygygiLDCVCabV7CupWL", "deprecated": false, "name": "MONGOOSE/USDC", "programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" } ]

--markets-json option has no effect

Hi, I'm trying to use --markets-json with my custom markets.json file to limit the serum-vial to listen to only a subset of markets, however this option seems to be not working.

The command I use: npx serum-vial --endpoint <my_rpc_endpoint> --markets-json <absolute_path_to_my_json_file>

The json file contains:
[
{
"address": "9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT",
"deprecated": false,
"name": "SOL/USDC",
"programId": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin"
}
]

`open`/`change` messages should *not always* be processed before `fill`/`done`

Hi @thaaddeus,

Have noticed during examination of data recorded via this excellent software a scenario which implies that the logic for ordering messages published to the level3 stream appears to require some modification.

In short, there are several instances where an order is opened on a particular update, and on the same update a fill message is generated for a different order which is already on the book. In a number of cases the newly placed order is for a better price than the existing one which is traded; this implies immediately that in fact the fill message should be handled before the open, since if the new order were already open when the fill occurred, it would have traded against the incoming order instead of the existing.

For example, I see progressions like the following:

1. 2021-11-03T17:48:55.477Z : Sell limit order #4147160109163233996678936 *open* for 2996.7 SOL @ 224.818 USDT 
2. 2021-11-03T17:55:29.956Z : Sell limit order #4146828067769907224750968 *open* for 130.5 SOL @ 224.800 USDT 
3. 2021-11-03T17:55:29.956Z : Sell limit order #4147160109163233996678936 *traded* for 0.6 SOL @ 224.818 USDT

If analysing this, it would be expected that the order open at 2. should be traded against any incoming order, as it is for a better price - clearly the trade at 3. then actually occurred before the open at 2. The message ordering from the level3 stream should reflect this.

It can also occur that all three messages are generated from the same update, and have the same timestamp, implying that the first order was immediately partially filled when it was received - the same principle applies here.

1. 2021-11-03T18:47:06.482Z : Buy limit order #4323732343436781781789141 *open* for 300.0 SOL @ 234.389 USDT 
2. 2021-11-03T18:47:06.482Z : Buy limit order #4327292565043007725251028 *open* for 22.0 SOL @ 234.582 USDT 
3. 2021-11-03T18:47:06.482Z : Buy limit order #4323732343436781781789141 *traded* for 198.2 SOL @ 234.389 USDT

Have not investigated yet if there is any way to confirm the ordering via the update data received from RPC node; if not then would perhaps have to develop logic which compares the price of opens and fills on the same update in order to deduce an ordering which is correct at least in relation to the traded prices.

Kindly let me know if you agree with this assessment, and if needing any further information or input from my side.

Thanks!

Missing L3 Updates After Snapshot?

Hi @thaaddeus ; firstly, thanks for the great work on this, awesome to have L3 streaming capability available for Serum ecosystem DEXs :)

Have been battling with an issue that seems to occur following some l3snapshot message publishing events; happens mostly after certain invalid l3diff detections, but has been seen also at initial subscription.

I am using the level2 stream in order to confirm the correctness of local reconstruction of the l3 orderbook (as kind of a "gap detection" mechanism in the absence of the message sequence numbers which would be used for CEX L3 streams); what I have observed is this:

  1. l3snapshot and l2snapshot are received and processed successfully; these agree perfectly (of course, as they are created at the same time from the same data)
  2. There is then in some cases an l2update message received, on which some price levels have been modified - however, no corresponding L3 updates (open/change/fill/done) are published at the same time. This obviously leads to a misalignment of the local L3 book with the published L2. I have defined my logic such that this triggers a forced reconnect; usually reconnecting to obtain a fresh snapshot and messages solves the issue, but have been instances where this repeated over several re-subscriptions.

Note this does not occur for every l3snapshot processed, and the agreement is perfect much of the time. Have unfortunately not managed to identify anything particularly special about the cases where it does occur - only thoughts I have had are that it may happen only when a particularly large update occurs directly after the snapshot is produced, or perhaps related to the time between the update producing the snapshot and the next change.

Any insight or advice you may be able to give on this would be much appreciated (even more so, a fix in the next version ๐Ÿ˜‹)

Respect rate / data limit responses

Certain RPC endpoints will send 429 and 413 responses when rate or data limits have been hit. Currently serum-vial will retry in fixed 50ms backoff increments per subscribed market. This typically leads to hammering the server when it's already rate limiting.

Suggestions:

  • Increase and randomise reconnection time for 429 and 413 errors (eg between 250ms and 2500ms), and/or
  • Gate reconnection so only one market attempts to reconnect at a time

commitment level

Hi

Is there a reason you don't support finalized commitment level?

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.