@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.
- package/README.md +294 -0
- package/dist/__tests__/full-test.d.ts +1 -0
- package/dist/__tests__/full-test.js +291 -0
- package/dist/builders/affiliate-transaction.d.ts +41 -0
- package/dist/builders/affiliate-transaction.js +123 -0
- package/dist/builders/bet-transaction.d.ts +70 -0
- package/dist/builders/bet-transaction.js +323 -0
- package/dist/builders/claim-transaction.d.ts +57 -0
- package/dist/builders/claim-transaction.js +196 -0
- package/dist/builders/creator-transaction.d.ts +49 -0
- package/dist/builders/creator-transaction.js +177 -0
- package/dist/builders/dispute-transaction.d.ts +81 -0
- package/dist/builders/dispute-transaction.js +215 -0
- package/dist/builders/index.d.ts +14 -0
- package/dist/builders/index.js +15 -0
- package/dist/builders/market-creation-tx.d.ts +65 -0
- package/dist/builders/market-creation-tx.js +362 -0
- package/dist/builders/market-management-transaction.d.ts +85 -0
- package/dist/builders/market-management-transaction.js +239 -0
- package/dist/builders/race-transaction.d.ts +67 -0
- package/dist/builders/race-transaction.js +242 -0
- package/dist/builders/resolution-transaction.d.ts +108 -0
- package/dist/builders/resolution-transaction.js +250 -0
- package/dist/builders/whitelist-transaction.d.ts +72 -0
- package/dist/builders/whitelist-transaction.js +179 -0
- package/dist/config.d.ts +138 -0
- package/dist/config.js +307 -0
- package/dist/handlers/agent-network.d.ts +81 -0
- package/dist/handlers/agent-network.js +332 -0
- package/dist/handlers/claims.d.ts +47 -0
- package/dist/handlers/claims.js +218 -0
- package/dist/handlers/market-creation.d.ts +154 -0
- package/dist/handlers/market-creation.js +290 -0
- package/dist/handlers/markets.d.ts +41 -0
- package/dist/handlers/markets.js +319 -0
- package/dist/handlers/positions.d.ts +40 -0
- package/dist/handlers/positions.js +244 -0
- package/dist/handlers/quote.d.ts +33 -0
- package/dist/handlers/quote.js +144 -0
- package/dist/handlers/race-markets.d.ts +54 -0
- package/dist/handlers/race-markets.js +308 -0
- package/dist/handlers/resolution.d.ts +43 -0
- package/dist/handlers/resolution.js +194 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +109 -0
- package/dist/resources.d.ts +13 -0
- package/dist/resources.js +336 -0
- package/dist/tools.d.ts +3109 -0
- package/dist/tools.js +1956 -0
- package/dist/validation/bet-rules.d.ts +82 -0
- package/dist/validation/bet-rules.js +276 -0
- package/dist/validation/creation-rules.d.ts +69 -0
- package/dist/validation/creation-rules.js +302 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/market-rules.d.ts +60 -0
- package/dist/validation/market-rules.js +237 -0
- package/dist/validation/parimutuel-rules.d.ts +117 -0
- package/dist/validation/parimutuel-rules.js +270 -0
- 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>;
|