event-scraper-v3/src/watchQueue.ts

44 lines
1.6 KiB
TypeScript

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<any>, 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);
}
});
};