@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,239 @@
|
|
|
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, PublicKey, Transaction, TransactionInstruction, } from '@solana/web3.js';
|
|
9
|
+
import { PROGRAM_ID, CONFIG_PDA, RPC_ENDPOINT, } from '../config.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// DISCRIMINATORS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
const DISCRIMINATORS = {
|
|
14
|
+
close_market: Buffer.from([88, 154, 248, 186, 48, 14, 123, 244]),
|
|
15
|
+
close_race_market: Buffer.from([39, 189, 166, 118, 134, 37, 102, 41]),
|
|
16
|
+
extend_market: Buffer.from([105, 89, 206, 205, 57, 31, 153, 252]),
|
|
17
|
+
extend_race_market: Buffer.from([242, 176, 227, 152, 79, 116, 110, 168]),
|
|
18
|
+
cancel_market: Buffer.from([205, 121, 84, 210, 222, 71, 150, 11]),
|
|
19
|
+
cancel_race: Buffer.from([28, 31, 113, 29, 126, 206, 39, 119]),
|
|
20
|
+
};
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// BOOLEAN MARKET MANAGEMENT
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Build close_market transaction
|
|
26
|
+
* Stops betting on a market (usually done by creator before resolution)
|
|
27
|
+
*/
|
|
28
|
+
export async function buildCloseMarketTransaction(params) {
|
|
29
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
30
|
+
const marketPubkey = new PublicKey(params.marketPda);
|
|
31
|
+
const callerPubkey = new PublicKey(params.callerWallet);
|
|
32
|
+
const data = DISCRIMINATORS.close_market;
|
|
33
|
+
const keys = [
|
|
34
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
35
|
+
{ pubkey: marketPubkey, isSigner: false, isWritable: true },
|
|
36
|
+
{ pubkey: callerPubkey, isSigner: true, isWritable: false },
|
|
37
|
+
];
|
|
38
|
+
const instruction = new TransactionInstruction({
|
|
39
|
+
programId: PROGRAM_ID,
|
|
40
|
+
keys,
|
|
41
|
+
data,
|
|
42
|
+
});
|
|
43
|
+
const transaction = new Transaction().add(instruction);
|
|
44
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
45
|
+
transaction.recentBlockhash = blockhash;
|
|
46
|
+
transaction.feePayer = callerPubkey;
|
|
47
|
+
return {
|
|
48
|
+
transaction,
|
|
49
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build extend_market transaction
|
|
54
|
+
* Extends the closing time and/or resolution time
|
|
55
|
+
*/
|
|
56
|
+
export async function buildExtendMarketTransaction(params) {
|
|
57
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
58
|
+
const marketPubkey = new PublicKey(params.marketPda);
|
|
59
|
+
const callerPubkey = new PublicKey(params.callerWallet);
|
|
60
|
+
// Instruction data: discriminator + new_closing_time (i64) + Option<i64> new_resolution_time
|
|
61
|
+
const hasResolutionTime = params.newResolutionTime !== undefined;
|
|
62
|
+
const dataSize = 8 + 8 + 1 + (hasResolutionTime ? 8 : 0);
|
|
63
|
+
const data = Buffer.alloc(dataSize);
|
|
64
|
+
let offset = 0;
|
|
65
|
+
DISCRIMINATORS.extend_market.copy(data, offset);
|
|
66
|
+
offset += 8;
|
|
67
|
+
data.writeBigInt64LE(BigInt(params.newClosingTime), offset);
|
|
68
|
+
offset += 8;
|
|
69
|
+
if (hasResolutionTime) {
|
|
70
|
+
data.writeUInt8(1, offset); // Some
|
|
71
|
+
offset += 1;
|
|
72
|
+
data.writeBigInt64LE(BigInt(params.newResolutionTime), offset);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
data.writeUInt8(0, offset); // None
|
|
76
|
+
}
|
|
77
|
+
const keys = [
|
|
78
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
79
|
+
{ pubkey: marketPubkey, isSigner: false, isWritable: true },
|
|
80
|
+
{ pubkey: callerPubkey, isSigner: true, isWritable: false },
|
|
81
|
+
];
|
|
82
|
+
const instruction = new TransactionInstruction({
|
|
83
|
+
programId: PROGRAM_ID,
|
|
84
|
+
keys,
|
|
85
|
+
data,
|
|
86
|
+
});
|
|
87
|
+
const transaction = new Transaction().add(instruction);
|
|
88
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
89
|
+
transaction.recentBlockhash = blockhash;
|
|
90
|
+
transaction.feePayer = callerPubkey;
|
|
91
|
+
return {
|
|
92
|
+
transaction,
|
|
93
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// =============================================================================
|
|
97
|
+
// RACE MARKET MANAGEMENT
|
|
98
|
+
// =============================================================================
|
|
99
|
+
/**
|
|
100
|
+
* Build close_race_market transaction
|
|
101
|
+
*/
|
|
102
|
+
export async function buildCloseRaceMarketTransaction(params) {
|
|
103
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
104
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
105
|
+
const callerPubkey = new PublicKey(params.callerWallet);
|
|
106
|
+
const data = DISCRIMINATORS.close_race_market;
|
|
107
|
+
const keys = [
|
|
108
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
109
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
110
|
+
{ pubkey: callerPubkey, isSigner: true, isWritable: false },
|
|
111
|
+
];
|
|
112
|
+
const instruction = new TransactionInstruction({
|
|
113
|
+
programId: PROGRAM_ID,
|
|
114
|
+
keys,
|
|
115
|
+
data,
|
|
116
|
+
});
|
|
117
|
+
const transaction = new Transaction().add(instruction);
|
|
118
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
119
|
+
transaction.recentBlockhash = blockhash;
|
|
120
|
+
transaction.feePayer = callerPubkey;
|
|
121
|
+
return {
|
|
122
|
+
transaction,
|
|
123
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build extend_race_market transaction
|
|
128
|
+
*/
|
|
129
|
+
export async function buildExtendRaceMarketTransaction(params) {
|
|
130
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
131
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
132
|
+
const callerPubkey = new PublicKey(params.callerWallet);
|
|
133
|
+
const hasResolutionTime = params.newResolutionTime !== undefined;
|
|
134
|
+
const dataSize = 8 + 8 + 1 + (hasResolutionTime ? 8 : 0);
|
|
135
|
+
const data = Buffer.alloc(dataSize);
|
|
136
|
+
let offset = 0;
|
|
137
|
+
DISCRIMINATORS.extend_race_market.copy(data, offset);
|
|
138
|
+
offset += 8;
|
|
139
|
+
data.writeBigInt64LE(BigInt(params.newClosingTime), offset);
|
|
140
|
+
offset += 8;
|
|
141
|
+
if (hasResolutionTime) {
|
|
142
|
+
data.writeUInt8(1, offset); // Some
|
|
143
|
+
offset += 1;
|
|
144
|
+
data.writeBigInt64LE(BigInt(params.newResolutionTime), offset);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
data.writeUInt8(0, offset); // None
|
|
148
|
+
}
|
|
149
|
+
const keys = [
|
|
150
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
151
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
152
|
+
{ pubkey: callerPubkey, isSigner: true, isWritable: false },
|
|
153
|
+
];
|
|
154
|
+
const instruction = new TransactionInstruction({
|
|
155
|
+
programId: PROGRAM_ID,
|
|
156
|
+
keys,
|
|
157
|
+
data,
|
|
158
|
+
});
|
|
159
|
+
const transaction = new Transaction().add(instruction);
|
|
160
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
161
|
+
transaction.recentBlockhash = blockhash;
|
|
162
|
+
transaction.feePayer = callerPubkey;
|
|
163
|
+
return {
|
|
164
|
+
transaction,
|
|
165
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// CANCEL MARKET (ADMIN/CREATOR)
|
|
170
|
+
// =============================================================================
|
|
171
|
+
/**
|
|
172
|
+
* Build cancel_market transaction
|
|
173
|
+
* Cancels a market and allows all bettors to claim refunds.
|
|
174
|
+
* Only callable by admin or creator (depending on market status).
|
|
175
|
+
*/
|
|
176
|
+
export async function buildCancelMarketTransaction(params) {
|
|
177
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
178
|
+
const marketPubkey = new PublicKey(params.marketPda);
|
|
179
|
+
const authorityPubkey = new PublicKey(params.authorityWallet);
|
|
180
|
+
// Instruction data: discriminator + reason (string)
|
|
181
|
+
// String encoding: 4-byte length prefix + UTF-8 bytes
|
|
182
|
+
const reasonBytes = Buffer.from(params.reason, 'utf8');
|
|
183
|
+
const data = Buffer.alloc(8 + 4 + reasonBytes.length);
|
|
184
|
+
DISCRIMINATORS.cancel_market.copy(data, 0);
|
|
185
|
+
data.writeUInt32LE(reasonBytes.length, 8);
|
|
186
|
+
reasonBytes.copy(data, 12);
|
|
187
|
+
const keys = [
|
|
188
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
189
|
+
{ pubkey: marketPubkey, isSigner: false, isWritable: true },
|
|
190
|
+
{ pubkey: authorityPubkey, isSigner: true, isWritable: false },
|
|
191
|
+
];
|
|
192
|
+
const instruction = new TransactionInstruction({
|
|
193
|
+
programId: PROGRAM_ID,
|
|
194
|
+
keys,
|
|
195
|
+
data,
|
|
196
|
+
});
|
|
197
|
+
const transaction = new Transaction().add(instruction);
|
|
198
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
199
|
+
transaction.recentBlockhash = blockhash;
|
|
200
|
+
transaction.feePayer = authorityPubkey;
|
|
201
|
+
return {
|
|
202
|
+
transaction,
|
|
203
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Build cancel_race transaction
|
|
208
|
+
* Cancels a race market and allows all bettors to claim refunds.
|
|
209
|
+
*/
|
|
210
|
+
export async function buildCancelRaceTransaction(params) {
|
|
211
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
212
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
213
|
+
const authorityPubkey = new PublicKey(params.authorityWallet);
|
|
214
|
+
// Instruction data: discriminator + reason (string)
|
|
215
|
+
const reasonBytes = Buffer.from(params.reason, 'utf8');
|
|
216
|
+
const data = Buffer.alloc(8 + 4 + reasonBytes.length);
|
|
217
|
+
DISCRIMINATORS.cancel_race.copy(data, 0);
|
|
218
|
+
data.writeUInt32LE(reasonBytes.length, 8);
|
|
219
|
+
reasonBytes.copy(data, 12);
|
|
220
|
+
const keys = [
|
|
221
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
222
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
223
|
+
{ pubkey: authorityPubkey, isSigner: true, isWritable: false },
|
|
224
|
+
];
|
|
225
|
+
const instruction = new TransactionInstruction({
|
|
226
|
+
programId: PROGRAM_ID,
|
|
227
|
+
keys,
|
|
228
|
+
data,
|
|
229
|
+
});
|
|
230
|
+
const transaction = new Transaction().add(instruction);
|
|
231
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
232
|
+
transaction.recentBlockhash = blockhash;
|
|
233
|
+
transaction.feePayer = authorityPubkey;
|
|
234
|
+
return {
|
|
235
|
+
transaction,
|
|
236
|
+
serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0LW1hbmFnZW1lbnQtdHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGRlcnMvbWFya2V0LW1hbmFnZW1lbnQtdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsV0FBVyxFQUNYLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksR0FDYixNQUFNLGNBQWMsQ0FBQztBQUV0QixnRkFBZ0Y7QUFDaEYsaUJBQWlCO0FBQ2pCLGdGQUFnRjtBQUVoRixNQUFNLGNBQWMsR0FBRztJQUNyQixZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEUsYUFBYSxFQUFFLE1BQU0s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TSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO0lBRXZDLE9BQU87UUFDTCxXQUFXO1FBQ1gsWUFBWSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0tBQ2pILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXJrZXQgTWFuYWdlbWVudCBUcmFuc2FjdGlvbiBCdWlsZGVyc1xuICpcbiAqIEJ1aWxkcyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yOlxuICogLSBDbG9zaW5nIG1hcmtldHMgKHN0b3BwaW5nIGJldHRpbmcpXG4gKiAtIEV4dGVuZGluZyBtYXJrZXQgZGVhZGxpbmVzXG4gKi9cbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIFB1YmxpY0tleSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBDT05GSUdfUERBLFxuICBSUENfRU5EUE9JTlQsXG59IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBESVNDUklNSU5BVE9SU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgRElTQ1JJTUlOQVRPUlMgPSB7XG4gIGNsb3NlX21hcmtldDogQnVmZmVyLmZyb20oWzg4LCAxNTQsIDI0OCwgMTg2LCA0OCwgMTQsIDEyMywgMjQ0XSksXG4gIGNsb3NlX3JhY2VfbWFya2V0OiBCdWZmZXIuZnJvbShbMzksIDE4OSwgMTY2LCAxMTgsIDEzNCwgMzcsIDEwMiwgNDFdKSxcbiAgZXh0ZW5kX21hcmtldDogQnVmZmVyLmZyb20oWzEwNSwgODksIDIwNiwgMjA1LCA1NywgMzEsIDE1MywgMjUyXSksXG4gIGV4dGVuZF9yYWNlX21hcmtldDogQnVmZmVyLmZyb20oWzI0MiwgMTc2LCAyMjcsIDE1MiwgNzksIDExNiwgMTEwLCAxNjhdKSxcbiAgY2FuY2VsX21hcmtldDogQnVmZmVyLmZyb20oWzIwNSwgMTIxLCA4NCwgMjEwLCAyMjIsIDcxLCAxNTAsIDExXSksXG4gIGNhbmNlbF9yYWNlOiBCdWZmZXIuZnJvbShbMjgsIDMxLCAxMTMsIDI5LCAxMjYsIDIwNiwgMzksIDExOV0pLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJPT0xFQU4gTUFSS0VUIE1BTkFHRU1FTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgY2xvc2VfbWFya2V0IHRyYW5zYWN0aW9uXG4gKiBTdG9wcyBiZXR0aW5nIG9uIGEgbWFya2V0ICh1c3VhbGx5IGRvbmUgYnkgY3JlYXRvciBiZWZvcmUgcmVzb2x1dGlvbilcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xvc2VNYXJrZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIGNhbGxlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3QgY2FsbGVyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY2FsbGVyV2FsbGV0KTtcblxuICBjb25zdCBkYXRhID0gRElTQ1JJTUlOQVRPUlMuY2xvc2VfbWFya2V0O1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGV4dGVuZF9tYXJrZXQgdHJhbnNhY3Rpb25cbiAqIEV4dGVuZHMgdGhlIGNsb3NpbmcgdGltZSBhbmQvb3IgcmVzb2x1dGlvbiB0aW1lXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEV4dGVuZE1hcmtldFRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgbmV3Q2xvc2luZ1RpbWU6IG51bWJlcjsgLy8gVW5peCB0aW1lc3RhbXBcbiAgbmV3UmVzb2x1dGlvblRpbWU/OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIChvcHRpb25hbClcbiAgY2FsbGVyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHNlcmlhbGl6ZWRUeDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCBtYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5tYXJrZXRQZGEpO1xuICBjb25zdCBjYWxsZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5jYWxsZXJXYWxsZXQpO1xuXG4gIC8vIEluc3RydWN0aW9uIGRhdGE6IGRpc2NyaW1pbmF0b3IgKyBuZXdfY2xvc2luZ190aW1lIChpNjQpICsgT3B0aW9uPGk2ND4gbmV3X3Jlc29sdXRpb25fdGltZVxuICBjb25zdCBoYXNSZXNvbHV0aW9uVGltZSA9IHBhcmFtcy5uZXdSZXNvbHV0aW9uVGltZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBkYXRhU2l6ZSA9IDggKyA4ICsgMSArIChoYXNSZXNvbHV0aW9uVGltZSA/IDggOiAwKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhkYXRhU2l6ZSk7XG5cbiAgbGV0IG9mZnNldCA9IDA7XG4gIERJU0NSSU1JTkFUT1JTLmV4dGVuZF9tYXJrZXQuY29weShkYXRhLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld0Nsb3NpbmdUaW1lKSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgaWYgKGhhc1Jlc29sdXRpb25UaW1lKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IC8vIFNvbWVcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld1Jlc29sdXRpb25UaW1lISksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDAsIG9mZnNldCk7IC8vIE5vbmVcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkFDRSBNQVJLRVQgTUFOQUdFTUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBjbG9zZV9yYWNlX21hcmtldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbG9zZVJhY2VNYXJrZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICBjYWxsZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgY2FsbGVyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY2FsbGVyV2FsbGV0KTtcblxuICBjb25zdCBkYXRhID0gRElTQ1JJTUlOQVRPUlMuY2xvc2VfcmFjZV9tYXJrZXQ7XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGV4dGVuZF9yYWNlX21hcmtldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFeHRlbmRSYWNlTWFya2V0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbmV3Q2xvc2luZ1RpbWU6IG51bWJlcjsgLy8gVW5peCB0aW1lc3RhbXBcbiAgbmV3UmVzb2x1dGlvblRpbWU/OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIChvcHRpb25hbClcbiAgY2FsbGVyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHNlcmlhbGl6ZWRUeDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gIGNvbnN0IGNhbGxlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmNhbGxlcldhbGxldCk7XG5cbiAgY29uc3QgaGFzUmVzb2x1dGlvblRpbWUgPSBwYXJhbXMubmV3UmVzb2x1dGlvblRpbWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YVNpemUgPSA4ICsgOCArIDEgKyAoaGFzUmVzb2x1dGlvblRpbWUgPyA4IDogMCk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoZGF0YVNpemUpO1xuXG4gIGxldCBvZmZzZXQgPSAwO1xuICBESVNDUklNSU5BVE9SUy5leHRlbmRfcmFjZV9tYXJrZXQuY29weShkYXRhLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld0Nsb3NpbmdUaW1lKSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgaWYgKGhhc1Jlc29sdXRpb25UaW1lKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IC8vIFNvbWVcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld1Jlc29sdXRpb25UaW1lISksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDAsIG9mZnNldCk7IC8vIE5vbmVcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGNhbGxlclB1YmtleSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaW5zdHJ1Y3Rpb24pO1xuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gY2FsbGVyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBTkNFTCBNQVJLRVQgKEFETUlOL0NSRUFUT1IpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIGNhbmNlbF9tYXJrZXQgdHJhbnNhY3Rpb25cbiAqIENhbmNlbHMgYSBtYXJrZXQgYW5kIGFsbG93cyBhbGwgYmV0dG9ycyB0byBjbGFpbSByZWZ1bmRzLlxuICogT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBjcmVhdG9yIChkZXBlbmRpbmcgb24gbWFya2V0IHN0YXR1cykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENhbmNlbE1hcmtldFRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGF1dGhvcml0eVdhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3QgYXV0aG9yaXR5UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYXV0aG9yaXR5V2FsbGV0KTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgcmVhc29uIChzdHJpbmcpXG4gIC8vIFN0cmluZyBlbmNvZGluZzogNC1ieXRlIGxlbmd0aCBwcmVmaXggKyBVVEYtOCBieXRlc1xuICBjb25zdCByZWFzb25CeXRlcyA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5yZWFzb24sICd1dGY4Jyk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCArIDQgKyByZWFzb25CeXRlcy5sZW5ndGgpO1xuICBESVNDUklNSU5BVE9SUy5jYW5jZWxfbWFya2V0LmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50MzJMRShyZWFzb25CeXRlcy5sZW5ndGgsIDgpO1xuICByZWFzb25CeXRlcy5jb3B5KGRhdGEsIDEyKTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGF1dGhvcml0eVB1YmtleSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaW5zdHJ1Y3Rpb24pO1xuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gYXV0aG9yaXR5UHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjYW5jZWxfcmFjZSB0cmFuc2FjdGlvblxuICogQ2FuY2VscyBhIHJhY2UgbWFya2V0IGFuZCBhbGxvd3MgYWxsIGJldHRvcnMgdG8gY2xhaW0gcmVmdW5kcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2FuY2VsUmFjZVRyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBhdXRob3JpdHlXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgYXV0aG9yaXR5UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYXV0aG9yaXR5V2FsbGV0KTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgcmVhc29uIChzdHJpbmcpXG4gIGNvbnN0IHJlYXNvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnJlYXNvbiwgJ3V0ZjgnKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4ICsgNCArIHJlYXNvbkJ5dGVzLmxlbmd0aCk7XG4gIERJU0NSSU1JTkFUT1JTLmNhbmNlbF9yYWNlLmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50MzJMRShyZWFzb25CeXRlcy5sZW5ndGgsIDgpO1xuICByZWFzb25CeXRlcy5jb3B5KGRhdGEsIDEyKTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBhdXRob3JpdHlQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGF1dGhvcml0eVB1YmtleTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogdHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Race Market Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - Placing bets on race (multi-outcome) markets
|
|
6
|
+
* - Claiming race winnings
|
|
7
|
+
* - Claiming race refunds
|
|
8
|
+
*/
|
|
9
|
+
import { Connection, Transaction } from '@solana/web3.js';
|
|
10
|
+
export interface RaceBetTransactionResult {
|
|
11
|
+
transaction: Transaction;
|
|
12
|
+
serializedTx: string;
|
|
13
|
+
positionPda: string;
|
|
14
|
+
marketId: bigint;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build bet_on_race_outcome_sol transaction
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildRaceBetTransaction(params: {
|
|
20
|
+
raceMarketPda: string;
|
|
21
|
+
marketId: bigint;
|
|
22
|
+
outcomeIndex: number;
|
|
23
|
+
amountSol: number;
|
|
24
|
+
userWallet: string;
|
|
25
|
+
whitelistRequired?: boolean;
|
|
26
|
+
affiliatePda?: string;
|
|
27
|
+
connection?: Connection;
|
|
28
|
+
}): Promise<RaceBetTransactionResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch race market data and build bet transaction
|
|
31
|
+
*/
|
|
32
|
+
export declare function fetchAndBuildRaceBetTransaction(params: {
|
|
33
|
+
raceMarketPda: string;
|
|
34
|
+
outcomeIndex: number;
|
|
35
|
+
amountSol: number;
|
|
36
|
+
userWallet: string;
|
|
37
|
+
affiliatePda?: string;
|
|
38
|
+
connection?: Connection;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
transaction: RaceBetTransactionResult | null;
|
|
41
|
+
marketId: bigint;
|
|
42
|
+
error?: string;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Build claim_race_winnings_sol transaction
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildClaimRaceWinningsTransaction(params: {
|
|
48
|
+
raceMarketPda: string;
|
|
49
|
+
positionPda: string;
|
|
50
|
+
userWallet: string;
|
|
51
|
+
connection?: Connection;
|
|
52
|
+
}): Promise<{
|
|
53
|
+
transaction: Transaction;
|
|
54
|
+
serializedTx: string;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Build claim_race_refund transaction
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildClaimRaceRefundTransaction(params: {
|
|
60
|
+
raceMarketPda: string;
|
|
61
|
+
positionPda: string;
|
|
62
|
+
userWallet: string;
|
|
63
|
+
connection?: Connection;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
transaction: Transaction;
|
|
66
|
+
serializedTx: string;
|
|
67
|
+
}>;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Race Market Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - Placing bets on race (multi-outcome) markets
|
|
6
|
+
* - Claiming race winnings
|
|
7
|
+
* - Claiming race refunds
|
|
8
|
+
*/
|
|
9
|
+
import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
|
|
10
|
+
import { PROGRAM_ID, CONFIG_PDA, SOL_TREASURY_PDA, SEEDS, RPC_ENDPOINT, solToLamports, } from '../config.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// INSTRUCTION DISCRIMINATORS
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Correct discriminators: sha256("global:<instruction_name>")[0..8]
|
|
15
|
+
const BET_ON_RACE_SOL_DISCRIMINATOR = Buffer.from([195, 181, 151, 159, 105, 100, 234, 244]);
|
|
16
|
+
const BET_ON_RACE_SOL_WITH_AFFILIATE_DISCRIMINATOR = Buffer.from([26, 224, 14, 181, 67, 52, 24, 0]);
|
|
17
|
+
const CLAIM_RACE_WINNINGS_SOL_DISCRIMINATOR = Buffer.from([46, 120, 202, 194, 126, 72, 22, 52]);
|
|
18
|
+
const CLAIM_RACE_REFUND_DISCRIMINATOR = Buffer.from([174, 101, 101, 227, 171, 69, 173, 243]);
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// RACE POSITION PDA
|
|
21
|
+
// =============================================================================
|
|
22
|
+
function deriveRacePositionPda(marketId, user) {
|
|
23
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
24
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
25
|
+
const [pda] = PublicKey.findProgramAddressSync([SEEDS.RACE_POSITION, marketIdBuffer, user.toBuffer()], PROGRAM_ID);
|
|
26
|
+
return pda;
|
|
27
|
+
}
|
|
28
|
+
function deriveRaceWhitelistPda(raceMarketPda) {
|
|
29
|
+
const [pda] = PublicKey.findProgramAddressSync([SEEDS.RACE_WHITELIST, raceMarketPda.toBuffer()], PROGRAM_ID);
|
|
30
|
+
return pda;
|
|
31
|
+
}
|
|
32
|
+
function deriveRaceReferralPda(user) {
|
|
33
|
+
const [pda] = PublicKey.findProgramAddressSync([Buffer.from('race_referral'), user.toBuffer()], PROGRAM_ID);
|
|
34
|
+
return pda;
|
|
35
|
+
}
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// BET ON RACE OUTCOME
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Build bet_on_race_outcome_sol transaction
|
|
41
|
+
*/
|
|
42
|
+
export async function buildRaceBetTransaction(params) {
|
|
43
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
44
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
45
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
46
|
+
// Derive position PDA
|
|
47
|
+
const positionPda = deriveRacePositionPda(params.marketId, userPubkey);
|
|
48
|
+
// Optional whitelist PDA
|
|
49
|
+
const whitelistPda = params.whitelistRequired
|
|
50
|
+
? deriveRaceWhitelistPda(raceMarketPubkey)
|
|
51
|
+
: null;
|
|
52
|
+
// Amount in lamports
|
|
53
|
+
const amountLamports = solToLamports(params.amountSol);
|
|
54
|
+
let instruction;
|
|
55
|
+
if (params.affiliatePda) {
|
|
56
|
+
// With affiliate
|
|
57
|
+
const affiliatePubkey = new PublicKey(params.affiliatePda);
|
|
58
|
+
const raceReferralPda = deriveRaceReferralPda(userPubkey);
|
|
59
|
+
// Instruction data: discriminator + outcome_index (u8) + amount (u64)
|
|
60
|
+
const data = Buffer.alloc(17);
|
|
61
|
+
BET_ON_RACE_SOL_WITH_AFFILIATE_DISCRIMINATOR.copy(data, 0);
|
|
62
|
+
data.writeUInt8(params.outcomeIndex, 8);
|
|
63
|
+
data.writeBigUInt64LE(amountLamports, 9);
|
|
64
|
+
const keys = [
|
|
65
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
66
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
67
|
+
{ pubkey: positionPda, isSigner: false, isWritable: true },
|
|
68
|
+
{ pubkey: affiliatePubkey, isSigner: false, isWritable: true },
|
|
69
|
+
{ pubkey: raceReferralPda, isSigner: false, isWritable: true },
|
|
70
|
+
];
|
|
71
|
+
if (whitelistPda) {
|
|
72
|
+
keys.push({ pubkey: whitelistPda, isSigner: false, isWritable: false });
|
|
73
|
+
}
|
|
74
|
+
keys.push({ pubkey: userPubkey, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
|
|
75
|
+
instruction = new TransactionInstruction({
|
|
76
|
+
programId: PROGRAM_ID,
|
|
77
|
+
keys,
|
|
78
|
+
data,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Without affiliate
|
|
83
|
+
const data = Buffer.alloc(17);
|
|
84
|
+
BET_ON_RACE_SOL_DISCRIMINATOR.copy(data, 0);
|
|
85
|
+
data.writeUInt8(params.outcomeIndex, 8);
|
|
86
|
+
data.writeBigUInt64LE(amountLamports, 9);
|
|
87
|
+
const keys = [
|
|
88
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
89
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
90
|
+
{ pubkey: positionPda, isSigner: false, isWritable: true },
|
|
91
|
+
];
|
|
92
|
+
if (whitelistPda) {
|
|
93
|
+
keys.push({ pubkey: whitelistPda, isSigner: false, isWritable: false });
|
|
94
|
+
}
|
|
95
|
+
keys.push({ pubkey: userPubkey, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
|
|
96
|
+
instruction = new TransactionInstruction({
|
|
97
|
+
programId: PROGRAM_ID,
|
|
98
|
+
keys,
|
|
99
|
+
data,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const transaction = new Transaction();
|
|
103
|
+
transaction.add(instruction);
|
|
104
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
105
|
+
transaction.recentBlockhash = blockhash;
|
|
106
|
+
transaction.feePayer = userPubkey;
|
|
107
|
+
const serializedTx = transaction.serialize({
|
|
108
|
+
requireAllSignatures: false,
|
|
109
|
+
verifySignatures: false,
|
|
110
|
+
}).toString('base64');
|
|
111
|
+
return {
|
|
112
|
+
transaction,
|
|
113
|
+
serializedTx,
|
|
114
|
+
positionPda: positionPda.toBase58(),
|
|
115
|
+
marketId: params.marketId,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// =============================================================================
|
|
119
|
+
// FETCH AND BUILD RACE BET
|
|
120
|
+
// =============================================================================
|
|
121
|
+
/**
|
|
122
|
+
* Fetch race market data and build bet transaction
|
|
123
|
+
*/
|
|
124
|
+
export async function fetchAndBuildRaceBetTransaction(params) {
|
|
125
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
126
|
+
try {
|
|
127
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
128
|
+
const accountInfo = await conn.getAccountInfo(raceMarketPubkey);
|
|
129
|
+
if (!accountInfo) {
|
|
130
|
+
return {
|
|
131
|
+
transaction: null,
|
|
132
|
+
marketId: 0n,
|
|
133
|
+
error: 'Race market not found',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const data = accountInfo.data;
|
|
137
|
+
// Extract market_id (first field after discriminator)
|
|
138
|
+
const marketId = data.readBigUInt64LE(8);
|
|
139
|
+
// Check access_gate (need to navigate through struct)
|
|
140
|
+
// For now, assume public
|
|
141
|
+
const whitelistRequired = false;
|
|
142
|
+
const result = await buildRaceBetTransaction({
|
|
143
|
+
raceMarketPda: params.raceMarketPda,
|
|
144
|
+
marketId,
|
|
145
|
+
outcomeIndex: params.outcomeIndex,
|
|
146
|
+
amountSol: params.amountSol,
|
|
147
|
+
userWallet: params.userWallet,
|
|
148
|
+
whitelistRequired,
|
|
149
|
+
affiliatePda: params.affiliatePda,
|
|
150
|
+
connection: conn,
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
transaction: result,
|
|
154
|
+
marketId,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return {
|
|
159
|
+
transaction: null,
|
|
160
|
+
marketId: 0n,
|
|
161
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// =============================================================================
|
|
166
|
+
// CLAIM RACE WINNINGS
|
|
167
|
+
// =============================================================================
|
|
168
|
+
/**
|
|
169
|
+
* Build claim_race_winnings_sol transaction
|
|
170
|
+
*/
|
|
171
|
+
export async function buildClaimRaceWinningsTransaction(params) {
|
|
172
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
173
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
174
|
+
const positionPubkey = new PublicKey(params.positionPda);
|
|
175
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
176
|
+
const data = CLAIM_RACE_WINNINGS_SOL_DISCRIMINATOR;
|
|
177
|
+
const keys = [
|
|
178
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
179
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
180
|
+
{ pubkey: positionPubkey, isSigner: false, isWritable: true },
|
|
181
|
+
{ pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
|
|
182
|
+
{ pubkey: userPubkey, isSigner: true, isWritable: true },
|
|
183
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
184
|
+
];
|
|
185
|
+
const instruction = new TransactionInstruction({
|
|
186
|
+
programId: PROGRAM_ID,
|
|
187
|
+
keys,
|
|
188
|
+
data,
|
|
189
|
+
});
|
|
190
|
+
const transaction = new Transaction();
|
|
191
|
+
transaction.add(instruction);
|
|
192
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
193
|
+
transaction.recentBlockhash = blockhash;
|
|
194
|
+
transaction.feePayer = userPubkey;
|
|
195
|
+
const serializedTx = transaction.serialize({
|
|
196
|
+
requireAllSignatures: false,
|
|
197
|
+
verifySignatures: false,
|
|
198
|
+
}).toString('base64');
|
|
199
|
+
return {
|
|
200
|
+
transaction,
|
|
201
|
+
serializedTx,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// CLAIM RACE REFUND
|
|
206
|
+
// =============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Build claim_race_refund transaction
|
|
209
|
+
*/
|
|
210
|
+
export async function buildClaimRaceRefundTransaction(params) {
|
|
211
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
212
|
+
const raceMarketPubkey = new PublicKey(params.raceMarketPda);
|
|
213
|
+
const positionPubkey = new PublicKey(params.positionPda);
|
|
214
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
215
|
+
const data = CLAIM_RACE_REFUND_DISCRIMINATOR;
|
|
216
|
+
// IDL Accounts: race_market, position, user, system_program (NO config!)
|
|
217
|
+
const keys = [
|
|
218
|
+
{ pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
|
|
219
|
+
{ pubkey: positionPubkey, isSigner: false, isWritable: true },
|
|
220
|
+
{ pubkey: userPubkey, isSigner: true, isWritable: true },
|
|
221
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
222
|
+
];
|
|
223
|
+
const instruction = new TransactionInstruction({
|
|
224
|
+
programId: PROGRAM_ID,
|
|
225
|
+
keys,
|
|
226
|
+
data,
|
|
227
|
+
});
|
|
228
|
+
const transaction = new Transaction();
|
|
229
|
+
transaction.add(instruction);
|
|
230
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
231
|
+
transaction.recentBlockhash = blockhash;
|
|
232
|
+
transaction.feePayer = userPubkey;
|
|
233
|
+
const serializedTx = transaction.serialize({
|
|
234
|
+
requireAllSignatures: false,
|
|
235
|
+
verifySignatures: false,
|
|
236
|
+
}).toString('base64');
|
|
237
|
+
return {
|
|
238
|
+
transaction,
|
|
239
|
+
serializedTx,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFjZS10cmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVycy9yYWNlLXRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsWUFBWSxFQUNaLGFBQWEsR0FDZCxNQUFNLGNBQWMsQ0FBQztBQUV0QixnRkFBZ0Y7QUFDaEYsNkJBQTZCO0FBQzdCLGdGQUFnRjtBQUVoRixvRUFBb0U7QUFDcEUsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUYsTUFBTSw0Q0FBNEMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxxQ0FBcUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEcsTUFBTSwrQkFBK0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVB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QUFJO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN0QyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxXQUFXLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxXQUFXLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUVsQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ3pDLG9CQUFvQixFQUFFLEtBQUs7UUFDM0IsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXRCLE9BQU87UUFDTCxXQUFXO1FBQ1gsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYWNlIE1hcmtldCBUcmFuc2FjdGlvbiBCdWlsZGVyc1xuICpcbiAqIEJ1aWxkcyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yOlxuICogLSBQbGFjaW5nIGJldHMgb24gcmFjZSAobXVsdGktb3V0Y29tZSkgbWFya2V0c1xuICogLSBDbGFpbWluZyByYWNlIHdpbm5pbmdzXG4gKiAtIENsYWltaW5nIHJhY2UgcmVmdW5kc1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU09MX1RSRUFTVVJZX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbiAgc29sVG9MYW1wb3J0cyxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb3JyZWN0IGRpc2NyaW1pbmF0b3JzOiBzaGEyNTYoXCJnbG9iYWw6PGluc3RydWN0aW9uX25hbWU+XCIpWzAuLjhdXG5jb25zdCBCRVRfT05fUkFDRV9TT0xfRElTQ1JJTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFsxOTUsIDE4MSwgMTUxLCAxNTksIDEwNSwgMTAwLCAyMzQsIDI0NF0pO1xuY29uc3QgQkVUX09OX1JBQ0VfU09MX1dJVEhfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMjYsIDIyNCwgMTQsIDE4MSwgNjcsIDUyLCAyNCwgMF0pO1xuY29uc3QgQ0xBSU1fUkFDRV9XSU5OSU5HU19TT0xfRElTQ1JJTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFs0NiwgMTIwLCAyMDIsIDE5NCwgMTI2LCA3MiwgMjIsIDUyXSk7XG5jb25zdCBDTEFJTV9SQUNFX1JFRlVORF9ESVNDUklNSU5BVE9SID0gQnVmZmVyLmZyb20oWzE3NCwgMTAxLCAxMDEsIDIyNywgMTcxLCA2OSwgMTczLCAyNDNdKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgc2VyaWFsaXplZFR4OiBzdHJpbmc7XG4gIHBvc2l0aW9uUGRhOiBzdHJpbmc7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSQUNFIFBPU0lUSU9OIFBEQVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZGVyaXZlUmFjZVBvc2l0aW9uUGRhKG1hcmtldElkOiBiaWdpbnQsIHVzZXI6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUkFDRV9QT1NJVElPTiwgbWFya2V0SWRCdWZmZXIsIHVzZXIudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVSYWNlV2hpdGVsaXN0UGRhKHJhY2VNYXJrZXRQZGE6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IFtwZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLlJBQ0VfV0hJVEVMSVNULCByYWNlTWFya2V0UGRhLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbiAgcmV0dXJuIHBkYTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlUmFjZVJlZmVycmFsUGRhKHVzZXI6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IFtwZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW0J1ZmZlci5mcm9tKCdyYWNlX3JlZmVycmFsJyksIHVzZXIudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQkVUIE9OIFJBQ0UgT1VUQ09NRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBiZXRfb25fcmFjZV9vdXRjb21lX3NvbCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRSYWNlQmV0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0SWQ6IGJpZ2ludDtcbiAgb3V0Y29tZUluZGV4OiBudW1iZXI7XG4gIGFtb3VudFNvbDogbnVtYmVyO1xuICB1c2VyV2FsbGV0OiBzdHJpbmc7XG4gIHdoaXRlbGlzdFJlcXVpcmVkPzogYm9vbGVhbjtcbiAgYWZmaWxpYXRlUGRhPzogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgdXNlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnVzZXJXYWxsZXQpO1xuXG4gIC8vIERlcml2ZSBwb3NpdGlvbiBQREFcbiAgY29uc3QgcG9zaXRpb25QZGEgPSBkZXJpdmVSYWNlUG9zaXRpb25QZGEocGFyYW1zLm1hcmtldElkLCB1c2VyUHVia2V5KTtcblxuICAvLyBPcHRpb25hbCB3aGl0ZWxpc3QgUERBXG4gIGNvbnN0IHdoaXRlbGlzdFBkYSA9IHBhcmFtcy53aGl0ZWxpc3RSZXF1aXJlZFxuICAgID8gZGVyaXZlUmFjZVdoaXRlbGlzdFBkYShyYWNlTWFya2V0UHVia2V5KVxuICAgIDogbnVsbDtcblxuICAvLyBBbW91bnQgaW4gbGFtcG9ydHNcbiAgY29uc3QgYW1vdW50TGFtcG9ydHMgPSBzb2xUb0xhbXBvcnRzKHBhcmFtcy5hbW91bnRTb2wpO1xuXG4gIGxldCBpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcblxuICBpZiAocGFyYW1zLmFmZmlsaWF0ZVBkYSkge1xuICAgIC8vIFdpdGggYWZmaWxpYXRlXG4gICAgY29uc3QgYWZmaWxpYXRlUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYWZmaWxpYXRlUGRhKTtcbiAgICBjb25zdCByYWNlUmVmZXJyYWxQZGEgPSBkZXJpdmVSYWNlUmVmZXJyYWxQZGEodXNlclB1YmtleSk7XG5cbiAgICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgb3V0Y29tZV9pbmRleCAodTgpICsgYW1vdW50ICh1NjQpXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxNyk7XG4gICAgQkVUX09OX1JBQ0VfU09MX1dJVEhfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCAwKTtcbiAgICBkYXRhLndyaXRlVUludDgocGFyYW1zLm91dGNvbWVJbmRleCwgOCk7XG4gICAgZGF0YS53cml0ZUJpZ1VJbnQ2NExFKGFtb3VudExhbXBvcnRzLCA5KTtcblxuICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHBvc2l0aW9uUGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBhZmZpbGlhdGVQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHJhY2VSZWZlcnJhbFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGlmICh3aGl0ZWxpc3RQZGEpIHtcbiAgICAgIGtleXMucHVzaCh7IHB1YmtleTogd2hpdGVsaXN0UGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaChcbiAgICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAgICBrZXlzLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXaXRob3V0IGFmZmlsaWF0ZVxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTcpO1xuICAgIEJFVF9PTl9SQUNFX1NPTF9ESVNDUklNSU5BVE9SLmNvcHkoZGF0YSwgMCk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHBhcmFtcy5vdXRjb21lSW5kZXgsIDgpO1xuICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShhbW91bnRMYW1wb3J0cywgOSk7XG5cbiAgICBjb25zdCBrZXlzID0gW1xuICAgICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBwb3NpdGlvblBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGlmICh3aGl0ZWxpc3RQZGEpIHtcbiAgICAgIGtleXMucHVzaCh7IHB1YmtleTogd2hpdGVsaXN0UGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaChcbiAgICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAgICBrZXlzLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHVzZXJQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBwb3NpdGlvblBkYTogcG9zaXRpb25QZGEudG9CYXNlNTgoKSxcbiAgICBtYXJrZXRJZDogcGFyYW1zLm1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRkVUQ0ggQU5EIEJVSUxEIFJBQ0UgQkVUXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZldGNoIHJhY2UgbWFya2V0IGRhdGEgYW5kIGJ1aWxkIGJldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmRCdWlsZFJhY2VCZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICBvdXRjb21lSW5kZXg6IG51bWJlcjtcbiAgYW1vdW50U29sOiBudW1iZXI7XG4gIHVzZXJXYWxsZXQ6IHN0cmluZztcbiAgYWZmaWxpYXRlUGRhPzogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHtcbiAgdHJhbnNhY3Rpb246IFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdCB8IG51bGw7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG4gIGVycm9yPzogc3RyaW5nO1xufT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gICAgY29uc3QgYWNjb3VudEluZm8gPSBhd2FpdCBjb25uLmdldEFjY291bnRJbmZvKHJhY2VNYXJrZXRQdWJrZXkpO1xuXG4gICAgaWYgKCFhY2NvdW50SW5mbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNhY3Rpb246IG51bGwsXG4gICAgICAgIG1hcmtldElkOiAwbixcbiAgICAgICAgZXJyb3I6ICdSYWNlIG1hcmtldCBub3QgZm91bmQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYWNjb3VudEluZm8uZGF0YTtcblxuICAgIC8vIEV4dHJhY3QgbWFya2V0X2lkIChmaXJzdCBmaWVsZCBhZnRlciBkaXNjcmltaW5hdG9yKVxuICAgIGNvbnN0IG1hcmtldElkID0gZGF0YS5yZWFkQmlnVUludDY0TEUoOCk7XG5cbiAgICAvLyBDaGVjayBhY2Nlc3NfZ2F0ZSAobmVlZCB0byBuYXZpZ2F0ZSB0aHJvdWdoIHN0cnVjdClcbiAgICAvLyBGb3Igbm93LCBhc3N1bWUgcHVibGljXG4gICAgY29uc3Qgd2hpdGVsaXN0UmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkUmFjZUJldFRyYW5zYWN0aW9uKHtcbiAgICAgIHJhY2VNYXJrZXRQZGE6IHBhcmFtcy5yYWNlTWFya2V0UGRhLFxuICAgICAgbWFya2V0SWQsXG4gICAgICBvdXRjb21lSW5kZXg6IHBhcmFtcy5vdXRjb21lSW5kZXgsXG4gICAgICBhbW91bnRTb2w6IHBhcmFtcy5hbW91bnRTb2wsXG4gICAgICB1c2VyV2FsbGV0OiBwYXJhbXMudXNlcldhbGxldCxcbiAgICAgIHdoaXRlbGlzdFJlcXVpcmVkLFxuICAgICAgYWZmaWxpYXRlUGRhOiBwYXJhbXMuYWZmaWxpYXRlUGRhLFxuICAgICAgY29ubmVjdGlvbjogY29ubixcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogcmVzdWx0LFxuICAgICAgbWFya2V0SWQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uOiBudWxsLFxuICAgICAgbWFya2V0SWQ6IDBuLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgfTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0xBSU0gUkFDRSBXSU5OSU5HU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBjbGFpbV9yYWNlX3dpbm5pbmdzX3NvbCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGFpbVJhY2VXaW5uaW5nc1RyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHBvc2l0aW9uUGRhOiBzdHJpbmc7XG4gIHVzZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgc2VyaWFsaXplZFR4OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgcmFjZU1hcmtldFB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnJhY2VNYXJrZXRQZGEpO1xuICBjb25zdCBwb3NpdGlvblB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnBvc2l0aW9uUGRhKTtcbiAgY29uc3QgdXNlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnVzZXJXYWxsZXQpO1xuXG4gIGNvbnN0IGRhdGEgPSBDTEFJTV9SQUNFX1dJTk5JTkdTX1NPTF9ESVNDUklNSU5BVE9SO1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHBvc2l0aW9uUHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogU09MX1RSRUFTVVJZX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHVzZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gdXNlclB1YmtleTtcblxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0xBSU0gUkFDRSBSRUZVTkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgY2xhaW1fcmFjZV9yZWZ1bmQgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xhaW1SYWNlUmVmdW5kVHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgcG9zaXRpb25QZGE6IHN0cmluZztcbiAgdXNlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gIGNvbnN0IHBvc2l0aW9uUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucG9zaXRpb25QZGEpO1xuICBjb25zdCB1c2VyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMudXNlcldhbGxldCk7XG5cbiAgY29uc3QgZGF0YSA9IENMQUlNX1JBQ0VfUkVGVU5EX0RJU0NSSU1JTkFUT1I7XG5cbiAgLy8gSURMIEFjY291bnRzOiByYWNlX21hcmtldCwgcG9zaXRpb24sIHVzZXIsIHN5c3RlbV9wcm9ncmFtIChOTyBjb25maWchKVxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcG9zaXRpb25QdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHVzZXJQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgfTtcbn1cbiJdfQ==
|