diff --git a/.gitignore b/.gitignore index 2bcc9923..5731c5a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*.json +*.env_private_key .idea # Logs logs diff --git a/examples/benchmark_submit_tx/benchmark_submit_tx_trader_api.ts b/examples/benchmark_submit_tx/benchmark_submit_tx_trader_api.ts new file mode 100644 index 00000000..7299390f --- /dev/null +++ b/examples/benchmark_submit_tx/benchmark_submit_tx_trader_api.ts @@ -0,0 +1,46 @@ +import { readFileSync } from "fs" +import { + loadFromEnv, + MAINNET_API_VIRGINIA_WS, + MAINNET_API_NY_WS, + TESTNET_API_WS, + WsProvider, LOCAL_API_WS +} from "../../bxsolana" +import * as fs from "fs" +import { Type as GetPerpTradesResponse } from "../../bxsolana/proto/messages/api/GetPerpTradesResponse" + +const config = loadFromEnv() + +const provider = new WsProvider( + config.authHeader, + config.privateKey.toString(), + MAINNET_API_NY_WS + // LOCAL_API_WS +) + +await provider.connect() +const filePath = 'bx_api_data.json'; +await fs.truncate(filePath, (err) => { + if (err) { + console.error('Error deleting old content:', err); + } else { + console.log('Old content deleted.'); + } +}); + +const numberOfSeconds = parseInt(process.argv[2], 10); +console.log("numberOfSeconds to check : " + numberOfSeconds); + +const req = await provider.submitTradeSwap({ + ownerAddress: ownerAddress, + inToken: "USDT", + outToken: "SOL", + inAmount: 0.01, + slippage: 0.1, + project: "P_RAYDIUM", + }, + "P_SUBMIT_ALL", + true) + + + diff --git a/examples/benchmark_submit_tx_helius.ts b/examples/benchmark_submit_tx_helius.ts new file mode 100644 index 00000000..698dee7e --- /dev/null +++ b/examples/benchmark_submit_tx_helius.ts @@ -0,0 +1,267 @@ +import { Connection, Keypair } from "@solana/web3.js" +import base58 from "bs58" +import { readFileSync } from "fs" +import { + loadFromEnv, + MAINNET_API_NY_WS, + // MAINNET_API_UK_WS, + PostSubmitRequestEntry, PostSubmitResponse, + signTx, + signTxMessage, + WsProvider +} from "../bxsolana" +import { randomInt } from "crypto" + +const httpHeaders = { } +const endpoint = 'https://proud-fabled-crater.solana-mainnet.quiknode.pro/e3bfb432b5b982fb3e296b8fd1ec3a2d91124d76/' +// const endpoint = 'https://mainnet.competitor-rpc.com/?api-key=88e7c870-b0e3-4a59-b80f-8d78f01e5e4a' +const connection = new Connection( + endpoint, + {httpHeaders}); + +const config = loadFromEnv() + +const provider = new WsProvider( + config.authHeader, + config.privateKey.toString(), + MAINNET_API_NY_WS + // MAINNET_API_UK_WS, + // LOCAL_API_WS +) + +type RequestPair = { + tPromise: Promise; + hPromise: Promise; + tBlockNumber: number; + hBlockNumber: number; + tSignature: string; + hSignature: string; +}; +let blx_win = 0; +let competitor_win = 0; +let equal = 0; +let total_diff = 0; +const noOfComparisons = 100; +const dataArray: { diff: number; trader_api_slot: number; competitor_slot: number; tSignature: string, hSignature: string}[] = []; +console.log("connecting to trader api") +await provider.connect() +console.log("connected to trader api") +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function getRandomNumber(): number { + + const randomValue = Math.random(); + const minValue = 1.00; + const maxValue = 2.00; + const randomInRange = minValue + (randomValue * (maxValue - minValue)); + // console.log("randomInRange : ", randomInRange) + return randomInRange; +} + +async function submitTx() { + const config = loadFromEnv() + const privateKey = Keypair.fromSecretKey( + base58.decode(config.privateKey.toString()) + ) + const requestPairs: RequestPair[] = [] + const BONK = "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" + for (let i = 1; i <= noOfComparisons; i++) { + const rescompetitor = await provider.postTradeSwap({ + ownerAddress: config.publicKey, + inToken: BONK, + outToken: "USDC", + inAmount: getRandomNumber(), + slippage: 30, + project: "P_RAYDIUM", + }) + + const resTraderAPI = await provider.postTradeSwap({ + ownerAddress: config.publicKey, + inToken: BONK, + outToken: "USDC", + inAmount: getRandomNumber(), + slippage: 30, + project: "P_RAYDIUM", + }) + + const serializedTransactionsTraderAPI = resTraderAPI.transactions.map((tx) => signTxMessage( + tx, + privateKey, + )); + + + const serializedTransactions = rescompetitor.transactions.map((tx) => signTxMessage( + tx, + privateKey, + )); + + const tx = serializedTransactionsTraderAPI.pop() + let txContent = ""; + if (tx) { + txContent = tx.content; + } + + const txH = serializedTransactions.pop() + let txHContent = ""; + if (txH) { + txHContent = txH.content; + } + const hPromise = connection.sendEncodedTransaction(txHContent, { + preflightCommitment: 'processed', + + }); + const tPromise = provider.postSubmit({ + transaction: { + content: txContent, + isCleanup: false, + }, + skipPreFlight: true, + }) + const newPair: RequestPair = { + tPromise, + hPromise, + hBlockNumber : 0, + tBlockNumber : 0, + tSignature: "", + hSignature: "", + }; + requestPairs.push(newPair); + console.log("submitted tx to trader api and competitor : " + i) + } // for loop + const allResults = [] + const wait = 60000 + console.log("sleeping for ", wait , " millis ") + await sleep(wait); + let tSignature + for (const requestPair of requestPairs) { + console.log("waiting for tx from competitor") + let hSignature = "" + for (let i = 0; i < 10; i++) { + try { + hSignature = await requestPair.hPromise + break + } catch (e) { + await sleep(10000) + console.log(e) + } + } + let tSignature : PostSubmitResponse = {signature: ""} + for (let i = 0; i < 10; i++) { + try { + tSignature = await requestPair.tPromise + break + } catch (e) { + await sleep(10000) + console.log(e) + } + } + console.log("waiting for tx from trader api") + for (let i = 0; i < 10; i++) { + try { + await connection.confirmTransaction(hSignature) + break + } catch (e) { + await sleep(10000) + console.log(e) + } + } + for (let i = 0; i < 10; i++) { + try { + await connection.confirmTransaction(tSignature.signature) + break + } catch (e) { + await sleep(10000) + console.log(e) + } + } + + allResults.push({ + tResult: tSignature, + hResult: hSignature, + tSignature: tSignature.signature, + hSignature: hSignature, + tBlockNumber: requestPair.tBlockNumber, + hBlockNumber: requestPair.hBlockNumber + }) + } + + + for (const res of allResults) { + const tBlockNumber = await getBlockNumber(res.tResult.signature) + if (tBlockNumber) { + if (tBlockNumber == -1) { + continue + } + res.tBlockNumber = tBlockNumber + } + + const hBlockNumber = await getBlockNumber(res.hResult) + if (hBlockNumber) { + if (hBlockNumber == -1) { + continue + } + + res.hBlockNumber = hBlockNumber + } + + if (res.tBlockNumber < res.hBlockNumber) { + blx_win++ + } else if (res.tBlockNumber > res.hBlockNumber) { + competitor_win++ + } else { + equal++ + } + + total_diff += res.tBlockNumber - res.hBlockNumber + + dataArray.push({ + diff : res.tBlockNumber - res.hBlockNumber, + trader_api_slot: res.tBlockNumber, + competitor_slot: res.hBlockNumber, + tSignature: res.tSignature, + hSignature: res.hSignature, + }) + + } + +} + +async function getBlockNumber(signature: string) { + for (let i = 0; i < 2; i++) { + try { + const transactionInfo = await connection.getTransaction(signature, { + commitment: 'confirmed', + }); + + const blockNumber = transactionInfo?.slot; + + if (blockNumber !== undefined) { + // console.log(`Transaction with signature ${signature} confirmed in block number ${blockNumber}`); + } else { + // console.log(`Transaction with signature ${signature} not found or not confirmed yet.`); + } + + return blockNumber; + } catch (e) { + await sleep(10000) + console.log(e) + } + } + + return -1 +} + +await submitTx() +console.table(dataArray); +console.log("endpoint : " + endpoint) +console.log("blx_win : " + blx_win) +console.log("blx_win % : " + blx_win * 100 / noOfComparisons) +console.log("competitor_win : " + competitor_win) +console.log("competitor_win % : " + competitor_win * 100 / noOfComparisons) +console.log("equal : " + equal) +console.log("equal % : " + equal * 100 / noOfComparisons) +console.log("total_diff on avg(block distance): " + total_diff / noOfComparisons) +console.log("numOfComparisons : " + noOfComparisons) +process.exit(0); \ No newline at end of file diff --git a/examples/index.ts b/examples/index.ts index 81cae210..9245bca8 100755 --- a/examples/index.ts +++ b/examples/index.ts @@ -57,6 +57,7 @@ const openOrdersAddress = "DwoXdF8kjt9RS6yPfpzp1yHBKtFMDpHQPCRgy1JhKgFt" const baseTokenWallet = config.publicKey const quoteTokenWallet = "4raJjCwLLqw8TciQXYruDEF4YhDkGwoEnwnAdwJSjcgv" + const testOrder: PostOrderRequestV2 = { ownerAddress: ownerAddress, payerAddress: payerAddress, diff --git a/examples/price_stream_benchmark/benchmark_bx_api.ts b/examples/price_stream_benchmark/benchmark_bx_api.ts new file mode 100644 index 00000000..6d34f1e6 --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_bx_api.ts @@ -0,0 +1,94 @@ +import { readFileSync } from "fs" +import { + loadFromEnv, + MAINNET_API_VIRGINIA_WS, + MAINNET_API_NY_WS, + TESTNET_API_WS, + WsProvider, LOCAL_API_WS +} from "../../bxsolana" +import * as fs from "fs" +import { Type as GetPerpTradesResponse } from "../../bxsolana/proto/messages/api/GetPerpTradesResponse" + +const config = loadFromEnv() + +const provider = new WsProvider( + config.authHeader, + readFileSync("./.env_private_key").toString(), + MAINNET_API_NY_WS + // LOCAL_API_WS +) + +await provider.connect() +const filePath = 'bx_api_data.json'; +await fs.truncate(filePath, (err) => { + if (err) { + console.error('Error deleting old content:', err); + } else { + console.log('Old content deleted.'); + } +}); + +const numberOfSeconds = parseInt(process.argv[2], 10); +console.log("numberOfSeconds to check : " + numberOfSeconds); + +const req = await provider.getPerpTradesStream({ + contracts: ["ALL"], + project: "P_DRIFT", +}) + +interface WrappedPerpTradesResponse { + ts: number; + data: GetPerpTradesResponse | undefined; +} + +const mapOfData: Map = new Map(); +let count = 0 + +const startTime = Date.now(); + +function writeToFile() { + + type SerializedData = { + [key: number]: WrappedPerpTradesResponse[]; + }; + + const serializedData :SerializedData = {}; + + for (const [key , value] of mapOfData) { + serializedData[key] = value; + } + const updatedDataJSON = JSON.stringify(serializedData, null, 2); + fs.writeFileSync(filePath, updatedDataJSON, 'utf8'); + console.log("finished writing to file " + filePath) +} + +for await (const ob of req) { + console.log(JSON.stringify(ob)); + + if (ob.trade == undefined || ob.context == undefined) { + continue + } + + const wrappedItem: WrappedPerpTradesResponse = { + ts: Date.now(), + data: ob.trade, + }; + const slot = parseInt(ob.context.slot, 10); + console.log("checking time : " + (Date.now() - startTime) / 1000); + if ((Date.now() - startTime) / 1000 >= numberOfSeconds) { + break + } + const val = mapOfData.get(slot); + if (val) { + val.push(wrappedItem); + } else { + mapOfData.set(slot, [wrappedItem]); + } + // we write to file every time we get some value, to have the latest data in file + writeToFile() + count++ +} + + + +provider.close() \ No newline at end of file diff --git a/examples/price_stream_benchmark/benchmark_bx_raydium_get_price_stream.ts b/examples/price_stream_benchmark/benchmark_bx_raydium_get_price_stream.ts new file mode 100644 index 00000000..385111c6 --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_bx_raydium_get_price_stream.ts @@ -0,0 +1,91 @@ +import { readFileSync } from "fs" +import { + loadFromEnv, + MAINNET_API_VIRGINIA_WS, + MAINNET_API_NY_WS, + TESTNET_API_WS, + WsProvider, LOCAL_API_WS, GetPricesStreamResponse +} from "../../bxsolana" +import * as fs from "fs" +import { Type as GetPerpTradesResponse } from "../../bxsolana/proto/messages/api/GetPerpTradesResponse" +import { Type as Project } from "../../bxsolana/proto/messages/api/Project" + +const config = loadFromEnv() + +const provider = new WsProvider( + config.authHeader, + readFileSync("./.env_private_key").toString(), + MAINNET_API_NY_WS + // LOCAL_API_WS +) + +await provider.connect() +const filePath = 'raydium_get_price_stream.json'; +await fs.truncate(filePath, (err) => { + if (err) { + console.error('Error deleting old content:', err); + } else { + console.log('Old content deleted.'); + } +}); + +const numberOfSeconds = parseInt(process.argv[2], 10); +console.log("numberOfSeconds to check : " + numberOfSeconds); + +const req = await provider.getPricesStream({ + projects: ['P_RAYDIUM'], + tokens: ['RAY', 'SOL', 'USDT', 'USDC'] +}) + +interface WrappedPerpTradesResponse { + ts: number; + data: GetPricesStreamResponse | undefined; +} + +const mapOfData: Map = new Map(); +let count = 0 + +const startTime = Date.now(); + +function writeToFile() { + + type SerializedData = { + [key: number]: WrappedPerpTradesResponse[]; + }; + + const serializedData :SerializedData = {}; + + for (const [key , value] of mapOfData) { + serializedData[key] = value; + } + const updatedDataJSON = JSON.stringify(serializedData, null, 2); + fs.writeFileSync(filePath, updatedDataJSON, 'utf8'); + console.log("finished writing to file " + filePath) +} + +for await (const ob of req) { + console.log(JSON.stringify(ob)); + + const wrappedItem: WrappedPerpTradesResponse = { + ts: Date.now(), + data: ob, + }; + const slot = parseInt(ob.slot, 10); + console.log("checking time : " + (Date.now() - startTime) / 1000); + if ((Date.now() - startTime) / 1000 >= numberOfSeconds) { + break + } + const val = mapOfData.get(slot); + if (val) { + val.push(wrappedItem); + } else { + mapOfData.set(slot, [wrappedItem]); + } + // we write to file every time we get some value, to have the latest data in file + writeToFile() + count++ +} + + + +provider.close() \ No newline at end of file diff --git a/examples/price_stream_benchmark/benchmark_comparison.ts b/examples/price_stream_benchmark/benchmark_comparison.ts new file mode 100644 index 00000000..c981189a --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_comparison.ts @@ -0,0 +1,115 @@ +import { OrderActionRecord } from "@drift-labs/sdk" +import moment from 'moment'; +import * as fs from "fs" +import { Type as GetPerpTradesResponse } from "../../bxsolana/proto/messages/api/GetPerpTradesResponse" + +interface WrappedDriftEvent { + ts: number; + data: OrderActionRecord | undefined; +} + +interface WrappedPerpTradesResponse { + ts: number; + data: GetPerpTradesResponse | undefined; +} + +const bxTraderApifilePath = 'bx_api_data.json'; +const driftApiFilePath = 'drift_api_data.json'; + + +function readTraderApiFile(filePath: string): Map { + const fileContent = fs.readFileSync(filePath, 'utf8'); + + const dataObject = JSON.parse(fileContent); + + const map: Map = new Map(); + const keys = Object.keys(dataObject) + for (const key of keys) { + map.set(parseInt(key, 10), dataObject[key]) + } + return map +} + +function readDriftFile(filePath: string): Map { + const fileContent = fs.readFileSync(filePath, 'utf8'); + + const dataObject = JSON.parse(fileContent); + + const map: Map = new Map(); + const keys = Object.keys(dataObject) + for (const key of keys) { + map.set(parseInt(key, 10), dataObject[key]) + } + return map +} + +let total_fast = 0; +let total_slow = 0; +let faster = 0; +let slower = 0; +let sameTime = 0; +let noOfComparisons = 0; +let notFound = 0; + +const dataArray: { diff: number; slot: number; trader_api_ts: string; drift_api_ts: string; }[] = []; +function compareResponseMaps(bxTraderApiMap: Map, + driftMap: Map): boolean { + for (const [key, traderApiEvents] of bxTraderApiMap) { + const driftEvents = driftMap.get(key); + if (driftEvents != undefined) { + for (const traderApiEvent of traderApiEvents) { + for (const driftEvent of driftEvents) { + if (traderApiEvent.data == undefined || driftEvent.data == undefined) { + continue + } + if (parseInt(traderApiEvent.data.marketIndex, 10) == driftEvent.data.marketIndex && + traderApiEvent.data.filler.toString() == driftEvent.data.filler?.toString() + && traderApiEvent.data.baseAssetAmountFilled == (parseInt(driftEvent.data.baseAssetAmountFilled.toString(), 16) / (10 ** 9)) + ) { + const driftEventFormatted = moment(new Date(driftEvent.ts)).format('DD-MM-YYYY HH:mm:ss'); + const traderApiEventFormatted = moment(new Date(traderApiEvent.ts)).format('DD-MM-YYYY HH:mm:ss'); + + dataArray.push({ + diff : (driftEvent.ts - traderApiEvent.ts) / 1000, + slot: key, + trader_api_ts: traderApiEventFormatted, + drift_api_ts: driftEventFormatted, + }) + + noOfComparisons++ + + if (traderApiEvent.ts < driftEvent.ts) { + faster++; + total_fast += driftEvent.ts - traderApiEvent.ts + } else if (traderApiEvent.ts > driftEvent.ts ) { + slower++ + total_slow += driftEvent.ts - traderApiEvent.ts + } else { + sameTime++ + } + } + } + } + + } else { + notFound++ + } + } + + return true; +} + +const traderApiMap = readTraderApiFile(bxTraderApifilePath) +const driftMap = readDriftFile(driftApiFilePath) +compareResponseMaps(traderApiMap, driftMap) + +console.table(dataArray); +console.log("faster : " + faster) +console.log("faster % : " + faster * 100 / noOfComparisons) +console.log("faster on avg(ms): " + total_fast / faster) +console.log("slower : " + slower) +console.log("slower % : " + slower * 100 / noOfComparisons) +console.log("slower on avg(ms): " + total_slow / slower) +console.log("equal : " + sameTime) +console.log("numOfComparisons : " + noOfComparisons) +console.log("notFound : " + notFound) \ No newline at end of file diff --git a/examples/price_stream_benchmark/benchmark_drift_api.ts b/examples/price_stream_benchmark/benchmark_drift_api.ts new file mode 100644 index 00000000..07114914 --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_drift_api.ts @@ -0,0 +1,142 @@ +import { BN, DLOBApiClient, DLOBSubscriber, EventSubscriber, isVariant } from "@drift-labs/sdk" +import { Connection, Keypair } from "@solana/web3.js" +import {SlotSubscriber} from "@drift-labs/sdk"; +import base58 from "bs58"; + +import {Wallet, DriftClient} from "@drift-labs/sdk"; +import { readFileSync } from "fs" +import * as fs from "fs" +import { + OrderActionRecord, +} from "@drift-labs/sdk/lib" +import { EventSubscriptionOptions } from "@drift-labs/sdk/src/events/types" +const httpHeaders = { } +const connection = new Connection('https://proud-fabled-crater.solana-mainnet.quiknode.pro/e3bfb432b5b982fb3e296b8fd1ec3a2d91124d76/', + {httpHeaders}); +const wallet = new Wallet(Keypair.fromSecretKey( + base58.decode(readFileSync("./.env_private_key").toString()) +)) +process + .on("unhandledRejection", (reason, p) => { + console.log("Unhandled Rejection at Promise", reason, p) + }) + .on("uncaughtException", (err) => { + console.log("Uncaught Exception thrown", err) + }) + +const filePath = 'drift_api_data.json'; +console.log("truncating file " + filePath); +await fs.truncate(filePath, (err) => { + if (err) { + console.error('Error deleting old content:', err); + } else { + console.log('Old content deleted.'); + + + } +}); + +const dlobApiClient = new DLOBApiClient({ + url: 'https://dlob.drift.trade/orders/idlWithSlot', +}); + +const driftClient = new DriftClient({ + connection, + wallet, + env: 'mainnet-beta', +}); + +const slotSubscriber = new SlotSubscriber(connection); +await driftClient.subscribe(); +await slotSubscriber.subscribe(); +const numberOfSeconds = parseInt(process.argv[2], 10); +console.log("numberOfSeconds to check : " + numberOfSeconds); +const dlobSubscriber = new DLOBSubscriber({ + driftClient, + dlobSource: dlobApiClient, + slotSource: slotSubscriber, + updateFrequency: 1000, +}); + +await dlobSubscriber.subscribe(); + +export const options: EventSubscriptionOptions = { + eventTypes: [ + // 'OrderRecord', + 'OrderActionRecord', + ], + maxEventsPerType: 4096, + orderBy: 'blockchain', + orderDir: 'asc', + commitment: 'confirmed', + maxTx: 4096, + logProviderConfig: { + type: 'websocket', + }, +}; + +const eventSubscriber = new EventSubscriber(connection, driftClient.program, options); +await eventSubscriber.subscribe(); +const startTime = Date.now(); + +interface WrappedDriftEvent { + ts: number; + data: OrderActionRecord | undefined; +} +const mapOfData: Map = new Map(); + +function writeToFile() { + type SerializedData = { + [key: number]: WrappedDriftEvent[]; + }; + + const serializedData :SerializedData = {}; + + for (const [key , value] of mapOfData) { + serializedData[key] = value; + } + const updatedDataJSON = JSON.stringify(serializedData,null, 2); + fs.writeFileSync(filePath, updatedDataJSON, 'utf8'); + console.log("finished writing to file " + filePath) +} + +eventSubscriber.eventEmitter.on('newEvent', (event) => { + + const e = event as OrderActionRecord + const wrappedItem: WrappedDriftEvent = { + ts: Date.now().valueOf(), + data: e, + }; + if (!isVariant(e.marketType, 'perp') || + !isVariant(e.action, 'fill')) { + return + } + const slot = event['slot'] + event.ts = new BN(Date.now().valueOf()); + console.log("OrderActionRecord: " + JSON.stringify(e)); + + console.log("checking time : " + (Date.now() - startTime) / 1000); + if ((Date.now() - startTime) / 1000 >= numberOfSeconds) { + eventSubscriber.eventEmitter.removeAllListeners('newEvent'); + eventSubscriber.eventEmitter.removeListener('newEvent', (event) => { + console.log("newEvent Listener removed"); + }); + + + process.exit(0); + } + + + + const val: WrappedDriftEvent[] | undefined = mapOfData.get(slot); + if (val !== undefined) { + val.push(wrappedItem); + mapOfData.set(slot, val); + } else { + const val = [wrappedItem] + mapOfData.set(slot, val); + } + + writeToFile() +}); + diff --git a/examples/price_stream_benchmark/benchmark_quicknode_raydium_get_price_stream.ts b/examples/price_stream_benchmark/benchmark_quicknode_raydium_get_price_stream.ts new file mode 100644 index 00000000..30248ea7 --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_quicknode_raydium_get_price_stream.ts @@ -0,0 +1,93 @@ +import { readFileSync } from "fs" +import { + loadFromEnv, + MAINNET_API_VIRGINIA_WS, + MAINNET_API_NY_WS, + TESTNET_API_WS, + WsProvider, LOCAL_API_WS, GetPricesStreamResponse +} from "../../bxsolana" +import * as fs from "fs" +import { Type as GetPerpTradesResponse } from "../../bxsolana/proto/messages/api/GetPerpTradesResponse" +import { Type as Project } from "../../bxsolana/proto/messages/api/Project" + +const config = loadFromEnv() + +const provider = new WsProvider( + // config.authHeader + "", + readFileSync("./.env_private_key").toString(), + // "wss://proud-fabled-crater.solana-mainnet.quiknode.pro/e3bfb432b5b982fb3e296b8fd1ec3a2d91124d76/" + LOCAL_API_WS +) +console.log('before connected'); +await provider.connect() +console.log('connected'); +const filePath = 'raydium_get_price_stream.json'; +await fs.truncate(filePath, (err) => { + if (err) { + console.error('Error deleting old content:', err); + } else { + console.log('Old content deleted.'); + } +}); + +const numberOfSeconds = parseInt(process.argv[2], 10); +console.log("numberOfSeconds to check : " + numberOfSeconds); + +const req = await provider.getPricesStream({ + projects: ['P_RAYDIUM'], + tokens: ['RAY', 'SOL', 'USDT', 'USDC'] +}) + +interface WrappedPerpTradesResponse { + ts: number; + data: GetPricesStreamResponse | undefined; +} + +const mapOfData: Map = new Map(); +let count = 0 + +const startTime = Date.now(); + +function writeToFile() { + + type SerializedData = { + [key: number]: WrappedPerpTradesResponse[]; + }; + + const serializedData :SerializedData = {}; + + for (const [key , value] of mapOfData) { + serializedData[key] = value; + } + const updatedDataJSON = JSON.stringify(serializedData, null, 2); + fs.writeFileSync(filePath, updatedDataJSON, 'utf8'); + console.log("finished writing to file " + filePath) +} + +for await (const ob of req) { + console.log(JSON.stringify(ob)); + + const wrappedItem: WrappedPerpTradesResponse = { + ts: Date.now(), + data: ob, + }; + const slot = parseInt(ob.slot, 10); + console.log("checking time : " + (Date.now() - startTime) / 1000); + if ((Date.now() - startTime) / 1000 >= numberOfSeconds) { + break + } + const val = mapOfData.get(slot); + if (val) { + val.push(wrappedItem); + } else { + mapOfData.set(slot, [wrappedItem]); + } + // we write to file every time we get some value, to have the latest data in file + writeToFile() + count++ +} + + + +provider.close() \ No newline at end of file diff --git a/examples/price_stream_benchmark/benchmark_results.txt b/examples/price_stream_benchmark/benchmark_results.txt new file mode 100644 index 00000000..61697890 --- /dev/null +++ b/examples/price_stream_benchmark/benchmark_results.txt @@ -0,0 +1,112 @@ +┌─────────┬──────┬─────────────────┬─────────────┬────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────┐ +│ (index) │ diff │ trader_api_slot │ helius_slot │ tSignature │ hSignature │ +├─────────┼──────┼─────────────────┼─────────────┼────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ +│ 0 │ 7 │ 242185341 │ 242185334 │ '2gXiet7ywUM4Nzo72R24Jnj46uqPUuPQNswqQ4BmbPGGzcsuiNZS2fmWdX5nunrem4mu2G8NYCD6BAv66c92gmsa' │ '5TWhzGaYg2x3gFGxqDei6kPsT3jwkgP64eanYcfBMqvZfRXkLYuPBrmbmRossAPdz2VAruAwXcmucWxwja3v9RjS' │ +│ 1 │ 6 │ 242185329 │ 242185323 │ '3rM9YGA6i2Co7ahVsTmNSGh1qex9bLk4NSYLhkLBjvyvMTaABNyqhj9B913ZCsTeB7NahPZJyYY1WgQmcy8NSACi' │ 'AcMuz9MjcsDYLbSZdRVX89gWELFsGFE3LDqQiX6TPoBkM6VpKBpXMBiXoFyx6tkHCdidFVEjSyWb3PjdQhx3pTD' │ +│ 2 │ 1 │ 242185317 │ 242185316 │ '46LfA1udwwBCfaiFBuqv7wzBHTHRoF3hnhdUiaimZmiuuDD4Pne67r4BDTpiHsbTz1mFiBedw7qw7tQdCbbBN1gB' │ '3z258pnx48sUWHcR3ypxLd14JpopF6aUUp4DKAitquVpmzweufW9C73rnUJptLEM3iJVEsWhXmMAAWhdw7vGQDvr' │ +│ 3 │ 6 │ 242185328 │ 242185322 │ 'WQ9JRLB2hbWmDG1jv13RVpTnRdTTrKUR9UDDU9Qi2fVb9KJkDu1YYQua8MkRxhRFp8Bwxo51A4KYZZsNr785t6g' │ '2BooEDBtFFgFcp7vx9uER4KPQfVqYHPpyeXyPM6i97JbEwr3jgKt2rbJ9SQZNUpFDdbBGpzHyghWAF7aW6Ubimjr' │ +│ 4 │ -14 │ 242185328 │ 242185342 │ '5nZHMqAUYm4hWEZusr5jHbuMzaubdAkLHagYM8QypT5JKif1wdpXX1CramfzK3gL4cR12etATWQuU1ZGLLGgN8y9' │ '41bhh5jpxtcYPzSJNdAmSccoKvxhk7qi7zNQDpvU84wcXbJfqvYVCKMgfCnL1o3tNynNggcxrbyY3eaFUyPqpTkG' │ +│ 5 │ 2 │ 242185324 │ 242185322 │ 'A6FJtNLm2bXUiXz5zg3QwSyUgp1GDY1iwHBJfFoY8WYEmSwSQp9Q1hrxkXEw3hc95RuBb9Ha4W57ioVGVgJZKVr' │ '2YsGQSQddF3pjD51HLntBFqjaSXs83bUyTokGU3aQtdkUwxsf2A4RnC1nPfkRz6UHH6f1gffvbKPmrUjQ8aNM8k2' │ +│ 6 │ 6 │ 242185328 │ 242185322 │ '2vLgsp4swqwRL2XVA4DRPBF59BjrAbBJDprqUb6Jj8Y6L8K3FBKhXnhNxZBRAWcuwUthcvkZTt5kxT5fdXwgaYbc' │ '5w4uW7kUgUG1iJC5JQdNyhHt5EKaL1tV3kQrqwwP1VZXKHvVyXhhP1ERRvpLe7jmwSqvXpoFP2Tm7AXtHgoAvoUP' │ +│ 7 │ -1 │ 242185332 │ 242185333 │ '322ygR1daN6DSnc1Ly928ppuzdPs9Q7xrqGCneJs3k5ysQygftTicTQyNnsvcmLnRTKcFttUpabNx714m3g9yM1H' │ '3bkjwuwVtSfERkZsVBRvQ5o2HFTaR868NFCQsdPtW3suf8QVsECgNzskuUyabkAHgASzCCtapKUodobkbCaasqv3' │ +│ 8 │ -7 │ 242185323 │ 242185330 │ '3rfQdNRW8SVPULZdzJwYSm34SrSi4LQ9TE42e7qesoDywGcS1uCUh9mGnvFvEf1gMi4heMeFD9ZaARzbQd86mgoG' │ '55yPKum1MQg5r456y13MPnNx17LuUDr4TfKTX8cTQ1VTrUqZVzGQSJUBJPLWEZUoHNo6r7imjVevhqTqWChT47Hu' │ +│ 9 │ 8 │ 242185334 │ 242185326 │ '5Y3aEqKqtjG8z271DMYV8gEtZjuuD8Nuf1Mu6QkAoXfQMi87Fu5WoDwe9UZf2g8tMCsGz2DGmgSHYx6SdEJK6n9Q' │ '2vRVahhxD1KXAzinGqsnNyN2sJ1ju4W5sAotFCYPkd7HPDh7QEXEPfPzHybS75RFvsqrxJFcYPzqMCgKk31YUEEK' │ +│ 10 │ 4 │ 242185334 │ 242185330 │ '5WLvnydb3C1Z7jHH8WqQeGQdphGTzouXXamVPKgzFuMASaTXSLD4F6LWfVxcZqXjEyQzyioTmqN7nWZtsvcmP6zW' │ 'cietXcyTEwnm2Rv2S4bQZvtJsz856ZeMtT8nvkJyVJfwQNuFNJpBxetRuUigMcztk5XVrYDTwKdmEvrEXKyUVEq' │ +│ 11 │ 1 │ 242185340 │ 242185339 │ '2isakmQ6oonxUqTXTazxvqAcaFPa6CxH17ZQBZarTULZJZ4694cFV2nneJxYPXkEJpUtUc4E5WG1sChV8NFHCpAm' │ '3dXi9LFEUEDF2fSEb2Ke4k5FHToRvNMuwGBvvLjha6SffVWD24oE2MqRZ1uFnnc2NGaHzAyTv8ymEw5E6fYJivjw' │ +│ 12 │ 12 │ 242185342 │ 242185330 │ '5WkRtS2MPL1uzCp7ZNWkMy9WyrQ1ziPMrYnr2MDwJ2ZbAifRrKKBpoF7fh45L1ir7wHWsxathbdmigeNXPgJvuj4' │ 'ctggxj4hYGRUJDqia6q22CZdEgSSWLspSNE6UwotGffqAJ1MuqALLk6qwsFowquWEUXibWQSLHEnoLRnsnzge5k' │ +│ 13 │ -2 │ 242185337 │ 242185339 │ '5GkUhbrRvfEgWzNuYMcoXA5kNzFmfpvnm16NbSDsbQaiDXvDEvC88dKEpo3xbFp8dZqnv5S31gaNy5JpVb72UGG4' │ '5xhoJ1MoF8EkX3dqgBWMNu5wph1L8zB4RUU7Q4KEwvSGNqqZmmsa864ebVnBFYsTaFMxBa6BTRoEywcnLBFGwKZX' │ +│ 14 │ -8 │ 242185332 │ 242185340 │ '3T7qoQ9YoBPKtw78HSgFkdL2LpRgRiuSUxm72URjiE6Mv9XVUKrLYLRYyBPgybiL4MXAHUu1dRNuCtAVMoVfhz2q' │ 'S9vcBLGNsHRd3ySxtecm9pVFJyWFhTtrvCpn9RBGWQT4F29Dr8R16oN3f6DKLkr8WSzJpPneiqKCy9PrTgVyRk4' │ +│ 15 │ -8 │ 242185335 │ 242185343 │ '3jCvwaWBsued3NPsA3vACrJ3y8udaHFQCy1HzXrms5RWF89wzDrfyhp8xqyRmejPRXt4gsZtAAGvrC1JgBzQzJS7' │ 'TGvUBqrfQFiMt1YUAiroWSFR8LSG14bAPPjMJkL6cZxeaTBHEk6AdjXAUpFkeiHUfJNCWLjyPf5LWtz8RaA7URn' │ +│ 16 │ -2 │ 242185333 │ 242185335 │ '2rHEaJt4tunZYeGDCakAfr364PhmqdgrD4c94QhC8aVqYHxhHmSaA9wr35LhN33U4HujYFuoNtzhYDAsm7W2hqBN' │ '3HGiPQUSrPd5sktRAW1ZxHRPJRbDE5SDsk9L922tsuotsdWEweQQu7HtUjpgVbcSmNALK67ma4hnGFePRaMvu4e9' │ +│ 17 │ 16 │ 242185349 │ 242185333 │ '5QF6zvea3jieW3tLnHsha3noayZYmW9d1JKRohLUZehSVheTDXaRhWxa2y2GkX1VeitvmP45o75gTVa1CQjNCLHs' │ '61F1zGSsjvJNavRMLBwV2SiTBnP21RQvGSPmsvBiF2VRUZ4E6WoyiXsBjdoK5gupBuGTSmvFqZREsQzzPRwtXemx' │ +│ 18 │ 4 │ 242185354 │ 242185350 │ 'Vqri4S9Amg31EAaok2JPtNdxaY8qcaCVUywc8ibsnc59QzxXn41oDXMWwS7CTqgh8Gyah78cb13WgFDzZsxHPZ6' │ '2AUSYULMaWv8HVGVdSswweKk4WwLC6Niw3zfZFt4yMepmM5R9DzVLEkRYep6e7eLGTfPKi9moeTHbXYuzakkrMUf' │ +│ 19 │ 8 │ 242185343 │ 242185335 │ '539Q7nCNsnKAJcshhZx7QjQ2kmFDqaFUrSqRsJWJAx4r7tFJwwSvSqLqUuC3BfzEDorHrX5TuoAtoo81dedFxHod' │ '28WTXNsTbtrY6yQ7xLSZLPJyFx7cB99rJ951o6vMJpedEbJZyz4V6DhjZLXnG2Cwbz5HsLGbizSfT7aL7HCHaBCN' │ +│ 20 │ 2 │ 242185336 │ 242185334 │ '4pQzhV7ueyTb2cYfXjo21HtGaqdtQ84ytRVHgbBEc684C42yxJWJoMpenWaaPHod9igDGS96FyzeULVyAHK1puxn' │ '3YyTRvY4ELFP53aiAJEvXwJMbm15km4Kd5QABtbXNKZWT3MFSFaA5CMR17aG9MzekB2rjta1EPzu2hxkRn7nnH51' │ +│ 21 │ -28 │ 242185335 │ 242185363 │ '5Wp5EWkGV3F7KERwhL2ZLaQnW63de5HA4Y81x32Go4XdT2RHNTqxUuadQZFg9mxsXd3JmsUDgo6siigHWhwa4Hgj' │ '32sg2g7j857mYE74AZAEn1ycvoHGubW9Ljj5PNQAaCgfPts6Bz9yZo4qMbwriiTSz8tP7xSZ1PrUbu4MVgHZdxg' │ +│ 22 │ 7 │ 242185342 │ 242185335 │ '4Dnvf9wzmFEhm7rKefRABKbhq8W8mEaif23YRtYX1NTt4XJ8A7KcbW7rjUq691zfQeDLZPxERDseqbqNVNgGd3ef' │ '3FyKGjqzsuZBqBgQoCEFfZqLmUAMtUwC9Sj6vaRa8ZR7zDGUtpaZjh8tcYanxVqbGHjqGYhAvJ2y1RrnuZCTANYZ' │ +│ 23 │ -5 │ 242185346 │ 242185351 │ '2f2tGZ1AdtRq1EBCDLPXfuHbiJHmdNpmGcWLNfyesQyaRteYJVxhu4npJJj9bLtAb6uwHaz6SKdhTaifEaPhGaEX' │ '5SjzSGQ2qYodBMUYCNffSU6Lw9XkoCFqHDCj4zqp67rsCuZjonk16nBKwU52Fj5PZYc2u8hc91LfMvkeWDqvvUPi' │ +│ 24 │ -12 │ 242185344 │ 242185356 │ 'q37HhwUqNYueTWMvxojLeEYxZGkRs4GpRdJBMZ6qw6AKzpr3bgKwc6noyEDe1nTh4vKLLUWh25hU5BqoJwDjy4h' │ '5FAmhoQ8Ha3rRUe7frFDKLoYeNmZX4dt1oHXqLoVXyBXByjQopntE9f84c2Hut2HQa5sJoH66QpEVo3YxHp24oAU' │ +│ 25 │ -11 │ 242185347 │ 242185358 │ '4phT7DZKbP9KpdbxM49cqRyaf7W7ZXs6YHW4jv912bUt3M5zgz924QbWeFPanYfxsgvYAT8Es6XNCRHQq4hsHjyL' │ '5vGJJe7uhjxCtkZfK3iMAFZSpa6GeAoSgSChKijL9BxF5pgXtxDK31ywSQZWokvwDmYW6qh6Y5YgTbE9vmH1y3iy' │ +│ 26 │ -4 │ 242185337 │ 242185341 │ '35d21orno6SYKbJeGwAD6jGi77QvD693pysgEhFcnwUCer52urpo9nEX1Z4QbHTN3GhG3dohcvhGoxZebNRSiiXz' │ 'wUhURK4mPe1wce5ZgTQ4P1SbhvjZasQ674p75nQTQSFZvxpaFBCHe1daXc1Ygu96tFoHULN2YoSEQg1sDY9AQ3G' │ +│ 27 │ 18 │ 242185361 │ 242185343 │ '3YBv38bNY29mHKBQNPi2hTGVUTtRGTyKH5X6ixn6iky933PuamA9uZiGMFU17iYrzQXxWF4z3Wp9TNwF9LzCNDuu' │ 'tQgZFviPamr9FRQ5PNKfmRKopYdNXKFNff8f4ic8y7ZAntDcvTPPp3yTLu9WP5JfmiyVvcai3vG1ikCygdLjmpo' │ +│ 28 │ -4 │ 242185344 │ 242185348 │ 'VJGpQtHyZp2bbmDmkjJmuBWV1oBvppPTJCmPmt2nPaqQ2TrjrLxfXCQfVe18uA79tZmzwBwV7J1gFTUZH5bq9SV' │ '3irKYVZUrdCG1hRWKsgZGmiaGzq1v9r1XgQWTaNX1YLtEbPMmwcAyyJKPAm3GkQ6LfG1nAU37ge4G9A7kUHgvMZ5' │ +│ 29 │ -3 │ 242185342 │ 242185345 │ '2i45VirWjGvgeHkgzGQ31thnPry335mSw9dY6NrjiXyQJGotFF8vNfQb5anzSHxtrR9g2x6ZKQnWF4WrvmGVZaSP' │ '2wYrDtHpMTtc37Dx1Kbo3qMZyCC93dJYJCso372CxWH8k9o2pjaFPNXthX6BkWwxX4fELjwUArDwUPxSzVqPoTrr' │ +│ 30 │ 23 │ 242185362 │ 242185339 │ 'Deb7aKF2E1s8NdRmE1UUocSUEzart66VjbHNgMZjQtZog3jmpdXtixJe3bE1S3U5A5rSobperCQ3g8yXD9nHej4' │ '5QoVK6Pi4gWFvCdiimyuSH3VETSSguWqkhCUkA86RLi7Gm8czPjgz2qzBWJzZtE5vSpARp1wYMhebHJTSpXMJUwK' │ +│ 31 │ -17 │ 242185337 │ 242185354 │ '3AvkqRq2wrzxjZ7yeS89NNECidAH8DsVjQkHP3xaYN4Seo2gPDgPaJtjAJwLkwQDaHRXUbvwRp9HdBhfxtqDjFec' │ '4JF4i53LSq1JHQXn4669kATVpwCmLgd5mxfecyEnJCvUfHZ8tLvCc6VuREmCrdsy5vMFwuMDWuyFQXgwRgqJruAs' │ +│ 32 │ -3 │ 242185342 │ 242185345 │ '4zTWXTnCMZTuaunehzgKruG1BVAjN2bP8pLjQEkDmaG6SbPtJzZoYDxL8JKvGqEujotGyEPF2sdWnMyYA88EziJC' │ '3Nx9wwS14nA4VWS5qDoG3mAqxbPBpE6RroSMdYM4kRQ3AzFUiuebBs5UQLrqFeY2FdMFhxpzQwby9KnbwGSRXbCo' │ +│ 33 │ 2 │ 242185340 │ 242185338 │ '5yv4DY8ZA384RzEqaxk7PSurbo6eZbKPL9h2PqoHnPtCJgJGGw73qyEjowduaXgY1zHJBgWhniBLX4Z4uMq9yLPZ' │ '436a8gEknvrj9yWktrp7XCyLdBP1j1ZSyUhWMrqbxJrCeXqHVTdm8MxtsPw4MzcnG26xBwAVsCK31HNTLAE85tT6' │ +│ 34 │ 7 │ 242185345 │ 242185338 │ '4HfS8YaDnwvvmmakFY1AYfTfMpP4evQCsd9rLKe5zhVjo5xiwJ1uNy7fqvw5WcBZw3Z6pqFwQ79GcQ2qBEZoL1T6' │ '4nT4BCQdBvK3x7LKEph11dwv1DeFBxhfsLcgrXet2uxW4ZxH9Y1jx3GAhaCNMpnbhVbeFq5Udpb8k6eyMGbi4ga6' │ +│ 35 │ -6 │ 242185342 │ 242185348 │ '3WSgxTUDXdgEtm7zUzfowUUZirkLfDamT8M28nWC5t6av98ta5ZqfUwcLDAJaQ8B3UR6zpjx56JyJ9YRsaQMa85b' │ '4oMGnExn5XoxDFtA8WsYcHbEJcoHhkPKB1w8CKJUFD2LUdWPBuJSEbps4UGvxvNSTS29kJ7ZBp2TxydNDMDbW6vr' │ +│ 36 │ 0 │ 242185344 │ 242185344 │ '4vppDuUrt67cBRNM2UdChU51a6uhBnVCNgQ9o5BbewwnbiT4XwqqUETuabUG9sobXxdNcxzLyeQtktfsYUDUE22y' │ '2YBP2VU9LkL1xwzj8TcQ9eWD2DKTSz8nkiZRpq4gGNJJtoJ765LPLwaNvo2XVd4tR4CH9SzYoQFhtyQrzsaFm1ai' │ +│ 37 │ 11 │ 242185350 │ 242185339 │ '2nAfNNVwzwzohDGNMgxtEN4V434iZjLNNg9L7fAiyknMGHCshDVyphwEG9Xk577aVmbxdvehHZSVEPX1TVcLZEzw' │ 'fFePCSYiRK8UGmUCEsHWbuQR5TZffd8wy3mvbepLMoodLX5cmrKev48oG67aJWV735ENTdbnM7ZqnZKmsTThNGE' │ +│ 38 │ 9 │ 242185358 │ 242185349 │ '2JK4V4s2JE3m5i699Q1QFNJehzukUCPuHzTrSeDC2Q65ChxFAqRQUirjpuZrvwvR84GFMUa8WvWG2mowHPU9hhUp' │ '4MVua6nEYQJ9Mj3bGgA69h8ziun8va6PUqsJxjSLyUY1Ypph3kHB38NReTTzD8Baat7jFjuNgDU11rfuHyVn6irB' │ +│ 39 │ -10 │ 242185349 │ 242185359 │ '2sMYQj85uBBJandi3NxhiuoZPSwgYjqe8RZeJcTrWL6Lny9kFuL96UhDqMZd8M86onp2GT3NSAMXAVWBfmTv4RCc' │ '5Ctt3xwQMKoid2JC7tiMPo1bqg6RouMEK6ZBdAT5uEHGY1DDp41wtN8E9BMrPR4rshRobEDGhdXg31gQLZF5cKj3' │ +│ 40 │ -13 │ 242185349 │ 242185362 │ '4PQYKqQyNLvXBNANqSDEeGzCCShbzLWubpqjo9146MPk4jS77Yey1gb6t8PjkowavDjHWFouafhgoApDoBzn5TbX' │ '3ULqL3Ec24huPJF4RANoRgS6zR8DZf7z9hezLGYH2PcRxohn8qQHwCs9BmmXNSrTirAenu2Ppkz8dNnnSaHpVJW9' │ +│ 41 │ 10 │ 242185361 │ 242185351 │ '22VT7cFQ1jowqVmo2vBU1grE2CFqVUWQ3vJU9PDZ3o17oDqjfyME9kQbq2VEmwAZDvMT8CiSXB1bgEUgMUmbACtZ' │ '3xTGHvajRh5tUF4XsDtT7gMRmRemd9jmPALj32v5PDot7it6kXpvC2LtebMMyAYpqcGjPnmJWahMspeMpgLTZFQK' │ +│ 42 │ 8 │ 242185358 │ 242185350 │ '5KDjo4DwTrWraacgTGTv8QvMJpJdLQkpSk55XJPQbZdZJysPmwkv5SssX5RrLzJYkirQarrdvLpzDdQNuRVBx3P5' │ '4aLmkksuvUm8Cer3vthXhzmC693kk31MvQRG6sbKpzhyuCLYjkiAzkC96g4T91jZpieYFqYpAteTFhdwPW18hZ86' │ +│ 43 │ 7 │ 242185360 │ 242185353 │ 'caxxtRgU3wn3ENdD7WrzCSkBR8fWgQ12Lu6bEXKgFDzWgsALm7uauynZgVu2CG76Py48NQyRf6rgC5FZQUPBKgN' │ '3UC9PwZTwo5MDnTBphgGquvuaGr3F25n4FLVccTafnSngDQ3rBAPCj4LEdxW1oX124tAwVo8ay5kMpNVxKmrUuDt' │ +│ 44 │ 7 │ 242185353 │ 242185346 │ 'oinmpP3kqFQiyvPsPJBhYbgcKJXkAw9ewUVHqWvn1uA5gzWLgPomPjVjzt6pkUYHrDkHU8kFNdCr66dSaWGKTHR' │ '4EPht9yX5KRx778eAv2UQCTGYBxVjhReH7NS5Teas6rDT2dzjLAUzTk5G4o5TzpU4ZVQEUqZWjdBN9TyQJexpjGC' │ +│ 45 │ -7 │ 242185351 │ 242185358 │ '3qoDP9btwqVDqBRN7HYAHUn75VPAreLsoMebp9SgGw1GzEiYb9gh8kS74FxQTF4dU5xeQ1TTx32g5UUmH1DbTMsx' │ 'guXSuqRUnYArRh27MnZfS4Hizq2XSSE7JFyEQt9XTnQKt3H4mtwhaACSEcCc1YvzjQEbrY8nzrrGCStbe3Cb5uo' │ +│ 46 │ 2 │ 242185351 │ 242185349 │ '2uq7rieiqvrsXoz1ZNusgvh9j4ZTpaF3dP8hfAbvgoMGm9XtezZQVtfnE1xANczbd3QJ1DEezaFRRcpxywPQF2mF' │ '2iRfSgcCbpAn2h5Bwe4EUptU5DVPzv5ZBKeQnR52wda7ZMUezoSqPKj3s8jzx8Brt82EeoQoZx2BJVvLHqqPDT1U' │ +│ 47 │ -18 │ 242185346 │ 242185364 │ '2THA3ptGHPkJ8JDgDfsFG4dWr8vnGVXpeYJW2dcRegBjkxErthZ8U9FoBiiUemPAbNK6QLBUQTUvKPQM9rQn2n5q' │ '5ENYDSDK3QEmt79SYjL776hdxszb3Qdwwzs8FaPi5mmXr91tZxhc8hEdcLK6GH3RNPvg7rRDWQTk8tuZ5QLodW4i' │ +│ 48 │ -6 │ 242185359 │ 242185365 │ '5tvFAWnz9Kn3tci15UBChduj66Xyw5zDtdV1bqEeP32HJkos6yHp6HwfbkoDzJKsgmexvjqYpEU9bd9R2vfpN1ZP' │ '2WshWdCfAd6M51igJPcL7FUHbtHvsLEfRhaHy2A1LWn3QrfwitY99dtyaDh3SGoXdBBs67T8teEdXSxuiDfYwnhA' │ +│ 49 │ -19 │ 242185354 │ 242185373 │ '2oZSJdic2fUJcLPTN99MDWDdED1K79fLCCRGzVvXQpW2gX81GXbKWuh9jWp3wn9zFZWA1PrKibiTfthANfsmxAmn' │ 'EsrYoR8D3dCBuPMv1ZHvTuy5PknyEk9k4ogNP23cTX59ze7mLAJVCWCUN9Umtfc1D338ceUVk8Sk1qNLfZ1dbxg' │ +│ 50 │ 0 │ 242185347 │ 242185347 │ '3XMtoxGjuhDTQLdG29Keo6UAvPtEGajEhGM1i14TJkAALGebfncdNgReoWPsw7P7TK8StPeNqzNRqNM8rQMrFP9Y' │ 'pbtL4ChkCidZAn7moD8ocpdWoGvYY79CgQBCARPBZ7mannsTwdmiM3U2Gn9QJkgw7HtWKUyHb8rmu3Nxh1bAmDL' │ +│ 51 │ 2 │ 242185357 │ 242185355 │ '2dweAdgig1H37LDoT9fAydPY34Tdj5DM42veyarNhrpYqVpWhV7zSp9WBFFhTkS5mNYp2WmJyxq6hsnrktS5NV8L' │ 'cFqh9wLgBLPyBcnPdmPjVVrnk4xv5HxdmEY4TBr5Ftnx3R6EKjcuHfjMrmiQ3x2nDk3pZimgFkP2soVNrDbJ1EC' │ +│ 52 │ -10 │ 242185365 │ 242185375 │ '3MuQPJAn1CaHH2WtnSjmZ5rJMLjie37d8kKVC8CwUr9YKgnLutuwgs1dsfie4o3yhECncTf82ceNwSaQYgwYUb5x' │ '5NnAFvUJ14Z9uPSYf2WjxjQ1HLhT6oP7g15xggcgNtMqwF2CeNVyTpmJxJtYADgQazvpD7pKBboEJQozbUZ7yS8D' │ +│ 53 │ -5 │ 242185356 │ 242185361 │ '2a9JgcTqYPFppDc17w8LEbEHuxgQ7Gb7wbHUxomZMVKezMsqvra3DAy1Dy4BZ1iSmgZDu2xagsbz5UYCgTzTC7dA' │ '36HMzC1uZkJ8XE9DJ4S94PiHTZaAAhvmfJemujqdXKosug1mQZFY3ydp4Ebvqvgt7hhYoo18nC9N7RaydMT5FcVF' │ +│ 54 │ -1 │ 242185358 │ 242185359 │ '5fTrSuWRguTfH9r2YR21hDYNFJMU4KLUQBawD6J1Zuu8DiNY2PnzPSNqFATPkWtfUD4gYAMK8wyAutuB58Fc3HHb' │ '258PsKoA8Lh46h1UCS3iK9uN9VPKnji3joDBnN3FxQuSsxRubkTRvzFLyNzph4xCkofoZRHz7RB4uK5ZXPVYT6dj' │ +│ 55 │ -33 │ 242185366 │ 242185399 │ '2SrHLzFVygrEX5kHuYdFVV1fFwr59Mp4gEa9RomH6ymu9XG7BVfdAQCsj5dsCxYZoYx6pRWzv9Kn8n7PYWjhfCPN' │ '2j2QJoMbaiea36VPJBuWLqx4sdhHMFLThqVaV7cASzy36mpuka1s82DMiavEiNNES1sH89m7vVcyZtrJc4h8U8vW' │ +│ 56 │ -11 │ 242185370 │ 242185381 │ '3tzgE3yTCgfg6EztCtwoaA9qJpDVYFgLzKq1HyXV1bP1PyZy5Sn1881jXihm9Dr1Lp1hWjryPG3h1sYznADzwqY5' │ '5WYt2JYfEbVwHDv6q8krC1xFKGMRhTgqY2k3BE5z2CC3k5D8brWQ8bRkyRTYpmSTG7dxsibN3HFQBWtASmu2NVpT' │ +│ 57 │ 0 │ 242185372 │ 242185372 │ 'BoJyn7hUuvqLstQANaqsjDrv4fYXUWmLatCf9is5jyMrypozEJ9zzRHbh9zFjr5uL6NLtnzyPiAo6kgBca6rBnG' │ '4DAURCzFu3EwfRCgbQQsNXy5nf4vcCRCmFAu11rZLtvinA1ERAsSGvyRM9Ugz27Fb411NiNTmtzTg2ZrxfigxRY1' │ +│ 58 │ 16 │ 242185388 │ 242185372 │ '2c5qQ39TcjE16AWi9jJ8UCuX1bxpgpa91FqrtTiqwQGgNbjTq5TFqjWAKpzgs5dVP8srK41pWXAwSwAJ1C2awHkr' │ '2brnzn1q1c3x5jQrjL1CBu34QZvdwaWBQHZrV2TFZnmuCKnqEhY6D6VWaDGo7SUUCNCpaAYDUjWJ7xZ7XXCpM7tw' │ +│ 59 │ -6 │ 242185376 │ 242185382 │ '58DHDJGxKqtPyFwbnkC4z28siqankdX2oziWuxAjwCz2w4gCZ77wgoXaNmt2iEi33bVxA2nnBMxUh45d5d2q1nPS' │ '2hScHLapMVZAqmzJwq6Eo4JHe45QeAibRNVHNnaR2g7LhAi9e9XPBFoGxfPYZ3npaDEKsBYtT5bPu5pySiX2MFQr' │ +│ 60 │ 0 │ 242185372 │ 242185372 │ '4hBZ2KQLK9hCTNWKU5gbnwruJaEHdNHhC1WezDFzgGJnUmz7AEf47zJBPyNG8ftGzyDyYFzDHdyAmwa2eAR9LZnU' │ '2DZTVMfHLLaztUmfgyu2m19FTSJHN8YdtRsGomD2UwN1nVxEMTYApoLGU5o2Fq2LqUBUPSmcEyjmAtAojKHxNj53' │ +│ 61 │ 4 │ 242185379 │ 242185375 │ '5dLHWysa7hh8eJq2gR1RdVzVFK4vEfk8ywudo3mknzs6gdf1HmeXMHC7v1GCnW4yDZzNBmBiFZEpC9UyTVuZAt9i' │ '5ebVN4tX4PeYAJU5f87eRLnx9jo4pPziBeuWTjMrs78inW4z3BakDD7mJrdQ4XpWk2PiVx8C2ErQboWkVaSdBPQC' │ +│ 62 │ -1 │ 242185379 │ 242185380 │ '5F18dGfw4kENGdd2rnMx1xuqB4aYEcCbFvmaEQcUYAT4G1caLe7FjYdzeeeksW8SNXUiV9f65QztQtNDWEYs1uBq' │ '5XGop899X9Pom9gdZDUn575Lgx7Kh8r7jLymU6yMjvzUj4KcH6a3e1PidCuar7MdvgMrBUnZKqh5BgzLWmsDFsUy' │ +│ 63 │ 7 │ 242185400 │ 242185393 │ '2akfYmRxptgCx19NWS2Sbgggvmu7hofpBApat3kb8HKpGvL8uJAyiBnSY1wUmV3rkcKyo8h5xTL2U8rytfsniKmN' │ '5Gx3vz9Wu2eDSthywn8LZfETaq5eLKb8ZAwvTfLkmZy7nGBzTyZYSRzkeeZvPnSVND6VQFGxrqadFczdmoM9cFYR' │ +│ 64 │ 8 │ 242185383 │ 242185375 │ '3HzEBoGctHpQDz7kiU6cwodgSgjRgg9eq5dwQJnCjF1vMbHWpGBraSHDzckAkhhgPJeeeK8rbSy2nfdG2rnuwWiU' │ '2U93AsT9yCLW52KjrzswyAGr8ZitsrbLnifRBFdXRQ7NNjVPKXRFV5y4hUuWmtnBH84dGpfLUGFBrsC7u3YJgeu1' │ +│ 65 │ 14 │ 242185397 │ 242185383 │ '665Pphpsv3qUthGSDQwKZJjgBNS55PBiq8SSRPG6dcF3FZ2WtdTuLpaoaiGxiZSBspb3WGwAUucbHCEjDyo9zEgt' │ '2eDbAPvBEu6EkqQ2U5FczHea5nmJagGvfV8x4PfSPQs9ydTwVXcjgT7hwgd4Nea7Wc7oteozQdQTHcJh6WQACY2E' │ +│ 66 │ 3 │ 242185379 │ 242185376 │ '4vYjQLFHJAh9BheCee2UPXSkZf6Y6ScrdBc2C5JNooV4yoMrsK9Lmu5ZAEPi3c4NZhBbku1SminoUrQZ3JakVPm1' │ '32eH6b6PyPXmk7yvL5XThrTpzW6uFMkvsezuQLquZHuLfHcvGgDBBWkpLDtTrzV7G2Wb9iEyH2jqFfczKr2jcWTR' │ +│ 67 │ -11 │ 242185381 │ 242185392 │ 'Axqr8GD8TVejmPZni5F2G2zdAkpmovpNjmbX7WMBPaXLRw5mvnF52brDmeeVBogiE3pZf9yqs2hRH9n7bYVv6Bm' │ '5mAzsvNcYn8H8VPKw43XmFJxJMNt6umF1tSZ8QBpaU9Sb3y2EJvhiJiGouQfo5MaZzFf71Hhp7NDg3WVUkiNXQuZ' │ +│ 68 │ -2 │ 242185374 │ 242185376 │ '8Xs9J2qnUWxN9Noq56W7f3HzR8uYRU4ajR7UeKvufirWWshLeVjcwKfjrWkPyfCsRtcMxHXsF3YYuLtPgaun6WY' │ '2mHqiRQUE93WZG9PBBzfXuvp3PxJgbaPnqHBK4zZrS24xM2qkDGxyzoQ5GmZy7nDsTwpr33ys5rZeB1rDo49PnQf' │ +│ 69 │ -23 │ 242185375 │ 242185398 │ '3oEjtz39zMP7jm7zJeDJV4CCetMzYiEFSWszkzhaJ9TR2kwrV9k8z6Piqva1HLmaeNbiqUE6CxWqPgibioEYYt9Z' │ '5png5i2Jqr25uxH8PKWd7xpXzFdpyCfWqmWUGxg7qDXTGwFw7C5JNbCtSmoxSC23WD5z2uxsrGzCorNruyGURvSN' │ +│ 70 │ -9 │ 242185379 │ 242185388 │ '57iDJiFEG8HjizkVwF4z8CnuMipMLfaEydzjWWSLHLHRvFNC6wA6YHnDfPsuNkQRTDcD4TiXoFieopbZmX5iadQC' │ '61uv222TK5mfk6U9uyQohSu5AETqXa93qyvhm71JcBjgKaP96HFGDhVvdnfXkrXtvGrAxWR26rebyo1dRnu36Mt4' │ +│ 71 │ -4 │ 242185388 │ 242185392 │ 'DL8AgDDUFNVtG8zvUFHyCUHg5Ktav7h5eweNM4zH1dBBA4FxwotZ4gJM44euezSbDHPbSzWrRhEMQ5yFGMg5pzt' │ '2cXqw9W87WeZY3LmPTqUT61nuBRJBGG39XwwRWNVR5wzjqM6qrzWTMyCcGCz8APuz18AfXeNFCUAeoqKSLaQh8Vf' │ +│ 72 │ 10 │ 242185392 │ 242185382 │ '3obEpL94gKr89Ed5cirLNho6YXrQU34Rr2t3Qzy9uyzPcXu982F8r3ANtcvYoRdtacU7hA16YTx3X7XG8q4tF967' │ '2GvZ1f7hQT1grMmjGjm7EcYaZtatqkrexFEMXwBXDaCfZ57MRWhJi78AC3yisN5GCC8MVsn8trN8EhvTXVgrXoQw' │ +│ 73 │ 4 │ 242185392 │ 242185388 │ '2Zrcduv7KxvD635qEg2j4J6CCkkff2o2tarkDgki3fJrg2bWxEHN8mw9PPeGiwNTisonaDtVfYLXC6ygqVsKYrXR' │ '3LSG1zgrX9f7rqquKseHhNqWyudWDFvBo52534XPbf2cWu57mgUZGK6SgRX9ijxBTsXXVszHa8f3baPSftMfdkjq' │ +│ 74 │ 6 │ 242185399 │ 242185393 │ '3TtCEnsNhUA2t1XJTf9mYNquiGRBVovpiZZLdsC3xHxBWdinsDgW2eQZiS9XUeacL6Q69RYX2UGm64GPtjWtHxBs' │ '9Kks1WdAS1nF22NwU8vmBWwrb7o3sb9Xb7C7G5M3LoBUeUuYtWr16vh42vWga8du31ZJk3j8hb2Fs2nFa1edh1r' │ +│ 75 │ -10 │ 242185394 │ 242185404 │ '3JAVyMpGGZHzR9uTywBKaFCKEbXm3cpVk2F7Rf2yDZvQsuQYkr8jQ2AZgFqCwJjuzziHq8Rabr8oMvrnv1GPASg9' │ '2fxTnKJUwf9p8Pfg12uyGXy8wbnG6iiDywGvjEfAUsZHTHuXuv5DTXcNzvaoZRhh7hGrsi4YZSyVoAt7h5PoXamN' │ +│ 76 │ -4 │ 242185389 │ 242185393 │ '42tWZdDakCz3dCENuMeH6C79KM7H1ys2DrX9jYMkeQCZHzgZ3H3pwzN7Uw9ZHrfT3D5KJmWhpAnh5xeBj7cYy24X' │ '61gG8gMCTpAq17bZoKC41b36BwpWUnM4NduF8ULmzyX7rH8ogVWz1xCJ3WS8mnaUJvW9K427sbdcgCh9PckKykRG' │ +│ 77 │ -27 │ 242185395 │ 242185422 │ '3UaE3E3ay1moPXevxVazYMc2qU5AVjko8S12Ma55R4znFHU89SxVu5ZrvWTvrMHGjpK1Qq7KoP7Numy1hBXD4GGD' │ '3cgLFL9B14zbW5H3MZqFFKQtLJqLGYeEcEP9WdHLB7wSM5BQ1c45JsG7Tu9xmYw1z5FHUZ1yJfqzYF7iNrn7s8gf' │ +│ 78 │ -2 │ 242185394 │ 242185396 │ '5nWqK3RG8imL2PCryS6uXqKsm6PdQtQxxwdgDQSdSiaXeZhMzfz1pyaKaX4BYoJ3vJce4BaQKFAgV18vPgMD5No6' │ '4uTQ3U1cXb9ZzPEZaYA2pjJyRnxg92xKQ4bpGesKPjvCxGWeh3Zxw9KerWiKqemdQSpxg4ihg2XQQmCkDe2RPELH' │ +│ 79 │ 5 │ 242185400 │ 242185395 │ '3DeQrNesCKwk1YqL3ocSaK356nho7UYR6592sn457AsJa2iosgUMKa8eUxia6nssocFy2uKvMtwYmwAU2zviP216' │ '5GVbah3Civ1CCpAdkrz6YeGx9PEUjv3T7p7V3HixxyQHQv1ntMsaqzyqf5KUGJv5RF2Ko8XgUCf6UQkkmBPFzPz5' │ +│ 80 │ -5 │ 242185395 │ 242185400 │ '4S3scEEKr66d5FAW7uai9YH2U4bGhoAKxJK7raPkvnKJpzp5vjYmzTP27F7RwDFo8rknPHgtpVXE6afjZjCYzSde' │ 'mZqkzAGeFdZ9Sz5Hs6CF89g2PcnSq2oukDiSDU2wdbun46tcidkcWGUyXMNcvien8rYp1csfvWdyjA5vvAE6zcW' │ +│ 81 │ -2 │ 242185395 │ 242185397 │ '3dL1H3Gi9Vb5kHaDdH82a9oMrNCD4aLnrNPT8svtRrFc5PtYDseoD2e1SZAjBAgqd4VSUvFCfd7Qh6iwFdGxnjZA' │ '5opBhNcEr1scSbHfpeuGGUoPjV27C3E4jAHMK1UwyhKNhqBHm8fiewJyRwsK1Xo6KhLAhqXF2iSxRLBBN857G78d' │ +│ 82 │ -1 │ 242185393 │ 242185394 │ 'TDecoiBoQQLSiVf3PwMHXYCvxKBtCaiwVCR9uEmgaSAs38nLshw8VUEZ8NXyBBi5nW86VyQ7CfsffxgGGfCXEXA' │ 'ZJsUT9Q3ukg67iDw7jZhkNtQZY6W9yKwAS1jgCEgUt4Mw9xa3UQF1A7gJi4ehmkERSx9mLTMHY2Y8mgsdm1S6gH' │ +│ 83 │ 1 │ 242185394 │ 242185393 │ '4AeGd2kbpXhN4hjhEAPAh3zTap4vGg3Aqfhy2d75YzeeKgEd3Q3xeSsyHzbQbR3rhypgPHdzjnPeXyu5uDaqwaiC' │ '49HauhKtvmNyrgxb9wnnsti2qjtMsuKSr7g6EyBPbUvd6V4cogFWwSow9APYf8G6PszRgQWgpaSBAAV58GPAzMk8' │ +│ 84 │ -4 │ 242185396 │ 242185400 │ '4kQXWiXYxW2RvJaxyiJHYeDCCJQbrVXCBzDi8iRmiep58onGMa6LBND4wpL3f9DDNFbkAYJ8h9T4w8dNzfPpyvhQ' │ '3FPfXwtasexEAd62n8tadJknBghfcHhEqviuTj8sEBx6vDYtoV5D3KyEYPM5Zzbmqh4xHwG1mA6yaYrUbBBdBK9U' │ +│ 85 │ -20 │ 242185391 │ 242185411 │ '3qW5MGmwPLAAig8PckWkMmw8oubLWhutqbK1mTAmKDWRmdhAnVArqxxRA4cyjWqFZxUP23cJKWWHViJnGYTDkqwE' │ '4qn3YftmjeNPsb1DM7mfk93DYrjtawfp96QLazZ3MwntnBXD72JKHQYzLDNk4SfvyDW79yJVC7qtJVLRFDyjRdxc' │ +│ 86 │ 0 │ 242185393 │ 242185393 │ '4Fov2bNpnxS9zAyyZtzrLvmPpsaFWkDqN3Rcb2qLnZPvZ4GiYDzMGexU9D4bzXW5xVpwAv113SJpnVnJ1NiA6YeD' │ '4dckMHQHuFQ594BhunVuZN2jRrsB3ZCGh1kWNTWANQg5MAs6JgNMhZm15Pa8JJyYRYyMLPMJoNwXUk8SZbfLg5Nt' │ +│ 87 │ 11 │ 242185412 │ 242185401 │ '56vUtMSTNokzbvvRQGfjhMnoAHodpXB73WF8fqxdxJsHNmUfF3X1x3kaD2PqU8gUPP1Zqci4FqLSKzqpRFxRUHmv' │ '5zQRqiFDXviaCTLRDSsdbP7c3CrWFM2WK3L7brxrffDeHrwnMGCrKFQaKRPu58JQesJR939SQCdmGPfDCygCAuSW' │ +│ 88 │ 3 │ 242185405 │ 242185402 │ 'ehQEsLEVDKndUwTeeKqVbd6UFSRC6mdqmmhhGV6y6hUbNB5Mcv6kpLf6bd8HbuUthYMWWP6K1byx3TKr2cm3z2X' │ '5Q4ZqgJa5ZnQ5BVDF5TJ5rzZsFWQzTvqkCvAf1WDtcNbXPtt6VrtbEJG19coGNcvdY6shkUgHJ1aSW6HWB7vDyYj' │ +│ 89 │ 5 │ 242185406 │ 242185401 │ '2xS8debcdpJCmb2MxXLyWd9FSQiSZ9jE5PzER4WgozBwgcTHxXs1McMgtVD3L4qytZVfB6AZ3Fg2RzyVQ5giCUAG' │ '3ncEqG899ovKDRqKhkbWctbkr45gVamJxzttbGh2LB124tZvPwEGuaRr7XCpSQumaNX82rQEvcfmq3DCCiMepso' │ +│ 90 │ 3 │ 242185407 │ 242185404 │ '4UasiZTWbyAe2Dv1ifheJ1ydKspnsUHmPoTWee6bbzJ1ZWUZZzETktGzAWeVcHgRgebVWUhdyMiK1HGTLn8XcG7Y' │ '4Zz1Mio7ZGGYzvmrLajdndBJyytaHPh4P8YNcmK8Fk8HMibRcrzEhRvvseQYmG7XcqD4qJoscTpmo2LBhHQnHTjn' │ +│ 91 │ 1 │ 242185408 │ 242185407 │ '3fTGu2ZJ3GGRZKFPdydoVfcB4sPhAZuuETUWG1F6vBV96PSSq5HVLLyJEgUVBGgvXSGQ2TQqA6Zz8y3Y58wn6dSr' │ 'ewU9Z1XxUsuvd1p8Vv3oviSpjzrKcgbodK3ju7XM74PLmEFRFr2g5fAyHV8FaSvP6RuKcfSq8pUFv6ZmooK2wXP' │ +│ 92 │ 7 │ 242185413 │ 242185406 │ '2trAhaSuVZhrPSnUmnUzJ1fTFT5Bb3CyFq1D2Sj976TxjnHncv5TAMHJFEn1zkj7WAkDnHMv2Po6aRQuKXm5Z1k6' │ '3N6XB6AsWyZGsfCUF5vahsgSciNy8itiEi6eMXyJcrT6wPaWsHUmRR76iXcJFbmY16fC49hxHBXbLhx5DEWPKKz5' │ +│ 93 │ 8 │ 242185415 │ 242185407 │ '21VzU7BzZ4Le8ipg7MTQd8fTmBX71XeBk1UAJTsFb5ypMJ4JjcsgAwnhvS3dcnyZ4JCoCdCz9Kr5VfNc8yuf16Nz' │ '3yvayUbc1KerbQ6xG9cNGkCEGMGKXHstNRLBztFGD5W19Z7pc3Gn1EaHjJjGCbV4o3FQo3FFFdcSRbyVh7jEP3yB' │ +│ 94 │ -1 │ 242185414 │ 242185415 │ 'bmATokbbAfr62DyaHtD8Rj2wNMJ5s6B6ojiB5kLk7AboTnQA8DnwWV7LSRgjDynm8Z4ogYsRf2PARDGypX5ijux' │ '3Zis3WMjohfxLPNE8X7rJYdBc6264i4pNFKiZN6EzJXc6u8zhMmDq6CU9qEfi5kc8Duigv4Ho1MpVU4D6NP4k1WE' │ +│ 95 │ 5 │ 242185413 │ 242185408 │ '2t9qecUihR8Xux7n7WPrpsZDFhQ6nfPrC2GVgk9uH9x5jt1B6whFgy634TuXrtSiaMM6M2D8B1wg8i2NaV54skc8' │ '4sD5qWmGopvnw1iE5gXvLTGtN8HRTpZLfDdSdqEcDtEdRpjMa9GrWwuQJzcVEXbqz4FTciFXfJYYze788PsEqGiH' │ +│ 96 │ 3 │ 242185416 │ 242185413 │ '2sRVHrpEvXMCL3ma42WoZG5mzC2Uwo5otLARjA16dpJZ9nvzbq7qsp2GKc5B9JQWLDU8d3basyvxcikxdks9aTfX' │ '2iJHK1mHrq2Fbfyw6Gbwj6QQqLTC7EHcKBM7Ywk9Q1jmfnoahWTGdGF7fb2CaDVrwiw1NMTP68jXh7qCkShz2uAo' │ +│ 97 │ 0 │ 242185415 │ 242185415 │ '5V9ADm9KxTnwov22rGpgtZZWfnp3TmWyhYmU7wiJGnDaY2u8ZQoaN6FYnhUmMsxp3ntoLE79ozYvFkxZoVK6vsvY' │ 'iiGRANAB5Mc2bKfeUfKp4zKDNeHB7n3K43XALJoYW4NCGq6V5U9et97pgXTBqBnhWJJTrG9e1hGH9KtEPidgYMe' │ +│ 98 │ 0 │ 242185415 │ 242185415 │ '232UNyfzuvyfq4YSkRArCbT6ETPqNHer1bCfWJF27GtW3eoCTPEz3NoWr1iMysNYVSijUxWb8kydKprJ2gnC4REk' │ '3mVnvgN9pkv8diUNmjBEbJ8ckorHZZB1V7Rc4xyM1aF6LeUDsvPLasnixzXUnjtLjc5rMX6eGxeC4UkDFuzBDPbV' │ +│ 99 │ 5 │ 242185416 │ 242185411 │ '2RqZn9T3VBA4DP5iasWxeDsc9mYxdyH8cZtQA5tWZMXeGVDkoM2avghRvDKKjodmqQ2mDwCkJm88ZVgigADdMKpt' │ 'Aja5PAN15cFxxm2mfsEsYKJCvNTAXG85PohvmsB43TP36Gtzjp8WWdnV22bUXLcjnK2VFKFb1Ve4nseuizHuYpD' │ +└─────────┴──────┴─────────────────┴─────────────┴────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ +blx_win : 45 +blx_win % : 45 +helius_win : 48 +helius_win % : 48 +equal : 7 +equal % : 7 +total_diff on avg(block distance): -0.75 +numOfComparisons : 100 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 24e1da3f..e65e319c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "ws": "^8.8.0" }, "devDependencies": { + "@drift-labs/sdk": "2.36.1-beta.5", "@protobuf-ts/plugin": "^2.7.0", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.7.18", @@ -37,6 +38,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", + "moment": "^2.29.4", "prettier": "^2.7.1", "ts-proto": "^1.115.5" } @@ -148,6 +150,84 @@ "node": ">=6.9.0" } }, + "node_modules/@coral-xyz/anchor": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.26.0.tgz", + "integrity": "sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==", + "dev": true, + "dependencies": { + "@coral-xyz/borsh": "^0.26.0", + "@solana/web3.js": "^1.68.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==", + "dev": true + }, + "node_modules/@coral-xyz/borsh": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", + "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -159,6 +239,41 @@ "node": ">=12" } }, + "node_modules/@drift-labs/sdk": { + "version": "2.36.1-beta.5", + "resolved": "https://registry.npmjs.org/@drift-labs/sdk/-/sdk-2.36.1-beta.5.tgz", + "integrity": "sha512-PFoFBWR6GL+NYvCznJbwuvyaZPQFFlTWGh1rFWfIOsIxWZ8gmGSAaRhlxFFNo84kxXYzzVxHhyemHK4HGyRlXA==", + "dev": true, + "dependencies": { + "@coral-xyz/anchor": "0.26.0", + "@ellipsis-labs/phoenix-sdk": "^1.4.2", + "@project-serum/serum": "^0.13.38", + "@pythnetwork/client": "2.5.3", + "@solana/spl-token": "^0.3.7", + "@solana/web3.js": "1.73.2", + "strict-event-emitter-types": "^2.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ellipsis-labs/phoenix-sdk": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@ellipsis-labs/phoenix-sdk/-/phoenix-sdk-1.4.5.tgz", + "integrity": "sha512-vEYgMXuV5/mpnpEi+VK4HO8f6SheHtVLdHHlULBiDN1eECYmL67gq+/cRV7Ar6jAQ7rJZL7xBxhbUW5kugMl6A==", + "dev": true, + "dependencies": { + "@metaplex-foundation/beet": "^0.7.1", + "@metaplex-foundation/rustbin": "^0.3.1", + "@metaplex-foundation/solita": "^0.12.2", + "@solana/spl-token": "^0.3.7", + "@types/node": "^18.11.13", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^5.0.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.16.14", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.14.tgz", @@ -613,6 +728,85 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@metaplex-foundation/beet": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", + "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", + "dev": true, + "dependencies": { + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" + } + }, + "node_modules/@metaplex-foundation/beet-solana": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", + "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", + "dev": true, + "dependencies": { + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, + "node_modules/@metaplex-foundation/rustbin": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/rustbin/-/rustbin-0.3.1.tgz", + "integrity": "sha512-hWd2JPrnt2/nJzkBpZD3Y6ZfCUlJujv2K7qUfsxdS0jSwLrSrOvYwmNWFw6mc3lbULj6VP4WDyuy9W5/CHU/lQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.3", + "semver": "^7.3.7", + "text-table": "^0.2.0", + "toml": "^3.0.0" + } + }, + "node_modules/@metaplex-foundation/solita": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/solita/-/solita-0.12.2.tgz", + "integrity": "sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw==", + "dev": true, + "dependencies": { + "@metaplex-foundation/beet": "^0.4.0", + "@metaplex-foundation/beet-solana": "^0.3.0", + "@metaplex-foundation/rustbin": "^0.3.0", + "@solana/web3.js": "^1.36.0", + "camelcase": "^6.2.1", + "debug": "^4.3.3", + "js-sha256": "^0.9.0", + "prettier": "^2.5.1", + "snake-case": "^3.0.4", + "spok": "^1.4.3" + }, + "bin": { + "solita": "dist/src/cli/solita.js" + } + }, + "node_modules/@metaplex-foundation/solita/node_modules/@metaplex-foundation/beet": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.4.0.tgz", + "integrity": "sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA==", + "dev": true, + "dependencies": { + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" + } + }, + "node_modules/@metaplex-foundation/solita/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@noble/ed25519": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz", @@ -697,6 +891,131 @@ "resolved": "https://registry.npmjs.org/@pbkit/runtime/-/runtime-0.0.35.tgz", "integrity": "sha512-QPey6r26Dfh1gVfUmGH0qn4lhbH2RVRC7St3mnERISyT1Gx1RgBpGIQJs14Pwt8E7TfJB+a0Btj6nr6teUADTg==" }, + "node_modules/@project-serum/anchor": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", + "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", + "dev": true, + "dependencies": { + "@project-serum/borsh": "^0.2.2", + "@solana/web3.js": "^1.17.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.0", + "camelcase": "^5.3.1", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "find": "^0.3.0", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@project-serum/anchor/node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@project-serum/anchor/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" + } + }, + "node_modules/@project-serum/serum": { + "version": "0.13.65", + "resolved": "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz", + "integrity": "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==", + "dev": true, + "dependencies": { + "@project-serum/anchor": "^0.11.1", + "@solana/spl-token": "^0.1.6", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@project-serum/serum/node_modules/@solana/spl-token": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz", + "integrity": "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.5", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.0", + "buffer": "6.0.3", + "buffer-layout": "^1.2.0", + "dotenv": "10.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@project-serum/serum/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@project-serum/serum/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@protobuf-ts/plugin": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin/-/plugin-2.7.0.tgz", @@ -828,6 +1147,17 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@pythnetwork/client": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@pythnetwork/client/-/client-2.5.3.tgz", + "integrity": "sha512-NBLxPnA6A3tZb/DYUooD4SO63UJ70s9DzzFPGXcQNBR9itcycp7aaV+UA5oUPloD/4UHL9soo2fRuDVur0gmhA==", + "dev": true, + "dependencies": { + "@solana/web3.js": "^1.30.2", + "assert": "^2.0.0", + "buffer": "^6.0.1" + } + }, "node_modules/@samverschueren/stream-to-observable": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", @@ -866,6 +1196,21 @@ "node": ">=5.10" } }, + "node_modules/@solana/buffer-layout-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", + "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", + "dev": true, + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/web3.js": "^1.32.0", + "bigint-buffer": "^1.1.5", + "bignumber.js": "^9.0.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/@solana/buffer-layout/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -889,6 +1234,47 @@ "ieee754": "^1.2.1" } }, + "node_modules/@solana/spl-token": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.8.tgz", + "integrity": "sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg==", + "dev": true, + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.47.4" + } + }, + "node_modules/@solana/spl-token/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@solana/web3.js": { "version": "1.73.2", "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.2.tgz", @@ -931,25 +1317,6 @@ "base-x": "^3.0.2" } }, - "node_modules/@solana/web3.js/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -1046,9 +1413,9 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" }, "node_modules/@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -1388,6 +1755,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true + }, "node_modules/any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", @@ -1432,6 +1805,18 @@ "node": ">=0.10.0" } }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "node_modules/async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", @@ -1445,6 +1830,18 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", @@ -1509,6 +1906,15 @@ "node": ">= 10.0.0" } }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -1641,6 +2047,15 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-layout": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", + "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", + "dev": true, + "engines": { + "node": ">=4.5" + } + }, "node_modules/bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -1684,6 +2099,19 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1939,6 +2367,15 @@ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1952,6 +2389,18 @@ "node": ">= 8" } }, + "node_modules/crypto-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", + "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -2048,6 +2497,22 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -2169,6 +2634,22 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2222,6 +2703,12 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -2732,6 +3219,38 @@ "node": ">=8" } }, + "node_modules/find": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", + "dev": true, + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, + "node_modules/find-process": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", + "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "bin": { + "find-process": "bin/find-process.js" + } + }, + "node_modules/find-process/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2786,6 +3305,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2810,6 +3338,21 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -2919,6 +3462,18 @@ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.20.1.tgz", "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -3008,6 +3563,57 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -3448,11 +4054,39 @@ "node": ">=8" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -3506,6 +4140,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3533,6 +4182,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -3639,6 +4304,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3761,6 +4441,12 @@ } } }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4274,6 +4960,21 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -4512,6 +5213,15 @@ "node": ">= 6" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -4555,6 +5265,41 @@ "node": ">=6" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", @@ -4765,6 +5510,31 @@ "node": ">= 0.10.0" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4977,6 +5747,12 @@ "semver": "bin/semver.js" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5710,6 +6486,22 @@ "node": ">=0.10.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snake-case/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -5749,6 +6541,22 @@ "node": "*" } }, + "node_modules/spok": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/spok/-/spok-1.5.5.tgz", + "integrity": "sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q==", + "dev": true, + "dependencies": { + "ansicolors": "~0.3.2", + "find-process": "^1.4.7" + } + }, + "node_modules/strict-event-emitter-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", + "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==", + "dev": true + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5962,11 +6770,23 @@ "node": ">=8.0" } }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -6212,6 +7032,19 @@ "node": ">=6.14.2" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -6284,6 +7117,25 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -6514,6 +7366,71 @@ "regenerator-runtime": "^0.13.4" } }, + "@coral-xyz/anchor": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.26.0.tgz", + "integrity": "sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==", + "dev": true, + "requires": { + "@coral-xyz/borsh": "^0.26.0", + "@solana/web3.js": "^1.68.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "dependencies": { + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==", + "dev": true + } + } + }, + "@coral-xyz/borsh": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", + "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", + "dev": true, + "requires": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + } + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -6522,6 +7439,38 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@drift-labs/sdk": { + "version": "2.36.1-beta.5", + "resolved": "https://registry.npmjs.org/@drift-labs/sdk/-/sdk-2.36.1-beta.5.tgz", + "integrity": "sha512-PFoFBWR6GL+NYvCznJbwuvyaZPQFFlTWGh1rFWfIOsIxWZ8gmGSAaRhlxFFNo84kxXYzzVxHhyemHK4HGyRlXA==", + "dev": true, + "requires": { + "@coral-xyz/anchor": "0.26.0", + "@ellipsis-labs/phoenix-sdk": "^1.4.2", + "@project-serum/serum": "^0.13.38", + "@pythnetwork/client": "2.5.3", + "@solana/spl-token": "^0.3.7", + "@solana/web3.js": "1.73.2", + "strict-event-emitter-types": "^2.0.0", + "uuid": "^8.3.2" + } + }, + "@ellipsis-labs/phoenix-sdk": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@ellipsis-labs/phoenix-sdk/-/phoenix-sdk-1.4.5.tgz", + "integrity": "sha512-vEYgMXuV5/mpnpEi+VK4HO8f6SheHtVLdHHlULBiDN1eECYmL67gq+/cRV7Ar6jAQ7rJZL7xBxhbUW5kugMl6A==", + "dev": true, + "requires": { + "@metaplex-foundation/beet": "^0.7.1", + "@metaplex-foundation/rustbin": "^0.3.1", + "@metaplex-foundation/solita": "^0.12.2", + "@solana/spl-token": "^0.3.7", + "@types/node": "^18.11.13", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^5.0.0" + } + }, "@esbuild/android-arm": { "version": "0.16.14", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.14.tgz", @@ -6756,6 +7705,78 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@metaplex-foundation/beet": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", + "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", + "dev": true, + "requires": { + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" + } + }, + "@metaplex-foundation/beet-solana": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", + "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", + "dev": true, + "requires": { + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, + "@metaplex-foundation/rustbin": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/rustbin/-/rustbin-0.3.1.tgz", + "integrity": "sha512-hWd2JPrnt2/nJzkBpZD3Y6ZfCUlJujv2K7qUfsxdS0jSwLrSrOvYwmNWFw6mc3lbULj6VP4WDyuy9W5/CHU/lQ==", + "dev": true, + "requires": { + "debug": "^4.3.3", + "semver": "^7.3.7", + "text-table": "^0.2.0", + "toml": "^3.0.0" + } + }, + "@metaplex-foundation/solita": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/solita/-/solita-0.12.2.tgz", + "integrity": "sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw==", + "dev": true, + "requires": { + "@metaplex-foundation/beet": "^0.4.0", + "@metaplex-foundation/beet-solana": "^0.3.0", + "@metaplex-foundation/rustbin": "^0.3.0", + "@solana/web3.js": "^1.36.0", + "camelcase": "^6.2.1", + "debug": "^4.3.3", + "js-sha256": "^0.9.0", + "prettier": "^2.5.1", + "snake-case": "^3.0.4", + "spok": "^1.4.3" + }, + "dependencies": { + "@metaplex-foundation/beet": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.4.0.tgz", + "integrity": "sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA==", + "dev": true, + "requires": { + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, "@noble/ed25519": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz", @@ -6781,35 +7802,132 @@ "run-parallel": "^1.1.9" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pbkit/grpc-client": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@pbkit/grpc-client/-/grpc-client-0.0.1.tgz", + "integrity": "sha512-MDWuGabX7RJmFrCdanaa966CyU+oaeY172h969Mm3Ggx44VM5fnIAtYzH58zsCfm7fvsD8l4F4SrQW2gQx3q+w==", + "requires": { + "@pbkit/runtime": "^0.0.35" + } + }, + "@pbkit/runtime": { + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@pbkit/runtime/-/runtime-0.0.35.tgz", + "integrity": "sha512-QPey6r26Dfh1gVfUmGH0qn4lhbH2RVRC7St3mnERISyT1Gx1RgBpGIQJs14Pwt8E7TfJB+a0Btj6nr6teUADTg==" + }, + "@project-serum/anchor": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", + "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", + "dev": true, + "requires": { + "@project-serum/borsh": "^0.2.2", + "@solana/web3.js": "^1.17.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.0", + "camelcase": "^5.3.1", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "find": "^0.3.0", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "toml": "^3.0.0" + }, + "dependencies": { + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + } + } + }, + "@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" } }, - "@pbkit/grpc-client": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@pbkit/grpc-client/-/grpc-client-0.0.1.tgz", - "integrity": "sha512-MDWuGabX7RJmFrCdanaa966CyU+oaeY172h969Mm3Ggx44VM5fnIAtYzH58zsCfm7fvsD8l4F4SrQW2gQx3q+w==", + "@project-serum/serum": { + "version": "0.13.65", + "resolved": "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz", + "integrity": "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==", + "dev": true, "requires": { - "@pbkit/runtime": "^0.0.35" + "@project-serum/anchor": "^0.11.1", + "@solana/spl-token": "^0.1.6", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "dependencies": { + "@solana/spl-token": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz", + "integrity": "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.5", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.0", + "buffer": "6.0.3", + "buffer-layout": "^1.2.0", + "dotenv": "10.0.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + } } }, - "@pbkit/runtime": { - "version": "0.0.35", - "resolved": "https://registry.npmjs.org/@pbkit/runtime/-/runtime-0.0.35.tgz", - "integrity": "sha512-QPey6r26Dfh1gVfUmGH0qn4lhbH2RVRC7St3mnERISyT1Gx1RgBpGIQJs14Pwt8E7TfJB+a0Btj6nr6teUADTg==" - }, "@protobuf-ts/plugin": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin/-/plugin-2.7.0.tgz", @@ -6924,6 +8042,17 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "@pythnetwork/client": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@pythnetwork/client/-/client-2.5.3.tgz", + "integrity": "sha512-NBLxPnA6A3tZb/DYUooD4SO63UJ70s9DzzFPGXcQNBR9itcycp7aaV+UA5oUPloD/4UHL9soo2fRuDVur0gmhA==", + "dev": true, + "requires": { + "@solana/web3.js": "^1.30.2", + "assert": "^2.0.0", + "buffer": "^6.0.1" + } + }, "@samverschueren/stream-to-observable": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", @@ -6956,6 +8085,41 @@ } } }, + "@solana/buffer-layout-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", + "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", + "dev": true, + "requires": { + "@solana/buffer-layout": "^4.0.0", + "@solana/web3.js": "^1.32.0", + "bigint-buffer": "^1.1.5", + "bignumber.js": "^9.0.1" + } + }, + "@solana/spl-token": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.8.tgz", + "integrity": "sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg==", + "dev": true, + "requires": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "buffer": "^6.0.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, "@solana/web3.js": { "version": "1.73.2", "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.2.tgz", @@ -6994,14 +8158,6 @@ "requires": { "base-x": "^3.0.2" } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } } } }, @@ -7098,9 +8254,9 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" }, "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -7315,6 +8471,12 @@ "color-convert": "^2.0.1" } }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true + }, "any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", @@ -7347,6 +8509,18 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", @@ -7357,6 +8531,12 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axios": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", @@ -7402,6 +8582,12 @@ "bindings": "^1.3.0" } }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -7509,6 +8695,12 @@ "ieee754": "^1.2.1" } }, + "buffer-layout": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", + "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", + "dev": true + }, "bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -7544,6 +8736,16 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7732,6 +8934,15 @@ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "requires": { + "node-fetch": "^2.6.12" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7742,6 +8953,12 @@ "which": "^2.0.1" } }, + "crypto-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", + "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", + "dev": true + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -7811,6 +9028,16 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -7900,6 +9127,24 @@ "esutils": "^2.0.2" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + } + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7944,6 +9189,12 @@ "is-arrayish": "^0.2.1" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -8330,6 +9581,34 @@ "to-regex-range": "^5.0.1" } }, + "find": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", + "dev": true, + "requires": { + "traverse-chain": "~0.1.0" + } + }, + "find-process": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", + "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -8361,6 +9640,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8382,6 +9670,18 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -8460,6 +9760,15 @@ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.20.1.tgz", "integrity": "sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==" }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -8532,6 +9841,36 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -8847,11 +10186,27 @@ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -8884,6 +10239,15 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8902,6 +10266,16 @@ "is-path-inside": "^3.0.1" } }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -8977,6 +10351,15 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -9068,6 +10451,12 @@ } } }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9469,6 +10858,23 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + } + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -9638,6 +11044,12 @@ "kind-of": "^6.0.3" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true + }, "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -9674,6 +11086,32 @@ } } }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", @@ -9821,6 +11259,22 @@ "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", "dev": true }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9970,6 +11424,12 @@ } } }, + "pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10465,6 +11925,24 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==" }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + } + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -10501,6 +11979,22 @@ "through": "2" } }, + "spok": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/spok/-/spok-1.5.5.tgz", + "integrity": "sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q==", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "find-process": "^1.4.7" + } + }, + "strict-event-emitter-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", + "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -10647,11 +12141,23 @@ "is-number": "^7.0.0" } }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -10827,6 +12333,19 @@ "node-gyp-build": "^4.3.0" } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -10890,6 +12409,19 @@ "isexe": "^2.0.0" } }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index 9d4bdf1b..45e85efe 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,12 @@ ], "scripts": { "start": "node --experimental-specifier-resolution=node --loader ts-node/esm ./examples/index.ts", + "start_benchmark_submit_tx_helius": "node --experimental-specifier-resolution=node --loader ts-node/esm ./examples/benchmark_submit_tx_helius.ts", + "start_benchmark_trader_api": "node --experimental-specifier-resolution=node --loader ts-node/esm examples/price_stream_benchmark/benchmark_bx_api.ts 3600", + "start_benchmark_drift": "node --experimental-specifier-resolution=node --loader ts-node/esm examples/price_stream_benchmark/benchmark_drift_api.ts 3600", + "start_benchmark_bx_raydium_get_price_stream": "node --experimental-specifier-resolution=node --loader ts-node/esm examples/price_stream_benchmark/benchmark_bx_raydium_get_price_stream.ts 3600", + "start_benchmark_quicknode_raydium_get_price_stream": "node --experimental-specifier-resolution=node --loader ts-node/esm examples/price_stream_benchmark/benchmark_quicknode_raydium_get_price_stream.ts 3600", + "run_benchmark_comparison": "node --experimental-specifier-resolution=node --loader ts-node/esm examples/price_stream_benchmark/benchmark_comparison.ts", "test": "echo \"No test specified\"", "build": "npm run esbuild && npm run types", "clean": "rm -rf dist", @@ -70,6 +76,7 @@ "ws": "^8.8.0" }, "devDependencies": { + "@drift-labs/sdk": "2.36.1-beta.5", "@protobuf-ts/plugin": "^2.7.0", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.7.18", @@ -81,6 +88,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", + "moment": "^2.29.4", "prettier": "^2.7.1", "ts-proto": "^1.115.5" } diff --git a/solana-trader-proto b/solana-trader-proto index 385bd835..3d70071f 160000 --- a/solana-trader-proto +++ b/solana-trader-proto @@ -1 +1 @@ -Subproject commit 385bd835bae591c08ed547e57062185c606f0846 +Subproject commit 3d70071f7eb90f47952189c5edda977be5d98d4b