import 'reflect-metadata'; import { Connection, PublicKey } from '@solana/web3.js'; import { Market, decodeEventQueue } from '@project-serum/serum'; import { SerumEvent } from './entity'; import { formatFilledEvents, SOURCES } from './utils'; import { SERUM_DEX_V3_PK } from '.'; const insertEvents = async (events: Array, marketMeta, loadTimestamp, db) => { const eventRepo = db.getRepository(SerumEvent); if (events.length) { try { await eventRepo.createQueryBuilder().insert().values(events).orIgnore().execute(); } catch (error) { console.error('Error inserting into Event table:', error); } } }; export const watchMarketEventQueue = async (db, marketMeta) => { let connection = new Connection('https://mango.rpcpool.com/'); let marketPk = new PublicKey(marketMeta.address); let programID = new PublicKey(SERUM_DEX_V3_PK); let market = await Market.load(connection, marketPk, {}, programID); const eventQueueAccount = market['_decoded'].eventQueue; connection.onAccountChange(eventQueueAccount, (event) => { const loadTimestamp = new Date().toISOString(); const decodedEventQueue = decodeEventQueue(event.data); const filledEvents = decodedEventQueue.filter((e) => e.eventFlags['fill']); if (filledEvents.length > 0) { console.log('event inserted for', marketMeta.name); const formattedFilledEvents = formatFilledEvents( filledEvents, marketMeta, loadTimestamp, SOURCES.websocket ); insertEvents(formattedFilledEvents, marketMeta, loadTimestamp, db); } }); };