@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,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market Creation Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - create_lab_market_sol (community markets)
|
|
6
|
+
* - create_private_table_sol (invite-only markets)
|
|
7
|
+
* - create_race_market_sol (multi-outcome markets)
|
|
8
|
+
*
|
|
9
|
+
* FIXED: Jan 2026 - Corrected discriminators, offsets, and instruction formats
|
|
10
|
+
*/
|
|
11
|
+
import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
|
|
12
|
+
import { PROGRAM_ID, CONFIG_PDA, SOL_TREASURY_PDA, SEEDS, RPC_ENDPOINT, } from '../config.js';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// INSTRUCTION DISCRIMINATORS (sha256("global:<name>")[0..8])
|
|
15
|
+
// =============================================================================
|
|
16
|
+
const CREATE_LAB_MARKET_SOL_DISCRIMINATOR = Buffer.from([35, 159, 50, 67, 31, 134, 199, 157]);
|
|
17
|
+
const CREATE_PRIVATE_TABLE_SOL_DISCRIMINATOR = Buffer.from([242, 241, 183, 108, 35, 183, 38, 241]);
|
|
18
|
+
const CREATE_RACE_MARKET_SOL_DISCRIMINATOR = Buffer.from([94, 237, 40, 47, 63, 233, 25, 67]);
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// GLOBAL CONFIG OFFSETS (calculated from IDL struct layout)
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// GlobalConfig struct layout:
|
|
23
|
+
// discriminator (8) + admin (32) + treasury (32) + guardian (32) +
|
|
24
|
+
// _reserved_usdc_mint (32) + _reserved_creation_fee_usdc (8) + creation_fee_sol (8) +
|
|
25
|
+
// _reserved_market_bond_usdc (8) + market_bond_sol (8) + platform_fee_bps (2) + market_count (8)
|
|
26
|
+
const MARKET_COUNT_OFFSET = 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 2; // = 170
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// PDA DERIVATION
|
|
29
|
+
// =============================================================================
|
|
30
|
+
function deriveMarketPda(marketId) {
|
|
31
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
32
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
33
|
+
return PublicKey.findProgramAddressSync([SEEDS.MARKET, marketIdBuffer], PROGRAM_ID);
|
|
34
|
+
}
|
|
35
|
+
function deriveRaceMarketPda(marketId) {
|
|
36
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
37
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
38
|
+
return PublicKey.findProgramAddressSync([SEEDS.RACE, marketIdBuffer], PROGRAM_ID);
|
|
39
|
+
}
|
|
40
|
+
function deriveWhitelistPda(marketId) {
|
|
41
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
42
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
43
|
+
return PublicKey.findProgramAddressSync([SEEDS.WHITELIST, marketIdBuffer], PROGRAM_ID);
|
|
44
|
+
}
|
|
45
|
+
function deriveCreatorProfilePda(creator) {
|
|
46
|
+
return PublicKey.findProgramAddressSync([Buffer.from('creator_profile'), creator.toBuffer()], PROGRAM_ID);
|
|
47
|
+
}
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// GET MARKET COUNT FROM CONFIG
|
|
50
|
+
// =============================================================================
|
|
51
|
+
export async function getNextMarketId(connection) {
|
|
52
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
53
|
+
try {
|
|
54
|
+
const configAccount = await conn.getAccountInfo(CONFIG_PDA);
|
|
55
|
+
if (!configAccount) {
|
|
56
|
+
throw new Error('GlobalConfig not found');
|
|
57
|
+
}
|
|
58
|
+
const data = configAccount.data;
|
|
59
|
+
// market_count at offset 170 (verified against on-chain data)
|
|
60
|
+
const marketCount = data.readBigUInt64LE(MARKET_COUNT_OFFSET);
|
|
61
|
+
// Both regular and race markets use the SAME counter
|
|
62
|
+
// The program uses the CURRENT value (not +1) for PDA derivation
|
|
63
|
+
return {
|
|
64
|
+
marketId: marketCount,
|
|
65
|
+
raceMarketId: marketCount,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
// If we can't read config, return safe defaults
|
|
70
|
+
return { marketId: 0n, raceMarketId: 0n };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// =============================================================================
|
|
74
|
+
// BUILD CREATE LAB MARKET TRANSACTION
|
|
75
|
+
// =============================================================================
|
|
76
|
+
export async function buildCreateLabMarketTransaction(params, connection) {
|
|
77
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
78
|
+
const creatorPubkey = new PublicKey(params.creatorWallet);
|
|
79
|
+
// Get current market count for PDA derivation
|
|
80
|
+
const { marketId } = await getNextMarketId(conn);
|
|
81
|
+
const [marketPda] = deriveMarketPda(marketId);
|
|
82
|
+
const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
|
|
83
|
+
// Check if creator profile exists
|
|
84
|
+
const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
|
|
85
|
+
const hasCreatorProfile = creatorProfileInfo !== null;
|
|
86
|
+
// Set defaults
|
|
87
|
+
const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
|
|
88
|
+
const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200); // 12 hours
|
|
89
|
+
const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300); // 5 minutes
|
|
90
|
+
const resolutionMode = params.resolutionMode ?? 1; // CouncilOracle by default
|
|
91
|
+
// For CouncilOracle, creator is default council member
|
|
92
|
+
const council = params.council?.map(p => new PublicKey(p)) ??
|
|
93
|
+
(resolutionMode === 1 ? [creatorPubkey] : []);
|
|
94
|
+
const councilThreshold = params.councilThreshold ?? (council.length > 0 ? 1 : 0);
|
|
95
|
+
// Encode instruction data:
|
|
96
|
+
// discriminator (8) + question (4+len) + closing_time (8) + resolution_buffer (8) +
|
|
97
|
+
// auto_stop_buffer (8) + resolution_mode (1) + council (4+n*32) + council_threshold (1)
|
|
98
|
+
const questionBytes = Buffer.from(params.question, 'utf8');
|
|
99
|
+
const size = 8 + 4 + questionBytes.length + 8 + 8 + 8 + 1 + 4 + (council.length * 32) + 1;
|
|
100
|
+
const data = Buffer.alloc(size);
|
|
101
|
+
let offset = 0;
|
|
102
|
+
CREATE_LAB_MARKET_SOL_DISCRIMINATOR.copy(data, offset);
|
|
103
|
+
offset += 8;
|
|
104
|
+
data.writeUInt32LE(questionBytes.length, offset);
|
|
105
|
+
offset += 4;
|
|
106
|
+
questionBytes.copy(data, offset);
|
|
107
|
+
offset += questionBytes.length;
|
|
108
|
+
data.writeBigInt64LE(closingTime, offset);
|
|
109
|
+
offset += 8;
|
|
110
|
+
data.writeBigInt64LE(resolutionBuffer, offset);
|
|
111
|
+
offset += 8;
|
|
112
|
+
data.writeBigInt64LE(autoStopBuffer, offset);
|
|
113
|
+
offset += 8;
|
|
114
|
+
data.writeUInt8(resolutionMode, offset);
|
|
115
|
+
offset += 1;
|
|
116
|
+
data.writeUInt32LE(council.length, offset);
|
|
117
|
+
offset += 4;
|
|
118
|
+
for (const member of council) {
|
|
119
|
+
member.toBuffer().copy(data, offset);
|
|
120
|
+
offset += 32;
|
|
121
|
+
}
|
|
122
|
+
data.writeUInt8(councilThreshold, offset);
|
|
123
|
+
// Accounts from IDL:
|
|
124
|
+
// config (PDA), market (PDA), treasury, creator (signer), creator_profile (optional), system_program
|
|
125
|
+
const keys = [
|
|
126
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
|
|
127
|
+
{ pubkey: marketPda, isSigner: false, isWritable: true },
|
|
128
|
+
{ pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
|
|
129
|
+
{ pubkey: creatorPubkey, isSigner: true, isWritable: true },
|
|
130
|
+
// For optional accounts, pass PROGRAM_ID as placeholder if not present
|
|
131
|
+
{ pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
|
|
132
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
133
|
+
];
|
|
134
|
+
const instruction = new TransactionInstruction({
|
|
135
|
+
programId: PROGRAM_ID,
|
|
136
|
+
keys,
|
|
137
|
+
data,
|
|
138
|
+
});
|
|
139
|
+
const transaction = new Transaction();
|
|
140
|
+
transaction.add(instruction);
|
|
141
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
142
|
+
transaction.recentBlockhash = blockhash;
|
|
143
|
+
transaction.feePayer = creatorPubkey;
|
|
144
|
+
const serializedTx = transaction.serialize({
|
|
145
|
+
requireAllSignatures: false,
|
|
146
|
+
verifySignatures: false,
|
|
147
|
+
}).toString('base64');
|
|
148
|
+
return {
|
|
149
|
+
transaction,
|
|
150
|
+
serializedTx,
|
|
151
|
+
marketPda: marketPda.toBase58(),
|
|
152
|
+
marketId,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// =============================================================================
|
|
156
|
+
// BUILD CREATE PRIVATE MARKET TRANSACTION
|
|
157
|
+
// =============================================================================
|
|
158
|
+
export async function buildCreatePrivateMarketTransaction(params, connection) {
|
|
159
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
160
|
+
const creatorPubkey = new PublicKey(params.creatorWallet);
|
|
161
|
+
const { marketId } = await getNextMarketId(conn);
|
|
162
|
+
const [marketPda] = deriveMarketPda(marketId);
|
|
163
|
+
const [whitelistPda] = deriveWhitelistPda(marketId);
|
|
164
|
+
const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
|
|
165
|
+
const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
|
|
166
|
+
const hasCreatorProfile = creatorProfileInfo !== null;
|
|
167
|
+
const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
|
|
168
|
+
const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200);
|
|
169
|
+
const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300);
|
|
170
|
+
const resolutionMode = params.resolutionMode ?? 0; // HostOracle for private
|
|
171
|
+
const council = params.council?.map(p => new PublicKey(p)) ?? [];
|
|
172
|
+
const councilThreshold = params.councilThreshold ?? 0;
|
|
173
|
+
// Same instruction format as Lab market
|
|
174
|
+
const questionBytes = Buffer.from(params.question, 'utf8');
|
|
175
|
+
const size = 8 + 4 + questionBytes.length + 8 + 8 + 8 + 1 + 4 + (council.length * 32) + 1;
|
|
176
|
+
const data = Buffer.alloc(size);
|
|
177
|
+
let offset = 0;
|
|
178
|
+
CREATE_PRIVATE_TABLE_SOL_DISCRIMINATOR.copy(data, offset);
|
|
179
|
+
offset += 8;
|
|
180
|
+
data.writeUInt32LE(questionBytes.length, offset);
|
|
181
|
+
offset += 4;
|
|
182
|
+
questionBytes.copy(data, offset);
|
|
183
|
+
offset += questionBytes.length;
|
|
184
|
+
data.writeBigInt64LE(closingTime, offset);
|
|
185
|
+
offset += 8;
|
|
186
|
+
data.writeBigInt64LE(resolutionBuffer, offset);
|
|
187
|
+
offset += 8;
|
|
188
|
+
data.writeBigInt64LE(autoStopBuffer, offset);
|
|
189
|
+
offset += 8;
|
|
190
|
+
data.writeUInt8(resolutionMode, offset);
|
|
191
|
+
offset += 1;
|
|
192
|
+
data.writeUInt32LE(council.length, offset);
|
|
193
|
+
offset += 4;
|
|
194
|
+
for (const member of council) {
|
|
195
|
+
member.toBuffer().copy(data, offset);
|
|
196
|
+
offset += 32;
|
|
197
|
+
}
|
|
198
|
+
data.writeUInt8(councilThreshold, offset);
|
|
199
|
+
// Private market accounts include whitelist PDA
|
|
200
|
+
const keys = [
|
|
201
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
|
|
202
|
+
{ pubkey: marketPda, isSigner: false, isWritable: true },
|
|
203
|
+
{ pubkey: whitelistPda, isSigner: false, isWritable: true },
|
|
204
|
+
{ pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
|
|
205
|
+
{ pubkey: creatorPubkey, isSigner: true, isWritable: true },
|
|
206
|
+
{ pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
|
|
207
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
208
|
+
];
|
|
209
|
+
const instruction = new TransactionInstruction({
|
|
210
|
+
programId: PROGRAM_ID,
|
|
211
|
+
keys,
|
|
212
|
+
data,
|
|
213
|
+
});
|
|
214
|
+
const transaction = new Transaction();
|
|
215
|
+
transaction.add(instruction);
|
|
216
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
217
|
+
transaction.recentBlockhash = blockhash;
|
|
218
|
+
transaction.feePayer = creatorPubkey;
|
|
219
|
+
const serializedTx = transaction.serialize({
|
|
220
|
+
requireAllSignatures: false,
|
|
221
|
+
verifySignatures: false,
|
|
222
|
+
}).toString('base64');
|
|
223
|
+
return {
|
|
224
|
+
transaction,
|
|
225
|
+
serializedTx,
|
|
226
|
+
marketPda: marketPda.toBase58(),
|
|
227
|
+
marketId,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// BUILD CREATE RACE MARKET TRANSACTION
|
|
232
|
+
// =============================================================================
|
|
233
|
+
export async function buildCreateRaceMarketTransaction(params, connection) {
|
|
234
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
235
|
+
const creatorPubkey = new PublicKey(params.creatorWallet);
|
|
236
|
+
const { raceMarketId } = await getNextMarketId(conn);
|
|
237
|
+
const [raceMarketPda] = deriveRaceMarketPda(raceMarketId);
|
|
238
|
+
const [creatorProfilePda] = deriveCreatorProfilePda(creatorPubkey);
|
|
239
|
+
const creatorProfileInfo = await conn.getAccountInfo(creatorProfilePda);
|
|
240
|
+
const hasCreatorProfile = creatorProfileInfo !== null;
|
|
241
|
+
const closingTime = BigInt(Math.floor(params.closingTime.getTime() / 1000));
|
|
242
|
+
const resolutionBuffer = BigInt(params.resolutionBuffer ?? 43200);
|
|
243
|
+
const autoStopBuffer = BigInt(params.autoStopBuffer ?? 300);
|
|
244
|
+
const layer = params.layer ?? 1; // Lab by default
|
|
245
|
+
const resolutionMode = params.resolutionMode ?? 1; // CouncilOracle
|
|
246
|
+
const accessGate = params.accessGate ?? 0; // Public
|
|
247
|
+
// Council is Option<Vec<Pubkey>> - encode as 1 (Some) + vec or 0 (None)
|
|
248
|
+
const hasCouncil = params.council && params.council.length > 0;
|
|
249
|
+
const council = hasCouncil ? params.council.map(p => new PublicKey(p)) : [];
|
|
250
|
+
// council_threshold is Option<u8>
|
|
251
|
+
const hasThreshold = params.councilThreshold !== undefined;
|
|
252
|
+
const councilThreshold = params.councilThreshold ?? 0;
|
|
253
|
+
// Encode instruction data:
|
|
254
|
+
// discriminator (8) + question (4+len) + outcome_labels (4 + n*(4+len)) +
|
|
255
|
+
// closing_time (8) + resolution_buffer (8) + auto_stop_buffer (8) +
|
|
256
|
+
// layer (1) + resolution_mode (1) + access_gate (1) +
|
|
257
|
+
// council (1 + 4 + n*32 or just 1) + council_threshold (1 + 1 or just 1)
|
|
258
|
+
const questionBytes = Buffer.from(params.question, 'utf8');
|
|
259
|
+
const outcomeBuffers = params.outcomes.map(o => Buffer.from(o, 'utf8'));
|
|
260
|
+
let outcomesSize = 4; // vec length
|
|
261
|
+
for (const buf of outcomeBuffers) {
|
|
262
|
+
outcomesSize += 4 + buf.length;
|
|
263
|
+
}
|
|
264
|
+
const councilSize = hasCouncil ? (1 + 4 + council.length * 32) : 1;
|
|
265
|
+
const thresholdSize = hasThreshold ? 2 : 1;
|
|
266
|
+
const size = 8 + 4 + questionBytes.length + outcomesSize + 8 + 8 + 8 + 1 + 1 + 1 + councilSize + thresholdSize;
|
|
267
|
+
const data = Buffer.alloc(size);
|
|
268
|
+
let offset = 0;
|
|
269
|
+
CREATE_RACE_MARKET_SOL_DISCRIMINATOR.copy(data, offset);
|
|
270
|
+
offset += 8;
|
|
271
|
+
data.writeUInt32LE(questionBytes.length, offset);
|
|
272
|
+
offset += 4;
|
|
273
|
+
questionBytes.copy(data, offset);
|
|
274
|
+
offset += questionBytes.length;
|
|
275
|
+
data.writeUInt32LE(params.outcomes.length, offset);
|
|
276
|
+
offset += 4;
|
|
277
|
+
for (const buf of outcomeBuffers) {
|
|
278
|
+
data.writeUInt32LE(buf.length, offset);
|
|
279
|
+
offset += 4;
|
|
280
|
+
buf.copy(data, offset);
|
|
281
|
+
offset += buf.length;
|
|
282
|
+
}
|
|
283
|
+
data.writeBigInt64LE(closingTime, offset);
|
|
284
|
+
offset += 8;
|
|
285
|
+
data.writeBigInt64LE(resolutionBuffer, offset);
|
|
286
|
+
offset += 8;
|
|
287
|
+
data.writeBigInt64LE(autoStopBuffer, offset);
|
|
288
|
+
offset += 8;
|
|
289
|
+
data.writeUInt8(layer, offset);
|
|
290
|
+
offset += 1;
|
|
291
|
+
data.writeUInt8(resolutionMode, offset);
|
|
292
|
+
offset += 1;
|
|
293
|
+
data.writeUInt8(accessGate, offset);
|
|
294
|
+
offset += 1;
|
|
295
|
+
// Option<Vec<Pubkey>> - 1 (Some) + vec or 0 (None)
|
|
296
|
+
if (hasCouncil) {
|
|
297
|
+
data.writeUInt8(1, offset);
|
|
298
|
+
offset += 1;
|
|
299
|
+
data.writeUInt32LE(council.length, offset);
|
|
300
|
+
offset += 4;
|
|
301
|
+
for (const member of council) {
|
|
302
|
+
member.toBuffer().copy(data, offset);
|
|
303
|
+
offset += 32;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
data.writeUInt8(0, offset);
|
|
308
|
+
offset += 1;
|
|
309
|
+
}
|
|
310
|
+
// Option<u8> - 1 (Some) + value or 0 (None)
|
|
311
|
+
if (hasThreshold) {
|
|
312
|
+
data.writeUInt8(1, offset);
|
|
313
|
+
offset += 1;
|
|
314
|
+
data.writeUInt8(councilThreshold, offset);
|
|
315
|
+
offset += 1;
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
data.writeUInt8(0, offset);
|
|
319
|
+
offset += 1;
|
|
320
|
+
}
|
|
321
|
+
// Accounts: config, race_market, creator_profile (optional), treasury, creator, system_program
|
|
322
|
+
const keys = [
|
|
323
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: true },
|
|
324
|
+
{ pubkey: raceMarketPda, isSigner: false, isWritable: true },
|
|
325
|
+
{ pubkey: hasCreatorProfile ? creatorProfilePda : PROGRAM_ID, isSigner: false, isWritable: hasCreatorProfile },
|
|
326
|
+
{ pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
|
|
327
|
+
{ pubkey: creatorPubkey, isSigner: true, isWritable: true },
|
|
328
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
329
|
+
];
|
|
330
|
+
const instruction = new TransactionInstruction({
|
|
331
|
+
programId: PROGRAM_ID,
|
|
332
|
+
keys,
|
|
333
|
+
data,
|
|
334
|
+
});
|
|
335
|
+
const transaction = new Transaction();
|
|
336
|
+
transaction.add(instruction);
|
|
337
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
338
|
+
transaction.recentBlockhash = blockhash;
|
|
339
|
+
transaction.feePayer = creatorPubkey;
|
|
340
|
+
const serializedTx = transaction.serialize({
|
|
341
|
+
requireAllSignatures: false,
|
|
342
|
+
verifySignatures: false,
|
|
343
|
+
}).toString('base64');
|
|
344
|
+
return {
|
|
345
|
+
transaction,
|
|
346
|
+
serializedTx,
|
|
347
|
+
marketPda: raceMarketPda.toBase58(),
|
|
348
|
+
marketId: raceMarketId,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// =============================================================================
|
|
352
|
+
// HELPER: DERIVE PDA PREVIEW
|
|
353
|
+
// =============================================================================
|
|
354
|
+
export function previewMarketPda(marketId) {
|
|
355
|
+
const [pda, bump] = deriveMarketPda(marketId);
|
|
356
|
+
return { marketPda: pda.toBase58(), bump };
|
|
357
|
+
}
|
|
358
|
+
export function previewRaceMarketPda(marketId) {
|
|
359
|
+
const [pda, bump] = deriveRaceMarketPda(marketId);
|
|
360
|
+
return { raceMarketPda: pda.toBase58(), bump };
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0LWNyZWF0aW9uLXR4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXJzL21hcmtldC1jcmVhdGlvbi10eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsWUFBWSxHQUNiLE1BQU0sY0FBYyxDQUFDO0FBRXRCLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsZ0ZBQWdGO0FBRWhGLE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlGLE1BQU0sc0NBQXNDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25HLE1BQU0sb0NBQW9DLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTdGLGdGQUFnRjtBQUNoRiw0REFBNEQ7QUFDNUQsZ0ZBQWdGO0FBRWhGLDhCQUE4QjtBQUM5QixtRUFBbUU7QUFDbkUsc0ZBQXNGO0FBQ3RGLGlHQUFpRztBQUNqRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FB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QUE2QjtBQUM3QixnRkFBZ0Y7QUFFaEYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWdCO0lBSS9DLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFJbkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXJrZXQgQ3JlYXRpb24gVHJhbnNhY3Rpb24gQnVpbGRlcnNcbiAqXG4gKiBCdWlsZHMgdW5zaWduZWQgdHJhbnNhY3Rpb25zIGZvcjpcbiAqIC0gY3JlYXRlX2xhYl9tYXJrZXRfc29sIChjb21tdW5pdHkgbWFya2V0cylcbiAqIC0gY3JlYXRlX3ByaXZhdGVfdGFibGVfc29sIChpbnZpdGUtb25seSBtYXJrZXRzKVxuICogLSBjcmVhdGVfcmFjZV9tYXJrZXRfc29sIChtdWx0aS1vdXRjb21lIG1hcmtldHMpXG4gKlxuICogRklYRUQ6IEphbiAyMDI2IC0gQ29ycmVjdGVkIGRpc2NyaW1pbmF0b3JzLCBvZmZzZXRzLCBhbmQgaW5zdHJ1Y3Rpb24gZm9ybWF0c1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU09MX1RSRUFTVVJZX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTIChzaGEyNTYoXCJnbG9iYWw6PG5hbWU+XCIpWzAuLjhdKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgQ1JFQVRFX0xBQl9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMzUsIDE1OSwgNTAsIDY3LCAzMSwgMTM0LCAxOTksIDE1N10pO1xuY29uc3QgQ1JFQVRFX1BSSVZBVEVfVEFCTEVfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMjQyLCAyNDEsIDE4MywgMTA4LCAzNSwgMTgzLCAzOCwgMjQxXSk7XG5jb25zdCBDUkVBVEVfUkFDRV9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbOTQsIDIzNywgNDAsIDQ3LCA2MywgMjMzLCAyNSwgNjddKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEdMT0JBTCBDT05GSUcgT0ZGU0VUUyAoY2FsY3VsYXRlZCBmcm9tIElETCBzdHJ1Y3QgbGF5b3V0KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gR2xvYmFsQ29uZmlnIHN0cnVjdCBsYXlvdXQ6XG4vLyBkaXNjcmltaW5hdG9yICg4KSArIGFkbWluICgzMikgKyB0cmVhc3VyeSAoMzIpICsgZ3VhcmRpYW4gKDMyKSArXG4vLyBfcmVzZXJ2ZWRfdXNkY19taW50ICgzMikgKyBfcmVzZXJ2ZWRfY3JlYXRpb25fZmVlX3VzZGMgKDgpICsgY3JlYXRpb25fZmVlX3NvbCAoOCkgK1xuLy8gX3Jlc2VydmVkX21hcmtldF9ib25kX3VzZGMgKDgpICsgbWFya2V0X2JvbmRfc29sICg4KSArIHBsYXRmb3JtX2ZlZV9icHMgKDIpICsgbWFya2V0X2NvdW50ICg4KVxuY29uc3QgTUFSS0VUX0NPVU5UX09GRlNFVCA9IDggKyAzMiArIDMyICsgMzIgKyAzMiArIDggKyA4ICsgOCArIDggKyAyOyAvLyA9IDE3MFxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTWFya2V0UmVzdWx0IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFiTWFya2V0UGFyYW1zIHtcbiAgcXVlc3Rpb246IHN0cmluZztcbiAgY2xvc2luZ1RpbWU6IERhdGU7XG4gIHJlc29sdXRpb25CdWZmZXI/OiBudW1iZXI7ICAgIC8vIHNlY29uZHMgYWZ0ZXIgY2xvc2luZyBiZWZvcmUgcmVzb2x1dGlvbiAoZGVmYXVsdDogNDMyMDAgPSAxMmgpXG4gIGF1dG9TdG9wQnVmZmVyPzogbnVtYmVyOyAgICAgIC8vIHNlY29uZHMgYmVmb3JlIGNsb3NpbmcgdG8gc3RvcCBiZXR0aW5nIChkZWZhdWx0OiAzMDAgPSA1bWluKVxuICByZXNvbHV0aW9uTW9kZT86IG51bWJlcjsgICAgICAvLyAwPUhvc3RPcmFjbGUsIDE9Q291bmNpbE9yYWNsZSAoZGVmYXVsdDogMSlcbiAgY291bmNpbD86IHN0cmluZ1tdOyAgICAgICAgICAgLy8gY291bmNpbCBtZW1iZXIgcHVia2V5cyAocmVxdWlyZWQgaWYgcmVzb2x1dGlvbk1vZGU9MSlcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjsgICAgLy8gdm90ZXMgbmVlZGVkIChyZXF1aXJlZCBpZiByZXNvbHV0aW9uTW9kZT0xKVxuICBjcmVhdG9yV2FsbGV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJpdmF0ZU1hcmtldFBhcmFtcyB7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICByZXNvbHV0aW9uQnVmZmVyPzogbnVtYmVyO1xuICBhdXRvU3RvcEJ1ZmZlcj86IG51bWJlcjtcbiAgcmVzb2x1dGlvbk1vZGU/OiBudW1iZXI7XG4gIGNvdW5jaWw/OiBzdHJpbmdbXTtcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjtcbiAgY3JlYXRvcldhbGxldDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJhY2VNYXJrZXRQYXJhbXMge1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICBvdXRjb21lczogc3RyaW5nW107ICAgICAgICAgICAvLyAyLTEwIG91dGNvbWUgbGFiZWxzXG4gIGNsb3NpbmdUaW1lOiBEYXRlO1xuICByZXNvbHV0aW9uQnVmZmVyPzogbnVtYmVyO1xuICBhdXRvU3RvcEJ1ZmZlcj86IG51bWJlcjtcbiAgbGF5ZXI/OiBudW1iZXI7ICAgICAgICAgICAgICAgLy8gMT1MYWIsIDI9UHJpdmF0ZSAoZGVmYXVsdDogMSlcbiAgcmVzb2x1dGlvbk1vZGU/OiBudW1iZXI7ICAgICAgLy8gMD1Ib3N0T3JhY2xlLCAxPUNvdW5jaWxPcmFjbGVcbiAgYWNjZXNzR2F0ZT86IG51bWJlcjsgICAgICAgICAgLy8gMD1QdWJsaWMsIDE9V2hpdGVsaXN0XG4gIGNvdW5jaWw/OiBzdHJpbmdbXTtcbiAgY291bmNpbFRocmVzaG9sZD86IG51bWJlcjtcbiAgY3JlYXRvcldhbGxldDogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUERBIERFUklWQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGRlcml2ZU1hcmtldFBkYShtYXJrZXRJZDogYmlnaW50KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgcmV0dXJuIFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgIFtTRUVEUy5NQVJLRVQsIG1hcmtldElkQnVmZmVyXSxcbiAgICBQUk9HUkFNX0lEXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRlcml2ZVJhY2VNYXJrZXRQZGEobWFya2V0SWQ6IGJpZ2ludCk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICBjb25zdCBtYXJrZXRJZEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgbWFya2V0SWRCdWZmZXIud3JpdGVCaWdVSW50NjRMRShtYXJrZXRJZCk7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUkFDRSwgbWFya2V0SWRCdWZmZXJdLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlV2hpdGVsaXN0UGRhKG1hcmtldElkOiBiaWdpbnQpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgY29uc3QgbWFya2V0SWRCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG4gIG1hcmtldElkQnVmZmVyLndyaXRlQmlnVUludDY0TEUobWFya2V0SWQpO1xuICByZXR1cm4gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLldISVRFTElTVCwgbWFya2V0SWRCdWZmZXJdLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvcjogUHVibGljS2V5KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbQnVmZmVyLmZyb20oJ2NyZWF0b3JfcHJvZmlsZScpLCBjcmVhdG9yLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEdFVCBNQVJLRVQgQ09VTlQgRlJPTSBDT05GSUdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0TWFya2V0SWQoXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPHsgbWFya2V0SWQ6IGJpZ2ludDsgcmFjZU1hcmtldElkOiBiaWdpbnQgfT4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ0FjY291bnQgPSBhd2FpdCBjb25uLmdldEFjY291bnRJbmZvKENPTkZJR19QREEpO1xuICAgIGlmICghY29uZmlnQWNjb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxDb25maWcgbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGNvbmZpZ0FjY291bnQuZGF0YTtcbiAgICAvLyBtYXJrZXRfY291bnQgYXQgb2Zmc2V0IDE3MCAodmVyaWZpZWQgYWdhaW5zdCBvbi1jaGFpbiBkYXRhKVxuICAgIGNvbnN0IG1hcmtldENvdW50ID0gZGF0YS5yZWFkQmlnVUludDY0TEUoTUFSS0VUX0NPVU5UX09GRlNFVCk7XG5cbiAgICAvLyBCb3RoIHJlZ3VsYXIgYW5kIHJhY2UgbWFya2V0cyB1c2UgdGhlIFNBTUUgY291bnRlclxuICAgIC8vIFRoZSBwcm9ncmFtIHVzZXMgdGhlIENVUlJFTlQgdmFsdWUgKG5vdCArMSkgZm9yIFBEQSBkZXJpdmF0aW9uXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmtldElkOiBtYXJrZXRDb3VudCxcbiAgICAgIHJhY2VNYXJrZXRJZDogbWFya2V0Q291bnQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCBjb25maWcsIHJldHVybiBzYWZlIGRlZmF1bHRzXG4gICAgcmV0dXJuIHsgbWFya2V0SWQ6IDBuLCByYWNlTWFya2V0SWQ6IDBuIH07XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxEIENSRUFURSBMQUIgTUFSS0VUIFRSQU5TQUNUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDcmVhdGVMYWJNYXJrZXRUcmFuc2FjdGlvbihcbiAgcGFyYW1zOiBDcmVhdGVMYWJNYXJrZXRQYXJhbXMsXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPENyZWF0ZU1hcmtldFJlc3VsdD4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgY3JlYXRvclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmNyZWF0b3JXYWxsZXQpO1xuXG4gIC8vIEdldCBjdXJyZW50IG1hcmtldCBjb3VudCBmb3IgUERBIGRlcml2YXRpb25cbiAgY29uc3QgeyBtYXJrZXRJZCB9ID0gYXdhaXQgZ2V0TmV4dE1hcmtldElkKGNvbm4pO1xuICBjb25zdCBbbWFya2V0UGRhXSA9IGRlcml2ZU1hcmtldFBkYShtYXJrZXRJZCk7XG4gIGNvbnN0IFtjcmVhdG9yUHJvZmlsZVBkYV0gPSBkZXJpdmVDcmVhdG9yUHJvZmlsZVBkYShjcmVhdG9yUHVia2V5KTtcblxuICAvLyBDaGVjayBpZiBjcmVhdG9yIHByb2ZpbGUgZXhpc3RzXG4gIGNvbnN0IGNyZWF0b3JQcm9maWxlSW5mbyA9IGF3YWl0IGNvbm4uZ2V0QWNjb3VudEluZm8oY3JlYXRvclByb2ZpbGVQZGEpO1xuICBjb25zdCBoYXNDcmVhdG9yUHJvZmlsZSA9IGNyZWF0b3JQcm9maWxlSW5mbyAhPT0gbnVsbDtcblxuICAvLyBTZXQgZGVmYXVsdHNcbiAgY29uc3QgY2xvc2luZ1RpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihwYXJhbXMuY2xvc2luZ1RpbWUuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICBjb25zdCByZXNvbHV0aW9uQnVmZmVyID0gQmlnSW50KHBhcmFtcy5yZXNvbHV0aW9uQnVmZmVyID8/IDQzMjAwKTsgLy8gMTIgaG91cnNcbiAgY29uc3QgYXV0b1N0b3BCdWZmZXIgPSBCaWdJbnQocGFyYW1zLmF1dG9TdG9wQnVmZmVyID8/IDMwMCk7IC8vIDUgbWludXRlc1xuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAxOyAvLyBDb3VuY2lsT3JhY2xlIGJ5IGRlZmF1bHRcblxuICAvLyBGb3IgQ291bmNpbE9yYWNsZSwgY3JlYXRvciBpcyBkZWZhdWx0IGNvdW5jaWwgbWVtYmVyXG4gIGNvbnN0IGNvdW5jaWwgPSBwYXJhbXMuY291bmNpbD8ubWFwKHAgPT4gbmV3IFB1YmxpY0tleShwKSkgPz9cbiAgICAocmVzb2x1dGlvbk1vZGUgPT09IDEgPyBbY3JlYXRvclB1YmtleV0gOiBbXSk7XG4gIGNvbnN0IGNvdW5jaWxUaHJlc2hvbGQgPSBwYXJhbXMuY291bmNpbFRocmVzaG9sZCA/PyAoY291bmNpbC5sZW5ndGggPiAwID8gMSA6IDApO1xuXG4gIC8vIEVuY29kZSBpbnN0cnVjdGlvbiBkYXRhOlxuICAvLyBkaXNjcmltaW5hdG9yICg4KSArIHF1ZXN0aW9uICg0K2xlbikgKyBjbG9zaW5nX3RpbWUgKDgpICsgcmVzb2x1dGlvbl9idWZmZXIgKDgpICtcbiAgLy8gYXV0b19zdG9wX2J1ZmZlciAoOCkgKyByZXNvbHV0aW9uX21vZGUgKDEpICsgY291bmNpbCAoNCtuKjMyKSArIGNvdW5jaWxfdGhyZXNob2xkICgxKVxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBzaXplID0gOCArIDQgKyBxdWVzdGlvbkJ5dGVzLmxlbmd0aCArIDggKyA4ICsgOCArIDEgKyA0ICsgKGNvdW5jaWwubGVuZ3RoICogMzIpICsgMTtcblxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfTEFCX01BUktFVF9TT0xfRElTQ1JJTUlOQVRPUi5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVVSW50OChyZXNvbHV0aW9uTW9kZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIGRhdGEud3JpdGVVSW50MzJMRShjb3VuY2lsLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICBtZW1iZXIudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSAzMjtcbiAgfVxuICBkYXRhLndyaXRlVUludDgoY291bmNpbFRocmVzaG9sZCwgb2Zmc2V0KTtcblxuICAvLyBBY2NvdW50cyBmcm9tIElETDpcbiAgLy8gY29uZmlnIChQREEpLCBtYXJrZXQgKFBEQSksIHRyZWFzdXJ5LCBjcmVhdG9yIChzaWduZXIpLCBjcmVhdG9yX3Byb2ZpbGUgKG9wdGlvbmFsKSwgc3lzdGVtX3Byb2dyYW1cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIEZvciBvcHRpb25hbCBhY2NvdW50cywgcGFzcyBQUk9HUkFNX0lEIGFzIHBsYWNlaG9sZGVyIGlmIG5vdCBwcmVzZW50XG4gICAgeyBwdWJrZXk6IGhhc0NyZWF0b3JQcm9maWxlID8gY3JlYXRvclByb2ZpbGVQZGEgOiBQUk9HUkFNX0lELCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGhhc0NyZWF0b3JQcm9maWxlIH0sXG4gICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gY3JlYXRvclB1YmtleTtcblxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4LFxuICAgIG1hcmtldFBkYTogbWFya2V0UGRhLnRvQmFzZTU4KCksXG4gICAgbWFya2V0SWQsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCVUlMRCBDUkVBVEUgUFJJVkFURSBNQVJLRVQgVFJBTlNBQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENyZWF0ZVByaXZhdGVNYXJrZXRUcmFuc2FjdGlvbihcbiAgcGFyYW1zOiBDcmVhdGVQcml2YXRlTWFya2V0UGFyYW1zLFxuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvblxuKTogUHJvbWlzZTxDcmVhdGVNYXJrZXRSZXN1bHQ+IHtcbiAgY29uc3QgY29ubiA9IGNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IGNyZWF0b3JQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5jcmVhdG9yV2FsbGV0KTtcblxuICBjb25zdCB7IG1hcmtldElkIH0gPSBhd2FpdCBnZXROZXh0TWFya2V0SWQoY29ubik7XG4gIGNvbnN0IFttYXJrZXRQZGFdID0gZGVyaXZlTWFya2V0UGRhKG1hcmtldElkKTtcbiAgY29uc3QgW3doaXRlbGlzdFBkYV0gPSBkZXJpdmVXaGl0ZWxpc3RQZGEobWFya2V0SWQpO1xuICBjb25zdCBbY3JlYXRvclByb2ZpbGVQZGFdID0gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvclB1YmtleSk7XG5cbiAgY29uc3QgY3JlYXRvclByb2ZpbGVJbmZvID0gYXdhaXQgY29ubi5nZXRBY2NvdW50SW5mbyhjcmVhdG9yUHJvZmlsZVBkYSk7XG4gIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gY3JlYXRvclByb2ZpbGVJbmZvICE9PSBudWxsO1xuXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gQmlnSW50KE1hdGguZmxvb3IocGFyYW1zLmNsb3NpbmdUaW1lLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgY29uc3QgcmVzb2x1dGlvbkJ1ZmZlciA9IEJpZ0ludChwYXJhbXMucmVzb2x1dGlvbkJ1ZmZlciA/PyA0MzIwMCk7XG4gIGNvbnN0IGF1dG9TdG9wQnVmZmVyID0gQmlnSW50KHBhcmFtcy5hdXRvU3RvcEJ1ZmZlciA/PyAzMDApO1xuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAwOyAvLyBIb3N0T3JhY2xlIGZvciBwcml2YXRlXG5cbiAgY29uc3QgY291bmNpbCA9IHBhcmFtcy5jb3VuY2lsPy5tYXAocCA9PiBuZXcgUHVibGljS2V5KHApKSA/PyBbXTtcbiAgY29uc3QgY291bmNpbFRocmVzaG9sZCA9IHBhcmFtcy5jb3VuY2lsVGhyZXNob2xkID8/IDA7XG5cbiAgLy8gU2FtZSBpbnN0cnVjdGlvbiBmb3JtYXQgYXMgTGFiIG1hcmtldFxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBzaXplID0gOCArIDQgKyBxdWVzdGlvbkJ5dGVzLmxlbmd0aCArIDggKyA4ICsgOCArIDEgKyA0ICsgKGNvdW5jaWwubGVuZ3RoICogMzIpICsgMTtcblxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfUFJJVkFURV9UQUJMRV9TT0xfRElTQ1JJTUlOQVRPUi5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVVSW50OChyZXNvbHV0aW9uTW9kZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIGRhdGEud3JpdGVVSW50MzJMRShjb3VuY2lsLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICBtZW1iZXIudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCk7IG9mZnNldCArPSAzMjtcbiAgfVxuICBkYXRhLndyaXRlVUludDgoY291bmNpbFRocmVzaG9sZCwgb2Zmc2V0KTtcblxuICAvLyBQcml2YXRlIG1hcmtldCBhY2NvdW50cyBpbmNsdWRlIHdoaXRlbGlzdCBQREFcbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHdoaXRlbGlzdFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBoYXNDcmVhdG9yUHJvZmlsZSA/IGNyZWF0b3JQcm9maWxlUGRhIDogUFJPR1JBTV9JRCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBoYXNDcmVhdG9yUHJvZmlsZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGNyZWF0b3JQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBtYXJrZXRQZGE6IG1hcmtldFBkYS50b0Jhc2U1OCgpLFxuICAgIG1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTEQgQ1JFQVRFIFJBQ0UgTUFSS0VUIFRSQU5TQUNUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDcmVhdGVSYWNlTWFya2V0VHJhbnNhY3Rpb24oXG4gIHBhcmFtczogQ3JlYXRlUmFjZU1hcmtldFBhcmFtcyxcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb25cbik6IFByb21pc2U8Q3JlYXRlTWFya2V0UmVzdWx0PiB7XG4gIGNvbnN0IGNvbm4gPSBjb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCBjcmVhdG9yUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY3JlYXRvcldhbGxldCk7XG5cbiAgY29uc3QgeyByYWNlTWFya2V0SWQgfSA9IGF3YWl0IGdldE5leHRNYXJrZXRJZChjb25uKTtcbiAgY29uc3QgW3JhY2VNYXJrZXRQZGFdID0gZGVyaXZlUmFjZU1hcmtldFBkYShyYWNlTWFya2V0SWQpO1xuICBjb25zdCBbY3JlYXRvclByb2ZpbGVQZGFdID0gZGVyaXZlQ3JlYXRvclByb2ZpbGVQZGEoY3JlYXRvclB1YmtleSk7XG5cbiAgY29uc3QgY3JlYXRvclByb2ZpbGVJbmZvID0gYXdhaXQgY29ubi5nZXRBY2NvdW50SW5mbyhjcmVhdG9yUHJvZmlsZVBkYSk7XG4gIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gY3JlYXRvclByb2ZpbGVJbmZvICE9PSBudWxsO1xuXG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gQmlnSW50KE1hdGguZmxvb3IocGFyYW1zLmNsb3NpbmdUaW1lLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgY29uc3QgcmVzb2x1dGlvbkJ1ZmZlciA9IEJpZ0ludChwYXJhbXMucmVzb2x1dGlvbkJ1ZmZlciA/PyA0MzIwMCk7XG4gIGNvbnN0IGF1dG9TdG9wQnVmZmVyID0gQmlnSW50KHBhcmFtcy5hdXRvU3RvcEJ1ZmZlciA/PyAzMDApO1xuICBjb25zdCBsYXllciA9IHBhcmFtcy5sYXllciA/PyAxOyAvLyBMYWIgYnkgZGVmYXVsdFxuICBjb25zdCByZXNvbHV0aW9uTW9kZSA9IHBhcmFtcy5yZXNvbHV0aW9uTW9kZSA/PyAxOyAvLyBDb3VuY2lsT3JhY2xlXG4gIGNvbnN0IGFjY2Vzc0dhdGUgPSBwYXJhbXMuYWNjZXNzR2F0ZSA/PyAwOyAvLyBQdWJsaWNcblxuICAvLyBDb3VuY2lsIGlzIE9wdGlvbjxWZWM8UHVia2V5Pj4gLSBlbmNvZGUgYXMgMSAoU29tZSkgKyB2ZWMgb3IgMCAoTm9uZSlcbiAgY29uc3QgaGFzQ291bmNpbCA9IHBhcmFtcy5jb3VuY2lsICYmIHBhcmFtcy5jb3VuY2lsLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGNvdW5jaWwgPSBoYXNDb3VuY2lsID8gcGFyYW1zLmNvdW5jaWwhLm1hcChwID0+IG5ldyBQdWJsaWNLZXkocCkpIDogW107XG5cbiAgLy8gY291bmNpbF90aHJlc2hvbGQgaXMgT3B0aW9uPHU4PlxuICBjb25zdCBoYXNUaHJlc2hvbGQgPSBwYXJhbXMuY291bmNpbFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VuY2lsVGhyZXNob2xkID0gcGFyYW1zLmNvdW5jaWxUaHJlc2hvbGQgPz8gMDtcblxuICAvLyBFbmNvZGUgaW5zdHJ1Y3Rpb24gZGF0YTpcbiAgLy8gZGlzY3JpbWluYXRvciAoOCkgKyBxdWVzdGlvbiAoNCtsZW4pICsgb3V0Y29tZV9sYWJlbHMgKDQgKyBuKig0K2xlbikpICtcbiAgLy8gY2xvc2luZ190aW1lICg4KSArIHJlc29sdXRpb25fYnVmZmVyICg4KSArIGF1dG9fc3RvcF9idWZmZXIgKDgpICtcbiAgLy8gbGF5ZXIgKDEpICsgcmVzb2x1dGlvbl9tb2RlICgxKSArIGFjY2Vzc19nYXRlICgxKSArXG4gIC8vIGNvdW5jaWwgKDEgKyA0ICsgbiozMiBvciBqdXN0IDEpICsgY291bmNpbF90aHJlc2hvbGQgKDEgKyAxIG9yIGp1c3QgMSlcblxuICBjb25zdCBxdWVzdGlvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnF1ZXN0aW9uLCAndXRmOCcpO1xuICBjb25zdCBvdXRjb21lQnVmZmVycyA9IHBhcmFtcy5vdXRjb21lcy5tYXAobyA9PiBCdWZmZXIuZnJvbShvLCAndXRmOCcpKTtcblxuICBsZXQgb3V0Y29tZXNTaXplID0gNDsgLy8gdmVjIGxlbmd0aFxuICBmb3IgKGNvbnN0IGJ1ZiBvZiBvdXRjb21lQnVmZmVycykge1xuICAgIG91dGNvbWVzU2l6ZSArPSA0ICsgYnVmLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvdW5jaWxTaXplID0gaGFzQ291bmNpbCA/ICgxICsgNCArIGNvdW5jaWwubGVuZ3RoICogMzIpIDogMTtcbiAgY29uc3QgdGhyZXNob2xkU2l6ZSA9IGhhc1RocmVzaG9sZCA/IDIgOiAxO1xuXG4gIGNvbnN0IHNpemUgPSA4ICsgNCArIHF1ZXN0aW9uQnl0ZXMubGVuZ3RoICsgb3V0Y29tZXNTaXplICsgOCArIDggKyA4ICsgMSArIDEgKyAxICsgY291bmNpbFNpemUgKyB0aHJlc2hvbGRTaXplO1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBDUkVBVEVfUkFDRV9NQVJLRVRfU09MX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCBvZmZzZXQpOyBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlVUludDMyTEUocXVlc3Rpb25CeXRlcy5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICBxdWVzdGlvbkJ5dGVzLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IHF1ZXN0aW9uQnl0ZXMubGVuZ3RoO1xuXG4gIGRhdGEud3JpdGVVSW50MzJMRShwYXJhbXMub3V0Y29tZXMubGVuZ3RoLCBvZmZzZXQpOyBvZmZzZXQgKz0gNDtcbiAgZm9yIChjb25zdCBidWYgb2Ygb3V0Y29tZUJ1ZmZlcnMpIHtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYnVmLmxlbmd0aCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDQ7XG4gICAgYnVmLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShjbG9zaW5nVGltZSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG4gIGRhdGEud3JpdGVCaWdJbnQ2NExFKHJlc29sdXRpb25CdWZmZXIsIG9mZnNldCk7IG9mZnNldCArPSA4O1xuICBkYXRhLndyaXRlQmlnSW50NjRMRShhdXRvU3RvcEJ1ZmZlciwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDg7XG5cbiAgZGF0YS53cml0ZVVJbnQ4KGxheWVyLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgZGF0YS53cml0ZVVJbnQ4KHJlc29sdXRpb25Nb2RlLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgZGF0YS53cml0ZVVJbnQ4KGFjY2Vzc0dhdGUsIG9mZnNldCk7IG9mZnNldCArPSAxO1xuXG4gIC8vIE9wdGlvbjxWZWM8UHVia2V5Pj4gLSAxIChTb21lKSArIHZlYyBvciAwIChOb25lKVxuICBpZiAoaGFzQ291bmNpbCkge1xuICAgIGRhdGEud3JpdGVVSW50OCgxLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoY291bmNpbC5sZW5ndGgsIG9mZnNldCk7IG9mZnNldCArPSA0O1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGNvdW5jaWwpIHtcbiAgICAgIG1lbWJlci50b0J1ZmZlcigpLmNvcHkoZGF0YSwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDMyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIH1cblxuICAvLyBPcHRpb248dTg+IC0gMSAoU29tZSkgKyB2YWx1ZSBvciAwIChOb25lKVxuICBpZiAoaGFzVGhyZXNob2xkKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IG9mZnNldCArPSAxO1xuICAgIGRhdGEud3JpdGVVSW50OChjb3VuY2lsVGhyZXNob2xkLCBvZmZzZXQpOyBvZmZzZXQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTsgb2Zmc2V0ICs9IDE7XG4gIH1cblxuICAvLyBBY2NvdW50czogY29uZmlnLCByYWNlX21hcmtldCwgY3JlYXRvcl9wcm9maWxlIChvcHRpb25hbCksIHRyZWFzdXJ5LCBjcmVhdG9yLCBzeXN0ZW1fcHJvZ3JhbVxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGhhc0NyZWF0b3JQcm9maWxlID8gY3JlYXRvclByb2ZpbGVQZGEgOiBQUk9HUkFNX0lELCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGhhc0NyZWF0b3JQcm9maWxlIH0sXG4gICAgeyBwdWJrZXk6IFNPTF9UUkVBU1VSWV9QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjcmVhdG9yUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGNyZWF0b3JQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBtYXJrZXRQZGE6IHJhY2VNYXJrZXRQZGEudG9CYXNlNTgoKSxcbiAgICBtYXJrZXRJZDogcmFjZU1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSOiBERVJJVkUgUERBIFBSRVZJRVdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aWV3TWFya2V0UGRhKG1hcmtldElkOiBiaWdpbnQpOiB7XG4gIG1hcmtldFBkYTogc3RyaW5nO1xuICBidW1wOiBudW1iZXI7XG59IHtcbiAgY29uc3QgW3BkYSwgYnVtcF0gPSBkZXJpdmVNYXJrZXRQZGEobWFya2V0SWQpO1xuICByZXR1cm4geyBtYXJrZXRQZGE6IHBkYS50b0Jhc2U1OCgpLCBidW1wIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aWV3UmFjZU1hcmtldFBkYShtYXJrZXRJZDogYmlnaW50KToge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIGJ1bXA6IG51bWJlcjtcbn0ge1xuICBjb25zdCBbcGRhLCBidW1wXSA9IGRlcml2ZVJhY2VNYXJrZXRQZGEobWFya2V0SWQpO1xuICByZXR1cm4geyByYWNlTWFya2V0UGRhOiBwZGEudG9CYXNlNTgoKSwgYnVtcCB9O1xufVxuIl19
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market Management Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - Closing markets (stopping betting)
|
|
6
|
+
* - Extending market deadlines
|
|
7
|
+
*/
|
|
8
|
+
import { Connection, Transaction } from '@solana/web3.js';
|
|
9
|
+
/**
|
|
10
|
+
* Build close_market transaction
|
|
11
|
+
* Stops betting on a market (usually done by creator before resolution)
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildCloseMarketTransaction(params: {
|
|
14
|
+
marketPda: string;
|
|
15
|
+
callerWallet: string;
|
|
16
|
+
connection?: Connection;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
transaction: Transaction;
|
|
19
|
+
serializedTx: string;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Build extend_market transaction
|
|
23
|
+
* Extends the closing time and/or resolution time
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildExtendMarketTransaction(params: {
|
|
26
|
+
marketPda: string;
|
|
27
|
+
newClosingTime: number;
|
|
28
|
+
newResolutionTime?: number;
|
|
29
|
+
callerWallet: string;
|
|
30
|
+
connection?: Connection;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
transaction: Transaction;
|
|
33
|
+
serializedTx: string;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Build close_race_market transaction
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildCloseRaceMarketTransaction(params: {
|
|
39
|
+
raceMarketPda: string;
|
|
40
|
+
callerWallet: string;
|
|
41
|
+
connection?: Connection;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
transaction: Transaction;
|
|
44
|
+
serializedTx: string;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Build extend_race_market transaction
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildExtendRaceMarketTransaction(params: {
|
|
50
|
+
raceMarketPda: string;
|
|
51
|
+
newClosingTime: number;
|
|
52
|
+
newResolutionTime?: number;
|
|
53
|
+
callerWallet: string;
|
|
54
|
+
connection?: Connection;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
transaction: Transaction;
|
|
57
|
+
serializedTx: string;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* Build cancel_market transaction
|
|
61
|
+
* Cancels a market and allows all bettors to claim refunds.
|
|
62
|
+
* Only callable by admin or creator (depending on market status).
|
|
63
|
+
*/
|
|
64
|
+
export declare function buildCancelMarketTransaction(params: {
|
|
65
|
+
marketPda: string;
|
|
66
|
+
reason: string;
|
|
67
|
+
authorityWallet: string;
|
|
68
|
+
connection?: Connection;
|
|
69
|
+
}): Promise<{
|
|
70
|
+
transaction: Transaction;
|
|
71
|
+
serializedTx: string;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Build cancel_race transaction
|
|
75
|
+
* Cancels a race market and allows all bettors to claim refunds.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildCancelRaceTransaction(params: {
|
|
78
|
+
raceMarketPda: string;
|
|
79
|
+
reason: string;
|
|
80
|
+
authorityWallet: string;
|
|
81
|
+
connection?: Connection;
|
|
82
|
+
}): Promise<{
|
|
83
|
+
transaction: Transaction;
|
|
84
|
+
serializedTx: string;
|
|
85
|
+
}>;
|