44 lines
1.6 KiB
TypeScript
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);
|
||
|
}
|
||
|
});
|
||
|
};
|