openbook-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +509 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
- package/src/cli.ts +9 -0
- package/src/index.ts +642 -0
- package/tsconfig.json +24 -0
package/dist/index.js
ADDED
@@ -0,0 +1,509 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getMarketInfo = getMarketInfo;
|
4
|
+
exports.getOrderBook = getOrderBook;
|
5
|
+
exports.getMarketStats = getMarketStats;
|
6
|
+
exports.displayOrderBook = displayOrderBook;
|
7
|
+
exports.displayMarketInfo = displayMarketInfo;
|
8
|
+
exports.listKnownMarkets = listKnownMarkets;
|
9
|
+
exports.loadOpenBookMarket = loadOpenBookMarket;
|
10
|
+
exports.getRealOrderBook = getRealOrderBook;
|
11
|
+
exports.main = main;
|
12
|
+
const web3_js_1 = require("@solana/web3.js");
|
13
|
+
const serum_1 = require("@project-serum/serum");
|
14
|
+
// Market information
|
15
|
+
const MARKET_ADDRESS = "Cw35vJ7ecmnwc2jPumgfhDzUuJ1fmrytuRopBF5JUXrq";
|
16
|
+
// Program IDs
|
17
|
+
const OPENBOOK_PROGRAM_ID = "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX";
|
18
|
+
const SERUM_PROGRAM_ID = "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin";
|
19
|
+
// Connection to Solana
|
20
|
+
const connection = new web3_js_1.Connection("https://api.mainnet-beta.solana.com", "confirmed");
|
21
|
+
// Known markets and symbols - will be loaded from JSON file
|
22
|
+
let KNOWN_MARKETS = {};
|
23
|
+
let KNOWN_TOKEN_SYMBOLS = {};
|
24
|
+
async function getTokenMetadata(mintAddress) {
|
25
|
+
try {
|
26
|
+
const mintPubkey = new web3_js_1.PublicKey(mintAddress);
|
27
|
+
// First check if we have a known symbol
|
28
|
+
const knownSymbol = KNOWN_TOKEN_SYMBOLS[mintAddress];
|
29
|
+
if (knownSymbol) {
|
30
|
+
return {
|
31
|
+
symbol: knownSymbol,
|
32
|
+
name: knownSymbol,
|
33
|
+
decimals: 6 // Default for most tokens
|
34
|
+
};
|
35
|
+
}
|
36
|
+
// Get token account info to extract decimals
|
37
|
+
const tokenInfo = await connection.getParsedAccountInfo(mintPubkey);
|
38
|
+
if (!tokenInfo.value) {
|
39
|
+
throw new Error("Token account not found");
|
40
|
+
}
|
41
|
+
const parsedData = tokenInfo.value.data;
|
42
|
+
const decimals = parsedData.parsed.info.decimals;
|
43
|
+
// Try to get Metaplex metadata
|
44
|
+
try {
|
45
|
+
const [metadataAddress] = web3_js_1.PublicKey.findProgramAddressSync([
|
46
|
+
Buffer.from("metadata"),
|
47
|
+
new web3_js_1.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s").toBuffer(),
|
48
|
+
mintPubkey.toBuffer()
|
49
|
+
], new web3_js_1.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"));
|
50
|
+
const metadataAccount = await connection.getAccountInfo(metadataAddress);
|
51
|
+
if (metadataAccount) {
|
52
|
+
// Parse Metaplex metadata
|
53
|
+
const metadata = JSON.parse(metadataAccount.data.toString());
|
54
|
+
return {
|
55
|
+
symbol: metadata.data.symbol || "UNKNOWN",
|
56
|
+
name: metadata.data.name || "Unknown Token",
|
57
|
+
decimals: decimals
|
58
|
+
};
|
59
|
+
}
|
60
|
+
}
|
61
|
+
catch (error) {
|
62
|
+
console.log(`No Metaplex metadata found for ${mintAddress}`);
|
63
|
+
}
|
64
|
+
// Fallback: use mint address as symbol
|
65
|
+
return {
|
66
|
+
symbol: mintAddress.slice(0, 8),
|
67
|
+
name: "Unknown Token",
|
68
|
+
decimals: decimals
|
69
|
+
};
|
70
|
+
}
|
71
|
+
catch (error) {
|
72
|
+
console.error(`Error fetching token metadata for ${mintAddress}:`, error);
|
73
|
+
return {
|
74
|
+
symbol: mintAddress.slice(0, 8),
|
75
|
+
name: "Unknown Token",
|
76
|
+
decimals: 6
|
77
|
+
};
|
78
|
+
}
|
79
|
+
}
|
80
|
+
async function getMarketInfo(marketAddress, useSerum = false) {
|
81
|
+
try {
|
82
|
+
// First try to get from known markets
|
83
|
+
const marketData = KNOWN_MARKETS[marketAddress];
|
84
|
+
if (marketData) {
|
85
|
+
// Fetch real token metadata from blockchain
|
86
|
+
const baseMetadata = await getTokenMetadata(marketData.baseMint);
|
87
|
+
const quoteMetadata = await getTokenMetadata(marketData.quoteMint);
|
88
|
+
return {
|
89
|
+
address: marketAddress,
|
90
|
+
baseMint: marketData.baseMint,
|
91
|
+
quoteMint: marketData.quoteMint,
|
92
|
+
baseSymbol: baseMetadata.symbol,
|
93
|
+
quoteSymbol: quoteMetadata.symbol,
|
94
|
+
minOrderSize: marketData.minOrderSize,
|
95
|
+
priceTick: marketData.priceTick,
|
96
|
+
eventQueueLength: marketData.eventQueueLength,
|
97
|
+
requestQueueLength: marketData.requestQueueLength,
|
98
|
+
bidsLength: marketData.bidsLength,
|
99
|
+
asksLength: marketData.asksLength
|
100
|
+
};
|
101
|
+
}
|
102
|
+
else {
|
103
|
+
// Load market directly from blockchain
|
104
|
+
const market = await loadOpenBookMarket(marketAddress, useSerum);
|
105
|
+
// Fetch real token metadata from blockchain
|
106
|
+
const baseMetadata = await getTokenMetadata(market.baseMintAddress.toString());
|
107
|
+
const quoteMetadata = await getTokenMetadata(market.quoteMintAddress.toString());
|
108
|
+
return {
|
109
|
+
address: marketAddress,
|
110
|
+
baseMint: market.baseMintAddress.toString(),
|
111
|
+
quoteMint: market.quoteMintAddress.toString(),
|
112
|
+
baseSymbol: baseMetadata.symbol,
|
113
|
+
quoteSymbol: quoteMetadata.symbol,
|
114
|
+
minOrderSize: 1, // Default values for unknown markets
|
115
|
+
priceTick: 0.0001,
|
116
|
+
eventQueueLength: 2978,
|
117
|
+
requestQueueLength: 63,
|
118
|
+
bidsLength: 909,
|
119
|
+
asksLength: 909
|
120
|
+
};
|
121
|
+
}
|
122
|
+
}
|
123
|
+
catch (error) {
|
124
|
+
console.error("Error fetching market info:", error);
|
125
|
+
throw error;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
async function getMarketAccounts(marketAddress, useSerum = false) {
|
129
|
+
try {
|
130
|
+
const marketPubkey = new web3_js_1.PublicKey(marketAddress);
|
131
|
+
const marketAccount = await connection.getAccountInfo(marketPubkey);
|
132
|
+
if (!marketAccount) {
|
133
|
+
throw new Error("Market account not found");
|
134
|
+
}
|
135
|
+
console.log("Market account found!");
|
136
|
+
console.log("Owner:", marketAccount.owner.toString());
|
137
|
+
console.log("Data length:", marketAccount.data.length);
|
138
|
+
// Check against the appropriate program ID
|
139
|
+
const expectedProgramId = useSerum ? SERUM_PROGRAM_ID : OPENBOOK_PROGRAM_ID;
|
140
|
+
const programName = useSerum ? "Serum" : "OpenBook";
|
141
|
+
if (marketAccount.owner.toString() !== expectedProgramId) {
|
142
|
+
throw new Error(`Market not owned by ${programName} program. Owner: ${marketAccount.owner.toString()}`);
|
143
|
+
}
|
144
|
+
return marketAccount;
|
145
|
+
}
|
146
|
+
catch (error) {
|
147
|
+
console.error("Error fetching market accounts:", error);
|
148
|
+
throw error;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
async function loadOpenBookMarket(marketAddress, useSerum = false) {
|
152
|
+
try {
|
153
|
+
const marketPubkey = new web3_js_1.PublicKey(marketAddress);
|
154
|
+
// Use the appropriate program ID based on mode
|
155
|
+
const programId = useSerum ? SERUM_PROGRAM_ID : OPENBOOK_PROGRAM_ID;
|
156
|
+
// Load the market using the appropriate program ID
|
157
|
+
const market = await serum_1.Market.load(connection, marketPubkey, {}, new web3_js_1.PublicKey(programId));
|
158
|
+
const programName = useSerum ? "Serum" : "OpenBook";
|
159
|
+
console.log(`ā
${programName} market loaded successfully!`);
|
160
|
+
return market;
|
161
|
+
}
|
162
|
+
catch (error) {
|
163
|
+
const programName = useSerum ? "Serum" : "OpenBook";
|
164
|
+
console.error(`Error loading ${programName} market:`, error);
|
165
|
+
throw error;
|
166
|
+
}
|
167
|
+
}
|
168
|
+
async function getRealOrderBook(marketAddress, depth = 20, useSerum = false) {
|
169
|
+
try {
|
170
|
+
const programName = useSerum ? "Serum" : "OpenBook";
|
171
|
+
console.log(`š Fetching real order book from ${programName}...`);
|
172
|
+
// Load the market with appropriate program
|
173
|
+
const market = await loadOpenBookMarket(marketAddress, useSerum);
|
174
|
+
// Use the correct Serum SDK methods
|
175
|
+
console.log("š Loading bids and asks...");
|
176
|
+
const bids = await market.loadBids(connection);
|
177
|
+
const asks = await market.loadAsks(connection);
|
178
|
+
// Access the orderbook data
|
179
|
+
const bidsArray = bids.getL2(20); // Get top 20 bids
|
180
|
+
const asksArray = asks.getL2(20); // Get top 20 asks
|
181
|
+
console.log("š Orderbook loaded successfully!");
|
182
|
+
console.log("Bids count:", bidsArray.length);
|
183
|
+
console.log("Asks count:", asksArray.length);
|
184
|
+
// Process bids (buy orders)
|
185
|
+
const bidOrders = bidsArray.map((bid) => ({
|
186
|
+
price: bid[0], // Price is first element
|
187
|
+
size: bid[1], // Size is second element
|
188
|
+
side: 'bid'
|
189
|
+
}));
|
190
|
+
// Process asks (sell orders)
|
191
|
+
const askOrders = asksArray.map((ask) => ({
|
192
|
+
price: ask[0], // Price is first element
|
193
|
+
size: ask[1], // Size is second element
|
194
|
+
side: 'ask'
|
195
|
+
}));
|
196
|
+
console.log(`ā
Real order book fetched: ${bidOrders.length} bids, ${askOrders.length} asks`);
|
197
|
+
return { bids: bidOrders, asks: askOrders };
|
198
|
+
}
|
199
|
+
catch (error) {
|
200
|
+
console.error("ā Error fetching real order book:", error);
|
201
|
+
throw error;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
async function getOrderBook(marketAddress, depth = 20) {
|
205
|
+
try {
|
206
|
+
// First, get the market account to verify it's a valid OpenBook market
|
207
|
+
const marketAccount = await getMarketAccounts(marketAddress);
|
208
|
+
// Get real order book data from the blockchain
|
209
|
+
return await getRealOrderBook(marketAddress, depth);
|
210
|
+
}
|
211
|
+
catch (error) {
|
212
|
+
console.error("Error fetching order book from blockchain:", error);
|
213
|
+
throw error;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
async function getMarketStats(marketAddress, useSerum = false) {
|
217
|
+
try {
|
218
|
+
const { bids, asks } = await getRealOrderBook(marketAddress, 1, useSerum);
|
219
|
+
const bestBid = bids.length > 0 ? bids[0].price : null;
|
220
|
+
const bestAsk = asks.length > 0 ? asks[0].price : null;
|
221
|
+
const spread = bestBid && bestAsk ? bestAsk - bestBid : null;
|
222
|
+
const spreadPercentage = spread && bestBid ? (spread / bestBid) * 100 : null;
|
223
|
+
return {
|
224
|
+
totalBids: bids.length,
|
225
|
+
totalAsks: asks.length,
|
226
|
+
bestBid,
|
227
|
+
bestAsk,
|
228
|
+
spread,
|
229
|
+
spreadPercentage
|
230
|
+
};
|
231
|
+
}
|
232
|
+
catch (error) {
|
233
|
+
console.error("Error fetching market stats:", error);
|
234
|
+
throw error;
|
235
|
+
}
|
236
|
+
}
|
237
|
+
async function displayOrderBook(marketAddress, depth = 10, useSerum = false) {
|
238
|
+
try {
|
239
|
+
const marketData = KNOWN_MARKETS[marketAddress];
|
240
|
+
let marketName = marketData?.name || marketAddress;
|
241
|
+
// Try to get real symbols for the market name
|
242
|
+
try {
|
243
|
+
const marketInfo = await getMarketInfo(marketAddress, useSerum);
|
244
|
+
marketName = `${marketInfo.baseSymbol}/${marketInfo.quoteSymbol}`;
|
245
|
+
}
|
246
|
+
catch (error) {
|
247
|
+
// Use fallback name if metadata fetch fails
|
248
|
+
}
|
249
|
+
console.log(`\nš Order Book for Market: ${marketName}`);
|
250
|
+
console.log("=".repeat(60));
|
251
|
+
const { bids, asks } = await getRealOrderBook(marketAddress, depth, useSerum);
|
252
|
+
console.log("\nš“ ASKS (Sell Orders):");
|
253
|
+
console.log("Price\t\tSize");
|
254
|
+
console.log("-".repeat(30));
|
255
|
+
// Display asks in reverse order (highest price first)
|
256
|
+
asks.slice().reverse().forEach((ask) => {
|
257
|
+
console.log(`${ask.price.toFixed(4)}\t\t${ask.size.toFixed(4)}`);
|
258
|
+
});
|
259
|
+
console.log("\nš¢ BIDS (Buy Orders):");
|
260
|
+
console.log("Price\t\tSize");
|
261
|
+
console.log("-".repeat(30));
|
262
|
+
bids.forEach((bid) => {
|
263
|
+
console.log(`${bid.price.toFixed(4)}\t\t${bid.size.toFixed(4)}`);
|
264
|
+
});
|
265
|
+
// Calculate market stats from the order book data we already have
|
266
|
+
const bestBid = bids.length > 0 ? bids[0].price : null;
|
267
|
+
const bestAsk = asks.length > 0 ? asks[0].price : null;
|
268
|
+
const spread = bestBid && bestAsk ? bestAsk - bestBid : null;
|
269
|
+
const spreadPercentage = spread && bestBid ? (spread / bestBid) * 100 : null;
|
270
|
+
console.log("\nš Market Stats:");
|
271
|
+
console.log(`Total Bids: ${bids.length}`);
|
272
|
+
console.log(`Total Asks: ${asks.length}`);
|
273
|
+
console.log(`Best Bid: ${bestBid?.toFixed(4) || 'N/A'}`);
|
274
|
+
console.log(`Best Ask: ${bestAsk?.toFixed(4) || 'N/A'}`);
|
275
|
+
console.log(`Spread: ${spread?.toFixed(4) || 'N/A'}`);
|
276
|
+
console.log(`Spread %: ${spreadPercentage?.toFixed(2) || 'N/A'}%`);
|
277
|
+
}
|
278
|
+
catch (error) {
|
279
|
+
console.error("Error displaying order book:", error);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
async function displayMarketInfo(marketAddress, useSerum = false) {
|
283
|
+
try {
|
284
|
+
const marketData = KNOWN_MARKETS[marketAddress];
|
285
|
+
let marketName = marketData?.name || marketAddress;
|
286
|
+
// Try to get real symbols for the market name
|
287
|
+
try {
|
288
|
+
const marketInfo = await getMarketInfo(marketAddress, useSerum);
|
289
|
+
marketName = `${marketInfo.baseSymbol}/${marketInfo.quoteSymbol}`;
|
290
|
+
}
|
291
|
+
catch (error) {
|
292
|
+
// Use fallback name if metadata fetch fails
|
293
|
+
}
|
294
|
+
console.log(`\nšŖ Market Information for: ${marketName}`);
|
295
|
+
console.log("=".repeat(60));
|
296
|
+
const marketInfo = await getMarketInfo(marketAddress, useSerum);
|
297
|
+
console.log(`Market Address: ${marketInfo.address}`);
|
298
|
+
console.log(`Base Mint: ${marketInfo.baseMint} (${marketInfo.baseSymbol})`);
|
299
|
+
console.log(`Quote Mint: ${marketInfo.quoteMint} (${marketInfo.quoteSymbol})`);
|
300
|
+
console.log(`Min Order Size: ${marketInfo.minOrderSize}`);
|
301
|
+
console.log(`Price Tick: ${marketInfo.priceTick}`);
|
302
|
+
console.log(`Event Queue Length: ${marketInfo.eventQueueLength}`);
|
303
|
+
console.log(`Request Queue Length: ${marketInfo.requestQueueLength}`);
|
304
|
+
console.log(`Bids Length: ${marketInfo.bidsLength}`);
|
305
|
+
console.log(`Asks Length: ${marketInfo.asksLength}`);
|
306
|
+
// Verify the market account
|
307
|
+
try {
|
308
|
+
await getMarketAccounts(marketAddress, useSerum);
|
309
|
+
const programName = useSerum ? "Serum" : "OpenBook";
|
310
|
+
console.log(`ā
Market verified as ${programName} market`);
|
311
|
+
}
|
312
|
+
catch (error) {
|
313
|
+
console.log(`ā Market verification failed: ${error}`);
|
314
|
+
}
|
315
|
+
}
|
316
|
+
catch (error) {
|
317
|
+
console.error("Error displaying market info:", error);
|
318
|
+
}
|
319
|
+
}
|
320
|
+
function listKnownMarkets(useSerum = false) {
|
321
|
+
const programType = useSerum ? "Serum" : "OpenBook";
|
322
|
+
console.log(`\nš Known ${programType} Markets:`);
|
323
|
+
console.log("=".repeat(60));
|
324
|
+
Object.entries(KNOWN_MARKETS).forEach(([address, market]) => {
|
325
|
+
console.log(`${market.name}: ${address}`);
|
326
|
+
});
|
327
|
+
}
|
328
|
+
// Function to add market to known markets
|
329
|
+
async function addMarketToKnownMarkets(marketAddress, useSerum = false) {
|
330
|
+
try {
|
331
|
+
console.log(`š Analyzing market: ${marketAddress}`);
|
332
|
+
// Load the market to get base and quote mints
|
333
|
+
const market = await loadOpenBookMarket(marketAddress, useSerum);
|
334
|
+
// Get token metadata for base and quote tokens
|
335
|
+
const baseMetadata = await getTokenMetadata(market.baseMintAddress.toString());
|
336
|
+
const quoteMetadata = await getTokenMetadata(market.quoteMintAddress.toString());
|
337
|
+
// Create market info
|
338
|
+
const marketInfo = {
|
339
|
+
name: `${baseMetadata.symbol}/${quoteMetadata.symbol}`,
|
340
|
+
baseMint: market.baseMintAddress.toString(),
|
341
|
+
quoteMint: market.quoteMintAddress.toString(),
|
342
|
+
minOrderSize: 1,
|
343
|
+
priceTick: 0.0001,
|
344
|
+
eventQueueLength: 2978,
|
345
|
+
requestQueueLength: 63,
|
346
|
+
bidsLength: 909,
|
347
|
+
asksLength: 909
|
348
|
+
};
|
349
|
+
// Add to known markets
|
350
|
+
KNOWN_MARKETS[marketAddress] = marketInfo;
|
351
|
+
// Add token symbols to known symbols if not already present
|
352
|
+
if (!KNOWN_TOKEN_SYMBOLS[market.baseMintAddress.toString()]) {
|
353
|
+
KNOWN_TOKEN_SYMBOLS[market.baseMintAddress.toString()] = baseMetadata.symbol;
|
354
|
+
}
|
355
|
+
if (!KNOWN_TOKEN_SYMBOLS[market.quoteMintAddress.toString()]) {
|
356
|
+
KNOWN_TOKEN_SYMBOLS[market.quoteMintAddress.toString()] = quoteMetadata.symbol;
|
357
|
+
}
|
358
|
+
console.log("ā
Market added to known markets!");
|
359
|
+
console.log(`Market: ${marketInfo.name}`);
|
360
|
+
console.log(`Base Token: ${baseMetadata.symbol} (${market.baseMintAddress.toString()})`);
|
361
|
+
console.log(`Quote Token: ${quoteMetadata.symbol} (${market.quoteMintAddress.toString()})`);
|
362
|
+
// Display the updated known markets
|
363
|
+
console.log("\nš Updated Known Markets:");
|
364
|
+
Object.entries(KNOWN_MARKETS).forEach(([address, info]) => {
|
365
|
+
console.log(`${info.name}: ${address}`);
|
366
|
+
});
|
367
|
+
}
|
368
|
+
catch (error) {
|
369
|
+
console.error("ā Error adding market to known markets:", error);
|
370
|
+
throw error;
|
371
|
+
}
|
372
|
+
}
|
373
|
+
// Function to save known markets to a file (for persistence)
|
374
|
+
function saveKnownMarketsToFile(useSerum = false) {
|
375
|
+
try {
|
376
|
+
const fs = require('fs');
|
377
|
+
const path = require('path');
|
378
|
+
const marketsData = {
|
379
|
+
markets: KNOWN_MARKETS,
|
380
|
+
symbols: KNOWN_TOKEN_SYMBOLS
|
381
|
+
};
|
382
|
+
// Choose the appropriate file based on program type
|
383
|
+
const fileName = useSerum ? 'known_serum_markets.json' : 'known_openbook_markets.json';
|
384
|
+
const filePath = path.join(__dirname, fileName);
|
385
|
+
fs.writeFileSync(filePath, JSON.stringify(marketsData, null, 2));
|
386
|
+
const programType = useSerum ? 'Serum' : 'OpenBook';
|
387
|
+
console.log(`š¾ Known ${programType} markets saved to ${fileName}`);
|
388
|
+
}
|
389
|
+
catch (error) {
|
390
|
+
console.error("ā Error saving known markets:", error);
|
391
|
+
}
|
392
|
+
}
|
393
|
+
// Function to load known markets from file
|
394
|
+
function loadKnownMarketsFromFile(useSerum = false) {
|
395
|
+
try {
|
396
|
+
const fs = require('fs');
|
397
|
+
const path = require('path');
|
398
|
+
// Choose the appropriate file based on program type
|
399
|
+
const fileName = useSerum ? 'known_serum_markets.json' : 'known_openbook_markets.json';
|
400
|
+
const filePath = path.join(__dirname, fileName);
|
401
|
+
if (fs.existsSync(filePath)) {
|
402
|
+
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
403
|
+
// Load data from file
|
404
|
+
KNOWN_MARKETS = data.markets || {};
|
405
|
+
KNOWN_TOKEN_SYMBOLS = data.symbols || {};
|
406
|
+
const programType = useSerum ? 'Serum' : 'OpenBook';
|
407
|
+
console.log(`š Loaded known ${programType} markets from file`);
|
408
|
+
console.log(`š Found ${Object.keys(KNOWN_MARKETS).length} markets and ${Object.keys(KNOWN_TOKEN_SYMBOLS).length} token symbols`);
|
409
|
+
}
|
410
|
+
else {
|
411
|
+
const programType = useSerum ? 'Serum' : 'OpenBook';
|
412
|
+
console.log(`ā¹ļø No saved ${programType} markets file found, starting with empty markets`);
|
413
|
+
// Initialize with empty objects
|
414
|
+
KNOWN_MARKETS = {};
|
415
|
+
KNOWN_TOKEN_SYMBOLS = {};
|
416
|
+
}
|
417
|
+
}
|
418
|
+
catch (error) {
|
419
|
+
const programType = useSerum ? 'Serum' : 'OpenBook';
|
420
|
+
console.log(`ā¹ļø Error loading ${programType} markets file, starting with empty markets`);
|
421
|
+
KNOWN_MARKETS = {};
|
422
|
+
KNOWN_TOKEN_SYMBOLS = {};
|
423
|
+
}
|
424
|
+
}
|
425
|
+
// Main function to run the fetcher
|
426
|
+
async function main() {
|
427
|
+
try {
|
428
|
+
console.log("š OpenBook Order Fetcher (Real Data)");
|
429
|
+
console.log("=".repeat(60));
|
430
|
+
// Check if a specific market address was provided
|
431
|
+
const args = process.argv.slice(2);
|
432
|
+
const targetMarket = args[0] || MARKET_ADDRESS;
|
433
|
+
// Check for --serum flag first
|
434
|
+
const useSerumFlag = args.includes('--serum') || args.includes('-s');
|
435
|
+
// Auto-detect program type based on market ownership
|
436
|
+
let useSerum = useSerumFlag;
|
437
|
+
let detectedProgram = useSerumFlag ? "Serum" : "OpenBook";
|
438
|
+
// If a specific market is provided, try to detect its program
|
439
|
+
if (args[0] && !args.includes('--list') && !args.includes('-l')) {
|
440
|
+
try {
|
441
|
+
const marketPubkey = new web3_js_1.PublicKey(targetMarket);
|
442
|
+
const marketAccount = await connection.getAccountInfo(marketPubkey);
|
443
|
+
if (marketAccount) {
|
444
|
+
const owner = marketAccount.owner.toString();
|
445
|
+
if (owner === SERUM_PROGRAM_ID) {
|
446
|
+
useSerum = true;
|
447
|
+
detectedProgram = "Serum";
|
448
|
+
}
|
449
|
+
else if (owner === OPENBOOK_PROGRAM_ID) {
|
450
|
+
useSerum = false;
|
451
|
+
detectedProgram = "OpenBook";
|
452
|
+
}
|
453
|
+
console.log(`š Auto-detected: ${detectedProgram} market`);
|
454
|
+
}
|
455
|
+
}
|
456
|
+
catch (error) {
|
457
|
+
console.log("ā¹ļø Could not auto-detect program, using OpenBook as default");
|
458
|
+
}
|
459
|
+
}
|
460
|
+
// Load known markets from appropriate file
|
461
|
+
loadKnownMarketsFromFile(useSerum);
|
462
|
+
if (args.includes('--list') || args.includes('-l')) {
|
463
|
+
listKnownMarkets(useSerum);
|
464
|
+
return;
|
465
|
+
}
|
466
|
+
// Check if --add flag is present
|
467
|
+
const shouldAdd = args.includes('--add') || args.includes('-a');
|
468
|
+
// If --add flag is present and a market address is provided
|
469
|
+
if (shouldAdd && args[0] && args[0] !== '--add' && args[0] !== '-a' && args[0] !== '--serum' && args[0] !== '-s') {
|
470
|
+
console.log("ā Adding market to known markets...");
|
471
|
+
await addMarketToKnownMarkets(targetMarket, useSerum);
|
472
|
+
// Save to appropriate file
|
473
|
+
saveKnownMarketsToFile(useSerum);
|
474
|
+
console.log("\nā
Market added successfully!");
|
475
|
+
return;
|
476
|
+
}
|
477
|
+
// Display market information
|
478
|
+
await displayMarketInfo(targetMarket, useSerum);
|
479
|
+
// Display order book
|
480
|
+
await displayOrderBook(targetMarket, 15, useSerum);
|
481
|
+
console.log("\nā
Fetch completed successfully!");
|
482
|
+
console.log("\nš Note: This implementation uses:");
|
483
|
+
console.log("1. Real OpenBook market loading via Serum SDK");
|
484
|
+
console.log("2. Direct blockchain order book fetching");
|
485
|
+
console.log("3. Real bids and asks from the market");
|
486
|
+
console.log("\nUsage:");
|
487
|
+
console.log(" npm run openbook # Fetch default market");
|
488
|
+
console.log(" npm run openbook <market_address> # Fetch market (auto-detects program)");
|
489
|
+
console.log(" npm run openbook <market_address> --add # Add market (auto-detects program)");
|
490
|
+
console.log(" npm run openbook --list # List OpenBook markets");
|
491
|
+
console.log(" npm run openbook --list --serum # List Serum markets");
|
492
|
+
console.log("\nAuto-detection:");
|
493
|
+
console.log(" The system automatically detects if a market is OpenBook or Serum");
|
494
|
+
console.log(" No need to specify --serum flag for most operations");
|
495
|
+
console.log("\nFiles:");
|
496
|
+
console.log(" known_openbook_markets.json # OpenBook markets");
|
497
|
+
console.log(" known_serum_markets.json # Serum markets");
|
498
|
+
}
|
499
|
+
catch (error) {
|
500
|
+
console.error("ā Error in main function:", error);
|
501
|
+
}
|
502
|
+
}
|
503
|
+
// Run the main function if this file is executed directly
|
504
|
+
if (require.main === module) {
|
505
|
+
main().catch((error) => {
|
506
|
+
console.error("ā Error in main function:", error);
|
507
|
+
});
|
508
|
+
}
|
509
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
{
|
2
|
+
"name": "openbook-cli",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "A comprehensive CLI tool for interacting with OpenBook and Serum DEX markets on Solana",
|
5
|
+
"main": "dist/index.js",
|
6
|
+
"bin": {
|
7
|
+
"openbook-cli": "./dist/cli.js"
|
8
|
+
},
|
9
|
+
"scripts": {
|
10
|
+
"build": "tsc",
|
11
|
+
"start": "node dist/cli.js",
|
12
|
+
"dev": "ts-node src/index.ts",
|
13
|
+
"openbook": "ts-node src/index.ts",
|
14
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
15
|
+
},
|
16
|
+
"keywords": [
|
17
|
+
"openbook",
|
18
|
+
"serum",
|
19
|
+
"solana",
|
20
|
+
"dex",
|
21
|
+
"trading",
|
22
|
+
"cli",
|
23
|
+
"blockchain",
|
24
|
+
"defi"
|
25
|
+
],
|
26
|
+
"author": "Your Name",
|
27
|
+
"license": "MIT",
|
28
|
+
"dependencies": {
|
29
|
+
"@project-serum/serum": "^0.13.65",
|
30
|
+
"@solana/spl-token": "^0.3.9",
|
31
|
+
"@solana/web3.js": "^1.87.6",
|
32
|
+
"bn.js": "^5.2.1"
|
33
|
+
},
|
34
|
+
"devDependencies": {
|
35
|
+
"@types/bn.js": "^5.1.0",
|
36
|
+
"@types/node": "^20.10.0",
|
37
|
+
"ts-node": "^10.9.1",
|
38
|
+
"typescript": "^5.3.2"
|
39
|
+
},
|
40
|
+
"engines": {
|
41
|
+
"node": ">=16.0.0"
|
42
|
+
},
|
43
|
+
"repository": {
|
44
|
+
"type": "git",
|
45
|
+
"url": "https://github.com/yourusername/openbook-cli.git"
|
46
|
+
},
|
47
|
+
"bugs": {
|
48
|
+
"url": "https://github.com/yourusername/openbook-cli/issues"
|
49
|
+
},
|
50
|
+
"homepage": "https://github.com/yourusername/openbook-cli#readme"
|
51
|
+
}
|