@baozi.bet/mcp-server 4.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.
Files changed (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Market handlers for MCP server
3
+ * Fetches market data from Solana V4.7.6 program (Mainnet)
4
+ */
5
+ import { Connection, PublicKey } from '@solana/web3.js';
6
+ import bs58 from 'bs58';
7
+ import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, MARKET_STATUS_NAMES, MARKET_LAYER_NAMES, lamportsToSol, } from '../config.js';
8
+ // =============================================================================
9
+ // MARKET DECODER
10
+ // =============================================================================
11
+ /**
12
+ * Decode Market account data from V4.7.6 struct
13
+ *
14
+ * Market struct layout:
15
+ * - discriminator (8)
16
+ * - market_id (u64, 8)
17
+ * - question (String: 4 + len)
18
+ * - closing_time (i64, 8)
19
+ * - resolution_time (i64, 8)
20
+ * - auto_stop_buffer (i64, 8)
21
+ * - yes_pool (u64, 8)
22
+ * - no_pool (u64, 8)
23
+ * - snapshot_yes_pool (u64, 8)
24
+ * - snapshot_no_pool (u64, 8)
25
+ * - status (enum, 1)
26
+ * - winning_outcome (Option<bool>: 1 + 0/1)
27
+ * - currency_type (enum, 1)
28
+ * - _reserved_usdc_vault (33)
29
+ * - creator_bond (u64, 8)
30
+ * - total_claimed (u64, 8)
31
+ * - platform_fee_collected (u64, 8)
32
+ * - last_bet_time (i64, 8)
33
+ * - bump (u8, 1)
34
+ * - layer (enum, 1)
35
+ * - resolution_mode (enum, 1)
36
+ * - access_gate (enum, 1)
37
+ * - creator (Pubkey, 32)
38
+ * - oracle_host (Option<Pubkey>: 1 + 0/32)
39
+ * - council (5 * Pubkey, 160)
40
+ * - council_size (u8, 1)
41
+ * - council_votes_yes (u8, 1)
42
+ * - council_votes_no (u8, 1)
43
+ * - council_threshold (u8, 1)
44
+ * - total_affiliate_fees (u64, 8)
45
+ * - invite_hash (Option<[u8;32]>: 1 + 0/32)
46
+ * - creator_fee_bps (u16, 2)
47
+ * - total_creator_fees (u64, 8)
48
+ * - creator_profile (Option<Pubkey>: 1 + 0/32)
49
+ * - platform_fee_bps_at_creation (u16, 2)
50
+ * - affiliate_fee_bps_at_creation (u16, 2)
51
+ * - betting_freeze_seconds_at_creation (i64, 8)
52
+ * - has_bets (bool, 1)
53
+ */
54
+ function decodeMarket(data, pubkey) {
55
+ try {
56
+ let offset = 8; // Skip discriminator
57
+ // market_id (u64)
58
+ const marketId = data.readBigUInt64LE(offset);
59
+ offset += 8;
60
+ // question (String: 4 byte len + UTF-8 bytes)
61
+ const questionLen = data.readUInt32LE(offset);
62
+ offset += 4;
63
+ const question = data.slice(offset, offset + questionLen).toString('utf8');
64
+ offset += questionLen;
65
+ // closing_time (i64)
66
+ const closingTime = data.readBigInt64LE(offset);
67
+ offset += 8;
68
+ // resolution_time (i64)
69
+ const resolutionTime = data.readBigInt64LE(offset);
70
+ offset += 8;
71
+ // auto_stop_buffer (i64)
72
+ offset += 8;
73
+ // yes_pool (u64)
74
+ const yesPool = data.readBigUInt64LE(offset);
75
+ offset += 8;
76
+ // no_pool (u64)
77
+ const noPool = data.readBigUInt64LE(offset);
78
+ offset += 8;
79
+ // snapshot_yes_pool, snapshot_no_pool (skip)
80
+ offset += 16;
81
+ // status (enum, 1 byte)
82
+ const statusCode = data.readUInt8(offset);
83
+ offset += 1;
84
+ // winning_outcome (Option<bool>: 1 byte discriminant + optional 1 byte)
85
+ const hasWinningOutcome = data.readUInt8(offset);
86
+ offset += 1;
87
+ let winningOutcome = null;
88
+ if (hasWinningOutcome === 1) {
89
+ winningOutcome = data.readUInt8(offset) === 1;
90
+ offset += 1;
91
+ }
92
+ // currency_type (enum, 1 byte)
93
+ const currencyTypeCode = data.readUInt8(offset);
94
+ offset += 1;
95
+ // _reserved_usdc_vault (33 bytes)
96
+ offset += 33;
97
+ // creator_bond (u64)
98
+ offset += 8;
99
+ // total_claimed (u64)
100
+ offset += 8;
101
+ // platform_fee_collected (u64)
102
+ offset += 8;
103
+ // last_bet_time (i64)
104
+ offset += 8;
105
+ // bump (u8)
106
+ offset += 1;
107
+ // layer (enum, 1 byte)
108
+ const layerCode = data.readUInt8(offset);
109
+ offset += 1;
110
+ // resolution_mode (enum, 1 byte)
111
+ offset += 1;
112
+ // access_gate (enum, 1 byte)
113
+ const accessGateCode = data.readUInt8(offset);
114
+ offset += 1;
115
+ // creator (Pubkey, 32 bytes)
116
+ const creator = new PublicKey(data.slice(offset, offset + 32));
117
+ offset += 32;
118
+ // oracle_host (Option<Pubkey>)
119
+ const hasOracleHost = data.readUInt8(offset);
120
+ offset += 1;
121
+ if (hasOracleHost === 1) {
122
+ offset += 32;
123
+ }
124
+ // council (5 * Pubkey = 160 bytes)
125
+ offset += 160;
126
+ // council_size, council_votes_yes, council_votes_no, council_threshold (4 bytes)
127
+ offset += 4;
128
+ // total_affiliate_fees (u64)
129
+ offset += 8;
130
+ // invite_hash (Option<[u8;32]>)
131
+ const hasInviteHash = data.readUInt8(offset);
132
+ offset += 1;
133
+ if (hasInviteHash === 1) {
134
+ offset += 32;
135
+ }
136
+ // creator_fee_bps (u16)
137
+ const creatorFeeBps = data.readUInt16LE(offset);
138
+ offset += 2;
139
+ // total_creator_fees (u64)
140
+ offset += 8;
141
+ // creator_profile (Option<Pubkey>)
142
+ const hasCreatorProfile = data.readUInt8(offset);
143
+ offset += 1;
144
+ if (hasCreatorProfile === 1) {
145
+ offset += 32;
146
+ }
147
+ // platform_fee_bps_at_creation (u16)
148
+ const platformFeeBps = data.readUInt16LE(offset);
149
+ offset += 2;
150
+ // affiliate_fee_bps_at_creation (u16)
151
+ offset += 2;
152
+ // betting_freeze_seconds_at_creation (i64)
153
+ const bettingFreezeSeconds = data.readBigInt64LE(offset);
154
+ offset += 8;
155
+ // has_bets (bool, 1 byte)
156
+ const hasBets = data.readUInt8(offset) === 1;
157
+ // Calculate derived fields
158
+ const yesPoolSol = lamportsToSol(yesPool);
159
+ const noPoolSol = lamportsToSol(noPool);
160
+ const totalPoolSol = yesPoolSol + noPoolSol;
161
+ const yesPercent = totalPoolSol > 0 ? (yesPoolSol / totalPoolSol) * 100 : 50;
162
+ const noPercent = totalPoolSol > 0 ? (noPoolSol / totalPoolSol) * 100 : 50;
163
+ // Determine if betting is open
164
+ const now = BigInt(Math.floor(Date.now() / 1000));
165
+ const freezeTime = closingTime - bettingFreezeSeconds;
166
+ const isBettingOpen = statusCode === 0 && now < freezeTime;
167
+ // Convert status code to name
168
+ const status = MARKET_STATUS_NAMES[statusCode] || 'Unknown';
169
+ const layer = MARKET_LAYER_NAMES[layerCode] || 'Unknown';
170
+ const currencyType = currencyTypeCode === 0 ? 'Sol' : 'Usdc';
171
+ const accessGate = accessGateCode === 0 ? 'Public' : 'Whitelist';
172
+ // Convert winning outcome
173
+ let winningOutcomeStr = null;
174
+ if (winningOutcome !== null) {
175
+ winningOutcomeStr = winningOutcome ? 'Yes' : 'No';
176
+ }
177
+ return {
178
+ publicKey: pubkey.toBase58(),
179
+ marketId: marketId.toString(),
180
+ question,
181
+ closingTime: new Date(Number(closingTime) * 1000).toISOString(),
182
+ resolutionTime: new Date(Number(resolutionTime) * 1000).toISOString(),
183
+ status,
184
+ statusCode,
185
+ winningOutcome: winningOutcomeStr,
186
+ currencyType,
187
+ yesPoolSol: round4(yesPoolSol),
188
+ noPoolSol: round4(noPoolSol),
189
+ totalPoolSol: round4(totalPoolSol),
190
+ yesPercent: round2(yesPercent),
191
+ noPercent: round2(noPercent),
192
+ platformFeeBps,
193
+ layer,
194
+ layerCode,
195
+ accessGate,
196
+ creator: creator.toBase58(),
197
+ hasBets,
198
+ isBettingOpen,
199
+ creatorFeeBps,
200
+ };
201
+ }
202
+ catch (err) {
203
+ console.error('Error decoding market:', err);
204
+ return null;
205
+ }
206
+ }
207
+ // =============================================================================
208
+ // PUBLIC API
209
+ // =============================================================================
210
+ /**
211
+ * List all markets with optional status filter
212
+ */
213
+ export async function listMarkets(status) {
214
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
215
+ // Get all market accounts using discriminator filter
216
+ // Note: Solana RPC expects base58 encoding for memcmp bytes
217
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
218
+ filters: [
219
+ {
220
+ memcmp: {
221
+ offset: 0,
222
+ bytes: bs58.encode(DISCRIMINATORS.MARKET),
223
+ },
224
+ },
225
+ ],
226
+ });
227
+ const markets = [];
228
+ for (const { account, pubkey } of accounts) {
229
+ // Account data is returned as Buffer by default
230
+ const data = account.data;
231
+ const market = decodeMarket(data, pubkey);
232
+ if (market) {
233
+ // Apply status filter if provided
234
+ if (!status || market.status.toLowerCase() === status.toLowerCase()) {
235
+ markets.push(market);
236
+ }
237
+ }
238
+ }
239
+ // Sort by closing time (soonest first for active, then by status)
240
+ markets.sort((a, b) => {
241
+ // Active markets first
242
+ if (a.status === 'Active' && b.status !== 'Active')
243
+ return -1;
244
+ if (a.status !== 'Active' && b.status === 'Active')
245
+ return 1;
246
+ // Then by closing time
247
+ return new Date(a.closingTime).getTime() - new Date(b.closingTime).getTime();
248
+ });
249
+ return markets;
250
+ }
251
+ /**
252
+ * Get a specific market by public key
253
+ */
254
+ export async function getMarket(publicKey) {
255
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
256
+ try {
257
+ const pubkey = new PublicKey(publicKey);
258
+ const account = await connection.getAccountInfo(pubkey);
259
+ if (!account)
260
+ return null;
261
+ return decodeMarket(account.data, pubkey);
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ }
267
+ /**
268
+ * Get market with additional details for transaction building
269
+ */
270
+ export async function getMarketForBetting(publicKey) {
271
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
272
+ try {
273
+ const pubkey = new PublicKey(publicKey);
274
+ const account = await connection.getAccountInfo(pubkey);
275
+ if (!account)
276
+ return null;
277
+ const data = account.data;
278
+ const market = decodeMarket(data, pubkey);
279
+ if (!market)
280
+ return null;
281
+ // Extract raw values needed for transaction building
282
+ const marketId = data.readBigUInt64LE(8);
283
+ // Parse access_gate position
284
+ let offset = 8 + 8; // discriminator + market_id
285
+ const questionLen = data.readUInt32LE(offset);
286
+ offset += 4 + questionLen;
287
+ offset += 24; // closing_time, resolution_time, auto_stop_buffer
288
+ offset += 32; // yes_pool, no_pool, snapshot_yes, snapshot_no
289
+ offset += 1; // status
290
+ const hasWinning = data.readUInt8(offset);
291
+ offset += 1 + (hasWinning === 1 ? 1 : 0);
292
+ offset += 1; // currency_type
293
+ offset += 33; // _reserved_usdc_vault
294
+ offset += 32; // creator_bond, total_claimed, platform_fee_collected, last_bet_time
295
+ offset += 1; // bump
296
+ offset += 1; // layer
297
+ offset += 1; // resolution_mode
298
+ const accessGate = data.readUInt8(offset);
299
+ return {
300
+ market,
301
+ marketId,
302
+ accessGate,
303
+ platformFeeBps: market.platformFeeBps,
304
+ };
305
+ }
306
+ catch {
307
+ return null;
308
+ }
309
+ }
310
+ // =============================================================================
311
+ // HELPERS
312
+ // =============================================================================
313
+ function round2(n) {
314
+ return Math.round(n * 100) / 100;
315
+ }
316
+ function round4(n) {
317
+ return Math.round(n * 10000) / 10000;
318
+ }
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVycy9tYXJrZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGNBQWMsRUFDZCxtQkFBbUIsRUFFbkIsa0JBQWtCLEVBRWxCLGFBQWEsR0FDZCxNQUFNLGNBQWMsQ0FBQztBQStCdEIsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQVksRUFBRSxNQUFpQjtJQUNuRCxJQUFJLENBQUM7UUFDSCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7UUFFckMsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLDhDQUE4QztRQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFFdEIscUJBQXFCO1FBQ3JCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLENBQUMs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aEYsVUFBVTtBQUNWLGdGQUFnRjtBQUVoRixTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hcmtldCBoYW5kbGVycyBmb3IgTUNQIHNlcnZlclxuICogRmV0Y2hlcyBtYXJrZXQgZGF0YSBmcm9tIFNvbGFuYSBWNC43LjYgcHJvZ3JhbSAoTWFpbm5ldClcbiAqL1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgUlBDX0VORFBPSU5ULFxuICBESVNDUklNSU5BVE9SUyxcbiAgTUFSS0VUX1NUQVRVU19OQU1FUyxcbiAgTUFSS0VUX09VVENPTUVfTkFNRVMsXG4gIE1BUktFVF9MQVlFUl9OQU1FUyxcbiAgQUNDRVNTX0dBVEUsXG4gIGxhbXBvcnRzVG9Tb2wsXG59IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBNYXJrZXQge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgbWFya2V0SWQ6IHN0cmluZztcbiAgcXVlc3Rpb246IHN0cmluZztcbiAgY2xvc2luZ1RpbWU6IHN0cmluZztcbiAgcmVzb2x1dGlvblRpbWU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgd2lubmluZ091dGNvbWU6IHN0cmluZyB8IG51bGw7XG4gIGN1cnJlbmN5VHlwZTogc3RyaW5nO1xuICB5ZXNQb29sU29sOiBudW1iZXI7XG4gIG5vUG9vbFNvbDogbnVtYmVyO1xuICB0b3RhbFBvb2xTb2w6IG51bWJlcjtcbiAgeWVzUGVyY2VudDogbnVtYmVyO1xuICBub1BlcmNlbnQ6IG51bWJlcjtcbiAgcGxhdGZvcm1GZWVCcHM6IG51bWJlcjtcbiAgbGF5ZXI6IHN0cmluZztcbiAgbGF5ZXJDb2RlOiBudW1iZXI7XG4gIGFjY2Vzc0dhdGU6IHN0cmluZztcbiAgY3JlYXRvcjogc3RyaW5nO1xuICBoYXNCZXRzOiBib29sZWFuO1xuICBpc0JldHRpbmdPcGVuOiBib29sZWFuO1xuICBjcmVhdG9yRmVlQnBzOiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNQVJLRVQgREVDT0RFUlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBEZWNvZGUgTWFya2V0IGFjY291bnQgZGF0YSBmcm9tIFY0LjcuNiBzdHJ1Y3RcbiAqXG4gKiBNYXJrZXQgc3RydWN0IGxheW91dDpcbiAqIC0gZGlzY3JpbWluYXRvciAoOClcbiAqIC0gbWFya2V0X2lkICh1NjQsIDgpXG4gKiAtIHF1ZXN0aW9uIChTdHJpbmc6IDQgKyBsZW4pXG4gKiAtIGNsb3NpbmdfdGltZSAoaTY0LCA4KVxuICogLSByZXNvbHV0aW9uX3RpbWUgKGk2NCwgOClcbiAqIC0gYXV0b19zdG9wX2J1ZmZlciAoaTY0LCA4KVxuICogLSB5ZXNfcG9vbCAodTY0LCA4KVxuICogLSBub19wb29sICh1NjQsIDgpXG4gKiAtIHNuYXBzaG90X3llc19wb29sICh1NjQsIDgpXG4gKiAtIHNuYXBzaG90X25vX3Bvb2wgKHU2NCwgOClcbiAqIC0gc3RhdHVzIChlbnVtLCAxKVxuICogLSB3aW5uaW5nX291dGNvbWUgKE9wdGlvbjxib29sPjogMSArIDAvMSlcbiAqIC0gY3VycmVuY3lfdHlwZSAoZW51bSwgMSlcbiAqIC0gX3Jlc2VydmVkX3VzZGNfdmF1bHQgKDMzKVxuICogLSBjcmVhdG9yX2JvbmQgKHU2NCwgOClcbiAqIC0gdG90YWxfY2xhaW1lZCAodTY0LCA4KVxuICogLSBwbGF0Zm9ybV9mZWVfY29sbGVjdGVkICh1NjQsIDgpXG4gKiAtIGxhc3RfYmV0X3RpbWUgKGk2NCwgOClcbiAqIC0gYnVtcCAodTgsIDEpXG4gKiAtIGxheWVyIChlbnVtLCAxKVxuICogLSByZXNvbHV0aW9uX21vZGUgKGVudW0sIDEpXG4gKiAtIGFjY2Vzc19nYXRlIChlbnVtLCAxKVxuICogLSBjcmVhdG9yIChQdWJrZXksIDMyKVxuICogLSBvcmFjbGVfaG9zdCAoT3B0aW9uPFB1YmtleT46IDEgKyAwLzMyKVxuICogLSBjb3VuY2lsICg1ICogUHVia2V5LCAxNjApXG4gKiAtIGNvdW5jaWxfc2l6ZSAodTgsIDEpXG4gKiAtIGNvdW5jaWxfdm90ZXNfeWVzICh1OCwgMSlcbiAqIC0gY291bmNpbF92b3Rlc19ubyAodTgsIDEpXG4gKiAtIGNvdW5jaWxfdGhyZXNob2xkICh1OCwgMSlcbiAqIC0gdG90YWxfYWZmaWxpYXRlX2ZlZXMgKHU2NCwgOClcbiAqIC0gaW52aXRlX2hhc2ggKE9wdGlvbjxbdTg7MzJdPjogMSArIDAvMzIpXG4gKiAtIGNyZWF0b3JfZmVlX2JwcyAodTE2LCAyKVxuICogLSB0b3RhbF9jcmVhdG9yX2ZlZXMgKHU2NCwgOClcbiAqIC0gY3JlYXRvcl9wcm9maWxlIChPcHRpb248UHVia2V5PjogMSArIDAvMzIpXG4gKiAtIHBsYXRmb3JtX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYWZmaWxpYXRlX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYmV0dGluZ19mcmVlemVfc2Vjb25kc19hdF9jcmVhdGlvbiAoaTY0LCA4KVxuICogLSBoYXNfYmV0cyAoYm9vbCwgMSlcbiAqL1xuZnVuY3Rpb24gZGVjb2RlTWFya2V0KGRhdGE6IEJ1ZmZlciwgcHVia2V5OiBQdWJsaWNLZXkpOiBNYXJrZXQgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBsZXQgb2Zmc2V0ID0gODsgLy8gU2tpcCBkaXNjcmltaW5hdG9yXG5cbiAgICAvLyBtYXJrZXRfaWQgKHU2NClcbiAgICBjb25zdCBtYXJrZXRJZCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBxdWVzdGlvbiAoU3RyaW5nOiA0IGJ5dGUgbGVuICsgVVRGLTggYnl0ZXMpXG4gICAgY29uc3QgcXVlc3Rpb25MZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHF1ZXN0aW9uTGVuKS50b1N0cmluZygndXRmOCcpO1xuICAgIG9mZnNldCArPSBxdWVzdGlvbkxlbjtcblxuICAgIC8vIGNsb3NpbmdfdGltZSAoaTY0KVxuICAgIGNvbnN0IGNsb3NpbmdUaW1lID0gZGF0YS5yZWFkQmlnSW50NjRMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA4O1xuXG4gICAgLy8gcmVzb2x1dGlvbl90aW1lIChpNjQpXG4gICAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBkYXRhLnJlYWRCaWdJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBhdXRvX3N0b3BfYnVmZmVyIChpNjQpXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyB5ZXNfcG9vbCAodTY0KVxuICAgIGNvbnN0IHllc1Bvb2wgPSBkYXRhLnJlYWRCaWdVSW50NjRMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA4O1xuXG4gICAgLy8gbm9fcG9vbCAodTY0KVxuICAgIGNvbnN0IG5vUG9vbCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBzbmFwc2hvdF95ZXNfcG9vbCwgc25hcHNob3Rfbm9fcG9vbCAoc2tpcClcbiAgICBvZmZzZXQgKz0gMTY7XG5cbiAgICAvLyBzdGF0dXMgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIHdpbm5pbmdfb3V0Y29tZSAoT3B0aW9uPGJvb2w+OiAxIGJ5dGUgZGlzY3JpbWluYW50ICsgb3B0aW9uYWwgMSBieXRlKVxuICAgIGNvbnN0IGhhc1dpbm5pbmdPdXRjb21lID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBsZXQgd2lubmluZ091dGNvbWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoaGFzV2lubmluZ091dGNvbWUgPT09IDEpIHtcbiAgICAgIHdpbm5pbmdPdXRjb21lID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSA9PT0gMTtcbiAgICAgIG9mZnNldCArPSAxO1xuICAgIH1cblxuICAgIC8vIGN1cnJlbmN5X3R5cGUgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBjdXJyZW5jeVR5cGVDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIF9yZXNlcnZlZF91c2RjX3ZhdWx0ICgzMyBieXRlcylcbiAgICBvZmZzZXQgKz0gMzM7XG5cbiAgICAvLyBjcmVhdG9yX2JvbmQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIHRvdGFsX2NsYWltZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIHBsYXRmb3JtX2ZlZV9jb2xsZWN0ZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGxhc3RfYmV0X3RpbWUgKGk2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGJ1bXAgKHU4KVxuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gbGF5ZXIgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBsYXllckNvZGUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gcmVzb2x1dGlvbl9tb2RlIChlbnVtLCAxIGJ5dGUpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBhY2Nlc3NfZ2F0ZSAoZW51bSwgMSBieXRlKVxuICAgIGNvbnN0IGFjY2Vzc0dhdGVDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIGNyZWF0b3IgKFB1YmtleSwgMzIgYnl0ZXMpXG4gICAgY29uc3QgY3JlYXRvciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgb2Zmc2V0ICs9IDMyO1xuXG4gICAgLy8gb3JhY2xlX2hvc3QgKE9wdGlvbjxQdWJrZXk+KVxuICAgIGNvbnN0IGhhc09yYWNsZUhvc3QgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuICAgIGlmIChoYXNPcmFjbGVIb3N0ID09PSAxKSB7XG4gICAgICBvZmZzZXQgKz0gMzI7XG4gICAgfVxuXG4gICAgLy8gY291bmNpbCAoNSAqIFB1YmtleSA9IDE2MCBieXRlcylcbiAgICBvZmZzZXQgKz0gMTYwO1xuXG4gICAgLy8gY291bmNpbF9zaXplLCBjb3VuY2lsX3ZvdGVzX3llcywgY291bmNpbF92b3Rlc19ubywgY291bmNpbF90aHJlc2hvbGQgKDQgYnl0ZXMpXG4gICAgb2Zmc2V0ICs9IDQ7XG5cbiAgICAvLyB0b3RhbF9hZmZpbGlhdGVfZmVlcyAodTY0KVxuICAgIG9mZnNldCArPSA4O1xuXG4gICAgLy8gaW52aXRlX2hhc2ggKE9wdGlvbjxbdTg7MzJdPilcbiAgICBjb25zdCBoYXNJbnZpdGVIYXNoID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzSW52aXRlSGFzaCA9PT0gMSkge1xuICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgIH1cblxuICAgIC8vIGNyZWF0b3JfZmVlX2JwcyAodTE2KVxuICAgIGNvbnN0IGNyZWF0b3JGZWVCcHMgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuXG4gICAgLy8gdG90YWxfY3JlYXRvcl9mZWVzICh1NjQpXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBjcmVhdG9yX3Byb2ZpbGUgKE9wdGlvbjxQdWJrZXk+KVxuICAgIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzQ3JlYXRvclByb2ZpbGUgPT09IDEpIHtcbiAgICAgIG9mZnNldCArPSAzMjtcbiAgICB9XG5cbiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzX2F0X2NyZWF0aW9uICh1MTYpXG4gICAgY29uc3QgcGxhdGZvcm1GZWVCcHMgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuXG4gICAgLy8gYWZmaWxpYXRlX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNilcbiAgICBvZmZzZXQgKz0gMjtcblxuICAgIC8vIGJldHRpbmdfZnJlZXplX3NlY29uZHNfYXRfY3JlYXRpb24gKGk2NClcbiAgICBjb25zdCBiZXR0aW5nRnJlZXplU2Vjb25kcyA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGhhc19iZXRzIChib29sLCAxIGJ5dGUpXG4gICAgY29uc3QgaGFzQmV0cyA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgPT09IDE7XG5cbiAgICAvLyBDYWxjdWxhdGUgZGVyaXZlZCBmaWVsZHNcbiAgICBjb25zdCB5ZXNQb29sU29sID0gbGFtcG9ydHNUb1NvbCh5ZXNQb29sKTtcbiAgICBjb25zdCBub1Bvb2xTb2wgPSBsYW1wb3J0c1RvU29sKG5vUG9vbCk7XG4gICAgY29uc3QgdG90YWxQb29sU29sID0geWVzUG9vbFNvbCArIG5vUG9vbFNvbDtcbiAgICBjb25zdCB5ZXNQZXJjZW50ID0gdG90YWxQb29sU29sID4gMCA/ICh5ZXNQb29sU29sIC8gdG90YWxQb29sU29sKSAqIDEwMCA6IDUwO1xuICAgIGNvbnN0IG5vUGVyY2VudCA9IHRvdGFsUG9vbFNvbCA+IDAgPyAobm9Qb29sU29sIC8gdG90YWxQb29sU29sKSAqIDEwMCA6IDUwO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGJldHRpbmcgaXMgb3BlblxuICAgIGNvbnN0IG5vdyA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSk7XG4gICAgY29uc3QgZnJlZXplVGltZSA9IGNsb3NpbmdUaW1lIC0gYmV0dGluZ0ZyZWV6ZVNlY29uZHM7XG4gICAgY29uc3QgaXNCZXR0aW5nT3BlbiA9IHN0YXR1c0NvZGUgPT09IDAgJiYgbm93IDwgZnJlZXplVGltZTtcblxuICAgIC8vIENvbnZlcnQgc3RhdHVzIGNvZGUgdG8gbmFtZVxuICAgIGNvbnN0IHN0YXR1cyA9IE1BUktFVF9TVEFUVVNfTkFNRVNbc3RhdHVzQ29kZV0gfHwgJ1Vua25vd24nO1xuICAgIGNvbnN0IGxheWVyID0gTUFSS0VUX0xBWUVSX05BTUVTW2xheWVyQ29kZV0gfHwgJ1Vua25vd24nO1xuICAgIGNvbnN0IGN1cnJlbmN5VHlwZSA9IGN1cnJlbmN5VHlwZUNvZGUgPT09IDAgPyAnU29sJyA6ICdVc2RjJztcbiAgICBjb25zdCBhY2Nlc3NHYXRlID0gYWNjZXNzR2F0ZUNvZGUgPT09IDAgPyAnUHVibGljJyA6ICdXaGl0ZWxpc3QnO1xuXG4gICAgLy8gQ29udmVydCB3aW5uaW5nIG91dGNvbWVcbiAgICBsZXQgd2lubmluZ091dGNvbWVTdHI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSAhPT0gbnVsbCkge1xuICAgICAgd2lubmluZ091dGNvbWVTdHIgPSB3aW5uaW5nT3V0Y29tZSA/ICdZZXMnIDogJ05vJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGljS2V5OiBwdWJrZXkudG9CYXNlNTgoKSxcbiAgICAgIG1hcmtldElkOiBtYXJrZXRJZC50b1N0cmluZygpLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBjbG9zaW5nVGltZTogbmV3IERhdGUoTnVtYmVyKGNsb3NpbmdUaW1lKSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXNvbHV0aW9uVGltZTogbmV3IERhdGUoTnVtYmVyKHJlc29sdXRpb25UaW1lKSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXMsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgd2lubmluZ091dGNvbWU6IHdpbm5pbmdPdXRjb21lU3RyLFxuICAgICAgY3VycmVuY3lUeXBlLFxuICAgICAgeWVzUG9vbFNvbDogcm91bmQ0KHllc1Bvb2xTb2wpLFxuICAgICAgbm9Qb29sU29sOiByb3VuZDQobm9Qb29sU29sKSxcbiAgICAgIHRvdGFsUG9vbFNvbDogcm91bmQ0KHRvdGFsUG9vbFNvbCksXG4gICAgICB5ZXNQZXJjZW50OiByb3VuZDIoeWVzUGVyY2VudCksXG4gICAgICBub1BlcmNlbnQ6IHJvdW5kMihub1BlcmNlbnQpLFxuICAgICAgcGxhdGZvcm1GZWVCcHMsXG4gICAgICBsYXllcixcbiAgICAgIGxheWVyQ29kZSxcbiAgICAgIGFjY2Vzc0dhdGUsXG4gICAgICBjcmVhdG9yOiBjcmVhdG9yLnRvQmFzZTU4KCksXG4gICAgICBoYXNCZXRzLFxuICAgICAgaXNCZXR0aW5nT3BlbixcbiAgICAgIGNyZWF0b3JGZWVCcHMsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVjb2RpbmcgbWFya2V0OicsIGVycik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBVQkxJQyBBUElcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTGlzdCBhbGwgbWFya2V0cyB3aXRoIG9wdGlvbmFsIHN0YXR1cyBmaWx0ZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RNYXJrZXRzKHN0YXR1cz86IHN0cmluZyk6IFByb21pc2U8TWFya2V0W10+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIEdldCBhbGwgbWFya2V0IGFjY291bnRzIHVzaW5nIGRpc2NyaW1pbmF0b3IgZmlsdGVyXG4gIC8vIE5vdGU6IFNvbGFuYSBSUEMgZXhwZWN0cyBiYXNlNTggZW5jb2RpbmcgZm9yIG1lbWNtcCBieXRlc1xuICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0UHJvZ3JhbUFjY291bnRzKFBST0dSQU1fSUQsIHtcbiAgICBmaWx0ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIG1lbWNtcDoge1xuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBieXRlczogYnM1OC5lbmNvZGUoRElTQ1JJTUlOQVRPUlMuTUFSS0VUKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3QgbWFya2V0czogTWFya2V0W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgYWNjb3VudCwgcHVia2V5IH0gb2YgYWNjb3VudHMpIHtcbiAgICAvLyBBY2NvdW50IGRhdGEgaXMgcmV0dXJuZWQgYXMgQnVmZmVyIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBkYXRhID0gYWNjb3VudC5kYXRhIGFzIEJ1ZmZlcjtcbiAgICBjb25zdCBtYXJrZXQgPSBkZWNvZGVNYXJrZXQoZGF0YSwgcHVia2V5KTtcbiAgICBpZiAobWFya2V0KSB7XG4gICAgICAvLyBBcHBseSBzdGF0dXMgZmlsdGVyIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoIXN0YXR1cyB8fCBtYXJrZXQuc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09IHN0YXR1cy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIG1hcmtldHMucHVzaChtYXJrZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNvcnQgYnkgY2xvc2luZyB0aW1lIChzb29uZXN0IGZpcnN0IGZvciBhY3RpdmUsIHRoZW4gYnkgc3RhdHVzKVxuICBtYXJrZXRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAvLyBBY3RpdmUgbWFya2V0cyBmaXJzdFxuICAgIGlmIChhLnN0YXR1cyA9PT0gJ0FjdGl2ZScgJiYgYi5zdGF0dXMgIT09ICdBY3RpdmUnKSByZXR1cm4gLTE7XG4gICAgaWYgKGEuc3RhdHVzICE9PSAnQWN0aXZlJyAmJiBiLnN0YXR1cyA9PT0gJ0FjdGl2ZScpIHJldHVybiAxO1xuICAgIC8vIFRoZW4gYnkgY2xvc2luZyB0aW1lXG4gICAgcmV0dXJuIG5ldyBEYXRlKGEuY2xvc2luZ1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuY2xvc2luZ1RpbWUpLmdldFRpbWUoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtldHM7XG59XG5cbi8qKlxuICogR2V0IGEgc3BlY2lmaWMgbWFya2V0IGJ5IHB1YmxpYyBrZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hcmtldChwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8TWFya2V0IHwgbnVsbD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwdWJrZXkgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8ocHVia2V5KTtcblxuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZGVjb2RlTWFya2V0KGFjY291bnQuZGF0YSBhcyBCdWZmZXIsIHB1YmtleSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2V0IG1hcmtldCB3aXRoIGFkZGl0aW9uYWwgZGV0YWlscyBmb3IgdHJhbnNhY3Rpb24gYnVpbGRpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hcmtldEZvckJldHRpbmcocHVibGljS2V5OiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgbWFya2V0OiBNYXJrZXQgfCBudWxsO1xuICBtYXJrZXRJZDogYmlnaW50O1xuICBhY2Nlc3NHYXRlOiBudW1iZXI7XG4gIHBsYXRmb3JtRmVlQnBzOiBudW1iZXI7XG59IHwgbnVsbD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwdWJrZXkgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8ocHVia2V5KTtcblxuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkYXRhID0gYWNjb3VudC5kYXRhIGFzIEJ1ZmZlcjtcbiAgICBjb25zdCBtYXJrZXQgPSBkZWNvZGVNYXJrZXQoZGF0YSwgcHVia2V5KTtcblxuICAgIGlmICghbWFya2V0KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEV4dHJhY3QgcmF3IHZhbHVlcyBuZWVkZWQgZm9yIHRyYW5zYWN0aW9uIGJ1aWxkaW5nXG4gICAgY29uc3QgbWFya2V0SWQgPSBkYXRhLnJlYWRCaWdVSW50NjRMRSg4KTtcblxuICAgIC8vIFBhcnNlIGFjY2Vzc19nYXRlIHBvc2l0aW9uXG4gICAgbGV0IG9mZnNldCA9IDggKyA4OyAvLyBkaXNjcmltaW5hdG9yICsgbWFya2V0X2lkXG4gICAgY29uc3QgcXVlc3Rpb25MZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0ICsgcXVlc3Rpb25MZW47XG4gICAgb2Zmc2V0ICs9IDI0OyAvLyBjbG9zaW5nX3RpbWUsIHJlc29sdXRpb25fdGltZSwgYXV0b19zdG9wX2J1ZmZlclxuICAgIG9mZnNldCArPSAzMjsgLy8geWVzX3Bvb2wsIG5vX3Bvb2wsIHNuYXBzaG90X3llcywgc25hcHNob3Rfbm9cbiAgICBvZmZzZXQgKz0gMTsgIC8vIHN0YXR1c1xuICAgIGNvbnN0IGhhc1dpbm5pbmcgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxICsgKGhhc1dpbm5pbmcgPT09IDEgPyAxIDogMCk7XG4gICAgb2Zmc2V0ICs9IDE7ICAvLyBjdXJyZW5jeV90eXBlXG4gICAgb2Zmc2V0ICs9IDMzOyAvLyBfcmVzZXJ2ZWRfdXNkY192YXVsdFxuICAgIG9mZnNldCArPSAzMjsgLy8gY3JlYXRvcl9ib25kLCB0b3RhbF9jbGFpbWVkLCBwbGF0Zm9ybV9mZWVfY29sbGVjdGVkLCBsYXN0X2JldF90aW1lXG4gICAgb2Zmc2V0ICs9IDE7ICAvLyBidW1wXG4gICAgb2Zmc2V0ICs9IDE7ICAvLyBsYXllclxuICAgIG9mZnNldCArPSAxOyAgLy8gcmVzb2x1dGlvbl9tb2RlXG4gICAgY29uc3QgYWNjZXNzR2F0ZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWFya2V0LFxuICAgICAgbWFya2V0SWQsXG4gICAgICBhY2Nlc3NHYXRlLFxuICAgICAgcGxhdGZvcm1GZWVCcHM6IG1hcmtldC5wbGF0Zm9ybUZlZUJwcyxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcm91bmQyKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG4gKiAxMDApIC8gMTAwO1xufVxuXG5mdW5jdGlvbiByb3VuZDQobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQobiAqIDEwMDAwKSAvIDEwMDAwO1xufVxuIl19
@@ -0,0 +1,40 @@
1
+ export interface Position {
2
+ publicKey: string;
3
+ user: string;
4
+ marketId: string;
5
+ yesAmountSol: number;
6
+ noAmountSol: number;
7
+ totalAmountSol: number;
8
+ side: 'Yes' | 'No' | 'Both';
9
+ claimed: boolean;
10
+ referredBy: string | null;
11
+ affiliateFeePaidSol: number;
12
+ marketPda?: string;
13
+ marketQuestion?: string;
14
+ marketStatus?: string;
15
+ marketOutcome?: string | null;
16
+ potentialPayout?: number;
17
+ }
18
+ export interface PositionSummary {
19
+ wallet: string;
20
+ totalPositions: number;
21
+ totalBetSol: number;
22
+ activePositions: number;
23
+ claimedPositions: number;
24
+ winningPositions: number;
25
+ losingPositions: number;
26
+ pendingPositions: number;
27
+ positions: Position[];
28
+ }
29
+ /**
30
+ * Get all positions for a wallet
31
+ */
32
+ export declare function getPositions(walletAddress: string): Promise<Position[]>;
33
+ /**
34
+ * Get positions with enriched market data
35
+ */
36
+ export declare function getPositionsEnriched(walletAddress: string): Promise<Position[]>;
37
+ /**
38
+ * Get position summary with statistics
39
+ */
40
+ export declare function getPositionsSummary(walletAddress: string): Promise<PositionSummary>;