Loading and streaming events into a pool
import {
ConfigurableCorePool,
EventDBManager,
EventType,
SimulationDataManager,
SimulatorClient,
SQLiteSimulationDataManager,
} from "@bella-defintech/uniswap-v3-simulator";
import { LiquidityEvent } from "@bella-defintech/uniswap-v3-simulator/dist/entity/LiquidityEvent";
import { SwapEvent } from "@bella-defintech/uniswap-v3-simulator/dist/entity/SwapEvent";
import JSBI from "jsbi";
// the database name containing downloaded-and-pre-processed mainnet events
let mainnetEventDBFilePath =
"events_0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8.db";
// build a client instance
let simulationDataManager: SimulationDataManager =
await SQLiteSimulationDataManager.buildInstance(
"Your file path to save the internal data"
);
let clientInstance: SimulatorClient = new SimulatorClient(
simulationDataManager
);
// Specify an endBlock number
// the SimulatorClient will replay events up to that block
let endBlock0 = 12374077;
// get a pool instance
let configurableCorePool: ConfigurableCorePool =
await clientInstance.recoverFromMainnetEventDBFile(
mainnetEventDBFilePath,
endBlock0
);
// get an EventDBManager instance to load events
let eventDB = await EventDBManager.buildInstance(mainnetEventDBFilePath);
// get and sort event by block number
let events: (LiquidityEvent | SwapEvent)[] = [];
let startBlock = 1000,
endBlock = 2000;
let mintEvents: LiquidityEvent[] =
await eventDB.getLiquidityEventsByBlockNumber(
EventType.MINT,
startBlock,
endBlock
);
let burnEvents: LiquidityEvent[] =
await eventDB.getLiquidityEventsByBlockNumber(
EventType.BURN,
startBlock,
endBlock
);
let swapEvents: SwapEvent[] = await eventDB.getSwapEventsByBlockNumber(
startBlock,
endBlock
);
events.push(...mintEvents);
events.push(...burnEvents);
events.push(...swapEvents);
events.sort(function (a, b) {
return a.blockNumber == b.blockNumber
? a.logIndex - b.logIndex
: a.blockNumber - b.blockNumber;
});
// replay events
for (let index = 0; index < events.length; index++) {
// avoid stack overflow for the possible recovering operation
if (index % 1000 == 0) {
configurableCorePool.takeSnapshot("");
}
let event = events[index];
switch (event.type) {
case EventType.MINT:
await configurableCorePool.mint(
event.recipient,
event.tickLower,
event.tickUpper,
event.liquidity
);
break;
case EventType.BURN:
await configurableCorePool.burn(
event.msgSender,
event.tickLower,
event.tickUpper,
event.liquidity
);
break;
case EventType.SWAP:
let zeroForOne: boolean = JSBI.greaterThan(event.amount0, JSBI.BigInt(0))
? true
: false;
await configurableCorePool.swap(
zeroForOne,
event.amountSpecified
//,event.sqrt_price_x96
);
break;
default:
// @ts-ignore: ExhaustiveCheck
const exhaustiveCheck: never = event;
}
}PreviousGetting a pool instance with the data fetchedNext(Advanced)For a better user experience as a state machine
Last updated