pnp-sdk 0.1.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/dist/cli.d.cts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.js ADDED
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ PNPClient
4
+ } from "./chunk-NRF2MZCQ.js";
5
+
6
+ // src/cli.ts
7
+ import "dotenv/config";
8
+ import { Keypair, PublicKey } from "@solana/web3.js";
9
+ import bs58 from "bs58";
10
+ import * as fs from "fs";
11
+ import * as path from "path";
12
+ function usage(code = 0) {
13
+ console.log(`
14
+ PNP CLI
15
+
16
+ Usage:
17
+ pnp create market "<question>" [--liquidity <lamports>] [--end <iso|days>]
18
+ pnp trade <marketId> buy <YES|NO> <amount_usdc>
19
+ pnp trade <marketId> sell <YES|NO> <amount_base_units>
20
+ pnp trade <marketId> balance
21
+ pnp trade <marketId> prices
22
+ pnp status <marketId>
23
+ pnp fetchMarkets
24
+ pnp settlementCritera <marketId>
25
+
26
+ Env:
27
+ RPC_URL, WALLET_SECRET_ARRAY | WALLET_BS58 | WALLET_FILE, [PNP_IDL_PATH]
28
+ `);
29
+ process.exit(code);
30
+ }
31
+ function parseWalletFromEnv() {
32
+ const secretArr = process.env.WALLET_SECRET_ARRAY;
33
+ if (secretArr) {
34
+ try {
35
+ const arr = JSON.parse(secretArr);
36
+ if (!Array.isArray(arr)) throw new Error("not an array");
37
+ return Keypair.fromSecretKey(Uint8Array.from(arr));
38
+ } catch (e) {
39
+ throw new Error("WALLET_SECRET_ARRAY must be a JSON array of numbers");
40
+ }
41
+ }
42
+ const secretBs58 = process.env.WALLET_BS58;
43
+ if (secretBs58) {
44
+ try {
45
+ const bytes = bs58.decode(secretBs58);
46
+ return Keypair.fromSecretKey(Uint8Array.from(bytes));
47
+ } catch (e) {
48
+ throw new Error("WALLET_BS58 must be a valid base58-encoded secret key");
49
+ }
50
+ }
51
+ const walletFile = process.env.WALLET_FILE;
52
+ if (walletFile) {
53
+ try {
54
+ const resolved = walletFile.startsWith("~") ? path.join(process.env.HOME || "", walletFile.slice(1)) : path.resolve(walletFile);
55
+ const content = fs.readFileSync(resolved, "utf8");
56
+ const parsed = JSON.parse(content);
57
+ if (!Array.isArray(parsed)) {
58
+ throw new Error("Expected JSON array in WALLET_FILE");
59
+ }
60
+ return Keypair.fromSecretKey(Uint8Array.from(parsed));
61
+ } catch (e) {
62
+ throw new Error(`Failed to read WALLET_FILE: ${e?.message || e}`);
63
+ }
64
+ }
65
+ throw new Error("Wallet not provided. Set one of WALLET_SECRET_ARRAY (JSON array), WALLET_BS58 (base58), or WALLET_FILE (path to JSON array).");
66
+ }
67
+ function hexToBigInt(hex) {
68
+ return BigInt("0x" + hex);
69
+ }
70
+ function hexToNumberSafe(hex) {
71
+ const n = hexToBigInt(hex);
72
+ return n > BigInt(Number.MAX_SAFE_INTEGER) ? null : Number(n);
73
+ }
74
+ function hexUnixSecondsToISOString(hex) {
75
+ const seconds = Number(hexToBigInt(hex));
76
+ return new Date(seconds * 1e3).toISOString();
77
+ }
78
+ var DEFAULT_PROXY_BASE_URL = "https://proxyserver-production-f61b.up.railway.app";
79
+ var MARKET_ADDRESSES_ENDPOINT = "/market-oracle/market-addresses";
80
+ async function fetchMarketAddressesFromProxy(baseUrl = process.env.PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL) {
81
+ const trimmed = baseUrl.replace(/\/+$/, "");
82
+ const url = `${trimmed}${MARKET_ADDRESSES_ENDPOINT}`;
83
+ const res = await fetch(url, {
84
+ method: "GET",
85
+ headers: { "Content-Type": "application/json" }
86
+ });
87
+ if (!res.ok) {
88
+ const text = await res.text().catch(() => "");
89
+ throw new Error(`Proxy request failed (${res.status} ${res.statusText}): ${text}`);
90
+ }
91
+ const data = await res.json().catch(() => {
92
+ throw new Error("Failed to parse JSON from proxy response");
93
+ });
94
+ if (Array.isArray(data)) return data.map(String);
95
+ if (data && Array.isArray(data.addresses)) return data.addresses.map(String);
96
+ if (data && typeof data.success !== "undefined" && data.data && Array.isArray(data.data.addresses)) {
97
+ return data.data.addresses.map(String);
98
+ }
99
+ if (data && Array.isArray(data.data)) return data.data.map(String);
100
+ throw new Error("Unexpected proxy response shape. Expected array, {addresses: string[]}, {data: string[]}, or { success, data: { addresses: string[] } }.");
101
+ }
102
+ async function main() {
103
+ const args = process.argv.slice(2);
104
+ if (args.length === 0) usage(1);
105
+ const [cmd, subcmd, ...rest] = args;
106
+ if (cmd === "fetchMarkets") {
107
+ const base = process.env.PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL;
108
+ const addresses = await fetchMarketAddressesFromProxy(base);
109
+ if (!addresses.length) {
110
+ console.log("\nNo market addresses returned by the proxy.");
111
+ return;
112
+ }
113
+ console.log(`
114
+ Received ${addresses.length} market addresses:`);
115
+ for (const addr of addresses) console.log(addr);
116
+ return;
117
+ }
118
+ if (cmd === "settlementCritera") {
119
+ const marketStr = subcmd;
120
+ if (!marketStr) {
121
+ usage(1);
122
+ }
123
+ const rpcUrlForReadOnly = process.env.RPC_URL || "https://api.mainnet-beta.solana.com";
124
+ const sdkReadOnly = new PNPClient(rpcUrlForReadOnly);
125
+ const criteria = await sdkReadOnly.getSettlementCriteria(marketStr);
126
+ console.log(JSON.stringify(criteria, null, 2));
127
+ return;
128
+ }
129
+ const rpcUrl = process.env.RPC_URL;
130
+ if (!rpcUrl) throw new Error("RPC_URL must be set");
131
+ const signer = parseWalletFromEnv();
132
+ const sdk = new PNPClient(rpcUrl, signer.secretKey);
133
+ if (cmd === "create" && (subcmd === "market" || !subcmd)) {
134
+ let question = rest.join(" ").trim();
135
+ const qi = args.findIndex((a) => a === "--question" || a === "-q");
136
+ if (!question && qi >= 0) {
137
+ const flagVal = args[qi + 1];
138
+ if (typeof flagVal === "string" && flagVal.length > 0) {
139
+ question = flagVal;
140
+ }
141
+ }
142
+ if (!question || question.length === 0) {
143
+ console.error("Missing question");
144
+ usage(1);
145
+ }
146
+ const questionStr = question;
147
+ const liIdx = args.findIndex((a) => a === "--liquidity" || a === "-l");
148
+ const initialLiquidityNum = liIdx >= 0 && args[liIdx + 1] ? Number(args[liIdx + 1]) : 5e7;
149
+ if (!Number.isFinite(initialLiquidityNum) || initialLiquidityNum <= 0) {
150
+ throw new Error("Invalid --liquidity value");
151
+ }
152
+ const initialLiquidity = BigInt(Math.floor(initialLiquidityNum));
153
+ let endDate = new Date(Date.now() + 7 * 24 * 3600 * 1e3);
154
+ const endIdx = args.findIndex((a) => a === "--end");
155
+ const daysIdx = args.findIndex((a) => a === "--days");
156
+ if (endIdx >= 0 && typeof args[endIdx + 1] === "string") {
157
+ const d = new Date(args[endIdx + 1]);
158
+ if (isNaN(d.getTime())) throw new Error("Invalid --end date");
159
+ endDate = d;
160
+ } else if (daysIdx >= 0 && typeof args[daysIdx + 1] === "string") {
161
+ const days = Number(args[daysIdx + 1]);
162
+ if (!Number.isFinite(days) || days <= 0) throw new Error("Invalid --days value");
163
+ endDate = new Date(Date.now() + days * 24 * 3600 * 1e3);
164
+ }
165
+ const endTime = BigInt(Math.floor(endDate.getTime() / 1e3));
166
+ const COLLATERAL_TOKEN_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
167
+ const collateralTokenMint = new PublicKey(COLLATERAL_TOKEN_MINT);
168
+ const res = await sdk.anchorMarket.createMarket({ question: questionStr, initialLiquidity, endTime, collateralTokenMint });
169
+ const md = res.marketDetails;
170
+ if (md && typeof md === "object") {
171
+ const decoded = {
172
+ id: md.id,
173
+ resolved: md.resolved,
174
+ marketReserves: typeof md.marketReserves === "string" ? hexToNumberSafe(md.marketReserves) : md.marketReserves,
175
+ initialLiquidity: typeof md.initialLiquidity === "string" ? hexToNumberSafe(md.initialLiquidity) : md.initialLiquidity,
176
+ yesTokenSupplyMinted: typeof md.yesTokenSupplyMinted === "string" ? hexToNumberSafe(md.yesTokenSupplyMinted) : md.yesTokenSupplyMinted,
177
+ noTokenSupplyMinted: typeof md.noTokenSupplyMinted === "string" ? hexToNumberSafe(md.noTokenSupplyMinted) : md.noTokenSupplyMinted,
178
+ endTime: typeof md.endTime === "string" ? hexUnixSecondsToISOString(md.endTime) : md.endTime,
179
+ creationTime: typeof md.creationTime === "string" ? hexUnixSecondsToISOString(md.creationTime) : md.creationTime,
180
+ collateralToken: md.collateralToken,
181
+ creator: md.creator,
182
+ creatorFeeTreasury: md.creatorFeeTreasury,
183
+ resolvable: md.resolvable,
184
+ forceResolve: md.forceResolve,
185
+ winningTokenId: md.winningTokenId
186
+ };
187
+ console.log("\nDecoded Market Details:");
188
+ console.log("------------------------");
189
+ Object.entries(decoded).forEach(([k, v]) => {
190
+ console.log(`${k}: ${typeof v === "object" ? JSON.stringify(v) : v}`);
191
+ });
192
+ console.log("------------------------\n");
193
+ }
194
+ if (md && typeof md === "object") {
195
+ const { yesTokenMint, noTokenMint, ...mdSansMints } = md;
196
+ const sanitized = { success: true, ...res, marketDetails: mdSansMints };
197
+ console.log(JSON.stringify(sanitized, null, 2));
198
+ } else {
199
+ console.log(JSON.stringify({ success: true, ...res }, null, 2));
200
+ }
201
+ return;
202
+ }
203
+ if (cmd === "status") {
204
+ const marketStr = subcmd;
205
+ if (!marketStr) {
206
+ usage(1);
207
+ }
208
+ const marketPk = new PublicKey(marketStr);
209
+ const info = await sdk.trading.getMarketInfo(marketPk);
210
+ const rawEnd = info.endTime;
211
+ let endSec = null;
212
+ if (typeof rawEnd === "bigint") endSec = Number(rawEnd);
213
+ else if (typeof rawEnd === "number") endSec = rawEnd;
214
+ else if (typeof rawEnd === "string") {
215
+ const hex = /^[0-9a-fA-F]+$/.test(rawEnd);
216
+ try {
217
+ endSec = Number(hex ? BigInt("0x" + rawEnd) : BigInt(rawEnd));
218
+ } catch {
219
+ const n = Number(rawEnd);
220
+ endSec = Number.isFinite(n) ? n : null;
221
+ }
222
+ }
223
+ const nowSec = Math.floor(Date.now() / 1e3);
224
+ const ended = endSec !== null ? nowSec >= endSec : false;
225
+ const endIso = endSec ? new Date(endSec * 1e3).toISOString() : "unknown";
226
+ console.log("Market Status:");
227
+ console.log("--------------");
228
+ console.log(`market: ${info.address.toBase58()}`);
229
+ console.log(`resolvable: ${info.resolvable}`);
230
+ console.log(`resolved: ${info.resolved}`);
231
+ console.log(`tradable: ${info.resolvable === true && info.resolved === false && !ended}`);
232
+ if (endSec !== null) {
233
+ console.log(`endTimeSeconds: ${endSec}`);
234
+ console.log(`endTimeISO: ${endIso}`);
235
+ }
236
+ console.log(`ended: ${ended}`);
237
+ console.log("--------------");
238
+ return;
239
+ }
240
+ if (cmd === "trade") {
241
+ if (!subcmd) {
242
+ usage(1);
243
+ }
244
+ const marketStr = subcmd;
245
+ const action = (rest[0] || "").toLowerCase();
246
+ const side = (rest[1] || "").toUpperCase();
247
+ const amountArg = rest[2];
248
+ const marketPk = new PublicKey(marketStr);
249
+ if (action === "balance") {
250
+ const bals = await sdk.trading.getBalances(marketPk);
251
+ console.log("Balances:");
252
+ console.log(` USDC: ${bals.collateral.uiAmountString}`);
253
+ console.log(` YES: ${bals.yes.uiAmountString}`);
254
+ console.log(` NO: ${bals.no.uiAmountString}`);
255
+ return;
256
+ }
257
+ if (action === "prices") {
258
+ const p = await sdk.trading.getPrices(marketPk);
259
+ console.log("Prices (implied shares):");
260
+ console.log(` YES share: ${(p.yesShare * 100).toFixed(2)}%`);
261
+ console.log(` NO share: ${(p.noShare * 100).toFixed(2)}%`);
262
+ return;
263
+ }
264
+ if (!marketStr || action !== "buy" && action !== "sell" || side !== "YES" && side !== "NO") {
265
+ console.error("Usage: pnp trade <marketId> buy <YES|NO> <amount_usdc> | pnp trade <marketId> sell <YES|NO> <amount_base_units> | pnp trade <marketId> balance | pnp trade <marketId> prices");
266
+ usage(1);
267
+ }
268
+ if (action === "buy") {
269
+ if (!amountArg) {
270
+ console.error("Missing amount_usdc");
271
+ usage(1);
272
+ }
273
+ const amtUsdc = Number(amountArg);
274
+ if (!Number.isFinite(amtUsdc) || amtUsdc <= 0) {
275
+ console.error("Invalid amount_usdc");
276
+ usage(1);
277
+ }
278
+ const buyYesToken = side === "YES";
279
+ console.log(`\u{1F6D2} Buying ${side} with ${amtUsdc} USDC on ${marketPk.toBase58()} ...`);
280
+ const res = await sdk.trading.buyTokensUsdc({ market: marketPk, buyYesToken, amountUsdc: amtUsdc, minimumOut: 0n });
281
+ console.log(`\u2705 Trade submitted: ${res.signature}`);
282
+ console.log(`\u{1F4B8} USDC Spent: ${res.usdcSpent}`);
283
+ console.log(`\u{1F3AF} ${side} Tokens Received: ${res.tokensReceived}`);
284
+ return;
285
+ } else {
286
+ if (!amountArg) {
287
+ console.error("Missing amount_base_units");
288
+ usage(1);
289
+ }
290
+ const amtBase = BigInt(amountArg);
291
+ if (amtBase <= 0n) {
292
+ console.error("Invalid amount_base_units");
293
+ usage(1);
294
+ }
295
+ const burnYesToken = side === "YES";
296
+ console.log(`\u{1F3EA} Selling ${side} amount=${amtBase.toString()} (base units) on ${marketPk.toBase58()} ...`);
297
+ const res = await sdk.trading.sellTokensBase({ market: marketPk, burnYesToken, amountBaseUnits: amtBase });
298
+ console.log(`\u2705 Trade submitted: ${res.signature}`);
299
+ console.log(`\u{1F3EA} ${side} Tokens Sold: ${res.tokensSold}`);
300
+ console.log(`\u{1F4B0} USDC Received: ${res.usdcReceived}`);
301
+ return;
302
+ }
303
+ }
304
+ usage(1);
305
+ }
306
+ main().catch((err) => {
307
+ console.error(err?.message || err);
308
+ process.exit(1);
309
+ });
310
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'dotenv/config';\nimport { Keypair, PublicKey } from '@solana/web3.js';\nimport { PNPClient } from './sdk';\nimport { NodeKeypairSigner } from './platform/wallet';\nimport bs58 from 'bs58';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction usage(code = 0): never {\n console.log(`\nPNP CLI\n\nUsage:\n pnp create market \"<question>\" [--liquidity <lamports>] [--end <iso|days>]\n pnp trade <marketId> buy <YES|NO> <amount_usdc>\n pnp trade <marketId> sell <YES|NO> <amount_base_units>\n pnp trade <marketId> balance\n pnp trade <marketId> prices\n pnp status <marketId>\n pnp fetchMarkets\n pnp settlementCritera <marketId>\n\nEnv:\n RPC_URL, WALLET_SECRET_ARRAY | WALLET_BS58 | WALLET_FILE, [PNP_IDL_PATH]\n`);\n process.exit(code);\n}\n\nfunction parseWalletFromEnv(): Keypair {\n // 1) JSON array via WALLET_SECRET_ARRAY\n const secretArr = process.env.WALLET_SECRET_ARRAY;\n if (secretArr) {\n try {\n const arr = JSON.parse(secretArr);\n if (!Array.isArray(arr)) throw new Error('not an array');\n return Keypair.fromSecretKey(Uint8Array.from(arr));\n } catch (e) {\n throw new Error('WALLET_SECRET_ARRAY must be a JSON array of numbers');\n }\n }\n\n // 2) Base58 string via WALLET_BS58\n const secretBs58 = process.env.WALLET_BS58;\n if (secretBs58) {\n try {\n const bytes = bs58.decode(secretBs58);\n return Keypair.fromSecretKey(Uint8Array.from(bytes));\n } catch (e) {\n throw new Error('WALLET_BS58 must be a valid base58-encoded secret key');\n }\n }\n\n // 3) File path via WALLET_FILE (expects a JSON array file like Solana keypair file)\n const walletFile = process.env.WALLET_FILE;\n if (walletFile) {\n try {\n const resolved = walletFile.startsWith('~')\n ? path.join(process.env.HOME || '', walletFile.slice(1))\n : path.resolve(walletFile);\n const content = fs.readFileSync(resolved, 'utf8');\n const parsed = JSON.parse(content);\n if (!Array.isArray(parsed)) {\n throw new Error('Expected JSON array in WALLET_FILE');\n }\n return Keypair.fromSecretKey(Uint8Array.from(parsed));\n } catch (e: any) {\n throw new Error(`Failed to read WALLET_FILE: ${e?.message || e}`);\n }\n }\n\n throw new Error('Wallet not provided. Set one of WALLET_SECRET_ARRAY (JSON array), WALLET_BS58 (base58), or WALLET_FILE (path to JSON array).');\n}\n\n// Helpers to decode hex-encoded numeric fields from on-chain accounts\nfunction hexToBigInt(hex: string): bigint {\n return BigInt('0x' + hex);\n}\nfunction hexToNumberSafe(hex: string): number | null {\n const n = hexToBigInt(hex);\n return n > BigInt(Number.MAX_SAFE_INTEGER) ? null : Number(n);\n}\nfunction hexUnixSecondsToISOString(hex: string): string {\n const seconds = Number(hexToBigInt(hex));\n return new Date(seconds * 1000).toISOString();\n}\n\n// Proxy fetch for market addresses\nconst DEFAULT_PROXY_BASE_URL = 'https://proxyserver-production-f61b.up.railway.app';\nconst MARKET_ADDRESSES_ENDPOINT = '/market-oracle/market-addresses';\nconst MARKET_ENDPOINT_PREFIX = '/market-oracle/market';\n\nasync function fetchMarketAddressesFromProxy(baseUrl: string = process.env.PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL): Promise<string[]> {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n const url = `${trimmed}${MARKET_ADDRESSES_ENDPOINT}`;\n\n const res = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Proxy request failed (${res.status} ${res.statusText}): ${text}`);\n }\n\n const data = await res.json().catch(() => {\n throw new Error('Failed to parse JSON from proxy response');\n });\n\n if (Array.isArray(data)) return data.map(String);\n if (data && Array.isArray((data as any).addresses)) return (data as any).addresses.map(String);\n if (\n data &&\n typeof (data as any).success !== 'undefined' &&\n (data as any).data &&\n Array.isArray((data as any).data.addresses)\n ) {\n return ((data as any).data.addresses as any[]).map(String);\n }\n if (data && Array.isArray((data as any).data)) return (data as any).data.map(String);\n\n throw new Error('Unexpected proxy response shape. Expected array, {addresses: string[]}, {data: string[]}, or { success, data: { addresses: string[] } }.');\n}\n\n// Removed local fetchSettlementCriteriaFromProxy in favor of SDK's getSettlementCriteria with built-in retry\n\nasync function main() {\n const args = process.argv.slice(2);\n if (args.length === 0) usage(1);\n\n const [cmd, subcmd, ...rest] = args;\n\n // Allow proxy fetch without needing RPC_URL or wallet\n if (cmd === 'fetchMarkets') {\n const base = process.env.PROXY_BASE_URL || DEFAULT_PROXY_BASE_URL;\n const addresses = await fetchMarketAddressesFromProxy(base);\n if (!addresses.length) {\n console.log('\\nNo market addresses returned by the proxy.');\n return;\n }\n console.log(`\\nReceived ${addresses.length} market addresses:`);\n for (const addr of addresses) console.log(addr);\n return;\n }\n\n if (cmd === 'settlementCritera') {\n const marketStr = subcmd;\n if (!marketStr) { usage(1); }\n // Allow this command to run without requiring RPC_URL by falling back to a default\n const rpcUrlForReadOnly = process.env.RPC_URL || 'https://api.mainnet-beta.solana.com';\n const sdkReadOnly = new PNPClient(rpcUrlForReadOnly);\n const criteria = await sdkReadOnly.getSettlementCriteria(marketStr);\n // Print only the criteria JSON without extra logs\n console.log(JSON.stringify(criteria, null, 2));\n return;\n }\n\n const rpcUrl = process.env.RPC_URL;\n if (!rpcUrl) throw new Error('RPC_URL must be set');\n\n const signer = parseWalletFromEnv();\n const sdk = new PNPClient(rpcUrl, signer.secretKey);\n\n if (cmd === 'create' && (subcmd === 'market' || !subcmd)) {\n // Question from positional args or --question flag\n let question = rest.join(' ').trim();\n const qi = args.findIndex((a) => a === '--question' || a === '-q');\n if (!question && qi >= 0) {\n const flagVal = args[qi + 1];\n if (typeof flagVal === 'string' && flagVal.length > 0) {\n question = flagVal;\n }\n }\n if (!question || question.length === 0) {\n console.error('Missing question');\n usage(1);\n }\n const questionStr: string = question;\n\n // Liquidity\n const liIdx = args.findIndex((a) => a === '--liquidity' || a === '-l');\n const initialLiquidityNum = liIdx >= 0 && args[liIdx + 1] ? Number(args[liIdx + 1]) : 50_000_000;\n if (!Number.isFinite(initialLiquidityNum) || initialLiquidityNum <= 0) {\n throw new Error('Invalid --liquidity value');\n }\n const initialLiquidity = BigInt(Math.floor(initialLiquidityNum));\n\n // End time: --end <ISO> or --days <n>\n let endDate: Date = new Date(Date.now() + 7 * 24 * 3600 * 1000);\n const endIdx = args.findIndex((a) => a === '--end');\n const daysIdx = args.findIndex((a) => a === '--days');\n if (endIdx >= 0 && typeof args[endIdx + 1] === 'string') {\n const d = new Date(args[endIdx + 1] as string);\n if (isNaN(d.getTime())) throw new Error('Invalid --end date');\n endDate = d;\n } else if (daysIdx >= 0 && typeof args[daysIdx + 1] === 'string') {\n const days = Number(args[daysIdx + 1]);\n if (!Number.isFinite(days) || days <= 0) throw new Error('Invalid --days value');\n endDate = new Date(Date.now() + days * 24 * 3600 * 1000);\n }\n const endTime = BigInt(Math.floor(endDate.getTime() / 1000));\n\n const COLLATERAL_TOKEN_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'; // USDC on mainnet\n const collateralTokenMint = new PublicKey(COLLATERAL_TOKEN_MINT);\n\n const res = await sdk.anchorMarket!.createMarket({ question: questionStr, initialLiquidity, endTime, collateralTokenMint });\n\n // Pretty print decoded market details, if present (V2-friendly)\n const md: any = (res as any).marketDetails;\n if (md && typeof md === 'object') {\n const decoded = {\n id: md.id,\n resolved: md.resolved,\n marketReserves: typeof md.marketReserves === 'string' ? hexToNumberSafe(md.marketReserves) : md.marketReserves,\n initialLiquidity: typeof md.initialLiquidity === 'string' ? hexToNumberSafe(md.initialLiquidity) : md.initialLiquidity,\n yesTokenSupplyMinted: typeof md.yesTokenSupplyMinted === 'string' ? hexToNumberSafe(md.yesTokenSupplyMinted) : md.yesTokenSupplyMinted,\n noTokenSupplyMinted: typeof md.noTokenSupplyMinted === 'string' ? hexToNumberSafe(md.noTokenSupplyMinted) : md.noTokenSupplyMinted,\n endTime: typeof md.endTime === 'string' ? hexUnixSecondsToISOString(md.endTime) : md.endTime,\n creationTime: typeof md.creationTime === 'string' ? hexUnixSecondsToISOString(md.creationTime) : md.creationTime,\n collateralToken: md.collateralToken,\n creator: md.creator,\n creatorFeeTreasury: md.creatorFeeTreasury,\n resolvable: md.resolvable,\n forceResolve: md.forceResolve,\n winningTokenId: md.winningTokenId,\n };\n\n console.log('\\nDecoded Market Details:');\n console.log('------------------------');\n Object.entries(decoded).forEach(([k, v]) => {\n console.log(`${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`);\n });\n console.log('------------------------\\n');\n }\n\n // Raw response for debugging/tools (omit yes/no mint fields)\n if (md && typeof md === 'object') {\n const { yesTokenMint, noTokenMint, ...mdSansMints } = md;\n const sanitized = { success: true, ...res, marketDetails: mdSansMints };\n console.log(JSON.stringify(sanitized, null, 2));\n } else {\n console.log(JSON.stringify({ success: true, ...res }, null, 2));\n }\n return;\n }\n\n if (cmd === 'status') {\n const marketStr = subcmd;\n if (!marketStr) { usage(1); }\n const marketPk = new PublicKey(marketStr);\n\n const info = await sdk.trading!.getMarketInfo(marketPk);\n\n // Normalize end time to seconds number, if possible\n const rawEnd: any = info.endTime;\n let endSec: number | null = null;\n if (typeof rawEnd === 'bigint') endSec = Number(rawEnd);\n else if (typeof rawEnd === 'number') endSec = rawEnd;\n else if (typeof rawEnd === 'string') {\n const hex = /^[0-9a-fA-F]+$/.test(rawEnd);\n try { endSec = Number(hex ? BigInt('0x' + rawEnd) : BigInt(rawEnd)); } catch { const n = Number(rawEnd); endSec = Number.isFinite(n) ? n : null; }\n }\n const nowSec = Math.floor(Date.now() / 1000);\n const ended = endSec !== null ? nowSec >= endSec : false;\n const endIso = endSec ? new Date(endSec * 1000).toISOString() : 'unknown';\n\n console.log('Market Status:');\n console.log('--------------');\n console.log(`market: ${info.address.toBase58()}`);\n console.log(`resolvable: ${(info as any).resolvable}`);\n console.log(`resolved: ${(info as any).resolved}`);\n console.log(`tradable: ${(info as any).resolvable === true && (info as any).resolved === false && !ended}`);\n if (endSec !== null) {\n console.log(`endTimeSeconds: ${endSec}`);\n console.log(`endTimeISO: ${endIso}`);\n }\n console.log(`ended: ${ended}`);\n console.log('--------------');\n return;\n }\n\n if (cmd === 'trade') {\n // Expected: pnp trade <marketId> buy <YES|NO> <amount_usdc>\n // pnp trade <marketId> sell <YES|NO> <amount_base_units>\n if (!subcmd) { usage(1); }\n\n const marketStr = subcmd; // second positional arg after 'trade'\n const action = (rest[0] || '').toLowerCase();\n const side = (rest[1] || '').toUpperCase();\n const amountArg = rest[2];\n\n const marketPk = new PublicKey(marketStr);\n\n // Support balance and prices without side/amount\n if (action === 'balance') {\n const bals = await sdk.trading!.getBalances(marketPk);\n console.log('Balances:');\n console.log(` USDC: ${bals.collateral.uiAmountString}`);\n console.log(` YES: ${bals.yes.uiAmountString}`);\n console.log(` NO: ${bals.no.uiAmountString}`);\n return;\n }\n if (action === 'prices') {\n const p = await sdk.trading!.getPrices(marketPk);\n console.log('Prices (implied shares):');\n console.log(` YES share: ${(p.yesShare * 100).toFixed(2)}%`);\n console.log(` NO share: ${(p.noShare * 100).toFixed(2)}%`);\n return;\n }\n\n if (!marketStr || (action !== 'buy' && action !== 'sell') || (side !== 'YES' && side !== 'NO')) {\n console.error('Usage: pnp trade <marketId> buy <YES|NO> <amount_usdc> | pnp trade <marketId> sell <YES|NO> <amount_base_units> | pnp trade <marketId> balance | pnp trade <marketId> prices');\n usage(1);\n }\n\n if (action === 'buy') {\n if (!amountArg) { console.error('Missing amount_usdc'); usage(1); }\n const amtUsdc = Number(amountArg);\n if (!Number.isFinite(amtUsdc) || amtUsdc <= 0) { console.error('Invalid amount_usdc'); usage(1); }\n const buyYesToken = side === 'YES';\n\n console.log(`🛒 Buying ${side} with ${amtUsdc} USDC on ${marketPk.toBase58()} ...`);\n const res = await sdk.trading!.buyTokensUsdc({ market: marketPk, buyYesToken, amountUsdc: amtUsdc, minimumOut: 0n });\n console.log(`✅ Trade submitted: ${res.signature}`);\n console.log(`💸 USDC Spent: ${res.usdcSpent}`);\n console.log(`🎯 ${side} Tokens Received: ${res.tokensReceived}`);\n return;\n } else {\n if (!amountArg) { console.error('Missing amount_base_units'); usage(1); }\n const amtBase = BigInt(amountArg);\n if (amtBase <= 0n) { console.error('Invalid amount_base_units'); usage(1); }\n const burnYesToken = side === 'YES';\n\n console.log(`🏪 Selling ${side} amount=${amtBase.toString()} (base units) on ${marketPk.toBase58()} ...`);\n const res = await sdk.trading!.sellTokensBase({ market: marketPk, burnYesToken, amountBaseUnits: amtBase });\n console.log(`✅ Trade submitted: ${res.signature}`);\n console.log(`🏪 ${side} Tokens Sold: ${res.tokensSold}`);\n console.log(`💰 USDC Received: ${res.usdcReceived}`);\n return;\n }\n }\n\n usage(1);\n}\n\nmain().catch((err) => {\n console.error(err?.message || err);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}