@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,108 @@
1
+ /**
2
+ * Resolution Transaction Builders
3
+ *
4
+ * IMPORTANT: Account structures verified against IDL v4.7.6
5
+ */
6
+ import { Connection, Transaction } from '@solana/web3.js';
7
+ /**
8
+ * Build propose_resolution transaction
9
+ * IDL Accounts: config, market, dispute_meta, authority, system_program
10
+ */
11
+ export declare function buildProposeResolutionTransaction(params: {
12
+ marketPda: string;
13
+ outcome: boolean;
14
+ proposerWallet: string;
15
+ connection?: Connection;
16
+ }): Promise<{
17
+ transaction: Transaction;
18
+ serializedTx: string;
19
+ }>;
20
+ /**
21
+ * Build propose_resolution_host transaction
22
+ * IDL Accounts: config, market, dispute_meta, host, system_program
23
+ */
24
+ export declare function buildProposeResolutionHostTransaction(params: {
25
+ marketPda: string;
26
+ outcome: boolean;
27
+ oracleWallet: string;
28
+ connection?: Connection;
29
+ }): Promise<{
30
+ transaction: Transaction;
31
+ serializedTx: string;
32
+ }>;
33
+ /**
34
+ * Build resolve_market transaction
35
+ * IDL Accounts: config, market, authority
36
+ */
37
+ export declare function buildResolveMarketTransaction(params: {
38
+ marketPda: string;
39
+ outcome: boolean;
40
+ resolverWallet: string;
41
+ connection?: Connection;
42
+ }): Promise<{
43
+ transaction: Transaction;
44
+ serializedTx: string;
45
+ }>;
46
+ /**
47
+ * Build resolve_market_host transaction
48
+ * IDL Accounts: config, market, host
49
+ */
50
+ export declare function buildResolveMarketHostTransaction(params: {
51
+ marketPda: string;
52
+ outcome: boolean;
53
+ oracleWallet: string;
54
+ connection?: Connection;
55
+ }): Promise<{
56
+ transaction: Transaction;
57
+ serializedTx: string;
58
+ }>;
59
+ /**
60
+ * Build finalize_resolution transaction
61
+ * IDL Accounts: market, dispute_meta, finalizer
62
+ */
63
+ export declare function buildFinalizeResolutionTransaction(params: {
64
+ marketPda: string;
65
+ callerWallet: string;
66
+ connection?: Connection;
67
+ }): Promise<{
68
+ transaction: Transaction;
69
+ serializedTx: string;
70
+ }>;
71
+ /**
72
+ * Build propose_race_resolution transaction
73
+ * IDL Accounts: config, race_market, dispute_meta, resolver, system_program
74
+ */
75
+ export declare function buildProposeRaceResolutionTransaction(params: {
76
+ raceMarketPda: string;
77
+ winningOutcomeIndex: number;
78
+ proposerWallet: string;
79
+ connection?: Connection;
80
+ }): Promise<{
81
+ transaction: Transaction;
82
+ serializedTx: string;
83
+ }>;
84
+ /**
85
+ * Build resolve_race transaction (direct resolve by creator)
86
+ * IDL Accounts: config, race_market, authority
87
+ */
88
+ export declare function buildResolveRaceTransaction(params: {
89
+ raceMarketPda: string;
90
+ winningOutcomeIndex: number;
91
+ resolverWallet: string;
92
+ connection?: Connection;
93
+ }): Promise<{
94
+ transaction: Transaction;
95
+ serializedTx: string;
96
+ }>;
97
+ /**
98
+ * Build finalize_race_resolution transaction
99
+ * IDL Accounts: race_market, dispute_meta, finalizer
100
+ */
101
+ export declare function buildFinalizeRaceResolutionTransaction(params: {
102
+ raceMarketPda: string;
103
+ callerWallet: string;
104
+ connection?: Connection;
105
+ }): Promise<{
106
+ transaction: Transaction;
107
+ serializedTx: string;
108
+ }>;
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Resolution Transaction Builders
3
+ *
4
+ * IMPORTANT: Account structures verified against IDL v4.7.6
5
+ */
6
+ import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
7
+ import { PROGRAM_ID, CONFIG_PDA, RPC_ENDPOINT, SEEDS, } from '../config.js';
8
+ // =============================================================================
9
+ // DISCRIMINATORS (from IDL)
10
+ // =============================================================================
11
+ const DISCRIMINATORS = {
12
+ propose_resolution: Buffer.from([19, 68, 181, 23, 194, 146, 152, 252]),
13
+ propose_resolution_host: Buffer.from([116, 231, 75, 185, 127, 129, 46, 124]),
14
+ resolve_market: Buffer.from([155, 23, 80, 173, 46, 74, 23, 239]),
15
+ resolve_market_host: Buffer.from([140, 50, 133, 146, 72, 5, 210, 116]),
16
+ finalize_resolution: Buffer.from([191, 74, 94, 214, 45, 150, 152, 125]),
17
+ propose_race_resolution: Buffer.from([14, 204, 17, 188, 243, 49, 107, 255]),
18
+ resolve_race: Buffer.from([181, 252, 7, 209, 242, 100, 95, 172]),
19
+ finalize_race_resolution: Buffer.from([19, 232, 81, 138, 191, 218, 54, 200]),
20
+ };
21
+ // =============================================================================
22
+ // PDA DERIVATION
23
+ // =============================================================================
24
+ function deriveDisputeMetaPda(marketPda) {
25
+ const [pda] = PublicKey.findProgramAddressSync([SEEDS.DISPUTE_META, marketPda.toBuffer()], PROGRAM_ID);
26
+ return pda;
27
+ }
28
+ // =============================================================================
29
+ // BOOLEAN MARKET RESOLUTION
30
+ // =============================================================================
31
+ /**
32
+ * Build propose_resolution transaction
33
+ * IDL Accounts: config, market, dispute_meta, authority, system_program
34
+ */
35
+ export async function buildProposeResolutionTransaction(params) {
36
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
37
+ const marketPubkey = new PublicKey(params.marketPda);
38
+ const proposerPubkey = new PublicKey(params.proposerWallet);
39
+ const disputeMetaPda = deriveDisputeMetaPda(marketPubkey);
40
+ // Instruction data: discriminator + outcome (bool)
41
+ const data = Buffer.alloc(9);
42
+ DISCRIMINATORS.propose_resolution.copy(data, 0);
43
+ data.writeUInt8(params.outcome ? 1 : 0, 8);
44
+ const keys = [
45
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
46
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
47
+ { pubkey: disputeMetaPda, isSigner: false, isWritable: true },
48
+ { pubkey: proposerPubkey, isSigner: true, isWritable: true },
49
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
50
+ ];
51
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
52
+ const transaction = new Transaction().add(instruction);
53
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
54
+ transaction.recentBlockhash = blockhash;
55
+ transaction.feePayer = proposerPubkey;
56
+ return {
57
+ transaction,
58
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
59
+ };
60
+ }
61
+ /**
62
+ * Build propose_resolution_host transaction
63
+ * IDL Accounts: config, market, dispute_meta, host, system_program
64
+ */
65
+ export async function buildProposeResolutionHostTransaction(params) {
66
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
67
+ const marketPubkey = new PublicKey(params.marketPda);
68
+ const oraclePubkey = new PublicKey(params.oracleWallet);
69
+ const disputeMetaPda = deriveDisputeMetaPda(marketPubkey);
70
+ const data = Buffer.alloc(9);
71
+ DISCRIMINATORS.propose_resolution_host.copy(data, 0);
72
+ data.writeUInt8(params.outcome ? 1 : 0, 8);
73
+ const keys = [
74
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
75
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
76
+ { pubkey: disputeMetaPda, isSigner: false, isWritable: true },
77
+ { pubkey: oraclePubkey, isSigner: true, isWritable: true },
78
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
79
+ ];
80
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
81
+ const transaction = new Transaction().add(instruction);
82
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
83
+ transaction.recentBlockhash = blockhash;
84
+ transaction.feePayer = oraclePubkey;
85
+ return {
86
+ transaction,
87
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
88
+ };
89
+ }
90
+ /**
91
+ * Build resolve_market transaction
92
+ * IDL Accounts: config, market, authority
93
+ */
94
+ export async function buildResolveMarketTransaction(params) {
95
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
96
+ const marketPubkey = new PublicKey(params.marketPda);
97
+ const resolverPubkey = new PublicKey(params.resolverWallet);
98
+ const data = Buffer.alloc(9);
99
+ DISCRIMINATORS.resolve_market.copy(data, 0);
100
+ data.writeUInt8(params.outcome ? 1 : 0, 8);
101
+ const keys = [
102
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
103
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
104
+ { pubkey: resolverPubkey, isSigner: true, isWritable: false },
105
+ ];
106
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
107
+ const transaction = new Transaction().add(instruction);
108
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
109
+ transaction.recentBlockhash = blockhash;
110
+ transaction.feePayer = resolverPubkey;
111
+ return {
112
+ transaction,
113
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
114
+ };
115
+ }
116
+ /**
117
+ * Build resolve_market_host transaction
118
+ * IDL Accounts: config, market, host
119
+ */
120
+ export async function buildResolveMarketHostTransaction(params) {
121
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
122
+ const marketPubkey = new PublicKey(params.marketPda);
123
+ const oraclePubkey = new PublicKey(params.oracleWallet);
124
+ const data = Buffer.alloc(9);
125
+ DISCRIMINATORS.resolve_market_host.copy(data, 0);
126
+ data.writeUInt8(params.outcome ? 1 : 0, 8);
127
+ const keys = [
128
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
129
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
130
+ { pubkey: oraclePubkey, isSigner: true, isWritable: false },
131
+ ];
132
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
133
+ const transaction = new Transaction().add(instruction);
134
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
135
+ transaction.recentBlockhash = blockhash;
136
+ transaction.feePayer = oraclePubkey;
137
+ return {
138
+ transaction,
139
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
140
+ };
141
+ }
142
+ /**
143
+ * Build finalize_resolution transaction
144
+ * IDL Accounts: market, dispute_meta, finalizer
145
+ */
146
+ export async function buildFinalizeResolutionTransaction(params) {
147
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
148
+ const marketPubkey = new PublicKey(params.marketPda);
149
+ const callerPubkey = new PublicKey(params.callerWallet);
150
+ const disputeMetaPda = deriveDisputeMetaPda(marketPubkey);
151
+ const data = DISCRIMINATORS.finalize_resolution;
152
+ const keys = [
153
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
154
+ { pubkey: disputeMetaPda, isSigner: false, isWritable: true },
155
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
156
+ ];
157
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
158
+ const transaction = new Transaction().add(instruction);
159
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
160
+ transaction.recentBlockhash = blockhash;
161
+ transaction.feePayer = callerPubkey;
162
+ return {
163
+ transaction,
164
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
165
+ };
166
+ }
167
+ // =============================================================================
168
+ // RACE MARKET RESOLUTION
169
+ // =============================================================================
170
+ /**
171
+ * Build propose_race_resolution transaction
172
+ * IDL Accounts: config, race_market, dispute_meta, resolver, system_program
173
+ */
174
+ export async function buildProposeRaceResolutionTransaction(params) {
175
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
176
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
177
+ const proposerPubkey = new PublicKey(params.proposerWallet);
178
+ const disputeMetaPda = deriveDisputeMetaPda(raceMarketPubkey);
179
+ const data = Buffer.alloc(9);
180
+ DISCRIMINATORS.propose_race_resolution.copy(data, 0);
181
+ data.writeUInt8(params.winningOutcomeIndex, 8);
182
+ const keys = [
183
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
184
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
185
+ { pubkey: disputeMetaPda, isSigner: false, isWritable: true },
186
+ { pubkey: proposerPubkey, isSigner: true, isWritable: true },
187
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
188
+ ];
189
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
190
+ const transaction = new Transaction().add(instruction);
191
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
192
+ transaction.recentBlockhash = blockhash;
193
+ transaction.feePayer = proposerPubkey;
194
+ return {
195
+ transaction,
196
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
197
+ };
198
+ }
199
+ /**
200
+ * Build resolve_race transaction (direct resolve by creator)
201
+ * IDL Accounts: config, race_market, authority
202
+ */
203
+ export async function buildResolveRaceTransaction(params) {
204
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
205
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
206
+ const resolverPubkey = new PublicKey(params.resolverWallet);
207
+ const data = Buffer.alloc(9);
208
+ DISCRIMINATORS.resolve_race.copy(data, 0);
209
+ data.writeUInt8(params.winningOutcomeIndex, 8);
210
+ const keys = [
211
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
212
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
213
+ { pubkey: resolverPubkey, isSigner: true, isWritable: false },
214
+ ];
215
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
216
+ const transaction = new Transaction().add(instruction);
217
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
218
+ transaction.recentBlockhash = blockhash;
219
+ transaction.feePayer = resolverPubkey;
220
+ return {
221
+ transaction,
222
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
223
+ };
224
+ }
225
+ /**
226
+ * Build finalize_race_resolution transaction
227
+ * IDL Accounts: race_market, dispute_meta, finalizer
228
+ */
229
+ export async function buildFinalizeRaceResolutionTransaction(params) {
230
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
231
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
232
+ const callerPubkey = new PublicKey(params.callerWallet);
233
+ const disputeMetaPda = deriveDisputeMetaPda(raceMarketPubkey);
234
+ const data = DISCRIMINATORS.finalize_race_resolution;
235
+ const keys = [
236
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
237
+ { pubkey: disputeMetaPda, isSigner: false, isWritable: true },
238
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
239
+ ];
240
+ const instruction = new TransactionInstruction({ programId: PROGRAM_ID, keys, data });
241
+ const transaction = new Transaction().add(instruction);
242
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
243
+ transaction.recentBlockhash = blockhash;
244
+ transaction.feePayer = callerPubkey;
245
+ return {
246
+ transaction,
247
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
248
+ };
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x1dGlvbi10cmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVycy9yZXNvbHV0aW9uLXRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEdBQ04sTUFBTSxjQUFjLENBQUM7QUFFdEIsZ0ZBQWdGO0FBQ2hGLDRCQUE0QjtBQUM1QixnRkFBZ0Y7QUFFaEYsTUFBTSxjQUFjLEdBQUc7SUFDckIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RSx1QkFBdUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEUsbUJBQW1CLEVB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RUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1FBQy9ELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDN0QsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtLQUM1RCxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO0lBRXBDLE9BQU87UUFDTCxXQUFXO1FBQ1gsWUFBWSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0tBQ2pILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHV0aW9uIFRyYW5zYWN0aW9uIEJ1aWxkZXJzXG4gKlxuICogSU1QT1JUQU5UOiBBY2NvdW50IHN0cnVjdHVyZXMgdmVyaWZpZWQgYWdhaW5zdCBJREwgdjQuNy42XG4gKi9cbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIFB1YmxpY0tleSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBDT05GSUdfUERBLFxuICBSUENfRU5EUE9JTlQsXG4gIFNFRURTLFxufSBmcm9tICcuLi9jb25maWcuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRElTQ1JJTUlOQVRPUlMgKGZyb20gSURMKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgRElTQ1JJTUlOQVRPUlMgPSB7XG4gIHByb3Bvc2VfcmVzb2x1dGlvbjogQnVmZmVyLmZyb20oWzE5LCA2OCwgMTgxLCAyMywgMTk0LCAxNDYsIDE1MiwgMjUyXSksXG4gIHByb3Bvc2VfcmVzb2x1dGlvbl9ob3N0OiBCdWZmZXIuZnJvbShbMTE2LCAyMzEsIDc1LCAxODUsIDEyNywgMTI5LCA0NiwgMTI0XSksXG4gIHJlc29sdmVfbWFya2V0OiBCdWZmZXIuZnJvbShbMTU1LCAyMywgODAsIDE3MywgNDYsIDc0LCAyMywgMjM5XSksXG4gIHJlc29sdmVfbWFya2V0X2hvc3Q6IEJ1ZmZlci5mcm9tKFsxNDAsIDUwLCAxMzMsIDE0NiwgNzIsIDUsIDIxMCwgMTE2XSksXG4gIGZpbmFsaXplX3Jlc29sdXRpb246IEJ1ZmZlci5mcm9tKFsxOTEsIDc0LCA5NCwgMjE0LCA0NSwgMTUwLCAxNTIsIDEyNV0pLFxuICBwcm9wb3NlX3JhY2VfcmVzb2x1dGlvbjogQnVmZmVyLmZyb20oWzE0LCAyMDQsIDE3LCAxODgsIDI0MywgNDksIDEwNywgMjU1XSksXG4gIHJlc29sdmVfcmFjZTogQnVmZmVyLmZyb20oWzE4MSwgMjUyLCA3LCAyMDksIDI0MiwgMTAwLCA5NSwgMTcyXSksXG4gIGZpbmFsaXplX3JhY2VfcmVzb2x1dGlvbjogQnVmZmVyLmZyb20oWzE5LCAyMzIsIDgxLCAxMzgsIDE5MSwgMjE4LCA1NCwgMjAwXSksXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUERBIERFUklWQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGRlcml2ZURpc3B1dGVNZXRhUGRhKG1hcmtldFBkYTogUHVibGljS2V5KTogUHVibGljS2V5IHtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuRElTUFVURV9NRVRBLCBtYXJrZXRQZGEudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQk9PTEVBTiBNQVJLRVQgUkVTT0xVVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBwcm9wb3NlX3Jlc29sdXRpb24gdHJhbnNhY3Rpb25cbiAqIElETCBBY2NvdW50czogY29uZmlnLCBtYXJrZXQsIGRpc3B1dGVfbWV0YSwgYXV0aG9yaXR5LCBzeXN0ZW1fcHJvZ3JhbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRQcm9wb3NlUmVzb2x1dGlvblRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgb3V0Y29tZTogYm9vbGVhbjtcbiAgcHJvcG9zZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IG1hcmtldFB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLm1hcmtldFBkYSk7XG4gIGNvbnN0IHByb3Bvc2VyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucHJvcG9zZXJXYWxsZXQpO1xuICBjb25zdCBkaXNwdXRlTWV0YVBkYSA9IGRlcml2ZURpc3B1dGVNZXRhUGRhKG1hcmtldFB1YmtleSk7XG5cbiAgLy8gSW5zdHJ1Y3Rpb24gZGF0YTogZGlzY3JpbWluYXRvciArIG91dGNvbWUgKGJvb2wpXG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOSk7XG4gIERJU0NSSU1JTkFUT1JTLnByb3Bvc2VfcmVzb2x1dGlvbi5jb3B5KGRhdGEsIDApO1xuICBkYXRhLndyaXRlVUludDgocGFyYW1zLm91dGNvbWUgPyAxIDogMCwgOCk7XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiBtYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBkaXNwdXRlTWV0YVBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHByb3Bvc2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHByb3Bvc2VyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBwcm9wb3NlX3Jlc29sdXRpb25faG9zdCB0cmFuc2FjdGlvblxuICogSURMIEFjY291bnRzOiBjb25maWcsIG1hcmtldCwgZGlzcHV0ZV9tZXRhLCBob3N0LCBzeXN0ZW1fcHJvZ3JhbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRQcm9wb3NlUmVzb2x1dGlvbkhvc3RUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIG91dGNvbWU6IGJvb2xlYW47XG4gIG9yYWNsZVdhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3Qgb3JhY2xlUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMub3JhY2xlV2FsbGV0KTtcbiAgY29uc3QgZGlzcHV0ZU1ldGFQZGEgPSBkZXJpdmVEaXNwdXRlTWV0YVBkYShtYXJrZXRQdWJrZXkpO1xuXG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOSk7XG4gIERJU0NSSU1JTkFUT1JTLnByb3Bvc2VfcmVzb2x1dGlvbl9ob3N0LmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50OChwYXJhbXMub3V0Y29tZSA/IDEgOiAwLCA4KTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGRpc3B1dGVNZXRhUGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogb3JhY2xlUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IG9yYWNsZVB1YmtleTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogdHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgcmVzb2x2ZV9tYXJrZXQgdHJhbnNhY3Rpb25cbiAqIElETCBBY2NvdW50czogY29uZmlnLCBtYXJrZXQsIGF1dGhvcml0eVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRSZXNvbHZlTWFya2V0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIG1hcmtldFBkYTogc3RyaW5nO1xuICBvdXRjb21lOiBib29sZWFuO1xuICByZXNvbHZlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3QgcmVzb2x2ZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yZXNvbHZlcldhbGxldCk7XG5cbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg5KTtcbiAgRElTQ1JJTUlOQVRPUlMucmVzb2x2ZV9tYXJrZXQuY29weShkYXRhLCAwKTtcbiAgZGF0YS53cml0ZVVJbnQ4KHBhcmFtcy5vdXRjb21lID8gMSA6IDAsIDgpO1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcmVzb2x2ZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHJlc29sdmVyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCByZXNvbHZlX21hcmtldF9ob3N0IHRyYW5zYWN0aW9uXG4gKiBJREwgQWNjb3VudHM6IGNvbmZpZywgbWFya2V0LCBob3N0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFJlc29sdmVNYXJrZXRIb3N0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIG1hcmtldFBkYTogc3RyaW5nO1xuICBvdXRjb21lOiBib29sZWFuO1xuICBvcmFjbGVXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IG1hcmtldFB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLm1hcmtldFBkYSk7XG4gIGNvbnN0IG9yYWNsZVB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLm9yYWNsZVdhbGxldCk7XG5cbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg5KTtcbiAgRElTQ1JJTUlOQVRPUlMucmVzb2x2ZV9tYXJrZXRfaG9zdC5jb3B5KGRhdGEsIDApO1xuICBkYXRhLndyaXRlVUludDgocGFyYW1zLm91dGNvbWUgPyAxIDogMCwgOCk7XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiBtYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBvcmFjbGVQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IG9yYWNsZVB1YmtleTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogdHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgZmluYWxpemVfcmVzb2x1dGlvbiB0cmFuc2FjdGlvblxuICogSURMIEFjY291bnRzOiBtYXJrZXQsIGRpc3B1dGVfbWV0YSwgZmluYWxpemVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEZpbmFsaXplUmVzb2x1dGlvblRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgY2FsbGVyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHNlcmlhbGl6ZWRUeDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCBtYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5tYXJrZXRQZGEpO1xuICBjb25zdCBjYWxsZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5jYWxsZXJXYWxsZXQpO1xuICBjb25zdCBkaXNwdXRlTWV0YVBkYSA9IGRlcml2ZURpc3B1dGVNZXRhUGRhKG1hcmtldFB1YmtleSk7XG5cbiAgY29uc3QgZGF0YSA9IERJU0NSSU1JTkFUT1JTLmZpbmFsaXplX3Jlc29sdXRpb247XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogZGlzcHV0ZU1ldGFQZGEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBjYWxsZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGNhbGxlclB1YmtleTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogdHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSQUNFIE1BUktFVCBSRVNPTFVUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIHByb3Bvc2VfcmFjZV9yZXNvbHV0aW9uIHRyYW5zYWN0aW9uXG4gKiBJREwgQWNjb3VudHM6IGNvbmZpZywgcmFjZV9tYXJrZXQsIGRpc3B1dGVfbWV0YSwgcmVzb2x2ZXIsIHN5c3RlbV9wcm9ncmFtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFByb3Bvc2VSYWNlUmVzb2x1dGlvblRyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHdpbm5pbmdPdXRjb21lSW5kZXg6IG51bWJlcjtcbiAgcHJvcG9zZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgcHJvcG9zZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5wcm9wb3NlcldhbGxldCk7XG4gIGNvbnN0IGRpc3B1dGVNZXRhUGRhID0gZGVyaXZlRGlzcHV0ZU1ldGFQZGEocmFjZU1hcmtldFB1YmtleSk7XG5cbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg5KTtcbiAgRElTQ1JJTUlOQVRPUlMucHJvcG9zZV9yYWNlX3Jlc29sdXRpb24uY29weShkYXRhLCAwKTtcbiAgZGF0YS53cml0ZVVJbnQ4KHBhcmFtcy53aW5uaW5nT3V0Y29tZUluZGV4LCA4KTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBkaXNwdXRlTWV0YVBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHByb3Bvc2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHByb3Bvc2VyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCByZXNvbHZlX3JhY2UgdHJhbnNhY3Rpb24gKGRpcmVjdCByZXNvbHZlIGJ5IGNyZWF0b3IpXG4gKiBJREwgQWNjb3VudHM6IGNvbmZpZywgcmFjZV9tYXJrZXQsIGF1dGhvcml0eVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRSZXNvbHZlUmFjZVRyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHdpbm5pbmdPdXRjb21lSW5kZXg6IG51bWJlcjtcbiAgcmVzb2x2ZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgcmVzb2x2ZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yZXNvbHZlcldhbGxldCk7XG5cbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg5KTtcbiAgRElTQ1JJTUlOQVRPUlMucmVzb2x2ZV9yYWNlLmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50OChwYXJhbXMud2lubmluZ091dGNvbWVJbmRleCwgOCk7XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcmVzb2x2ZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oeyBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsIGtleXMsIGRhdGEgfSk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHJlc29sdmVyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBmaW5hbGl6ZV9yYWNlX3Jlc29sdXRpb24gdHJhbnNhY3Rpb25cbiAqIElETCBBY2NvdW50czogcmFjZV9tYXJrZXQsIGRpc3B1dGVfbWV0YSwgZmluYWxpemVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEZpbmFsaXplUmFjZVJlc29sdXRpb25UcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICBjYWxsZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgY2FsbGVyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY2FsbGVyV2FsbGV0KTtcbiAgY29uc3QgZGlzcHV0ZU1ldGFQZGEgPSBkZXJpdmVEaXNwdXRlTWV0YVBkYShyYWNlTWFya2V0UHVia2V5KTtcblxuICBjb25zdCBkYXRhID0gRElTQ1JJTUlOQVRPUlMuZmluYWxpemVfcmFjZV9yZXNvbHV0aW9uO1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBkaXNwdXRlTWV0YVBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGNhbGxlclB1YmtleSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7IHByb2dyYW1JZDogUFJPR1JBTV9JRCwga2V5cywgZGF0YSB9KTtcbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaW5zdHJ1Y3Rpb24pO1xuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gY2FsbGVyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Whitelist Transaction Builders
3
+ *
4
+ * IMPORTANT: Account structures verified against IDL v4.7.6
5
+ */
6
+ import { Connection, Transaction } from '@solana/web3.js';
7
+ /**
8
+ * Build add_to_whitelist transaction
9
+ * IDL Accounts: market, whitelist, creator
10
+ */
11
+ export declare function buildAddToWhitelistTransaction(params: {
12
+ marketPda: string;
13
+ userToAdd: string;
14
+ creatorWallet: string;
15
+ connection?: Connection;
16
+ }): Promise<{
17
+ transaction: Transaction;
18
+ serializedTx: string;
19
+ whitelistPda: string;
20
+ }>;
21
+ /**
22
+ * Build remove_from_whitelist transaction
23
+ * IDL Accounts: market, whitelist, creator
24
+ */
25
+ export declare function buildRemoveFromWhitelistTransaction(params: {
26
+ marketPda: string;
27
+ userToRemove: string;
28
+ creatorWallet: string;
29
+ connection?: Connection;
30
+ }): Promise<{
31
+ transaction: Transaction;
32
+ serializedTx: string;
33
+ }>;
34
+ /**
35
+ * Build create_race_whitelist transaction
36
+ * IDL Accounts: race_market, whitelist, creator, system_program
37
+ */
38
+ export declare function buildCreateRaceWhitelistTransaction(params: {
39
+ raceMarketPda: string;
40
+ creatorWallet: string;
41
+ connection?: Connection;
42
+ }): Promise<{
43
+ transaction: Transaction;
44
+ serializedTx: string;
45
+ whitelistPda: string;
46
+ }>;
47
+ /**
48
+ * Build add_to_race_whitelist transaction
49
+ * IDL Accounts: race_market, whitelist, creator
50
+ */
51
+ export declare function buildAddToRaceWhitelistTransaction(params: {
52
+ raceMarketPda: string;
53
+ userToAdd: string;
54
+ creatorWallet: string;
55
+ connection?: Connection;
56
+ }): Promise<{
57
+ transaction: Transaction;
58
+ serializedTx: string;
59
+ }>;
60
+ /**
61
+ * Build remove_from_race_whitelist transaction
62
+ * IDL Accounts: race_market, whitelist, creator
63
+ */
64
+ export declare function buildRemoveFromRaceWhitelistTransaction(params: {
65
+ raceMarketPda: string;
66
+ userToRemove: string;
67
+ creatorWallet: string;
68
+ connection?: Connection;
69
+ }): Promise<{
70
+ transaction: Transaction;
71
+ serializedTx: string;
72
+ }>;