@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,290 @@
1
+ /**
2
+ * Market Creation Handler
3
+ *
4
+ * Provides high-level functions for creating markets:
5
+ * - Validation against v6.2 rules
6
+ * - Fee calculation
7
+ * - Transaction building
8
+ * - PDA derivation helpers
9
+ */
10
+ import { Connection, PublicKey } from '@solana/web3.js';
11
+ import { validateMarketCreation, getCreationFee, calculateResolutionTime, calculateRecommendedClosingTime, } from '../validation/creation-rules.js';
12
+ import { buildCreateLabMarketTransaction, buildCreatePrivateMarketTransaction, buildCreateRaceMarketTransaction, getNextMarketId, previewMarketPda, previewRaceMarketPda, } from '../builders/market-creation-tx.js';
13
+ import { simulateBetTransaction } from '../builders/bet-transaction.js';
14
+ import { FEES, TIMING, RPC_ENDPOINT } from '../config.js';
15
+ // =============================================================================
16
+ // PREVIEW MARKET CREATION
17
+ // =============================================================================
18
+ /**
19
+ * Preview market creation - validates and returns costs without building tx
20
+ */
21
+ export async function previewMarketCreation(params, connection) {
22
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
23
+ // Parse dates
24
+ const closingTime = new Date(params.closingTime);
25
+ const eventTime = params.eventTime ? new Date(params.eventTime) : undefined;
26
+ const measurementStart = params.measurementStart ? new Date(params.measurementStart) : undefined;
27
+ const measurementEnd = params.measurementEnd ? new Date(params.measurementEnd) : undefined;
28
+ // Calculate resolution time if not provided
29
+ let resolutionTime;
30
+ if (params.resolutionTime) {
31
+ resolutionTime = new Date(params.resolutionTime);
32
+ }
33
+ else {
34
+ resolutionTime = calculateResolutionTime(closingTime, params.marketType || 'event', eventTime);
35
+ }
36
+ // Validate
37
+ const validation = validateMarketCreation({
38
+ question: params.question,
39
+ closingTime,
40
+ resolutionTime,
41
+ layer: params.layer,
42
+ marketType: params.marketType,
43
+ eventTime,
44
+ measurementStart,
45
+ measurementEnd,
46
+ });
47
+ // Get next market ID
48
+ const { marketId } = await getNextMarketId(conn);
49
+ const { marketPda } = previewMarketPda(marketId);
50
+ // Calculate costs
51
+ const { sol: creationFeeSol } = getCreationFee(params.layer);
52
+ const totalCostSol = creationFeeSol + validation.computed.estimatedRentSol;
53
+ // Recommended timing if event-based and no closing time issues
54
+ let recommendedTiming;
55
+ if (params.marketType === 'event' && eventTime) {
56
+ const recClose = calculateRecommendedClosingTime(eventTime);
57
+ const recRes = calculateResolutionTime(recClose, 'event', eventTime);
58
+ recommendedTiming = {
59
+ closingTime: recClose.toISOString(),
60
+ resolutionTime: recRes.toISOString(),
61
+ };
62
+ }
63
+ return {
64
+ validation,
65
+ marketPda: validation.valid ? marketPda : undefined,
66
+ marketId: validation.valid ? marketId.toString() : undefined,
67
+ creationFeeSol,
68
+ platformFeeBps: validation.computed.platformFeeBps,
69
+ estimatedRentSol: validation.computed.estimatedRentSol,
70
+ totalCostSol,
71
+ recommendedTiming,
72
+ };
73
+ }
74
+ /**
75
+ * Preview race market creation
76
+ */
77
+ export async function previewRaceMarketCreation(params, connection) {
78
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
79
+ const closingTime = new Date(params.closingTime);
80
+ const resolutionTime = params.resolutionTime
81
+ ? new Date(params.resolutionTime)
82
+ : new Date(closingTime.getTime() + 24 * 60 * 60 * 1000);
83
+ // Validate
84
+ const validation = validateMarketCreation({
85
+ question: params.question,
86
+ closingTime,
87
+ resolutionTime,
88
+ layer: 'lab',
89
+ outcomes: params.outcomes,
90
+ });
91
+ // Get next race market ID
92
+ const { raceMarketId } = await getNextMarketId(conn);
93
+ const { raceMarketPda } = previewRaceMarketPda(raceMarketId);
94
+ // Race markets use lab fees
95
+ const { sol: creationFeeSol } = getCreationFee('lab');
96
+ const totalCostSol = creationFeeSol + validation.computed.estimatedRentSol;
97
+ return {
98
+ validation,
99
+ marketPda: validation.valid ? raceMarketPda : undefined,
100
+ marketId: validation.valid ? raceMarketId.toString() : undefined,
101
+ creationFeeSol,
102
+ platformFeeBps: validation.computed.platformFeeBps,
103
+ estimatedRentSol: validation.computed.estimatedRentSol,
104
+ totalCostSol,
105
+ };
106
+ }
107
+ // =============================================================================
108
+ // BUILD AND VALIDATE TRANSACTIONS
109
+ // =============================================================================
110
+ /**
111
+ * Build lab market creation transaction with full validation
112
+ */
113
+ export async function createLabMarket(params, connection) {
114
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
115
+ // Preview first (validates)
116
+ const preview = await previewMarketCreation(params, conn);
117
+ if (!preview.validation.valid) {
118
+ return {
119
+ success: false,
120
+ error: preview.validation.errors.join('; '),
121
+ validation: preview.validation,
122
+ };
123
+ }
124
+ // Build transaction
125
+ const closingTime = new Date(params.closingTime);
126
+ const resolutionTime = params.resolutionTime
127
+ ? new Date(params.resolutionTime)
128
+ : calculateResolutionTime(closingTime, params.marketType || 'event', params.eventTime ? new Date(params.eventTime) : undefined);
129
+ const inviteHash = params.inviteHash
130
+ ? Buffer.from(params.inviteHash, 'hex')
131
+ : undefined;
132
+ // Calculate resolutionBuffer (seconds from closing to resolution)
133
+ const resolutionBuffer = Math.floor((resolutionTime.getTime() - closingTime.getTime()) / 1000);
134
+ const result = await buildCreateLabMarketTransaction({
135
+ question: params.question,
136
+ closingTime,
137
+ resolutionBuffer,
138
+ creatorWallet: params.creatorWallet,
139
+ }, conn);
140
+ // Simulate
141
+ const simulation = await simulateBetTransaction(result.transaction, new PublicKey(params.creatorWallet), conn);
142
+ return {
143
+ success: true,
144
+ validation: preview.validation,
145
+ transaction: {
146
+ serialized: result.serializedTx,
147
+ marketPda: result.marketPda,
148
+ marketId: result.marketId.toString(),
149
+ },
150
+ simulation: {
151
+ success: simulation.success,
152
+ error: simulation.error,
153
+ unitsConsumed: simulation.unitsConsumed,
154
+ },
155
+ };
156
+ }
157
+ /**
158
+ * Build private market creation transaction
159
+ */
160
+ export async function createPrivateMarket(params, connection) {
161
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
162
+ // Use lab preview but with private layer
163
+ const preview = await previewMarketCreation({ ...params, layer: 'private' }, conn);
164
+ if (!preview.validation.valid) {
165
+ return {
166
+ success: false,
167
+ error: preview.validation.errors.join('; '),
168
+ validation: preview.validation,
169
+ };
170
+ }
171
+ const closingTime = new Date(params.closingTime);
172
+ const resolutionTime = params.resolutionTime
173
+ ? new Date(params.resolutionTime)
174
+ : calculateResolutionTime(closingTime, params.marketType || 'event');
175
+ const inviteHash = params.inviteHash
176
+ ? Buffer.from(params.inviteHash, 'hex')
177
+ : undefined;
178
+ // Calculate resolutionBuffer (seconds from closing to resolution)
179
+ const resolutionBuffer = Math.floor((resolutionTime.getTime() - closingTime.getTime()) / 1000);
180
+ const result = await buildCreatePrivateMarketTransaction({
181
+ question: params.question,
182
+ closingTime,
183
+ resolutionBuffer,
184
+ creatorWallet: params.creatorWallet,
185
+ }, conn);
186
+ const simulation = await simulateBetTransaction(result.transaction, new PublicKey(params.creatorWallet), conn);
187
+ return {
188
+ success: true,
189
+ validation: preview.validation,
190
+ transaction: {
191
+ serialized: result.serializedTx,
192
+ marketPda: result.marketPda,
193
+ marketId: result.marketId.toString(),
194
+ },
195
+ simulation: {
196
+ success: simulation.success,
197
+ error: simulation.error,
198
+ },
199
+ };
200
+ }
201
+ /**
202
+ * Build race market creation transaction
203
+ */
204
+ export async function createRaceMarket(params, connection) {
205
+ const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
206
+ const preview = await previewRaceMarketCreation(params, conn);
207
+ if (!preview.validation.valid) {
208
+ return {
209
+ success: false,
210
+ error: preview.validation.errors.join('; '),
211
+ validation: preview.validation,
212
+ };
213
+ }
214
+ const closingTime = new Date(params.closingTime);
215
+ const resolutionTime = params.resolutionTime
216
+ ? new Date(params.resolutionTime)
217
+ : new Date(closingTime.getTime() + 24 * 60 * 60 * 1000);
218
+ // Calculate resolutionBuffer (seconds from closing to resolution)
219
+ const resolutionBuffer = Math.floor((resolutionTime.getTime() - closingTime.getTime()) / 1000);
220
+ const result = await buildCreateRaceMarketTransaction({
221
+ question: params.question,
222
+ outcomes: params.outcomes,
223
+ closingTime,
224
+ resolutionBuffer,
225
+ creatorWallet: params.creatorWallet,
226
+ }, conn);
227
+ const simulation = await simulateBetTransaction(result.transaction, new PublicKey(params.creatorWallet), conn);
228
+ return {
229
+ success: true,
230
+ validation: preview.validation,
231
+ transaction: {
232
+ serialized: result.serializedTx,
233
+ raceMarketPda: result.marketPda,
234
+ marketId: result.marketId.toString(),
235
+ },
236
+ simulation: {
237
+ success: simulation.success,
238
+ error: simulation.error,
239
+ },
240
+ };
241
+ }
242
+ // =============================================================================
243
+ // UTILITY FUNCTIONS
244
+ // =============================================================================
245
+ /**
246
+ * Get creation fees for all layers
247
+ */
248
+ export function getAllCreationFees() {
249
+ return {
250
+ official: getCreationFee('official'),
251
+ lab: getCreationFee('lab'),
252
+ private: getCreationFee('private'),
253
+ };
254
+ }
255
+ /**
256
+ * Get platform fees for all layers
257
+ */
258
+ export function getAllPlatformFees() {
259
+ return {
260
+ official: { bps: FEES.OFFICIAL_PLATFORM_FEE_BPS, percent: `${FEES.OFFICIAL_PLATFORM_FEE_BPS / 100}%` },
261
+ lab: { bps: FEES.LAB_PLATFORM_FEE_BPS, percent: `${FEES.LAB_PLATFORM_FEE_BPS / 100}%` },
262
+ private: { bps: FEES.PRIVATE_PLATFORM_FEE_BPS, percent: `${FEES.PRIVATE_PLATFORM_FEE_BPS / 100}%` },
263
+ };
264
+ }
265
+ /**
266
+ * Get timing constraints
267
+ */
268
+ export function getTimingConstraints() {
269
+ return {
270
+ minEventBufferHours: TIMING.MIN_EVENT_BUFFER_HOURS,
271
+ recommendedEventBufferHours: TIMING.RECOMMENDED_EVENT_BUFFER_HOURS,
272
+ bettingFreezeSeconds: TIMING.BETTING_FREEZE_SECONDS,
273
+ maxMarketDurationDays: TIMING.MAX_MARKET_DURATION_DAYS,
274
+ };
275
+ }
276
+ /**
277
+ * Generate invite hash for private market
278
+ */
279
+ export function generateInviteHash() {
280
+ const bytes = new Uint8Array(32);
281
+ crypto.getRandomValues(bytes);
282
+ return Buffer.from(bytes).toString('hex');
283
+ }
284
+ /**
285
+ * Derive invite link from hash
286
+ */
287
+ export function getInviteLink(marketPda, inviteHash) {
288
+ return `https://baozi.ooo/market/${marketPda}?invite=${inviteHash}`;
289
+ }
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0LWNyZWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL21hcmtldC1jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLCtCQUErQixHQUtoQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsbUNBQW1DLEVBQ25DLGdDQUFnQyxFQUNoQyxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWlEMUQsZ0ZBQWdGO0FBQ2hGLDBCQUEwQjtBQUMxQixnRkFBZ0Y7QUFFaEY7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxNQUEyQixFQUMzQixVQUF1QjtJQUV2QixNQUFNLElBQUksR0FBRyxVQUFVLElBQUksSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXJFLGNBQWM7SUFDZCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENB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LEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWlCLEVBQUUsVUFBa0I7SUFDakUsT0FBTyw0QkFBNEIsU0FBUyxXQUFXLFVBQVUsRUFBRSxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hcmtldCBDcmVhdGlvbiBIYW5kbGVyXG4gKlxuICogUHJvdmlkZXMgaGlnaC1sZXZlbCBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIG1hcmtldHM6XG4gKiAtIFZhbGlkYXRpb24gYWdhaW5zdCB2Ni4yIHJ1bGVzXG4gKiAtIEZlZSBjYWxjdWxhdGlvblxuICogLSBUcmFuc2FjdGlvbiBidWlsZGluZ1xuICogLSBQREEgZGVyaXZhdGlvbiBoZWxwZXJzXG4gKi9cbmltcG9ydCB7IENvbm5lY3Rpb24sIFB1YmxpY0tleSB9IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQge1xuICB2YWxpZGF0ZU1hcmtldENyZWF0aW9uLFxuICBnZXRDcmVhdGlvbkZlZSxcbiAgY2FsY3VsYXRlUmVzb2x1dGlvblRpbWUsXG4gIGNhbGN1bGF0ZVJlY29tbWVuZGVkQ2xvc2luZ1RpbWUsXG4gIHZhbGlkYXRlUXVlc3Rpb24sXG4gIHZhbGlkYXRlUmFjZU91dGNvbWVzLFxuICBDcmVhdGVNYXJrZXRQYXJhbXMsXG4gIENyZWF0aW9uVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi4vdmFsaWRhdGlvbi9jcmVhdGlvbi1ydWxlcy5qcyc7XG5pbXBvcnQge1xuICBidWlsZENyZWF0ZUxhYk1hcmtldFRyYW5zYWN0aW9uLFxuICBidWlsZENyZWF0ZVByaXZhdGVNYXJrZXRUcmFuc2FjdGlvbixcbiAgYnVpbGRDcmVhdGVSYWNlTWFya2V0VHJhbnNhY3Rpb24sXG4gIGdldE5leHRNYXJrZXRJZCxcbiAgcHJldmlld01hcmtldFBkYSxcbiAgcHJldmlld1JhY2VNYXJrZXRQZGEsXG59IGZyb20gJy4uL2J1aWxkZXJzL21hcmtldC1jcmVhdGlvbi10eC5qcyc7XG5pbXBvcnQgeyBzaW11bGF0ZUJldFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vYnVpbGRlcnMvYmV0LXRyYW5zYWN0aW9uLmpzJztcbmltcG9ydCB7IEZFRVMsIFRJTUlORywgUlBDX0VORFBPSU5UIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtldENyZWF0aW9uUHJldmlldyB7XG4gIHZhbGlkYXRpb246IENyZWF0aW9uVmFsaWRhdGlvblJlc3VsdDtcbiAgbWFya2V0UGRhPzogc3RyaW5nO1xuICBtYXJrZXRJZD86IHN0cmluZztcbiAgY3JlYXRpb25GZWVTb2w6IG51bWJlcjtcbiAgcGxhdGZvcm1GZWVCcHM6IG51bWJlcjtcbiAgZXN0aW1hdGVkUmVudFNvbDogbnVtYmVyO1xuICB0b3RhbENvc3RTb2w6IG51bWJlcjtcbiAgcmVjb21tZW5kZWRUaW1pbmc/OiB7XG4gICAgY2xvc2luZ1RpbWU6IHN0cmluZztcbiAgICByZXNvbHV0aW9uVGltZTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU1hcmtldFJlcXVlc3Qge1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICBsYXllcjogJ2xhYicgfCAncHJpdmF0ZSc7XG4gIGNsb3NpbmdUaW1lOiBzdHJpbmc7IC8vIElTTyA4NjAxXG4gIHJlc29sdXRpb25UaW1lPzogc3RyaW5nOyAvLyBJU08gODYwMSwgYXV0by1jYWxjdWxhdGVkIGlmIG5vdCBwcm92aWRlZFxuXG4gIC8vIEV2ZW50LWJhc2VkIChSdWxlIEEpXG4gIG1hcmtldFR5cGU/OiAnZXZlbnQnIHwgJ21lYXN1cmVtZW50JztcbiAgZXZlbnRUaW1lPzogc3RyaW5nOyAvLyBJU08gODYwMVxuXG4gIC8vIE1lYXN1cmVtZW50LXBlcmlvZCAoUnVsZSBCKVxuICBtZWFzdXJlbWVudFN0YXJ0Pzogc3RyaW5nO1xuICBtZWFzdXJlbWVudEVuZD86IHN0cmluZztcblxuICAvLyBQcml2YXRlIG1hcmtldFxuICBpbnZpdGVIYXNoPzogc3RyaW5nOyAvLyBoZXggc3RyaW5nXG5cbiAgLy8gQ3JlYXRvclxuICBjcmVhdG9yV2FsbGV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUmFjZU1hcmtldFJlcXVlc3Qge1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICBvdXRjb21lczogc3RyaW5nW107XG4gIGNsb3NpbmdUaW1lOiBzdHJpbmc7XG4gIHJlc29sdXRpb25UaW1lPzogc3RyaW5nO1xuICBjcmVhdG9yV2FsbGV0OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQUkVWSUVXIE1BUktFVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcmV2aWV3IG1hcmtldCBjcmVhdGlvbiAtIHZhbGlkYXRlcyBhbmQgcmV0dXJucyBjb3N0cyB3aXRob3V0IGJ1aWxkaW5nIHR4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmV2aWV3TWFya2V0Q3JlYXRpb24oXG4gIHBhcmFtczogQ3JlYXRlTWFya2V0UmVxdWVzdCxcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb25cbik6IFByb21pc2U8TWFya2V0Q3JlYXRpb25QcmV2aWV3PiB7XG4gIGNvbnN0IGNvbm4gPSBjb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIFBhcnNlIGRhdGVzXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gbmV3IERhdGUocGFyYW1zLmNsb3NpbmdUaW1lKTtcbiAgY29uc3QgZXZlbnRUaW1lID0gcGFyYW1zLmV2ZW50VGltZSA/IG5ldyBEYXRlKHBhcmFtcy5ldmVudFRpbWUpIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZWFzdXJlbWVudFN0YXJ0ID0gcGFyYW1zLm1lYXN1cmVtZW50U3RhcnQgPyBuZXcgRGF0ZShwYXJhbXMubWVhc3VyZW1lbnRTdGFydCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1lYXN1cmVtZW50RW5kID0gcGFyYW1zLm1lYXN1cmVtZW50RW5kID8gbmV3IERhdGUocGFyYW1zLm1lYXN1cmVtZW50RW5kKSA6IHVuZGVmaW5lZDtcblxuICAvLyBDYWxjdWxhdGUgcmVzb2x1dGlvbiB0aW1lIGlmIG5vdCBwcm92aWRlZFxuICBsZXQgcmVzb2x1dGlvblRpbWU6IERhdGU7XG4gIGlmIChwYXJhbXMucmVzb2x1dGlvblRpbWUpIHtcbiAgICByZXNvbHV0aW9uVGltZSA9IG5ldyBEYXRlKHBhcmFtcy5yZXNvbHV0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzb2x1dGlvblRpbWUgPSBjYWxjdWxhdGVSZXNvbHV0aW9uVGltZShcbiAgICAgIGNsb3NpbmdUaW1lLFxuICAgICAgcGFyYW1zLm1hcmtldFR5cGUgfHwgJ2V2ZW50JyxcbiAgICAgIGV2ZW50VGltZVxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZVxuICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVNYXJrZXRDcmVhdGlvbih7XG4gICAgcXVlc3Rpb246IHBhcmFtcy5xdWVzdGlvbixcbiAgICBjbG9zaW5nVGltZSxcbiAgICByZXNvbHV0aW9uVGltZSxcbiAgICBsYXllcjogcGFyYW1zLmxheWVyLFxuICAgIG1hcmtldFR5cGU6IHBhcmFtcy5tYXJrZXRUeXBlLFxuICAgIGV2ZW50VGltZSxcbiAgICBtZWFzdXJlbWVudFN0YXJ0LFxuICAgIG1lYXN1cmVtZW50RW5kLFxuICB9KTtcblxuICAvLyBHZXQgbmV4dCBtYXJrZXQgSURcbiAgY29uc3QgeyBtYXJrZXRJZCB9ID0gYXdhaXQgZ2V0TmV4dE1hcmtldElkKGNvbm4pO1xuICBjb25zdCB7IG1hcmtldFBkYSB9ID0gcHJldmlld01hcmtldFBkYShtYXJrZXRJZCk7XG5cbiAgLy8gQ2FsY3VsYXRlIGNvc3RzXG4gIGNvbnN0IHsgc29sOiBjcmVhdGlvbkZlZVNvbCB9ID0gZ2V0Q3JlYXRpb25GZWUocGFyYW1zLmxheWVyKTtcbiAgY29uc3QgdG90YWxDb3N0U29sID0gY3JlYXRpb25GZWVTb2wgKyB2YWxpZGF0aW9uLmNvbXB1dGVkLmVzdGltYXRlZFJlbnRTb2w7XG5cbiAgLy8gUmVjb21tZW5kZWQgdGltaW5nIGlmIGV2ZW50LWJhc2VkIGFuZCBubyBjbG9zaW5nIHRpbWUgaXNzdWVzXG4gIGxldCByZWNvbW1lbmRlZFRpbWluZzogeyBjbG9zaW5nVGltZTogc3RyaW5nOyByZXNvbHV0aW9uVGltZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gIGlmIChwYXJhbXMubWFya2V0VHlwZSA9PT0gJ2V2ZW50JyAmJiBldmVudFRpbWUpIHtcbiAgICBjb25zdCByZWNDbG9zZSA9IGNhbGN1bGF0ZVJlY29tbWVuZGVkQ2xvc2luZ1RpbWUoZXZlbnRUaW1lKTtcbiAgICBjb25zdCByZWNSZXMgPSBjYWxjdWxhdGVSZXNvbHV0aW9uVGltZShyZWNDbG9zZSwgJ2V2ZW50JywgZXZlbnRUaW1lKTtcbiAgICByZWNvbW1lbmRlZFRpbWluZyA9IHtcbiAgICAgIGNsb3NpbmdUaW1lOiByZWNDbG9zZS50b0lTT1N0cmluZygpLFxuICAgICAgcmVzb2x1dGlvblRpbWU6IHJlY1Jlcy50b0lTT1N0cmluZygpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbGlkYXRpb24sXG4gICAgbWFya2V0UGRhOiB2YWxpZGF0aW9uLnZhbGlkID8gbWFya2V0UGRhIDogdW5kZWZpbmVkLFxuICAgIG1hcmtldElkOiB2YWxpZGF0aW9uLnZhbGlkID8gbWFya2V0SWQudG9TdHJpbmcoKSA6IHVuZGVmaW5lZCxcbiAgICBjcmVhdGlvbkZlZVNvbCxcbiAgICBwbGF0Zm9ybUZlZUJwczogdmFsaWRhdGlvbi5jb21wdXRlZC5wbGF0Zm9ybUZlZUJwcyxcbiAgICBlc3RpbWF0ZWRSZW50U29sOiB2YWxpZGF0aW9uLmNvbXB1dGVkLmVzdGltYXRlZFJlbnRTb2wsXG4gICAgdG90YWxDb3N0U29sLFxuICAgIHJlY29tbWVuZGVkVGltaW5nLFxuICB9O1xufVxuXG4vKipcbiAqIFByZXZpZXcgcmFjZSBtYXJrZXQgY3JlYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXZpZXdSYWNlTWFya2V0Q3JlYXRpb24oXG4gIHBhcmFtczogQ3JlYXRlUmFjZU1hcmtldFJlcXVlc3QsXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPE1hcmtldENyZWF0aW9uUHJldmlldz4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICBjb25zdCBjbG9zaW5nVGltZSA9IG5ldyBEYXRlKHBhcmFtcy5jbG9zaW5nVGltZSk7XG4gIGNvbnN0IHJlc29sdXRpb25UaW1lID0gcGFyYW1zLnJlc29sdXRpb25UaW1lXG4gICAgPyBuZXcgRGF0ZShwYXJhbXMucmVzb2x1dGlvblRpbWUpXG4gICAgOiBuZXcgRGF0ZShjbG9zaW5nVGltZS5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKTtcblxuICAvLyBWYWxpZGF0ZVxuICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVNYXJrZXRDcmVhdGlvbih7XG4gICAgcXVlc3Rpb246IHBhcmFtcy5xdWVzdGlvbixcbiAgICBjbG9zaW5nVGltZSxcbiAgICByZXNvbHV0aW9uVGltZSxcbiAgICBsYXllcjogJ2xhYicsXG4gICAgb3V0Y29tZXM6IHBhcmFtcy5vdXRjb21lcyxcbiAgfSk7XG5cbiAgLy8gR2V0IG5leHQgcmFjZSBtYXJrZXQgSURcbiAgY29uc3QgeyByYWNlTWFya2V0SWQgfSA9IGF3YWl0IGdldE5leHRNYXJrZXRJZChjb25uKTtcbiAgY29uc3QgeyByYWNlTWFya2V0UGRhIH0gPSBwcmV2aWV3UmFjZU1hcmtldFBkYShyYWNlTWFya2V0SWQpO1xuXG4gIC8vIFJhY2UgbWFya2V0cyB1c2UgbGFiIGZlZXNcbiAgY29uc3QgeyBzb2w6IGNyZWF0aW9uRmVlU29sIH0gPSBnZXRDcmVhdGlvbkZlZSgnbGFiJyk7XG4gIGNvbnN0IHRvdGFsQ29zdFNvbCA9IGNyZWF0aW9uRmVlU29sICsgdmFsaWRhdGlvbi5jb21wdXRlZC5lc3RpbWF0ZWRSZW50U29sO1xuXG4gIHJldHVybiB7XG4gICAgdmFsaWRhdGlvbixcbiAgICBtYXJrZXRQZGE6IHZhbGlkYXRpb24udmFsaWQgPyByYWNlTWFya2V0UGRhIDogdW5kZWZpbmVkLFxuICAgIG1hcmtldElkOiB2YWxpZGF0aW9uLnZhbGlkID8gcmFjZU1hcmtldElkLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQsXG4gICAgY3JlYXRpb25GZWVTb2wsXG4gICAgcGxhdGZvcm1GZWVCcHM6IHZhbGlkYXRpb24uY29tcHV0ZWQucGxhdGZvcm1GZWVCcHMsXG4gICAgZXN0aW1hdGVkUmVudFNvbDogdmFsaWRhdGlvbi5jb21wdXRlZC5lc3RpbWF0ZWRSZW50U29sLFxuICAgIHRvdGFsQ29zdFNvbCxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxEIEFORCBWQUxJREFURSBUUkFOU0FDVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgbGFiIG1hcmtldCBjcmVhdGlvbiB0cmFuc2FjdGlvbiB3aXRoIGZ1bGwgdmFsaWRhdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGFiTWFya2V0KFxuICBwYXJhbXM6IENyZWF0ZU1hcmtldFJlcXVlc3QsXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIHZhbGlkYXRpb246IENyZWF0aW9uVmFsaWRhdGlvblJlc3VsdDtcbiAgdHJhbnNhY3Rpb24/OiB7XG4gICAgc2VyaWFsaXplZDogc3RyaW5nO1xuICAgIG1hcmtldFBkYTogc3RyaW5nO1xuICAgIG1hcmtldElkOiBzdHJpbmc7XG4gIH07XG4gIHNpbXVsYXRpb24/OiB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IHN0cmluZztcbiAgICB1bml0c0NvbnN1bWVkPzogbnVtYmVyO1xuICB9O1xufT4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICAvLyBQcmV2aWV3IGZpcnN0ICh2YWxpZGF0ZXMpXG4gIGNvbnN0IHByZXZpZXcgPSBhd2FpdCBwcmV2aWV3TWFya2V0Q3JlYXRpb24ocGFyYW1zLCBjb25uKTtcblxuICBpZiAoIXByZXZpZXcudmFsaWRhdGlvbi52YWxpZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBwcmV2aWV3LnZhbGlkYXRpb24uZXJyb3JzLmpvaW4oJzsgJyksXG4gICAgICB2YWxpZGF0aW9uOiBwcmV2aWV3LnZhbGlkYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRyYW5zYWN0aW9uXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gbmV3IERhdGUocGFyYW1zLmNsb3NpbmdUaW1lKTtcbiAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBwYXJhbXMucmVzb2x1dGlvblRpbWVcbiAgICA/IG5ldyBEYXRlKHBhcmFtcy5yZXNvbHV0aW9uVGltZSlcbiAgICA6IGNhbGN1bGF0ZVJlc29sdXRpb25UaW1lKFxuICAgICAgICBjbG9zaW5nVGltZSxcbiAgICAgICAgcGFyYW1zLm1hcmtldFR5cGUgfHwgJ2V2ZW50JyxcbiAgICAgICAgcGFyYW1zLmV2ZW50VGltZSA/IG5ldyBEYXRlKHBhcmFtcy5ldmVudFRpbWUpIDogdW5kZWZpbmVkXG4gICAgICApO1xuXG4gIGNvbnN0IGludml0ZUhhc2ggPSBwYXJhbXMuaW52aXRlSGFzaFxuICAgID8gQnVmZmVyLmZyb20ocGFyYW1zLmludml0ZUhhc2gsICdoZXgnKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIENhbGN1bGF0ZSByZXNvbHV0aW9uQnVmZmVyIChzZWNvbmRzIGZyb20gY2xvc2luZyB0byByZXNvbHV0aW9uKVxuICBjb25zdCByZXNvbHV0aW9uQnVmZmVyID0gTWF0aC5mbG9vcigocmVzb2x1dGlvblRpbWUuZ2V0VGltZSgpIC0gY2xvc2luZ1RpbWUuZ2V0VGltZSgpKSAvIDEwMDApO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkQ3JlYXRlTGFiTWFya2V0VHJhbnNhY3Rpb24oe1xuICAgIHF1ZXN0aW9uOiBwYXJhbXMucXVlc3Rpb24sXG4gICAgY2xvc2luZ1RpbWUsXG4gICAgcmVzb2x1dGlvbkJ1ZmZlcixcbiAgICBjcmVhdG9yV2FsbGV0OiBwYXJhbXMuY3JlYXRvcldhbGxldCxcbiAgfSwgY29ubik7XG5cbiAgLy8gU2ltdWxhdGVcbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGF3YWl0IHNpbXVsYXRlQmV0VHJhbnNhY3Rpb24oXG4gICAgcmVzdWx0LnRyYW5zYWN0aW9uLFxuICAgIG5ldyBQdWJsaWNLZXkocGFyYW1zLmNyZWF0b3JXYWxsZXQpLFxuICAgIGNvbm5cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgdmFsaWRhdGlvbjogcHJldmlldy52YWxpZGF0aW9uLFxuICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICBzZXJpYWxpemVkOiByZXN1bHQuc2VyaWFsaXplZFR4LFxuICAgICAgbWFya2V0UGRhOiByZXN1bHQubWFya2V0UGRhLFxuICAgICAgbWFya2V0SWQ6IHJlc3VsdC5tYXJrZXRJZC50b1N0cmluZygpLFxuICAgIH0sXG4gICAgc2ltdWxhdGlvbjoge1xuICAgICAgc3VjY2Vzczogc2ltdWxhdGlvbi5zdWNjZXNzLFxuICAgICAgZXJyb3I6IHNpbXVsYXRpb24uZXJyb3IsXG4gICAgICB1bml0c0NvbnN1bWVkOiBzaW11bGF0aW9uLnVuaXRzQ29uc3VtZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBwcml2YXRlIG1hcmtldCBjcmVhdGlvbiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJpdmF0ZU1hcmtldChcbiAgcGFyYW1zOiBDcmVhdGVNYXJrZXRSZXF1ZXN0LFxuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvblxuKTogUHJvbWlzZTx7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICB2YWxpZGF0aW9uOiBDcmVhdGlvblZhbGlkYXRpb25SZXN1bHQ7XG4gIHRyYW5zYWN0aW9uPzoge1xuICAgIHNlcmlhbGl6ZWQ6IHN0cmluZztcbiAgICBtYXJrZXRQZGE6IHN0cmluZztcbiAgICBtYXJrZXRJZDogc3RyaW5nO1xuICB9O1xuICBzaW11bGF0aW9uPzoge1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gIH07XG59PiB7XG4gIGNvbnN0IGNvbm4gPSBjb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIFVzZSBsYWIgcHJldmlldyBidXQgd2l0aCBwcml2YXRlIGxheWVyXG4gIGNvbnN0IHByZXZpZXcgPSBhd2FpdCBwcmV2aWV3TWFya2V0Q3JlYXRpb24oeyAuLi5wYXJhbXMsIGxheWVyOiAncHJpdmF0ZScgfSwgY29ubik7XG5cbiAgaWYgKCFwcmV2aWV3LnZhbGlkYXRpb24udmFsaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogcHJldmlldy52YWxpZGF0aW9uLmVycm9ycy5qb2luKCc7ICcpLFxuICAgICAgdmFsaWRhdGlvbjogcHJldmlldy52YWxpZGF0aW9uLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBjbG9zaW5nVGltZSA9IG5ldyBEYXRlKHBhcmFtcy5jbG9zaW5nVGltZSk7XG4gIGNvbnN0IHJlc29sdXRpb25UaW1lID0gcGFyYW1zLnJlc29sdXRpb25UaW1lXG4gICAgPyBuZXcgRGF0ZShwYXJhbXMucmVzb2x1dGlvblRpbWUpXG4gICAgOiBjYWxjdWxhdGVSZXNvbHV0aW9uVGltZShjbG9zaW5nVGltZSwgcGFyYW1zLm1hcmtldFR5cGUgfHwgJ2V2ZW50Jyk7XG5cbiAgY29uc3QgaW52aXRlSGFzaCA9IHBhcmFtcy5pbnZpdGVIYXNoXG4gICAgPyBCdWZmZXIuZnJvbShwYXJhbXMuaW52aXRlSGFzaCwgJ2hleCcpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gQ2FsY3VsYXRlIHJlc29sdXRpb25CdWZmZXIgKHNlY29uZHMgZnJvbSBjbG9zaW5nIHRvIHJlc29sdXRpb24pXG4gIGNvbnN0IHJlc29sdXRpb25CdWZmZXIgPSBNYXRoLmZsb29yKChyZXNvbHV0aW9uVGltZS5nZXRUaW1lKCkgLSBjbG9zaW5nVGltZS5nZXRUaW1lKCkpIC8gMTAwMCk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRDcmVhdGVQcml2YXRlTWFya2V0VHJhbnNhY3Rpb24oe1xuICAgIHF1ZXN0aW9uOiBwYXJhbXMucXVlc3Rpb24sXG4gICAgY2xvc2luZ1RpbWUsXG4gICAgcmVzb2x1dGlvbkJ1ZmZlcixcbiAgICBjcmVhdG9yV2FsbGV0OiBwYXJhbXMuY3JlYXRvcldhbGxldCxcbiAgfSwgY29ubik7XG5cbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGF3YWl0IHNpbXVsYXRlQmV0VHJhbnNhY3Rpb24oXG4gICAgcmVzdWx0LnRyYW5zYWN0aW9uLFxuICAgIG5ldyBQdWJsaWNLZXkocGFyYW1zLmNyZWF0b3JXYWxsZXQpLFxuICAgIGNvbm5cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgdmFsaWRhdGlvbjogcHJldmlldy52YWxpZGF0aW9uLFxuICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICBzZXJpYWxpemVkOiByZXN1bHQuc2VyaWFsaXplZFR4LFxuICAgICAgbWFya2V0UGRhOiByZXN1bHQubWFya2V0UGRhLFxuICAgICAgbWFya2V0SWQ6IHJlc3VsdC5tYXJrZXRJZC50b1N0cmluZygpLFxuICAgIH0sXG4gICAgc2ltdWxhdGlvbjoge1xuICAgICAgc3VjY2Vzczogc2ltdWxhdGlvbi5zdWNjZXNzLFxuICAgICAgZXJyb3I6IHNpbXVsYXRpb24uZXJyb3IsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCByYWNlIG1hcmtldCBjcmVhdGlvbiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmFjZU1hcmtldChcbiAgcGFyYW1zOiBDcmVhdGVSYWNlTWFya2V0UmVxdWVzdCxcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb25cbik6IFByb21pc2U8e1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgdmFsaWRhdGlvbjogQ3JlYXRpb25WYWxpZGF0aW9uUmVzdWx0O1xuICB0cmFuc2FjdGlvbj86IHtcbiAgICBzZXJpYWxpemVkOiBzdHJpbmc7XG4gICAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICAgIG1hcmtldElkOiBzdHJpbmc7XG4gIH07XG4gIHNpbXVsYXRpb24/OiB7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IHN0cmluZztcbiAgfTtcbn0+IHtcbiAgY29uc3QgY29ubiA9IGNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgcHJldmlldyA9IGF3YWl0IHByZXZpZXdSYWNlTWFya2V0Q3JlYXRpb24ocGFyYW1zLCBjb25uKTtcblxuICBpZiAoIXByZXZpZXcudmFsaWRhdGlvbi52YWxpZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBwcmV2aWV3LnZhbGlkYXRpb24uZXJyb3JzLmpvaW4oJzsgJyksXG4gICAgICB2YWxpZGF0aW9uOiBwcmV2aWV3LnZhbGlkYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gbmV3IERhdGUocGFyYW1zLmNsb3NpbmdUaW1lKTtcbiAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBwYXJhbXMucmVzb2x1dGlvblRpbWVcbiAgICA/IG5ldyBEYXRlKHBhcmFtcy5yZXNvbHV0aW9uVGltZSlcbiAgICA6IG5ldyBEYXRlKGNsb3NpbmdUaW1lLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuXG4gIC8vIENhbGN1bGF0ZSByZXNvbHV0aW9uQnVmZmVyIChzZWNvbmRzIGZyb20gY2xvc2luZyB0byByZXNvbHV0aW9uKVxuICBjb25zdCByZXNvbHV0aW9uQnVmZmVyID0gTWF0aC5mbG9vcigocmVzb2x1dGlvblRpbWUuZ2V0VGltZSgpIC0gY2xvc2luZ1RpbWUuZ2V0VGltZSgpKSAvIDEwMDApO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkQ3JlYXRlUmFjZU1hcmtldFRyYW5zYWN0aW9uKHtcbiAgICBxdWVzdGlvbjogcGFyYW1zLnF1ZXN0aW9uLFxuICAgIG91dGNvbWVzOiBwYXJhbXMub3V0Y29tZXMsXG4gICAgY2xvc2luZ1RpbWUsXG4gICAgcmVzb2x1dGlvbkJ1ZmZlcixcbiAgICBjcmVhdG9yV2FsbGV0OiBwYXJhbXMuY3JlYXRvcldhbGxldCxcbiAgfSwgY29ubik7XG5cbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGF3YWl0IHNpbXVsYXRlQmV0VHJhbnNhY3Rpb24oXG4gICAgcmVzdWx0LnRyYW5zYWN0aW9uLFxuICAgIG5ldyBQdWJsaWNLZXkocGFyYW1zLmNyZWF0b3JXYWxsZXQpLFxuICAgIGNvbm5cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgdmFsaWRhdGlvbjogcHJldmlldy52YWxpZGF0aW9uLFxuICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICBzZXJpYWxpemVkOiByZXN1bHQuc2VyaWFsaXplZFR4LFxuICAgICAgcmFjZU1hcmtldFBkYTogcmVzdWx0Lm1hcmtldFBkYSxcbiAgICAgIG1hcmtldElkOiByZXN1bHQubWFya2V0SWQudG9TdHJpbmcoKSxcbiAgICB9LFxuICAgIHNpbXVsYXRpb246IHtcbiAgICAgIHN1Y2Nlc3M6IHNpbXVsYXRpb24uc3VjY2VzcyxcbiAgICAgIGVycm9yOiBzaW11bGF0aW9uLmVycm9yLFxuICAgIH0sXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVVElMSVRZIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgY3JlYXRpb24gZmVlcyBmb3IgYWxsIGxheWVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQ3JlYXRpb25GZWVzKCk6IHtcbiAgb2ZmaWNpYWw6IHsgc29sOiBudW1iZXI7IGxhbXBvcnRzOiBudW1iZXIgfTtcbiAgbGFiOiB7IHNvbDogbnVtYmVyOyBsYW1wb3J0czogbnVtYmVyIH07XG4gIHByaXZhdGU6IHsgc29sOiBudW1iZXI7IGxhbXBvcnRzOiBudW1iZXIgfTtcbn0ge1xuICByZXR1cm4ge1xuICAgIG9mZmljaWFsOiBnZXRDcmVhdGlvbkZlZSgnb2ZmaWNpYWwnKSxcbiAgICBsYWI6IGdldENyZWF0aW9uRmVlKCdsYWInKSxcbiAgICBwcml2YXRlOiBnZXRDcmVhdGlvbkZlZSgncHJpdmF0ZScpLFxuICB9O1xufVxuXG4vKipcbiAqIEdldCBwbGF0Zm9ybSBmZWVzIGZvciBhbGwgbGF5ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQbGF0Zm9ybUZlZXMoKToge1xuICBvZmZpY2lhbDogeyBicHM6IG51bWJlcjsgcGVyY2VudDogc3RyaW5nIH07XG4gIGxhYjogeyBicHM6IG51bWJlcjsgcGVyY2VudDogc3RyaW5nIH07XG4gIHByaXZhdGU6IHsgYnBzOiBudW1iZXI7IHBlcmNlbnQ6IHN0cmluZyB9O1xufSB7XG4gIHJldHVybiB7XG4gICAgb2ZmaWNpYWw6IHsgYnBzOiBGRUVTLk9GRklDSUFMX1BMQVRGT1JNX0ZFRV9CUFMsIHBlcmNlbnQ6IGAke0ZFRVMuT0ZGSUNJQUxfUExBVEZPUk1fRkVFX0JQUyAvIDEwMH0lYCB9LFxuICAgIGxhYjogeyBicHM6IEZFRVMuTEFCX1BMQVRGT1JNX0ZFRV9CUFMsIHBlcmNlbnQ6IGAke0ZFRVMuTEFCX1BMQVRGT1JNX0ZFRV9CUFMgLyAxMDB9JWAgfSxcbiAgICBwcml2YXRlOiB7IGJwczogRkVFUy5QUklWQVRFX1BMQVRGT1JNX0ZFRV9CUFMsIHBlcmNlbnQ6IGAke0ZFRVMuUFJJVkFURV9QTEFURk9STV9GRUVfQlBTIC8gMTAwfSVgIH0sXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRpbWluZyBjb25zdHJhaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltaW5nQ29uc3RyYWludHMoKToge1xuICBtaW5FdmVudEJ1ZmZlckhvdXJzOiBudW1iZXI7XG4gIHJlY29tbWVuZGVkRXZlbnRCdWZmZXJIb3VyczogbnVtYmVyO1xuICBiZXR0aW5nRnJlZXplU2Vjb25kczogbnVtYmVyO1xuICBtYXhNYXJrZXREdXJhdGlvbkRheXM6IG51bWJlcjtcbn0ge1xuICByZXR1cm4ge1xuICAgIG1pbkV2ZW50QnVmZmVySG91cnM6IFRJTUlORy5NSU5fRVZFTlRfQlVGRkVSX0hPVVJTLFxuICAgIHJlY29tbWVuZGVkRXZlbnRCdWZmZXJIb3VyczogVElNSU5HLlJFQ09NTUVOREVEX0VWRU5UX0JVRkZFUl9IT1VSUyxcbiAgICBiZXR0aW5nRnJlZXplU2Vjb25kczogVElNSU5HLkJFVFRJTkdfRlJFRVpFX1NFQ09ORFMsXG4gICAgbWF4TWFya2V0RHVyYXRpb25EYXlzOiBUSU1JTkcuTUFYX01BUktFVF9EVVJBVElPTl9EQVlTLFxuICB9O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGludml0ZSBoYXNoIGZvciBwcml2YXRlIG1hcmtldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbnZpdGVIYXNoKCk6IHN0cmluZyB7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKlxuICogRGVyaXZlIGludml0ZSBsaW5rIGZyb20gaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52aXRlTGluayhtYXJrZXRQZGE6IHN0cmluZywgaW52aXRlSGFzaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL2Jhb3ppLm9vby9tYXJrZXQvJHttYXJrZXRQZGF9P2ludml0ZT0ke2ludml0ZUhhc2h9YDtcbn1cbiJdfQ==
@@ -0,0 +1,41 @@
1
+ export interface Market {
2
+ publicKey: string;
3
+ marketId: string;
4
+ question: string;
5
+ closingTime: string;
6
+ resolutionTime: string;
7
+ status: string;
8
+ statusCode: number;
9
+ winningOutcome: string | null;
10
+ currencyType: string;
11
+ yesPoolSol: number;
12
+ noPoolSol: number;
13
+ totalPoolSol: number;
14
+ yesPercent: number;
15
+ noPercent: number;
16
+ platformFeeBps: number;
17
+ layer: string;
18
+ layerCode: number;
19
+ accessGate: string;
20
+ creator: string;
21
+ hasBets: boolean;
22
+ isBettingOpen: boolean;
23
+ creatorFeeBps: number;
24
+ }
25
+ /**
26
+ * List all markets with optional status filter
27
+ */
28
+ export declare function listMarkets(status?: string): Promise<Market[]>;
29
+ /**
30
+ * Get a specific market by public key
31
+ */
32
+ export declare function getMarket(publicKey: string): Promise<Market | null>;
33
+ /**
34
+ * Get market with additional details for transaction building
35
+ */
36
+ export declare function getMarketForBetting(publicKey: string): Promise<{
37
+ market: Market | null;
38
+ marketId: bigint;
39
+ accessGate: number;
40
+ platformFeeBps: number;
41
+ } | null>;