@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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Affiliate Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - Registering as an affiliate
|
|
6
|
+
* - Toggling affiliate active status
|
|
7
|
+
*/
|
|
8
|
+
import { Connection, Transaction } from '@solana/web3.js';
|
|
9
|
+
export interface RegisterAffiliateResult {
|
|
10
|
+
transaction: Transaction;
|
|
11
|
+
serializedTx: string;
|
|
12
|
+
affiliatePda: string;
|
|
13
|
+
code: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build register_affiliate transaction
|
|
17
|
+
*
|
|
18
|
+
* Registers a new affiliate with a unique code.
|
|
19
|
+
* The code must be 3-16 alphanumeric characters.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildRegisterAffiliateTransaction(params: {
|
|
22
|
+
code: string;
|
|
23
|
+
userWallet: string;
|
|
24
|
+
connection?: Connection;
|
|
25
|
+
}): Promise<RegisterAffiliateResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Build toggle_affiliate transaction
|
|
28
|
+
*
|
|
29
|
+
* Toggles an affiliate's active status (active/inactive).
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildToggleAffiliateTransaction(params: {
|
|
32
|
+
code: string;
|
|
33
|
+
active: boolean;
|
|
34
|
+
userWallet: string;
|
|
35
|
+
connection?: Connection;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
transaction: Transaction;
|
|
38
|
+
serializedTx: string;
|
|
39
|
+
affiliatePda: string;
|
|
40
|
+
newStatus: boolean;
|
|
41
|
+
}>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Affiliate Transaction Builders
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for:
|
|
5
|
+
* - Registering as an affiliate
|
|
6
|
+
* - Toggling affiliate active status
|
|
7
|
+
*/
|
|
8
|
+
import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
|
|
9
|
+
import { PROGRAM_ID, CONFIG_PDA, SEEDS, RPC_ENDPOINT, } from '../config.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// INSTRUCTION DISCRIMINATORS
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Correct discriminators: sha256("global:<instruction_name>")[0..8]
|
|
14
|
+
const REGISTER_AFFILIATE_DISCRIMINATOR = Buffer.from([87, 121, 99, 184, 126, 63, 103, 217]);
|
|
15
|
+
const TOGGLE_AFFILIATE_DISCRIMINATOR = Buffer.from([47, 161, 133, 19, 172, 44, 43, 194]);
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// REGISTER AFFILIATE
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Build register_affiliate transaction
|
|
21
|
+
*
|
|
22
|
+
* Registers a new affiliate with a unique code.
|
|
23
|
+
* The code must be 3-16 alphanumeric characters.
|
|
24
|
+
*/
|
|
25
|
+
export async function buildRegisterAffiliateTransaction(params) {
|
|
26
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
27
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
28
|
+
// Validate code
|
|
29
|
+
if (!isValidCode(params.code)) {
|
|
30
|
+
throw new Error('Invalid affiliate code. Must be 3-16 alphanumeric characters.');
|
|
31
|
+
}
|
|
32
|
+
// Derive affiliate PDA
|
|
33
|
+
const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(params.code)], PROGRAM_ID);
|
|
34
|
+
// Instruction data: discriminator + code (as string)
|
|
35
|
+
// String encoding: 4-byte length prefix + UTF-8 bytes
|
|
36
|
+
const codeBytes = Buffer.from(params.code, 'utf8');
|
|
37
|
+
const data = Buffer.alloc(8 + 4 + codeBytes.length);
|
|
38
|
+
REGISTER_AFFILIATE_DISCRIMINATOR.copy(data, 0);
|
|
39
|
+
data.writeUInt32LE(codeBytes.length, 8);
|
|
40
|
+
codeBytes.copy(data, 12);
|
|
41
|
+
// Accounts for register_affiliate:
|
|
42
|
+
// config, affiliate, owner, system_program
|
|
43
|
+
const keys = [
|
|
44
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
45
|
+
{ pubkey: affiliatePda, isSigner: false, isWritable: true },
|
|
46
|
+
{ pubkey: userPubkey, isSigner: true, isWritable: true },
|
|
47
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
48
|
+
];
|
|
49
|
+
const instruction = new TransactionInstruction({
|
|
50
|
+
programId: PROGRAM_ID,
|
|
51
|
+
keys,
|
|
52
|
+
data,
|
|
53
|
+
});
|
|
54
|
+
const transaction = new Transaction();
|
|
55
|
+
transaction.add(instruction);
|
|
56
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
57
|
+
transaction.recentBlockhash = blockhash;
|
|
58
|
+
transaction.feePayer = userPubkey;
|
|
59
|
+
const serializedTx = transaction.serialize({
|
|
60
|
+
requireAllSignatures: false,
|
|
61
|
+
verifySignatures: false,
|
|
62
|
+
}).toString('base64');
|
|
63
|
+
return {
|
|
64
|
+
transaction,
|
|
65
|
+
serializedTx,
|
|
66
|
+
affiliatePda: affiliatePda.toBase58(),
|
|
67
|
+
code: params.code,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// TOGGLE AFFILIATE
|
|
72
|
+
// =============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Build toggle_affiliate transaction
|
|
75
|
+
*
|
|
76
|
+
* Toggles an affiliate's active status (active/inactive).
|
|
77
|
+
*/
|
|
78
|
+
export async function buildToggleAffiliateTransaction(params) {
|
|
79
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
80
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
81
|
+
// Derive affiliate PDA
|
|
82
|
+
const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(params.code)], PROGRAM_ID);
|
|
83
|
+
// Instruction data: discriminator + is_active (bool)
|
|
84
|
+
const data = Buffer.alloc(9);
|
|
85
|
+
TOGGLE_AFFILIATE_DISCRIMINATOR.copy(data, 0);
|
|
86
|
+
data.writeUInt8(params.active ? 1 : 0, 8);
|
|
87
|
+
// Accounts for toggle_affiliate:
|
|
88
|
+
// config, affiliate, owner
|
|
89
|
+
const keys = [
|
|
90
|
+
{ pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
|
|
91
|
+
{ pubkey: affiliatePda, isSigner: false, isWritable: true },
|
|
92
|
+
{ pubkey: userPubkey, isSigner: true, isWritable: false },
|
|
93
|
+
];
|
|
94
|
+
const instruction = new TransactionInstruction({
|
|
95
|
+
programId: PROGRAM_ID,
|
|
96
|
+
keys,
|
|
97
|
+
data,
|
|
98
|
+
});
|
|
99
|
+
const transaction = new Transaction();
|
|
100
|
+
transaction.add(instruction);
|
|
101
|
+
const { blockhash } = await conn.getLatestBlockhash('finalized');
|
|
102
|
+
transaction.recentBlockhash = blockhash;
|
|
103
|
+
transaction.feePayer = userPubkey;
|
|
104
|
+
const serializedTx = transaction.serialize({
|
|
105
|
+
requireAllSignatures: false,
|
|
106
|
+
verifySignatures: false,
|
|
107
|
+
}).toString('base64');
|
|
108
|
+
return {
|
|
109
|
+
transaction,
|
|
110
|
+
serializedTx,
|
|
111
|
+
affiliatePda: affiliatePda.toBase58(),
|
|
112
|
+
newStatus: params.active,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// =============================================================================
|
|
116
|
+
// HELPERS
|
|
117
|
+
// =============================================================================
|
|
118
|
+
function isValidCode(code) {
|
|
119
|
+
if (code.length < 3 || code.length > 16)
|
|
120
|
+
return false;
|
|
121
|
+
return /^[a-zA-Z0-9_]+$/.test(code);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLXRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXJzL2FmZmlsaWF0ZS10cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxjQUFjLENBQUM7QUFFdEIsZ0ZBQWdGO0FBQ2hGLDZCQUE2QjtBQUM3QixnRkFBZ0Y7QUFFaEYsb0VBQW9FO0FBQ3BFLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVGLE1BQU0sOEJBQThCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBYXpGLGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxNQUl2RDtJQUNDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVwRCxnQkFBZ0I7SUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUNyRCxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDM0MsVUFBVSxDQUNYLENBQUM7SUFFRixxREFBcUQ7SUFDckQsc0RBQXNEO0lBQ3RELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELGdDQUFnQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXpCLG1DQUFtQztJQUNuQywyQ0FBMkM7SUFDM0MsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO1FBQzFELEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDM0QsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUN4RCxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtLQUN4RSxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsVUFBVTtRQUNyQixJQUFJO1FBQ0osSUFBSTtLQUNMLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU3QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakUsV0FBVyxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDeEMsV0FBVyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFFbEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN6QyxvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0QixPQUFPO1FBQ0wsV0FBVztRQUNYLFlBQVk7UUFDWixZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUNyQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwrQkFBK0IsQ0FBQyxNQUtyRDtJQU1DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVwRCx1QkFBdUI7SUFDdkIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDckQsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzNDLFVBQVUsQ0FDWCxDQUFDO0lBRUYscURBQXFEO0lBQ3JELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsOEJBQThCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLGlDQUFpQztJQUNqQywyQkFBMkI7SUFDM0IsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO1FBQzFELEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDM0QsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtLQUMxRCxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQztRQUM3QyxTQUFTLEVBQUUsVUFBVTtRQUNyQixJQUFJO1FBQ0osSUFBSTtLQUNMLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU3QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakUsV0FBVyxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDeEMsV0FBVyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFFbEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN6QyxvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0QixPQUFPO1FBQ0wsV0FBVztRQUNYLFlBQVk7UUFDWixZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUNyQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDekIsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsVUFBVTtBQUNWLGdGQUFnRjtBQUVoRixTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWZmaWxpYXRlIFRyYW5zYWN0aW9uIEJ1aWxkZXJzXG4gKlxuICogQnVpbGRzIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3I6XG4gKiAtIFJlZ2lzdGVyaW5nIGFzIGFuIGFmZmlsaWF0ZVxuICogLSBUb2dnbGluZyBhZmZpbGlhdGUgYWN0aXZlIHN0YXR1c1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb3JyZWN0IGRpc2NyaW1pbmF0b3JzOiBzaGEyNTYoXCJnbG9iYWw6PGluc3RydWN0aW9uX25hbWU+XCIpWzAuLjhdXG5jb25zdCBSRUdJU1RFUl9BRkZJTElBVEVfRElTQ1JJTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFs4NywgMTIxLCA5OSwgMTg0LCAxMjYsIDYzLCAxMDMsIDIxN10pO1xuY29uc3QgVE9HR0xFX0FGRklMSUFURV9ESVNDUklNSU5BVE9SID0gQnVmZmVyLmZyb20oWzQ3LCAxNjEsIDEzMywgMTksIDE3MiwgNDQsIDQzLCAxOTRdKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyQWZmaWxpYXRlUmVzdWx0IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbiAgYWZmaWxpYXRlUGRhOiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJFR0lTVEVSIEFGRklMSUFURVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCByZWdpc3Rlcl9hZmZpbGlhdGUgdHJhbnNhY3Rpb25cbiAqXG4gKiBSZWdpc3RlcnMgYSBuZXcgYWZmaWxpYXRlIHdpdGggYSB1bmlxdWUgY29kZS5cbiAqIFRoZSBjb2RlIG11c3QgYmUgMy0xNiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUmVnaXN0ZXJBZmZpbGlhdGVUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgY29kZTogc3RyaW5nO1xuICB1c2VyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8UmVnaXN0ZXJBZmZpbGlhdGVSZXN1bHQ+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCB1c2VyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMudXNlcldhbGxldCk7XG5cbiAgLy8gVmFsaWRhdGUgY29kZVxuICBpZiAoIWlzVmFsaWRDb2RlKHBhcmFtcy5jb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZmZpbGlhdGUgY29kZS4gTXVzdCBiZSAzLTE2IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLicpO1xuICB9XG5cbiAgLy8gRGVyaXZlIGFmZmlsaWF0ZSBQREFcbiAgY29uc3QgW2FmZmlsaWF0ZVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuQUZGSUxJQVRFLCBCdWZmZXIuZnJvbShwYXJhbXMuY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgY29kZSAoYXMgc3RyaW5nKVxuICAvLyBTdHJpbmcgZW5jb2Rpbmc6IDQtYnl0ZSBsZW5ndGggcHJlZml4ICsgVVRGLTggYnl0ZXNcbiAgY29uc3QgY29kZUJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLmNvZGUsICd1dGY4Jyk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCArIDQgKyBjb2RlQnl0ZXMubGVuZ3RoKTtcbiAgUkVHSVNURVJfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCAwKTtcbiAgZGF0YS53cml0ZVVJbnQzMkxFKGNvZGVCeXRlcy5sZW5ndGgsIDgpO1xuICBjb2RlQnl0ZXMuY29weShkYXRhLCAxMik7XG5cbiAgLy8gQWNjb3VudHMgZm9yIHJlZ2lzdGVyX2FmZmlsaWF0ZTpcbiAgLy8gY29uZmlnLCBhZmZpbGlhdGUsIG93bmVyLCBzeXN0ZW1fcHJvZ3JhbVxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IGFmZmlsaWF0ZVBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHVzZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gdXNlclB1YmtleTtcblxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4LFxuICAgIGFmZmlsaWF0ZVBkYTogYWZmaWxpYXRlUGRhLnRvQmFzZTU4KCksXG4gICAgY29kZTogcGFyYW1zLmNvZGUsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUT0dHTEUgQUZGSUxJQVRFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIHRvZ2dsZV9hZmZpbGlhdGUgdHJhbnNhY3Rpb25cbiAqXG4gKiBUb2dnbGVzIGFuIGFmZmlsaWF0ZSdzIGFjdGl2ZSBzdGF0dXMgKGFjdGl2ZS9pbmFjdGl2ZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFRvZ2dsZUFmZmlsaWF0ZVRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBjb2RlOiBzdHJpbmc7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgdXNlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbiAgYWZmaWxpYXRlUGRhOiBzdHJpbmc7XG4gIG5ld1N0YXR1czogYm9vbGVhbjtcbn0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCB1c2VyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMudXNlcldhbGxldCk7XG5cbiAgLy8gRGVyaXZlIGFmZmlsaWF0ZSBQREFcbiAgY29uc3QgW2FmZmlsaWF0ZVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuQUZGSUxJQVRFLCBCdWZmZXIuZnJvbShwYXJhbXMuY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgaXNfYWN0aXZlIChib29sKVxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDkpO1xuICBUT0dHTEVfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCAwKTtcbiAgZGF0YS53cml0ZVVJbnQ4KHBhcmFtcy5hY3RpdmUgPyAxIDogMCwgOCk7XG5cbiAgLy8gQWNjb3VudHMgZm9yIHRvZ2dsZV9hZmZpbGlhdGU6XG4gIC8vIGNvbmZpZywgYWZmaWxpYXRlLCBvd25lclxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IGFmZmlsaWF0ZVBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHVzZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHVzZXJQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBhZmZpbGlhdGVQZGE6IGFmZmlsaWF0ZVBkYS50b0Jhc2U1OCgpLFxuICAgIG5ld1N0YXR1czogcGFyYW1zLmFjdGl2ZSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFTFBFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGlzVmFsaWRDb2RlKGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoY29kZS5sZW5ndGggPCAzIHx8IGNvZGUubGVuZ3RoID4gMTYpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV9dKyQvLnRlc3QoY29kZSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bet Transaction Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for placing bets on Baozi markets.
|
|
5
|
+
* Agent builds, user signs. No private keys in agent.
|
|
6
|
+
*/
|
|
7
|
+
import { Connection, PublicKey, Transaction } from '@solana/web3.js';
|
|
8
|
+
export interface BuildBetTransactionParams {
|
|
9
|
+
marketPda: PublicKey;
|
|
10
|
+
marketId: bigint;
|
|
11
|
+
userWallet: PublicKey;
|
|
12
|
+
outcome: 'yes' | 'no';
|
|
13
|
+
amountSol: number;
|
|
14
|
+
affiliatePda?: PublicKey;
|
|
15
|
+
affiliateOwner?: PublicKey;
|
|
16
|
+
whitelistRequired?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface BuildBetTransactionResult {
|
|
19
|
+
transaction: Transaction;
|
|
20
|
+
positionPda: PublicKey;
|
|
21
|
+
serializedTx: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build an unsigned bet transaction
|
|
25
|
+
*
|
|
26
|
+
* @param params - Transaction parameters
|
|
27
|
+
* @param connection - Optional connection (will create if not provided)
|
|
28
|
+
* @returns Unsigned transaction ready for user signing
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildBetTransaction(params: BuildBetTransactionParams, connection?: Connection): Promise<BuildBetTransactionResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Simulate a bet transaction
|
|
33
|
+
*/
|
|
34
|
+
export declare function simulateBetTransaction(transaction: Transaction, userWallet: PublicKey, connection?: Connection): Promise<{
|
|
35
|
+
success: boolean;
|
|
36
|
+
logs: string[];
|
|
37
|
+
unitsConsumed?: number;
|
|
38
|
+
error?: string;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Extract market_id from market account data
|
|
42
|
+
* V4.7.6 Market struct layout:
|
|
43
|
+
* - discriminator (8 bytes)
|
|
44
|
+
* - market_id (u64, 8 bytes) <-- First field!
|
|
45
|
+
* - question (string: 4 byte len + content)
|
|
46
|
+
* - ...rest of fields
|
|
47
|
+
*/
|
|
48
|
+
export declare function extractMarketIdFromData(data: Buffer): bigint;
|
|
49
|
+
/**
|
|
50
|
+
* Extract access_gate from market data to determine if whitelist is needed
|
|
51
|
+
* This requires parsing through the struct to find access_gate field
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractAccessGateFromData(data: Buffer): number;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch market data and build bet transaction
|
|
56
|
+
* Convenience function that handles market fetching and market_id extraction
|
|
57
|
+
*/
|
|
58
|
+
export declare function fetchAndBuildBetTransaction(params: {
|
|
59
|
+
marketPda: string;
|
|
60
|
+
userWallet: string;
|
|
61
|
+
outcome: 'yes' | 'no';
|
|
62
|
+
amountSol: number;
|
|
63
|
+
affiliatePda?: string;
|
|
64
|
+
affiliateOwner?: string;
|
|
65
|
+
connection?: Connection;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
transaction: BuildBetTransactionResult | null;
|
|
68
|
+
marketId: bigint;
|
|
69
|
+
error?: string;
|
|
70
|
+
}>;
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bet Transaction Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds unsigned transactions for placing bets on Baozi markets.
|
|
5
|
+
* Agent builds, user signs. No private keys in agent.
|
|
6
|
+
*/
|
|
7
|
+
import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
|
|
8
|
+
import { PROGRAM_ID, CONFIG_PDA, SEEDS, RPC_ENDPOINT, solToLamports, } from '../config.js';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// INSTRUCTION DISCRIMINATORS
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// place_bet_sol discriminator: [137, 137, 247, 253, 233, 243, 48, 170]
|
|
13
|
+
const PLACE_BET_SOL_DISCRIMINATOR = Buffer.from([137, 137, 247, 253, 233, 243, 48, 170]);
|
|
14
|
+
// place_bet_sol_with_affiliate discriminator: [197, 186, 187, 145, 252, 239, 101, 96]
|
|
15
|
+
const PLACE_BET_SOL_WITH_AFFILIATE_DISCRIMINATOR = Buffer.from([197, 186, 187, 145, 252, 239, 101, 96]);
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// PDA DERIVATION
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Derive position PDA from market ID and user
|
|
21
|
+
*/
|
|
22
|
+
function derivePositionPda(marketId, user) {
|
|
23
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
24
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
25
|
+
const [pda] = PublicKey.findProgramAddressSync([SEEDS.POSITION, marketIdBuffer, user.toBuffer()], PROGRAM_ID);
|
|
26
|
+
return pda;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Derive whitelist PDA from market ID
|
|
30
|
+
*/
|
|
31
|
+
function deriveWhitelistPda(marketId) {
|
|
32
|
+
const marketIdBuffer = Buffer.alloc(8);
|
|
33
|
+
marketIdBuffer.writeBigUInt64LE(marketId);
|
|
34
|
+
const [pda] = PublicKey.findProgramAddressSync([SEEDS.WHITELIST, marketIdBuffer], PROGRAM_ID);
|
|
35
|
+
return pda;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Derive referred user PDA
|
|
39
|
+
*/
|
|
40
|
+
function deriveReferredUserPda(user) {
|
|
41
|
+
const [pda] = PublicKey.findProgramAddressSync([Buffer.from('referred'), user.toBuffer()], PROGRAM_ID);
|
|
42
|
+
return pda;
|
|
43
|
+
}
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// INSTRUCTION BUILDERS
|
|
46
|
+
// =============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* Create place_bet_sol instruction
|
|
49
|
+
*/
|
|
50
|
+
function createPlaceBetSolInstruction(params) {
|
|
51
|
+
// Serialize instruction data
|
|
52
|
+
// [discriminator(8)] [outcome(1)] [amount(8)]
|
|
53
|
+
const data = Buffer.alloc(17);
|
|
54
|
+
PLACE_BET_SOL_DISCRIMINATOR.copy(data, 0);
|
|
55
|
+
data.writeUInt8(params.outcome ? 1 : 0, 8);
|
|
56
|
+
data.writeBigUInt64LE(params.amount, 9);
|
|
57
|
+
const keys = [
|
|
58
|
+
{ pubkey: params.config, isSigner: false, isWritable: false },
|
|
59
|
+
{ pubkey: params.market, isSigner: false, isWritable: true },
|
|
60
|
+
{ pubkey: params.position, isSigner: false, isWritable: true },
|
|
61
|
+
];
|
|
62
|
+
// Add optional whitelist
|
|
63
|
+
if (params.whitelist) {
|
|
64
|
+
keys.push({ pubkey: params.whitelist, isSigner: false, isWritable: false });
|
|
65
|
+
}
|
|
66
|
+
keys.push({ pubkey: params.user, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
|
|
67
|
+
return new TransactionInstruction({
|
|
68
|
+
programId: PROGRAM_ID,
|
|
69
|
+
keys,
|
|
70
|
+
data,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create place_bet_sol_with_affiliate instruction
|
|
75
|
+
*/
|
|
76
|
+
function createPlaceBetSolWithAffiliateInstruction(params) {
|
|
77
|
+
// Serialize instruction data
|
|
78
|
+
// [discriminator(8)] [outcome(1)] [amount(8)]
|
|
79
|
+
const data = Buffer.alloc(17);
|
|
80
|
+
PLACE_BET_SOL_WITH_AFFILIATE_DISCRIMINATOR.copy(data, 0);
|
|
81
|
+
data.writeUInt8(params.outcome ? 1 : 0, 8);
|
|
82
|
+
data.writeBigUInt64LE(params.amount, 9);
|
|
83
|
+
const keys = [
|
|
84
|
+
{ pubkey: params.config, isSigner: false, isWritable: false },
|
|
85
|
+
{ pubkey: params.market, isSigner: false, isWritable: true },
|
|
86
|
+
{ pubkey: params.position, isSigner: false, isWritable: true },
|
|
87
|
+
{ pubkey: params.affiliate, isSigner: false, isWritable: true },
|
|
88
|
+
{ pubkey: params.referredUser, isSigner: false, isWritable: true },
|
|
89
|
+
];
|
|
90
|
+
// Add optional whitelist
|
|
91
|
+
if (params.whitelist) {
|
|
92
|
+
keys.push({ pubkey: params.whitelist, isSigner: false, isWritable: false });
|
|
93
|
+
}
|
|
94
|
+
keys.push({ pubkey: params.user, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
|
|
95
|
+
return new TransactionInstruction({
|
|
96
|
+
programId: PROGRAM_ID,
|
|
97
|
+
keys,
|
|
98
|
+
data,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// =============================================================================
|
|
102
|
+
// MAIN BUILDER FUNCTION
|
|
103
|
+
// =============================================================================
|
|
104
|
+
/**
|
|
105
|
+
* Build an unsigned bet transaction
|
|
106
|
+
*
|
|
107
|
+
* @param params - Transaction parameters
|
|
108
|
+
* @param connection - Optional connection (will create if not provided)
|
|
109
|
+
* @returns Unsigned transaction ready for user signing
|
|
110
|
+
*/
|
|
111
|
+
export async function buildBetTransaction(params, connection) {
|
|
112
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
113
|
+
// Derive PDAs
|
|
114
|
+
const positionPda = derivePositionPda(params.marketId, params.userWallet);
|
|
115
|
+
const whitelistPda = params.whitelistRequired
|
|
116
|
+
? deriveWhitelistPda(params.marketId)
|
|
117
|
+
: null;
|
|
118
|
+
// Convert amount to lamports
|
|
119
|
+
const amountLamports = solToLamports(params.amountSol);
|
|
120
|
+
// Create instruction
|
|
121
|
+
let instruction;
|
|
122
|
+
if (params.affiliatePda && params.affiliateOwner) {
|
|
123
|
+
const referredUserPda = deriveReferredUserPda(params.userWallet);
|
|
124
|
+
instruction = createPlaceBetSolWithAffiliateInstruction({
|
|
125
|
+
config: CONFIG_PDA,
|
|
126
|
+
market: params.marketPda,
|
|
127
|
+
position: positionPda,
|
|
128
|
+
affiliate: params.affiliatePda,
|
|
129
|
+
referredUser: referredUserPda,
|
|
130
|
+
whitelist: whitelistPda,
|
|
131
|
+
user: params.userWallet,
|
|
132
|
+
outcome: params.outcome === 'yes',
|
|
133
|
+
amount: amountLamports,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
instruction = createPlaceBetSolInstruction({
|
|
138
|
+
config: CONFIG_PDA,
|
|
139
|
+
market: params.marketPda,
|
|
140
|
+
position: positionPda,
|
|
141
|
+
whitelist: whitelistPda,
|
|
142
|
+
user: params.userWallet,
|
|
143
|
+
outcome: params.outcome === 'yes',
|
|
144
|
+
amount: amountLamports,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Build transaction
|
|
148
|
+
const transaction = new Transaction();
|
|
149
|
+
transaction.add(instruction);
|
|
150
|
+
// Get recent blockhash
|
|
151
|
+
const { blockhash, lastValidBlockHeight } = await conn.getLatestBlockhash('finalized');
|
|
152
|
+
transaction.recentBlockhash = blockhash;
|
|
153
|
+
transaction.feePayer = params.userWallet;
|
|
154
|
+
// Serialize without signatures (returns Buffer)
|
|
155
|
+
const serializedTx = transaction.serialize({
|
|
156
|
+
requireAllSignatures: false,
|
|
157
|
+
verifySignatures: false,
|
|
158
|
+
}).toString('base64');
|
|
159
|
+
return {
|
|
160
|
+
transaction,
|
|
161
|
+
positionPda,
|
|
162
|
+
serializedTx,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// =============================================================================
|
|
166
|
+
// SIMULATION
|
|
167
|
+
// =============================================================================
|
|
168
|
+
/**
|
|
169
|
+
* Simulate a bet transaction
|
|
170
|
+
*/
|
|
171
|
+
export async function simulateBetTransaction(transaction, userWallet, connection) {
|
|
172
|
+
const conn = connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
173
|
+
try {
|
|
174
|
+
// Use the legacy simulation API for Transaction objects
|
|
175
|
+
const simulation = await conn.simulateTransaction(transaction);
|
|
176
|
+
if (simulation.value.err) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
logs: simulation.value.logs || [],
|
|
180
|
+
unitsConsumed: simulation.value.unitsConsumed,
|
|
181
|
+
error: JSON.stringify(simulation.value.err),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
success: true,
|
|
186
|
+
logs: simulation.value.logs || [],
|
|
187
|
+
unitsConsumed: simulation.value.unitsConsumed,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
logs: [],
|
|
194
|
+
error: err instanceof Error ? err.message : 'Unknown simulation error',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// =============================================================================
|
|
199
|
+
// MARKET DATA EXTRACTION
|
|
200
|
+
// =============================================================================
|
|
201
|
+
/**
|
|
202
|
+
* Extract market_id from market account data
|
|
203
|
+
* V4.7.6 Market struct layout:
|
|
204
|
+
* - discriminator (8 bytes)
|
|
205
|
+
* - market_id (u64, 8 bytes) <-- First field!
|
|
206
|
+
* - question (string: 4 byte len + content)
|
|
207
|
+
* - ...rest of fields
|
|
208
|
+
*/
|
|
209
|
+
export function extractMarketIdFromData(data) {
|
|
210
|
+
// market_id is at offset 8 (right after discriminator)
|
|
211
|
+
return data.readBigUInt64LE(8);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Extract access_gate from market data to determine if whitelist is needed
|
|
215
|
+
* This requires parsing through the struct to find access_gate field
|
|
216
|
+
*/
|
|
217
|
+
export function extractAccessGateFromData(data) {
|
|
218
|
+
// V4.7.6 Market struct layout after market_id:
|
|
219
|
+
// market_id (8) + question (4+len) + closing_time (8) + resolution_time (8) +
|
|
220
|
+
// auto_stop_buffer (8) + yes_pool (8) + no_pool (8) + snapshot_yes_pool (8) +
|
|
221
|
+
// snapshot_no_pool (8) + status (1) + winning_outcome (1+1 option) +
|
|
222
|
+
// currency_type (1) + _reserved_usdc_vault (33) + creator_bond (8) +
|
|
223
|
+
// total_claimed (8) + platform_fee_collected (8) + last_bet_time (8) +
|
|
224
|
+
// bump (1) + layer (1) + resolution_mode (1) + access_gate (1)
|
|
225
|
+
let offset = 8; // Skip discriminator
|
|
226
|
+
// market_id
|
|
227
|
+
offset += 8;
|
|
228
|
+
// question (string: 4 byte len + content)
|
|
229
|
+
const questionLen = data.readUInt32LE(offset);
|
|
230
|
+
offset += 4 + questionLen;
|
|
231
|
+
// closing_time, resolution_time, auto_stop_buffer (3 * 8 = 24)
|
|
232
|
+
offset += 24;
|
|
233
|
+
// yes_pool, no_pool, snapshot_yes_pool, snapshot_no_pool (4 * 8 = 32)
|
|
234
|
+
offset += 32;
|
|
235
|
+
// status (enum, 1 byte)
|
|
236
|
+
offset += 1;
|
|
237
|
+
// winning_outcome (Option<bool>: 1 byte discriminant + 1 byte value if Some)
|
|
238
|
+
const hasWinningOutcome = data.readUInt8(offset);
|
|
239
|
+
offset += 1;
|
|
240
|
+
if (hasWinningOutcome === 1) {
|
|
241
|
+
offset += 1;
|
|
242
|
+
}
|
|
243
|
+
// currency_type (enum, 1 byte)
|
|
244
|
+
offset += 1;
|
|
245
|
+
// _reserved_usdc_vault (33 bytes)
|
|
246
|
+
offset += 33;
|
|
247
|
+
// creator_bond (8)
|
|
248
|
+
offset += 8;
|
|
249
|
+
// total_claimed (8)
|
|
250
|
+
offset += 8;
|
|
251
|
+
// platform_fee_collected (8)
|
|
252
|
+
offset += 8;
|
|
253
|
+
// last_bet_time (8)
|
|
254
|
+
offset += 8;
|
|
255
|
+
// bump (1)
|
|
256
|
+
offset += 1;
|
|
257
|
+
// layer (enum, 1 byte)
|
|
258
|
+
offset += 1;
|
|
259
|
+
// resolution_mode (enum, 1 byte)
|
|
260
|
+
offset += 1;
|
|
261
|
+
// access_gate (enum, 1 byte)
|
|
262
|
+
const accessGate = data.readUInt8(offset);
|
|
263
|
+
return accessGate;
|
|
264
|
+
}
|
|
265
|
+
// =============================================================================
|
|
266
|
+
// HELPER: FETCH MARKET AND BUILD
|
|
267
|
+
// =============================================================================
|
|
268
|
+
/**
|
|
269
|
+
* Fetch market data and build bet transaction
|
|
270
|
+
* Convenience function that handles market fetching and market_id extraction
|
|
271
|
+
*/
|
|
272
|
+
export async function fetchAndBuildBetTransaction(params) {
|
|
273
|
+
const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
|
|
274
|
+
try {
|
|
275
|
+
const marketPubkey = new PublicKey(params.marketPda);
|
|
276
|
+
const userPubkey = new PublicKey(params.userWallet);
|
|
277
|
+
// Fetch market account to get market_id
|
|
278
|
+
const accountInfo = await conn.getAccountInfo(marketPubkey);
|
|
279
|
+
if (!accountInfo) {
|
|
280
|
+
return {
|
|
281
|
+
transaction: null,
|
|
282
|
+
marketId: 0n,
|
|
283
|
+
error: 'Market not found',
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const data = accountInfo.data;
|
|
287
|
+
// Extract market_id (first field after discriminator)
|
|
288
|
+
const marketId = extractMarketIdFromData(data);
|
|
289
|
+
// Check if whitelist is required
|
|
290
|
+
const accessGate = extractAccessGateFromData(data);
|
|
291
|
+
const whitelistRequired = accessGate === 1; // 1 = Whitelist
|
|
292
|
+
// Build affiliate PDAs if provided
|
|
293
|
+
let affiliatePda;
|
|
294
|
+
let affiliateOwner;
|
|
295
|
+
if (params.affiliatePda && params.affiliateOwner) {
|
|
296
|
+
affiliatePda = new PublicKey(params.affiliatePda);
|
|
297
|
+
affiliateOwner = new PublicKey(params.affiliateOwner);
|
|
298
|
+
}
|
|
299
|
+
// Build the transaction
|
|
300
|
+
const result = await buildBetTransaction({
|
|
301
|
+
marketPda: marketPubkey,
|
|
302
|
+
marketId,
|
|
303
|
+
userWallet: userPubkey,
|
|
304
|
+
outcome: params.outcome,
|
|
305
|
+
amountSol: params.amountSol,
|
|
306
|
+
affiliatePda,
|
|
307
|
+
affiliateOwner,
|
|
308
|
+
whitelistRequired,
|
|
309
|
+
}, conn);
|
|
310
|
+
return {
|
|
311
|
+
transaction: result,
|
|
312
|
+
marketId,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
return {
|
|
317
|
+
transaction: null,
|
|
318
|
+
marketId: 0n,
|
|
319
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV0LXRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXJzL2JldC10cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILE9BQU8sRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWCxzQkFBc0IsRUFDdEIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsS0FBSyxFQUNMLFlBQVksRUFDWixhQUFhLEdBQ2QsTUFBTSxjQUFjLENBQUM7QUFFdEIsZ0ZBQWdGO0FBQ2hGLDZCQUE2QjtBQUM3QixnRkFBZ0Y7QUFFaEYsdUVBQXVFO0FBQ3ZFLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXpGLHNGQUFzRjtBQUN0RixNQUFNLDBDQUEwQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQXVCeEcsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFaEY7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsSUFBZTtJQUMxRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM1QyxDQUFD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ICpcbiAqIEJ1aWxkcyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yIHBsYWNpbmcgYmV0cyBvbiBCYW96aSBtYXJrZXRzLlxuICogQWdlbnQgYnVpbGRzLCB1c2VyIHNpZ25zLiBObyBwcml2YXRlIGtleXMgaW4gYWdlbnQuXG4gKi9cbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIFB1YmxpY0tleSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBDT05GSUdfUERBLFxuICBTRUVEUyxcbiAgUlBDX0VORFBPSU5ULFxuICBzb2xUb0xhbXBvcnRzLFxufSBmcm9tICcuLi9jb25maWcuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSU5TVFJVQ1RJT04gRElTQ1JJTUlOQVRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIHBsYWNlX2JldF9zb2wgZGlzY3JpbWluYXRvcjogWzEzNywgMTM3LCAyNDcsIDI1MywgMjMzLCAyNDMsIDQ4LCAxNzBdXG5jb25zdCBQTEFDRV9CRVRfU09MX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMTM3LCAxMzcsIDI0NywgMjUzLCAyMzMsIDI0MywgNDgsIDE3MF0pO1xuXG4vLyBwbGFjZV9iZXRfc29sX3dpdGhfYWZmaWxpYXRlIGRpc2NyaW1pbmF0b3I6IFsxOTcsIDE4NiwgMTg3LCAxNDUsIDI1MiwgMjM5LCAxMDEsIDk2XVxuY29uc3QgUExBQ0VfQkVUX1NPTF9XSVRIX0FGRklMSUFURV9ESVNDUklNSU5BVE9SID0gQnVmZmVyLmZyb20oWzE5NywgMTg2LCAxODcsIDE0NSwgMjUyLCAyMzksIDEwMSwgOTZdKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQmV0VHJhbnNhY3Rpb25QYXJhbXMge1xuICBtYXJrZXRQZGE6IFB1YmxpY0tleTtcbiAgbWFya2V0SWQ6IGJpZ2ludDtcbiAgdXNlcldhbGxldDogUHVibGljS2V5O1xuICBvdXRjb21lOiAneWVzJyB8ICdubyc7XG4gIGFtb3VudFNvbDogbnVtYmVyO1xuICBhZmZpbGlhdGVQZGE/OiBQdWJsaWNLZXk7XG4gIGFmZmlsaWF0ZU93bmVyPzogUHVibGljS2V5O1xuICB3aGl0ZWxpc3RSZXF1aXJlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRCZXRUcmFuc2FjdGlvblJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgcG9zaXRpb25QZGE6IFB1YmxpY0tleTtcbiAgc2VyaWFsaXplZFR4OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQREEgREVSSVZBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBEZXJpdmUgcG9zaXRpb24gUERBIGZyb20gbWFya2V0IElEIGFuZCB1c2VyXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVBvc2l0aW9uUGRhKG1hcmtldElkOiBiaWdpbnQsIHVzZXI6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUE9TSVRJT04sIG1hcmtldElkQnVmZmVyLCB1c2VyLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbiAgcmV0dXJuIHBkYTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgd2hpdGVsaXN0IFBEQSBmcm9tIG1hcmtldCBJRFxuICovXG5mdW5jdGlvbiBkZXJpdmVXaGl0ZWxpc3RQZGEobWFya2V0SWQ6IGJpZ2ludCk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuV0hJVEVMSVNULCBtYXJrZXRJZEJ1ZmZlcl0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG4vKipcbiAqIERlcml2ZSByZWZlcnJlZCB1c2VyIFBEQVxuICovXG5mdW5jdGlvbiBkZXJpdmVSZWZlcnJlZFVzZXJQZGEodXNlcjogUHVibGljS2V5KTogUHVibGljS2V5IHtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbQnVmZmVyLmZyb20oJ3JlZmVycmVkJyksIHVzZXIudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSU5TVFJVQ1RJT04gQlVJTERFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlIHBsYWNlX2JldF9zb2wgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGxhY2VCZXRTb2xJbnN0cnVjdGlvbihwYXJhbXM6IHtcbiAgY29uZmlnOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5O1xuICBwb3NpdGlvbjogUHVibGljS2V5O1xuICB3aGl0ZWxpc3Q6IFB1YmxpY0tleSB8IG51bGw7XG4gIHVzZXI6IFB1YmxpY0tleTtcbiAgb3V0Y29tZTogYm9vbGVhbjtcbiAgYW1vdW50OiBiaWdpbnQ7XG59KTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIC8vIFNlcmlhbGl6ZSBpbnN0cnVjdGlvbiBkYXRhXG4gIC8vIFtkaXNjcmltaW5hdG9yKDgpXSBbb3V0Y29tZSgxKV0gW2Ftb3VudCg4KV1cbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxNyk7XG4gIFBMQUNFX0JFVF9TT0xfRElTQ1JJTUlOQVRPUi5jb3B5KGRhdGEsIDApO1xuICBkYXRhLndyaXRlVUludDgocGFyYW1zLm91dGNvbWUgPyAxIDogMCwgOCk7XG4gIGRhdGEud3JpdGVCaWdVSW50NjRMRShwYXJhbXMuYW1vdW50LCA5KTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBwYXJhbXMuY29uZmlnLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IHBhcmFtcy5tYXJrZXQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBwYXJhbXMucG9zaXRpb24sIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICBdO1xuXG4gIC8vIEFkZCBvcHRpb25hbCB3aGl0ZWxpc3RcbiAgaWYgKHBhcmFtcy53aGl0ZWxpc3QpIHtcbiAgICBrZXlzLnB1c2goeyBwdWJrZXk6IHBhcmFtcy53aGl0ZWxpc3QsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSk7XG4gIH1cblxuICBrZXlzLnB1c2goXG4gICAgeyBwdWJrZXk6IHBhcmFtcy51c2VyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9XG4gICk7XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgcGxhY2VfYmV0X3NvbF93aXRoX2FmZmlsaWF0ZSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVQbGFjZUJldFNvbFdpdGhBZmZpbGlhdGVJbnN0cnVjdGlvbihwYXJhbXM6IHtcbiAgY29uZmlnOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5O1xuICBwb3NpdGlvbjogUHVibGljS2V5O1xuICBhZmZpbGlhdGU6IFB1YmxpY0tleTtcbiAgcmVmZXJyZWRVc2VyOiBQdWJsaWNLZXk7XG4gIHdoaXRlbGlzdDogUHVibGljS2V5IHwgbnVsbDtcbiAgdXNlcjogUHVibGljS2V5O1xuICBvdXRjb21lOiBib29sZWFuO1xuICBhbW91bnQ6IGJpZ2ludDtcbn0pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgLy8gU2VyaWFsaXplIGluc3RydWN0aW9uIGRhdGFcbiAgLy8gW2Rpc2NyaW1pbmF0b3IoOCldIFtvdXRjb21lKDEpXSBbYW1vdW50KDgpXVxuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDE3KTtcbiAgUExBQ0VfQkVUX1NPTF9XSVRIX0FGRklMSUFURV9ESVNDUklNSU5BVE9SLmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50OChwYXJhbXMub3V0Y29tZSA/IDEgOiAwLCA4KTtcbiAgZGF0YS53cml0ZUJpZ1VJbnQ2NExFKHBhcmFtcy5hbW91bnQsIDkpO1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IHBhcmFtcy5jb25maWcsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogcGFyYW1zLm1hcmtldCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHBhcmFtcy5wb3NpdGlvbiwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHBhcmFtcy5hZmZpbGlhdGUsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBwYXJhbXMucmVmZXJyZWRVc2VyLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgXTtcblxuICAvLyBBZGQgb3B0aW9uYWwgd2hpdGVsaXN0XG4gIGlmIChwYXJhbXMud2hpdGVsaXN0KSB7XG4gICAga2V5cy5wdXNoKHsgcHVia2V5OiBwYXJhbXMud2hpdGVsaXN0LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICB9XG5cbiAga2V5cy5wdXNoKFxuICAgIHsgcHVia2V5OiBwYXJhbXMudXNlciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfVxuICApO1xuXG4gIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNQUlOIEJVSUxERVIgRlVOQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgYW4gdW5zaWduZWQgYmV0IHRyYW5zYWN0aW9uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRyYW5zYWN0aW9uIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBjb25uZWN0aW9uIC0gT3B0aW9uYWwgY29ubmVjdGlvbiAod2lsbCBjcmVhdGUgaWYgbm90IHByb3ZpZGVkKVxuICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb24gcmVhZHkgZm9yIHVzZXIgc2lnbmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRCZXRUcmFuc2FjdGlvbihcbiAgcGFyYW1zOiBCdWlsZEJldFRyYW5zYWN0aW9uUGFyYW1zLFxuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvblxuKTogUHJvbWlzZTxCdWlsZEJldFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IGNvbm4gPSBjb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIERlcml2ZSBQREFzXG4gIGNvbnN0IHBvc2l0aW9uUGRhID0gZGVyaXZlUG9zaXRpb25QZGEocGFyYW1zLm1hcmtldElkLCBwYXJhbXMudXNlcldhbGxldCk7XG4gIGNvbnN0IHdoaXRlbGlzdFBkYSA9IHBhcmFtcy53aGl0ZWxpc3RSZXF1aXJlZFxuICAgID8gZGVyaXZlV2hpdGVsaXN0UGRhKHBhcmFtcy5tYXJrZXRJZClcbiAgICA6IG51bGw7XG5cbiAgLy8gQ29udmVydCBhbW91bnQgdG8gbGFtcG9ydHNcbiAgY29uc3QgYW1vdW50TGFtcG9ydHMgPSBzb2xUb0xhbXBvcnRzKHBhcmFtcy5hbW91bnRTb2wpO1xuXG4gIC8vIENyZWF0ZSBpbnN0cnVjdGlvblxuICBsZXQgaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb247XG5cbiAgaWYgKHBhcmFtcy5hZmZpbGlhdGVQZGEgJiYgcGFyYW1zLmFmZmlsaWF0ZU93bmVyKSB7XG4gICAgY29uc3QgcmVmZXJyZWRVc2VyUGRhID0gZGVyaXZlUmVmZXJyZWRVc2VyUGRhKHBhcmFtcy51c2VyV2FsbGV0KTtcbiAgICBpbnN0cnVjdGlvbiA9IGNyZWF0ZVBsYWNlQmV0U29sV2l0aEFmZmlsaWF0ZUluc3RydWN0aW9uKHtcbiAgICAgIGNvbmZpZzogQ09ORklHX1BEQSxcbiAgICAgIG1hcmtldDogcGFyYW1zLm1hcmtldFBkYSxcbiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblBkYSxcbiAgICAgIGFmZmlsaWF0ZTogcGFyYW1zLmFmZmlsaWF0ZVBkYSxcbiAgICAgIHJlZmVycmVkVXNlcjogcmVmZXJyZWRVc2VyUGRhLFxuICAgICAgd2hpdGVsaXN0OiB3aGl0ZWxpc3RQZGEsXG4gICAgICB1c2VyOiBwYXJhbXMudXNlcldhbGxldCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lID09PSAneWVzJyxcbiAgICAgIGFtb3VudDogYW1vdW50TGFtcG9ydHMsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdHJ1Y3Rpb24gPSBjcmVhdGVQbGFjZUJldFNvbEluc3RydWN0aW9uKHtcbiAgICAgIGNvbmZpZzogQ09ORklHX1BEQSxcbiAgICAgIG1hcmtldDogcGFyYW1zLm1hcmtldFBkYSxcbiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblBkYSxcbiAgICAgIHdoaXRlbGlzdDogd2hpdGVsaXN0UGRhLFxuICAgICAgdXNlcjogcGFyYW1zLnVzZXJXYWxsZXQsXG4gICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSA9PT0gJ3llcycsXG4gICAgICBhbW91bnQ6IGFtb3VudExhbXBvcnRzLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQnVpbGQgdHJhbnNhY3Rpb25cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICAvLyBHZXQgcmVjZW50IGJsb2NraGFzaFxuICBjb25zdCB7IGJsb2NraGFzaCwgbGFzdFZhbGlkQmxvY2tIZWlnaHQgfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHBhcmFtcy51c2VyV2FsbGV0O1xuXG4gIC8vIFNlcmlhbGl6ZSB3aXRob3V0IHNpZ25hdHVyZXMgKHJldHVybnMgQnVmZmVyKVxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgcG9zaXRpb25QZGEsXG4gICAgc2VyaWFsaXplZFR4LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU0lNVUxBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW11bGF0ZSBhIGJldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2ltdWxhdGVCZXRUcmFuc2FjdGlvbihcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLFxuICB1c2VyV2FsbGV0OiBQdWJsaWNLZXksXG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uXG4pOiBQcm9taXNlPHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbG9nczogc3RyaW5nW107XG4gIHVuaXRzQ29uc3VtZWQ/OiBudW1iZXI7XG4gIGVycm9yPzogc3RyaW5nO1xufT4ge1xuICBjb25zdCBjb25uID0gY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIC8vIFVzZSB0aGUgbGVnYWN5IHNpbXVsYXRpb24gQVBJIGZvciBUcmFuc2FjdGlvbiBvYmplY3RzXG4gICAgY29uc3Qgc2ltdWxhdGlvbiA9IGF3YWl0IGNvbm4uc2ltdWxhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG5cbiAgICBpZiAoc2ltdWxhdGlvbi52YWx1ZS5lcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBsb2dzOiBzaW11bGF0aW9uLnZhbHVlLmxvZ3MgfHwgW10sXG4gICAgICAgIHVuaXRzQ29uc3VtZWQ6IHNpbXVsYXRpb24udmFsdWUudW5pdHNDb25zdW1lZCxcbiAgICAgICAgZXJyb3I6IEpTT04uc3RyaW5naWZ5KHNpbXVsYXRpb24udmFsdWUuZXJyKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBsb2dzOiBzaW11bGF0aW9uLnZhbHVlLmxvZ3MgfHwgW10sXG4gICAgICB1bml0c0NvbnN1bWVkOiBzaW11bGF0aW9uLnZhbHVlLnVuaXRzQ29uc3VtZWQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbG9nczogW10sXG4gICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdVbmtub3duIHNpbXVsYXRpb24gZXJyb3InLFxuICAgIH07XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1BUktFVCBEQVRBIEVYVFJBQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXh0cmFjdCBtYXJrZXRfaWQgZnJvbSBtYXJrZXQgYWNjb3VudCBkYXRhXG4gKiBWNC43LjYgTWFya2V0IHN0cnVjdCBsYXlvdXQ6XG4gKiAtIGRpc2NyaW1pbmF0b3IgKDggYnl0ZXMpXG4gKiAtIG1hcmtldF9pZCAodTY0LCA4IGJ5dGVzKSA8LS0gRmlyc3QgZmllbGQhXG4gKiAtIHF1ZXN0aW9uIChzdHJpbmc6IDQgYnl0ZSBsZW4gKyBjb250ZW50KVxuICogLSAuLi5yZXN0IG9mIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hcmtldElkRnJvbURhdGEoZGF0YTogQnVmZmVyKTogYmlnaW50IHtcbiAgLy8gbWFya2V0X2lkIGlzIGF0IG9mZnNldCA4IChyaWdodCBhZnRlciBkaXNjcmltaW5hdG9yKVxuICByZXR1cm4gZGF0YS5yZWFkQmlnVUludDY0TEUoOCk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhY2Nlc3NfZ2F0ZSBmcm9tIG1hcmtldCBkYXRhIHRvIGRldGVybWluZSBpZiB3aGl0ZWxpc3QgaXMgbmVlZGVkXG4gKiBUaGlzIHJlcXVpcmVzIHBhcnNpbmcgdGhyb3VnaCB0aGUgc3RydWN0IHRvIGZpbmQgYWNjZXNzX2dhdGUgZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RBY2Nlc3NHYXRlRnJvbURhdGEoZGF0YTogQnVmZmVyKTogbnVtYmVyIHtcbiAgLy8gVjQuNy42IE1hcmtldCBzdHJ1Y3QgbGF5b3V0IGFmdGVyIG1hcmtldF9pZDpcbiAgLy8gbWFya2V0X2lkICg4KSArIHF1ZXN0aW9uICg0K2xlbikgKyBjbG9zaW5nX3RpbWUgKDgpICsgcmVzb2x1dGlvbl90aW1lICg4KSArXG4gIC8vIGF1dG9fc3RvcF9idWZmZXIgKDgpICsgeWVzX3Bvb2wgKDgpICsgbm9fcG9vbCAoOCkgKyBzbmFwc2hvdF95ZXNfcG9vbCAoOCkgK1xuICAvLyBzbmFwc2hvdF9ub19wb29sICg4KSArIHN0YXR1cyAoMSkgKyB3aW5uaW5nX291dGNvbWUgKDErMSBvcHRpb24pICtcbiAgLy8gY3VycmVuY3lfdHlwZSAoMSkgKyBfcmVzZXJ2ZWRfdXNkY192YXVsdCAoMzMpICsgY3JlYXRvcl9ib25kICg4KSArXG4gIC8vIHRvdGFsX2NsYWltZWQgKDgpICsgcGxhdGZvcm1fZmVlX2NvbGxlY3RlZCAoOCkgKyBsYXN0X2JldF90aW1lICg4KSArXG4gIC8vIGJ1bXAgKDEpICsgbGF5ZXIgKDEpICsgcmVzb2x1dGlvbl9tb2RlICgxKSArIGFjY2Vzc19nYXRlICgxKVxuXG4gIGxldCBvZmZzZXQgPSA4OyAvLyBTa2lwIGRpc2NyaW1pbmF0b3JcblxuICAvLyBtYXJrZXRfaWRcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgLy8gcXVlc3Rpb24gKHN0cmluZzogNCBieXRlIGxlbiArIGNvbnRlbnQpXG4gIGNvbnN0IHF1ZXN0aW9uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDQgKyBxdWVzdGlvbkxlbjtcblxuICAvLyBjbG9zaW5nX3RpbWUsIHJlc29sdXRpb25fdGltZSwgYXV0b19zdG9wX2J1ZmZlciAoMyAqIDggPSAyNClcbiAgb2Zmc2V0ICs9IDI0O1xuXG4gIC8vIHllc19wb29sLCBub19wb29sLCBzbmFwc2hvdF95ZXNfcG9vbCwgc25hcHNob3Rfbm9fcG9vbCAoNCAqIDggPSAzMilcbiAgb2Zmc2V0ICs9IDMyO1xuXG4gIC8vIHN0YXR1cyAoZW51bSwgMSBieXRlKVxuICBvZmZzZXQgKz0gMTtcblxuICAvLyB3aW5uaW5nX291dGNvbWUgKE9wdGlvbjxib29sPjogMSBieXRlIGRpc2NyaW1pbmFudCArIDEgYnl0ZSB2YWx1ZSBpZiBTb21lKVxuICBjb25zdCBoYXNXaW5uaW5nT3V0Y29tZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gIG9mZnNldCArPSAxO1xuICBpZiAoaGFzV2lubmluZ091dGNvbWUgPT09IDEpIHtcbiAgICBvZmZzZXQgKz0gMTtcbiAgfVxuXG4gIC8vIGN1cnJlbmN5X3R5cGUgKGVudW0sIDEgYnl0ZSlcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgLy8gX3Jlc2VydmVkX3VzZGNfdmF1bHQgKDMzIGJ5dGVzKVxuICBvZmZzZXQgKz0gMzM7XG5cbiAgLy8gY3JlYXRvcl9ib25kICg4KVxuICBvZmZzZXQgKz0gODtcblxuICAvLyB0b3RhbF9jbGFpbWVkICg4KVxuICBvZmZzZXQgKz0gODtcblxuICAvLyBwbGF0Zm9ybV9mZWVfY29sbGVjdGVkICg4KVxuICBvZmZzZXQgKz0gODtcblxuICAvLyBsYXN0X2JldF90aW1lICg4KVxuICBvZmZzZXQgKz0gODtcblxuICAvLyBidW1wICgxKVxuICBvZmZzZXQgKz0gMTtcblxuICAvLyBsYXllciAoZW51bSwgMSBieXRlKVxuICBvZmZzZXQgKz0gMTtcblxuICAvLyByZXNvbHV0aW9uX21vZGUgKGVudW0sIDEgYnl0ZSlcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgLy8gYWNjZXNzX2dhdGUgKGVudW0sIDEgYnl0ZSlcbiAgY29uc3QgYWNjZXNzR2F0ZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG5cbiAgcmV0dXJuIGFjY2Vzc0dhdGU7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVI6IEZFVENIIE1BUktFVCBBTkQgQlVJTERcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmV0Y2ggbWFya2V0IGRhdGEgYW5kIGJ1aWxkIGJldCB0cmFuc2FjdGlvblxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIG1hcmtldCBmZXRjaGluZyBhbmQgbWFya2V0X2lkIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kQnVpbGRCZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIHVzZXJXYWxsZXQ6IHN0cmluZztcbiAgb3V0Y29tZTogJ3llcycgfCAnbm8nO1xuICBhbW91bnRTb2w6IG51bWJlcjtcbiAgYWZmaWxpYXRlUGRhPzogc3RyaW5nO1xuICBhZmZpbGlhdGVPd25lcj86IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7XG4gIHRyYW5zYWN0aW9uOiBCdWlsZEJldFRyYW5zYWN0aW9uUmVzdWx0IHwgbnVsbDtcbiAgbWFya2V0SWQ6IGJpZ2ludDtcbiAgZXJyb3I/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IG1hcmtldFB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLm1hcmtldFBkYSk7XG4gICAgY29uc3QgdXNlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnVzZXJXYWxsZXQpO1xuXG4gICAgLy8gRmV0Y2ggbWFya2V0IGFjY291bnQgdG8gZ2V0IG1hcmtldF9pZFxuICAgIGNvbnN0IGFjY291bnRJbmZvID0gYXdhaXQgY29ubi5nZXRBY2NvdW50SW5mbyhtYXJrZXRQdWJrZXkpO1xuICAgIGlmICghYWNjb3VudEluZm8pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uOiBudWxsLFxuICAgICAgICBtYXJrZXRJZDogMG4sXG4gICAgICAgIGVycm9yOiAnTWFya2V0IG5vdCBmb3VuZCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhY2NvdW50SW5mby5kYXRhO1xuXG4gICAgLy8gRXh0cmFjdCBtYXJrZXRfaWQgKGZpcnN0IGZpZWxkIGFmdGVyIGRpc2NyaW1pbmF0b3IpXG4gICAgY29uc3QgbWFya2V0SWQgPSBleHRyYWN0TWFya2V0SWRGcm9tRGF0YShkYXRhKTtcblxuICAgIC8vIENoZWNrIGlmIHdoaXRlbGlzdCBpcyByZXF1aXJlZFxuICAgIGNvbnN0IGFjY2Vzc0dhdGUgPSBleHRyYWN0QWNjZXNzR2F0ZUZyb21EYXRhKGRhdGEpO1xuICAgIGNvbnN0IHdoaXRlbGlzdFJlcXVpcmVkID0gYWNjZXNzR2F0ZSA9PT0gMTsgLy8gMSA9IFdoaXRlbGlzdFxuXG4gICAgLy8gQnVpbGQgYWZmaWxpYXRlIFBEQXMgaWYgcHJvdmlkZWRcbiAgICBsZXQgYWZmaWxpYXRlUGRhOiBQdWJsaWNLZXkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFmZmlsaWF0ZU93bmVyOiBQdWJsaWNLZXkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocGFyYW1zLmFmZmlsaWF0ZVBkYSAmJiBwYXJhbXMuYWZmaWxpYXRlT3duZXIpIHtcbiAgICAgIGFmZmlsaWF0ZVBkYSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmFmZmlsaWF0ZVBkYSk7XG4gICAgICBhZmZpbGlhdGVPd25lciA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmFmZmlsaWF0ZU93bmVyKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgdHJhbnNhY3Rpb25cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZEJldFRyYW5zYWN0aW9uKFxuICAgICAge1xuICAgICAgICBtYXJrZXRQZGE6IG1hcmtldFB1YmtleSxcbiAgICAgICAgbWFya2V0SWQsXG4gICAgICAgIHVzZXJXYWxsZXQ6IHVzZXJQdWJrZXksXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgICBhbW91bnRTb2w6IHBhcmFtcy5hbW91bnRTb2wsXG4gICAgICAgIGFmZmlsaWF0ZVBkYSxcbiAgICAgICAgYWZmaWxpYXRlT3duZXIsXG4gICAgICAgIHdoaXRlbGlzdFJlcXVpcmVkLFxuICAgICAgfSxcbiAgICAgIGNvbm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uOiByZXN1bHQsXG4gICAgICBtYXJrZXRJZCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb246IG51bGwsXG4gICAgICBtYXJrZXRJZDogMG4sXG4gICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|