@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,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent Affiliate Network
|
|
3
|
+
*
|
|
4
|
+
* Enables AI agents to participate in Baozi's affiliate system:
|
|
5
|
+
* - Register as affiliates with unique codes
|
|
6
|
+
* - Share affiliate codes with other agents/users
|
|
7
|
+
* - Track referrals and earnings
|
|
8
|
+
* - Build networks of AI agents referring users
|
|
9
|
+
*
|
|
10
|
+
* Protocol: 1% affiliate commission on winning bet profits
|
|
11
|
+
*/
|
|
12
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
13
|
+
import bs58 from 'bs58';
|
|
14
|
+
import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, SEEDS, lamportsToSol, FEES, } from '../config.js';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// AFFILIATE REGISTRATION
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Check if an affiliate code is available
|
|
20
|
+
*/
|
|
21
|
+
export async function isAffiliateCodeAvailable(code) {
|
|
22
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
23
|
+
// Validate code format
|
|
24
|
+
if (!isValidAffiliateCode(code)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// Derive affiliate PDA
|
|
28
|
+
const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(code)], PROGRAM_ID);
|
|
29
|
+
try {
|
|
30
|
+
const account = await connection.getAccountInfo(affiliatePda);
|
|
31
|
+
return account === null; // Available if doesn't exist
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate affiliate code format
|
|
39
|
+
* - 3-16 characters
|
|
40
|
+
* - Alphanumeric + underscore
|
|
41
|
+
* - No spaces or special chars
|
|
42
|
+
*/
|
|
43
|
+
function isValidAffiliateCode(code) {
|
|
44
|
+
if (code.length < 3 || code.length > 16)
|
|
45
|
+
return false;
|
|
46
|
+
return /^[a-zA-Z0-9_]+$/.test(code);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate suggested affiliate codes for an agent
|
|
50
|
+
*/
|
|
51
|
+
export async function suggestAffiliateCodes(agentName, count = 5) {
|
|
52
|
+
const suggestions = [];
|
|
53
|
+
// Clean agent name for code generation
|
|
54
|
+
const base = agentName
|
|
55
|
+
.toLowerCase()
|
|
56
|
+
.replace(/[^a-z0-9]/g, '')
|
|
57
|
+
.slice(0, 10);
|
|
58
|
+
const candidates = [
|
|
59
|
+
base,
|
|
60
|
+
`${base}_ai`,
|
|
61
|
+
`${base}_bot`,
|
|
62
|
+
`ai_${base}`,
|
|
63
|
+
`${base}${Math.floor(Math.random() * 1000)}`,
|
|
64
|
+
`${base}_agent`,
|
|
65
|
+
`${base.slice(0, 6)}${Date.now().toString(36).slice(-4)}`,
|
|
66
|
+
];
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
if (suggestions.length >= count)
|
|
69
|
+
break;
|
|
70
|
+
if (isValidAffiliateCode(candidate)) {
|
|
71
|
+
const available = await isAffiliateCodeAvailable(candidate);
|
|
72
|
+
suggestions.push({
|
|
73
|
+
code: candidate,
|
|
74
|
+
available,
|
|
75
|
+
reason: available ? undefined : 'Already taken',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return suggestions;
|
|
80
|
+
}
|
|
81
|
+
// =============================================================================
|
|
82
|
+
// AFFILIATE LOOKUP
|
|
83
|
+
// =============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Get affiliate profile by code
|
|
86
|
+
*/
|
|
87
|
+
export async function getAffiliateByCode(code) {
|
|
88
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
89
|
+
const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(code)], PROGRAM_ID);
|
|
90
|
+
try {
|
|
91
|
+
const account = await connection.getAccountInfo(affiliatePda);
|
|
92
|
+
if (!account)
|
|
93
|
+
return null;
|
|
94
|
+
return decodeAffiliateAccount(account.data, affiliatePda, code);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get affiliate profile(s) by owner wallet
|
|
102
|
+
*/
|
|
103
|
+
export async function getAffiliatesByOwner(walletAddress) {
|
|
104
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
105
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
106
|
+
filters: [
|
|
107
|
+
{
|
|
108
|
+
memcmp: {
|
|
109
|
+
offset: 0,
|
|
110
|
+
bytes: bs58.encode(DISCRIMINATORS.AFFILIATE),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
memcmp: {
|
|
115
|
+
offset: 8, // After discriminator, owner pubkey
|
|
116
|
+
bytes: walletAddress,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
const affiliates = [];
|
|
122
|
+
for (const { account, pubkey } of accounts) {
|
|
123
|
+
const affiliate = decodeAffiliateAccount(account.data, pubkey);
|
|
124
|
+
if (affiliate) {
|
|
125
|
+
affiliates.push(affiliate);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return affiliates;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Decode Affiliate account data
|
|
132
|
+
*
|
|
133
|
+
* Affiliate struct:
|
|
134
|
+
* - discriminator (8)
|
|
135
|
+
* - owner (Pubkey, 32)
|
|
136
|
+
* - code (String: 4 + len)
|
|
137
|
+
* - total_earned (u64, 8)
|
|
138
|
+
* - total_claimed (u64, 8)
|
|
139
|
+
* - referral_count (u64, 8)
|
|
140
|
+
* - is_active (bool, 1)
|
|
141
|
+
* - bump (u8, 1)
|
|
142
|
+
*/
|
|
143
|
+
function decodeAffiliateAccount(data, pubkey, knownCode) {
|
|
144
|
+
try {
|
|
145
|
+
let offset = 8; // Skip discriminator
|
|
146
|
+
const owner = new PublicKey(data.slice(offset, offset + 32));
|
|
147
|
+
offset += 32;
|
|
148
|
+
const codeLen = data.readUInt32LE(offset);
|
|
149
|
+
offset += 4;
|
|
150
|
+
const code = data.slice(offset, offset + codeLen).toString('utf8');
|
|
151
|
+
offset += codeLen;
|
|
152
|
+
const totalEarned = data.readBigUInt64LE(offset);
|
|
153
|
+
offset += 8;
|
|
154
|
+
const totalClaimed = data.readBigUInt64LE(offset);
|
|
155
|
+
offset += 8;
|
|
156
|
+
const referralCount = data.readBigUInt64LE(offset);
|
|
157
|
+
offset += 8;
|
|
158
|
+
const isActive = data.readUInt8(offset) === 1;
|
|
159
|
+
return {
|
|
160
|
+
affiliatePda: pubkey.toBase58(),
|
|
161
|
+
ownerWallet: owner.toBase58(),
|
|
162
|
+
affiliateCode: knownCode || code,
|
|
163
|
+
isActive,
|
|
164
|
+
isVerified: false, // Would need additional check
|
|
165
|
+
totalEarnedSol: round4(lamportsToSol(totalEarned)),
|
|
166
|
+
unclaimedSol: round4(lamportsToSol(totalEarned - totalClaimed)),
|
|
167
|
+
totalClaimedSol: round4(lamportsToSol(totalClaimed)),
|
|
168
|
+
totalReferrals: Number(referralCount),
|
|
169
|
+
activeReferrals: 0, // Would need to count
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// =============================================================================
|
|
177
|
+
// REFERRAL TRACKING
|
|
178
|
+
// =============================================================================
|
|
179
|
+
/**
|
|
180
|
+
* Get all users referred by an affiliate
|
|
181
|
+
*/
|
|
182
|
+
export async function getReferralsByAffiliate(affiliateCode) {
|
|
183
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
184
|
+
// Get affiliate PDA first
|
|
185
|
+
const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(affiliateCode)], PROGRAM_ID);
|
|
186
|
+
// Get all ReferredUser accounts linked to this affiliate
|
|
187
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
188
|
+
filters: [
|
|
189
|
+
{
|
|
190
|
+
memcmp: {
|
|
191
|
+
offset: 0,
|
|
192
|
+
bytes: bs58.encode(DISCRIMINATORS.REFERRED_USER),
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
memcmp: {
|
|
197
|
+
offset: 40, // After discriminator + user pubkey
|
|
198
|
+
bytes: affiliatePda.toBase58(),
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
});
|
|
203
|
+
const referrals = [];
|
|
204
|
+
for (const { account, pubkey } of accounts) {
|
|
205
|
+
try {
|
|
206
|
+
const data = account.data;
|
|
207
|
+
let offset = 8;
|
|
208
|
+
const user = new PublicKey(data.slice(offset, offset + 32));
|
|
209
|
+
offset += 32;
|
|
210
|
+
// affiliate PDA at offset 40
|
|
211
|
+
offset += 32;
|
|
212
|
+
const totalBets = data.readBigUInt64LE(offset);
|
|
213
|
+
offset += 8;
|
|
214
|
+
const totalCommission = data.readBigUInt64LE(offset);
|
|
215
|
+
offset += 8;
|
|
216
|
+
const firstBetAt = data.readBigInt64LE(offset);
|
|
217
|
+
offset += 8;
|
|
218
|
+
const lastBetAt = data.readBigInt64LE(offset);
|
|
219
|
+
referrals.push({
|
|
220
|
+
referredUserPda: pubkey.toBase58(),
|
|
221
|
+
userWallet: user.toBase58(),
|
|
222
|
+
affiliateCode,
|
|
223
|
+
totalBetsSol: round4(lamportsToSol(totalBets)),
|
|
224
|
+
totalCommissionSol: round4(lamportsToSol(totalCommission)),
|
|
225
|
+
firstBetAt: new Date(Number(firstBetAt) * 1000).toISOString(),
|
|
226
|
+
lastBetAt: new Date(Number(lastBetAt) * 1000).toISOString(),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// Skip malformed
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return referrals;
|
|
234
|
+
}
|
|
235
|
+
// =============================================================================
|
|
236
|
+
// NETWORK STATS
|
|
237
|
+
// =============================================================================
|
|
238
|
+
/**
|
|
239
|
+
* Get overall agent affiliate network statistics
|
|
240
|
+
*/
|
|
241
|
+
export async function getAgentNetworkStats() {
|
|
242
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
243
|
+
// Get all affiliate accounts
|
|
244
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
245
|
+
filters: [
|
|
246
|
+
{
|
|
247
|
+
memcmp: {
|
|
248
|
+
offset: 0,
|
|
249
|
+
bytes: bs58.encode(DISCRIMINATORS.AFFILIATE),
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
});
|
|
254
|
+
const affiliates = [];
|
|
255
|
+
let totalNetworkEarnings = 0n;
|
|
256
|
+
let totalReferrals = 0;
|
|
257
|
+
for (const { account, pubkey } of accounts) {
|
|
258
|
+
const affiliate = decodeAffiliateAccount(account.data, pubkey);
|
|
259
|
+
if (affiliate) {
|
|
260
|
+
affiliates.push(affiliate);
|
|
261
|
+
totalNetworkEarnings += BigInt(Math.floor(affiliate.totalEarnedSol * 1e9));
|
|
262
|
+
totalReferrals += affiliate.totalReferrals;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Sort by earnings for top agents
|
|
266
|
+
affiliates.sort((a, b) => b.totalEarnedSol - a.totalEarnedSol);
|
|
267
|
+
return {
|
|
268
|
+
totalAgentAffiliates: affiliates.length,
|
|
269
|
+
totalNetworkEarningsSol: round4(lamportsToSol(totalNetworkEarnings)),
|
|
270
|
+
totalReferrals,
|
|
271
|
+
topAgents: affiliates.slice(0, 10),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// =============================================================================
|
|
275
|
+
// AGENT-TO-AGENT REFERRAL HELPERS
|
|
276
|
+
// =============================================================================
|
|
277
|
+
/**
|
|
278
|
+
* Format affiliate link for sharing between agents
|
|
279
|
+
*/
|
|
280
|
+
export function formatAffiliateLink(affiliateCode, marketPda) {
|
|
281
|
+
const baseUrl = 'https://baozi.ooo';
|
|
282
|
+
if (marketPda) {
|
|
283
|
+
return `${baseUrl}/market/${marketPda}?ref=${affiliateCode}`;
|
|
284
|
+
}
|
|
285
|
+
return `${baseUrl}?ref=${affiliateCode}`;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Parse affiliate code from a referral link
|
|
289
|
+
*/
|
|
290
|
+
export function parseAffiliateCode(url) {
|
|
291
|
+
try {
|
|
292
|
+
const urlObj = new URL(url);
|
|
293
|
+
return urlObj.searchParams.get('ref');
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Try to extract from raw string
|
|
297
|
+
const match = url.match(/[?&]ref=([a-zA-Z0-9_]+)/);
|
|
298
|
+
return match ? match[1] : null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Get recommended affiliate code for an agent to use
|
|
303
|
+
* Prefers verified/high-reputation affiliates
|
|
304
|
+
*/
|
|
305
|
+
export async function getRecommendedAffiliate() {
|
|
306
|
+
const stats = await getAgentNetworkStats();
|
|
307
|
+
// Return highest earning active affiliate
|
|
308
|
+
for (const agent of stats.topAgents) {
|
|
309
|
+
if (agent.isActive) {
|
|
310
|
+
return agent;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Commission structure info for agents
|
|
317
|
+
*/
|
|
318
|
+
export function getCommissionInfo() {
|
|
319
|
+
return {
|
|
320
|
+
affiliateFeeBps: FEES.AFFILIATE_FEE_BPS,
|
|
321
|
+
affiliateFeePercent: `${FEES.AFFILIATE_FEE_BPS / 100}%`,
|
|
322
|
+
description: 'Affiliates earn commission on winning bet PROFITS (not total stake)',
|
|
323
|
+
example: 'User bets 1 SOL, wins 2 SOL (1 SOL profit). Platform fee 2.5% = 0.025 SOL. Affiliate gets 1% of profit = 0.01 SOL',
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// =============================================================================
|
|
327
|
+
// HELPERS
|
|
328
|
+
// =============================================================================
|
|
329
|
+
function round4(n) {
|
|
330
|
+
return Math.round(n * 10000) / 10000;
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVycy9hZ2VudC1uZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUNMLGFBQWEsRUFDYixJQUFJLEdBQ0wsTUFBTSxjQUFjLENBQUM7QUFzRHRCLGdGQUFnRjtBQUNoRix5QkFBeUI7QUFDekIsZ0ZBQWdGO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxJQUFZO0lBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUU3RCx1QkFBdUI7SUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQ3JELENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3BDLFVBQVUsQ0FDWCxDQUFDO0lBRUYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLDZCQUE2QjtJQUN4RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztB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QyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBTS9CLE9BQU87UUFDTCxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtRQUN2QyxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLEdBQUc7UUFDdkQsV0FBVyxFQUFFLHFFQUFxRTtRQUNsRixPQUFPLEVBQUUsbUhBQW1IO0tBQzdILENBQUM7QUFDSixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFVBQVU7QUFDVixnRkFBZ0Y7QUFFaEYsU0FBUyxNQUFNLENBQUMsQ0FBUztJQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBSSBBZ2VudCBBZmZpbGlhdGUgTmV0d29ya1xuICpcbiAqIEVuYWJsZXMgQUkgYWdlbnRzIHRvIHBhcnRpY2lwYXRlIGluIEJhb3ppJ3MgYWZmaWxpYXRlIHN5c3RlbTpcbiAqIC0gUmVnaXN0ZXIgYXMgYWZmaWxpYXRlcyB3aXRoIHVuaXF1ZSBjb2Rlc1xuICogLSBTaGFyZSBhZmZpbGlhdGUgY29kZXMgd2l0aCBvdGhlciBhZ2VudHMvdXNlcnNcbiAqIC0gVHJhY2sgcmVmZXJyYWxzIGFuZCBlYXJuaW5nc1xuICogLSBCdWlsZCBuZXR3b3JrcyBvZiBBSSBhZ2VudHMgcmVmZXJyaW5nIHVzZXJzXG4gKlxuICogUHJvdG9jb2w6IDElIGFmZmlsaWF0ZSBjb21taXNzaW9uIG9uIHdpbm5pbmcgYmV0IHByb2ZpdHNcbiAqL1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgUlBDX0VORFBPSU5ULFxuICBESVNDUklNSU5BVE9SUyxcbiAgU0VFRFMsXG4gIGxhbXBvcnRzVG9Tb2wsXG4gIEZFRVMsXG59IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudEFmZmlsaWF0ZVByb2ZpbGUge1xuICAvLyBJZGVudGl0eVxuICBhZmZpbGlhdGVQZGE6IHN0cmluZztcbiAgb3duZXJXYWxsZXQ6IHN0cmluZztcbiAgYWZmaWxpYXRlQ29kZTogc3RyaW5nO1xuXG4gIC8vIFN0YXR1c1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgaXNWZXJpZmllZDogYm9vbGVhbjtcblxuICAvLyBFYXJuaW5nc1xuICB0b3RhbEVhcm5lZFNvbDogbnVtYmVyO1xuICB1bmNsYWltZWRTb2w6IG51bWJlcjtcbiAgdG90YWxDbGFpbWVkU29sOiBudW1iZXI7XG5cbiAgLy8gTmV0d29yayBzdGF0c1xuICB0b3RhbFJlZmVycmFsczogbnVtYmVyO1xuICBhY3RpdmVSZWZlcnJhbHM6IG51bWJlcjtcblxuICAvLyBBZ2VudCBtZXRhZGF0YSAoaWYgYXZhaWxhYmxlKVxuICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gIGFnZW50VHlwZT86IHN0cmluZztcbiAgcmVnaXN0ZXJlZEF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVycmFsSW5mbyB7XG4gIHJlZmVycmVkVXNlclBkYTogc3RyaW5nO1xuICB1c2VyV2FsbGV0OiBzdHJpbmc7XG4gIGFmZmlsaWF0ZUNvZGU6IHN0cmluZztcbiAgdG90YWxCZXRzU29sOiBudW1iZXI7XG4gIHRvdGFsQ29tbWlzc2lvblNvbDogbnVtYmVyO1xuICBmaXJzdEJldEF0OiBzdHJpbmc7XG4gIGxhc3RCZXRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50TmV0d29ya1N0YXRzIHtcbiAgdG90YWxBZ2VudEFmZmlsaWF0ZXM6IG51bWJlcjtcbiAgdG90YWxOZXR3b3JrRWFybmluZ3NTb2w6IG51bWJlcjtcbiAgdG90YWxSZWZlcnJhbHM6IG51bWJlcjtcbiAgdG9wQWdlbnRzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbiB7XG4gIGNvZGU6IHN0cmluZztcbiAgYXZhaWxhYmxlOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBRkZJTElBVEUgUkVHSVNUUkFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGFmZmlsaWF0ZSBjb2RlIGlzIGF2YWlsYWJsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBZmZpbGlhdGVDb2RlQXZhaWxhYmxlKGNvZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgLy8gVmFsaWRhdGUgY29kZSBmb3JtYXRcbiAgaWYgKCFpc1ZhbGlkQWZmaWxpYXRlQ29kZShjb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIERlcml2ZSBhZmZpbGlhdGUgUERBXG4gIGNvbnN0IFthZmZpbGlhdGVQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLkFGRklMSUFURSwgQnVmZmVyLmZyb20oY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKGFmZmlsaWF0ZVBkYSk7XG4gICAgcmV0dXJuIGFjY291bnQgPT09IG51bGw7IC8vIEF2YWlsYWJsZSBpZiBkb2Vzbid0IGV4aXN0XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFmZmlsaWF0ZSBjb2RlIGZvcm1hdFxuICogLSAzLTE2IGNoYXJhY3RlcnNcbiAqIC0gQWxwaGFudW1lcmljICsgdW5kZXJzY29yZVxuICogLSBObyBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyc1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkQWZmaWxpYXRlQ29kZShjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGNvZGUubGVuZ3RoIDwgMyB8fCBjb2RlLmxlbmd0aCA+IDE2KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXlthLXpBLVowLTlfXSskLy50ZXN0KGNvZGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHN1Z2dlc3RlZCBhZmZpbGlhdGUgY29kZXMgZm9yIGFuIGFnZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdWdnZXN0QWZmaWxpYXRlQ29kZXMoXG4gIGFnZW50TmFtZTogc3RyaW5nLFxuICBjb3VudDogbnVtYmVyID0gNVxuKTogUHJvbWlzZTxBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbltdPiB7XG4gIGNvbnN0IHN1Z2dlc3Rpb25zOiBBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbltdID0gW107XG5cbiAgLy8gQ2xlYW4gYWdlbnQgbmFtZSBmb3IgY29kZSBnZW5lcmF0aW9uXG4gIGNvbnN0IGJhc2UgPSBhZ2VudE5hbWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpXG4gICAgLnNsaWNlKDAsIDEwKTtcblxuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIGJhc2UsXG4gICAgYCR7YmFzZX1fYWlgLFxuICAgIGAke2Jhc2V9X2JvdGAsXG4gICAgYGFpXyR7YmFzZX1gLFxuICAgIGAke2Jhc2V9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgIGAke2Jhc2V9X2FnZW50YCxcbiAgICBgJHtiYXNlLnNsaWNlKDAsIDYpfSR7RGF0ZS5ub3coKS50b1N0cmluZygzNikuc2xpY2UoLTQpfWAsXG4gIF07XG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPj0gY291bnQpIGJyZWFrO1xuXG4gICAgaWYgKGlzVmFsaWRBZmZpbGlhdGVDb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzQWZmaWxpYXRlQ29kZUF2YWlsYWJsZShjYW5kaWRhdGUpO1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgIGNvZGU6IGNhbmRpZGF0ZSxcbiAgICAgICAgYXZhaWxhYmxlLFxuICAgICAgICByZWFzb246IGF2YWlsYWJsZSA/IHVuZGVmaW5lZCA6ICdBbHJlYWR5IHRha2VuJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWdnZXN0aW9ucztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFGRklMSUFURSBMT09LVVBcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGFmZmlsaWF0ZSBwcm9maWxlIGJ5IGNvZGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFmZmlsaWF0ZUJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50QWZmaWxpYXRlUHJvZmlsZSB8IG51bGw+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIGNvbnN0IFthZmZpbGlhdGVQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLkFGRklMSUFURSwgQnVmZmVyLmZyb20oY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKGFmZmlsaWF0ZVBkYSk7XG4gICAgaWYgKCFhY2NvdW50KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBkZWNvZGVBZmZpbGlhdGVBY2NvdW50KGFjY291bnQuZGF0YSBhcyBCdWZmZXIsIGFmZmlsaWF0ZVBkYSwgY29kZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGFmZmlsaWF0ZSBwcm9maWxlKHMpIGJ5IG93bmVyIHdhbGxldFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWZmaWxpYXRlc0J5T3duZXIod2FsbGV0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLkFGRklMSUFURSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDgsIC8vIEFmdGVyIGRpc2NyaW1pbmF0b3IsIG93bmVyIHB1YmtleVxuICAgICAgICAgIGJ5dGVzOiB3YWxsZXRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCBhZmZpbGlhdGVzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBhY2NvdW50LCBwdWJrZXkgfSBvZiBhY2NvdW50cykge1xuICAgIGNvbnN0IGFmZmlsaWF0ZSA9IGRlY29kZUFmZmlsaWF0ZUFjY291bnQoYWNjb3VudC5kYXRhIGFzIEJ1ZmZlciwgcHVia2V5KTtcbiAgICBpZiAoYWZmaWxpYXRlKSB7XG4gICAgICBhZmZpbGlhdGVzLnB1c2goYWZmaWxpYXRlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWZmaWxpYXRlcztcbn1cblxuLyoqXG4gKiBEZWNvZGUgQWZmaWxpYXRlIGFjY291bnQgZGF0YVxuICpcbiAqIEFmZmlsaWF0ZSBzdHJ1Y3Q6XG4gKiAtIGRpc2NyaW1pbmF0b3IgKDgpXG4gKiAtIG93bmVyIChQdWJrZXksIDMyKVxuICogLSBjb2RlIChTdHJpbmc6IDQgKyBsZW4pXG4gKiAtIHRvdGFsX2Vhcm5lZCAodTY0LCA4KVxuICogLSB0b3RhbF9jbGFpbWVkICh1NjQsIDgpXG4gKiAtIHJlZmVycmFsX2NvdW50ICh1NjQsIDgpXG4gKiAtIGlzX2FjdGl2ZSAoYm9vbCwgMSlcbiAqIC0gYnVtcCAodTgsIDEpXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUFmZmlsaWF0ZUFjY291bnQoXG4gIGRhdGE6IEJ1ZmZlcixcbiAgcHVia2V5OiBQdWJsaWNLZXksXG4gIGtub3duQ29kZT86IHN0cmluZ1xuKTogQWdlbnRBZmZpbGlhdGVQcm9maWxlIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgbGV0IG9mZnNldCA9IDg7IC8vIFNraXAgZGlzY3JpbWluYXRvclxuXG4gICAgY29uc3Qgb3duZXIgPSBuZXcgUHVibGljS2V5KGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyAzMikpO1xuICAgIG9mZnNldCArPSAzMjtcblxuICAgIGNvbnN0IGNvZGVMZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgY29kZUxlbikudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBvZmZzZXQgKz0gY29kZUxlbjtcblxuICAgIGNvbnN0IHRvdGFsRWFybmVkID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIGNvbnN0IHRvdGFsQ2xhaW1lZCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICBjb25zdCByZWZlcnJhbENvdW50ID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIGNvbnN0IGlzQWN0aXZlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSA9PT0gMTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZmZpbGlhdGVQZGE6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgb3duZXJXYWxsZXQ6IG93bmVyLnRvQmFzZTU4KCksXG4gICAgICBhZmZpbGlhdGVDb2RlOiBrbm93bkNvZGUgfHwgY29kZSxcbiAgICAgIGlzQWN0aXZlLFxuICAgICAgaXNWZXJpZmllZDogZmFsc2UsIC8vIFdvdWxkIG5lZWQgYWRkaXRpb25hbCBjaGVja1xuICAgICAgdG90YWxFYXJuZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsRWFybmVkKSksXG4gICAgICB1bmNsYWltZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsRWFybmVkIC0gdG90YWxDbGFpbWVkKSksXG4gICAgICB0b3RhbENsYWltZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsQ2xhaW1lZCkpLFxuICAgICAgdG90YWxSZWZlcnJhbHM6IE51bWJlcihyZWZlcnJhbENvdW50KSxcbiAgICAgIGFjdGl2ZVJlZmVycmFsczogMCwgLy8gV291bGQgbmVlZCB0byBjb3VudFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSRUZFUlJBTCBUUkFDS0lOR1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgYWxsIHVzZXJzIHJlZmVycmVkIGJ5IGFuIGFmZmlsaWF0ZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVmZXJyYWxzQnlBZmZpbGlhdGUoYWZmaWxpYXRlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxSZWZlcnJhbEluZm9bXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgLy8gR2V0IGFmZmlsaWF0ZSBQREEgZmlyc3RcbiAgY29uc3QgW2FmZmlsaWF0ZVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuQUZGSUxJQVRFLCBCdWZmZXIuZnJvbShhZmZpbGlhdGVDb2RlKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuXG4gIC8vIEdldCBhbGwgUmVmZXJyZWRVc2VyIGFjY291bnRzIGxpbmtlZCB0byB0aGlzIGFmZmlsaWF0ZVxuICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0UHJvZ3JhbUFjY291bnRzKFBST0dSQU1fSUQsIHtcbiAgICBmaWx0ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIG1lbWNtcDoge1xuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBieXRlczogYnM1OC5lbmNvZGUoRElTQ1JJTUlOQVRPUlMuUkVGRVJSRURfVVNFUiksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDQwLCAvLyBBZnRlciBkaXNjcmltaW5hdG9yICsgdXNlciBwdWJrZXlcbiAgICAgICAgICBieXRlczogYWZmaWxpYXRlUGRhLnRvQmFzZTU4KCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IHJlZmVycmFsczogUmVmZXJyYWxJbmZvW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgYWNjb3VudCwgcHVia2V5IH0gb2YgYWNjb3VudHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGFjY291bnQuZGF0YSBhcyBCdWZmZXI7XG4gICAgICBsZXQgb2Zmc2V0ID0gODtcblxuICAgICAgY29uc3QgdXNlciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIC8vIGFmZmlsaWF0ZSBQREEgYXQgb2Zmc2V0IDQwXG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIGNvbnN0IHRvdGFsQmV0cyA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gODtcblxuICAgICAgY29uc3QgdG90YWxDb21taXNzaW9uID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCBmaXJzdEJldEF0ID0gZGF0YS5yZWFkQmlnSW50NjRMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAgIGNvbnN0IGxhc3RCZXRBdCA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcblxuICAgICAgcmVmZXJyYWxzLnB1c2goe1xuICAgICAgICByZWZlcnJlZFVzZXJQZGE6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgICB1c2VyV2FsbGV0OiB1c2VyLnRvQmFzZTU4KCksXG4gICAgICAgIGFmZmlsaWF0ZUNvZGUsXG4gICAgICAgIHRvdGFsQmV0c1NvbDogcm91bmQ0KGxhbXBvcnRzVG9Tb2wodG90YWxCZXRzKSksXG4gICAgICAgIHRvdGFsQ29tbWlzc2lvblNvbDogcm91bmQ0KGxhbXBvcnRzVG9Tb2wodG90YWxDb21taXNzaW9uKSksXG4gICAgICAgIGZpcnN0QmV0QXQ6IG5ldyBEYXRlKE51bWJlcihmaXJzdEJldEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGxhc3RCZXRBdDogbmV3IERhdGUoTnVtYmVyKGxhc3RCZXRBdCkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTa2lwIG1hbGZvcm1lZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZlcnJhbHM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBORVRXT1JLIFNUQVRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBvdmVyYWxsIGFnZW50IGFmZmlsaWF0ZSBuZXR3b3JrIHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFnZW50TmV0d29ya1N0YXRzKCk6IFByb21pc2U8QWdlbnROZXR3b3JrU3RhdHM+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIEdldCBhbGwgYWZmaWxpYXRlIGFjY291bnRzXG4gIGNvbnN0IGFjY291bnRzID0gYXdhaXQgY29ubmVjdGlvbi5nZXRQcm9ncmFtQWNjb3VudHMoUFJPR1JBTV9JRCwge1xuICAgIGZpbHRlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgbWVtY21wOiB7XG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGJ5dGVzOiBiczU4LmVuY29kZShESVNDUklNSU5BVE9SUy5BRkZJTElBVEUpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCBhZmZpbGlhdGVzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXSA9IFtdO1xuICBsZXQgdG90YWxOZXR3b3JrRWFybmluZ3MgPSAwbjtcbiAgbGV0IHRvdGFsUmVmZXJyYWxzID0gMDtcblxuICBmb3IgKGNvbnN0IHsgYWNjb3VudCwgcHVia2V5IH0gb2YgYWNjb3VudHMpIHtcbiAgICBjb25zdCBhZmZpbGlhdGUgPSBkZWNvZGVBZmZpbGlhdGVBY2NvdW50KGFjY291bnQuZGF0YSBhcyBCdWZmZXIsIHB1YmtleSk7XG4gICAgaWYgKGFmZmlsaWF0ZSkge1xuICAgICAgYWZmaWxpYXRlcy5wdXNoKGFmZmlsaWF0ZSk7XG4gICAgICB0b3RhbE5ldHdvcmtFYXJuaW5ncyArPSBCaWdJbnQoTWF0aC5mbG9vcihhZmZpbGlhdGUudG90YWxFYXJuZWRTb2wgKiAxZTkpKTtcbiAgICAgIHRvdGFsUmVmZXJyYWxzICs9IGFmZmlsaWF0ZS50b3RhbFJlZmVycmFscztcbiAgICB9XG4gIH1cblxuICAvLyBTb3J0IGJ5IGVhcm5pbmdzIGZvciB0b3AgYWdlbnRzXG4gIGFmZmlsaWF0ZXMuc29ydCgoYSwgYikgPT4gYi50b3RhbEVhcm5lZFNvbCAtIGEudG90YWxFYXJuZWRTb2wpO1xuXG4gIHJldHVybiB7XG4gICAgdG90YWxBZ2VudEFmZmlsaWF0ZXM6IGFmZmlsaWF0ZXMubGVuZ3RoLFxuICAgIHRvdGFsTmV0d29ya0Vhcm5pbmdzU29sOiByb3VuZDQobGFtcG9ydHNUb1NvbCh0b3RhbE5ldHdvcmtFYXJuaW5ncykpLFxuICAgIHRvdGFsUmVmZXJyYWxzLFxuICAgIHRvcEFnZW50czogYWZmaWxpYXRlcy5zbGljZSgwLCAxMCksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBR0VOVC1UTy1BR0VOVCBSRUZFUlJBTCBIRUxQRVJTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZvcm1hdCBhZmZpbGlhdGUgbGluayBmb3Igc2hhcmluZyBiZXR3ZWVuIGFnZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QWZmaWxpYXRlTGluayhhZmZpbGlhdGVDb2RlOiBzdHJpbmcsIG1hcmtldFBkYT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2VVcmwgPSAnaHR0cHM6Ly9iYW96aS5vb28nO1xuICBpZiAobWFya2V0UGRhKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9L21hcmtldC8ke21hcmtldFBkYX0/cmVmPSR7YWZmaWxpYXRlQ29kZX1gO1xuICB9XG4gIHJldHVybiBgJHtiYXNlVXJsfT9yZWY9JHthZmZpbGlhdGVDb2RlfWA7XG59XG5cbi8qKlxuICogUGFyc2UgYWZmaWxpYXRlIGNvZGUgZnJvbSBhIHJlZmVycmFsIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWZmaWxpYXRlQ29kZSh1cmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gdXJsT2JqLnNlYXJjaFBhcmFtcy5nZXQoJ3JlZicpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBmcm9tIHJhdyBzdHJpbmdcbiAgICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvWz8mXXJlZj0oW2EtekEtWjAtOV9dKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgcmVjb21tZW5kZWQgYWZmaWxpYXRlIGNvZGUgZm9yIGFuIGFnZW50IHRvIHVzZVxuICogUHJlZmVycyB2ZXJpZmllZC9oaWdoLXJlcHV0YXRpb24gYWZmaWxpYXRlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRBZmZpbGlhdGUoKTogUHJvbWlzZTxBZ2VudEFmZmlsaWF0ZVByb2ZpbGUgfCBudWxsPiB7XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZ2V0QWdlbnROZXR3b3JrU3RhdHMoKTtcblxuICAvLyBSZXR1cm4gaGlnaGVzdCBlYXJuaW5nIGFjdGl2ZSBhZmZpbGlhdGVcbiAgZm9yIChjb25zdCBhZ2VudCBvZiBzdGF0cy50b3BBZ2VudHMpIHtcbiAgICBpZiAoYWdlbnQuaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDb21taXNzaW9uIHN0cnVjdHVyZSBpbmZvIGZvciBhZ2VudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1pc3Npb25JbmZvKCk6IHtcbiAgYWZmaWxpYXRlRmVlQnBzOiBudW1iZXI7XG4gIGFmZmlsaWF0ZUZlZVBlcmNlbnQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZXhhbXBsZTogc3RyaW5nO1xufSB7XG4gIHJldHVybiB7XG4gICAgYWZmaWxpYXRlRmVlQnBzOiBGRUVTLkFGRklMSUFURV9GRUVfQlBTLFxuICAgIGFmZmlsaWF0ZUZlZVBlcmNlbnQ6IGAke0ZFRVMuQUZGSUxJQVRFX0ZFRV9CUFMgLyAxMDB9JWAsXG4gICAgZGVzY3JpcHRpb246ICdBZmZpbGlhdGVzIGVhcm4gY29tbWlzc2lvbiBvbiB3aW5uaW5nIGJldCBQUk9GSVRTIChub3QgdG90YWwgc3Rha2UpJyxcbiAgICBleGFtcGxlOiAnVXNlciBiZXRzIDEgU09MLCB3aW5zIDIgU09MICgxIFNPTCBwcm9maXQpLiBQbGF0Zm9ybSBmZWUgMi41JSA9IDAuMDI1IFNPTC4gQWZmaWxpYXRlIGdldHMgMSUgb2YgcHJvZml0ID0gMC4wMSBTT0wnLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcm91bmQ0KG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG4gKiAxMDAwMCkgLyAxMDAwMDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface ClaimablePosition {
|
|
2
|
+
positionPda: string;
|
|
3
|
+
marketPda: string;
|
|
4
|
+
marketQuestion: string;
|
|
5
|
+
side: 'Yes' | 'No';
|
|
6
|
+
betAmountSol: number;
|
|
7
|
+
claimType: 'winnings' | 'refund' | 'cancelled';
|
|
8
|
+
estimatedPayoutSol: number;
|
|
9
|
+
marketStatus: string;
|
|
10
|
+
marketOutcome: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ClaimSummary {
|
|
13
|
+
wallet: string;
|
|
14
|
+
totalClaimableSol: number;
|
|
15
|
+
winningsClaimableSol: number;
|
|
16
|
+
refundsClaimableSol: number;
|
|
17
|
+
claimablePositions: ClaimablePosition[];
|
|
18
|
+
alreadyClaimedCount: number;
|
|
19
|
+
}
|
|
20
|
+
export interface AffiliateInfo {
|
|
21
|
+
affiliatePda: string;
|
|
22
|
+
owner: string;
|
|
23
|
+
code: string;
|
|
24
|
+
totalEarnedSol: number;
|
|
25
|
+
unclaimedSol: number;
|
|
26
|
+
referralCount: number;
|
|
27
|
+
isActive: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface CreatorEarnings {
|
|
30
|
+
wallet: string;
|
|
31
|
+
totalCreatorFeesSol: number;
|
|
32
|
+
unclaimedSol: number;
|
|
33
|
+
marketsCreated: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get all claimable positions for a wallet
|
|
37
|
+
* Checks which positions can be claimed (winnings or refunds)
|
|
38
|
+
*/
|
|
39
|
+
export declare function getClaimablePositions(walletAddress: string): Promise<ClaimSummary>;
|
|
40
|
+
/**
|
|
41
|
+
* Get affiliate info by code
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAffiliateByCode(code: string): Promise<AffiliateInfo | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Get affiliate info by owner wallet
|
|
46
|
+
*/
|
|
47
|
+
export declare function getAffiliateByOwner(walletAddress: string): Promise<AffiliateInfo[]>;
|