@baozi.bet/mcp-server 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
@@ -0,0 +1,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaWxpYXRlLXRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWxkZXJzL2FmZmlsaWF0ZS10cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxjQUFjLENBQUM7QUFFdEIsZ0ZBQWdGO0FBQ2hGLDZCQUE2QjtBQUM3QixnRkFBZ0Y7QUFFaEYsb0VBQW9FO0FBQ3BFLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVGLE1BQU0sOEJBQThCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBYXpGLGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxNQUl2RDtJQUNDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVwRCxnQkFBZ0I7SUFDaEIs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SUFDeEMsV0FBVyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFFbEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN6QyxvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0QixPQUFPO1FBQ0wsV0FBVztRQUNYLFlBQVk7UUFDWixZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUNyQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDekIsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsVUFBVTtBQUNWLGdGQUFnRjtBQUVoRixTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWZmaWxpYXRlIFRyYW5zYWN0aW9uIEJ1aWxkZXJzXG4gKlxuICogQnVpbGRzIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3I6XG4gKiAtIFJlZ2lzdGVyaW5nIGFzIGFuIGFmZmlsaWF0ZVxuICogLSBUb2dnbGluZyBhZmZpbGlhdGUgYWN0aXZlIHN0YXR1c1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb3JyZWN0IGRpc2NyaW1pbmF0b3JzOiBzaGEyNTYoXCJnbG9iYWw6PGluc3RydWN0aW9uX25hbWU+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=