proof-of-take-sdk 1.0.0 → 2.1.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/dist/getters/index.d.ts +0 -1
- package/dist/getters/index.js +0 -1
- package/dist/idl/proof_of_take.json +54 -458
- package/dist/instructions/claimReferralPenaltyForWindow.d.ts +2 -1
- package/dist/instructions/claimReferralPenaltyForWindow.js +4 -4
- package/dist/instructions/claimWindowRewards.d.ts +2 -1
- package/dist/instructions/claimWindowRewards.js +2 -2
- package/dist/instructions/confirmedPostOnX.d.ts +3 -1
- package/dist/instructions/confirmedPostOnX.js +4 -10
- package/dist/instructions/createMiztake.d.ts +3 -2
- package/dist/instructions/createMiztake.js +5 -5
- package/dist/instructions/joinSeason.d.ts +3 -3
- package/dist/instructions/joinSeason.js +9 -20
- package/dist/instructions/viewSeasonMembershipStatus.d.ts +2 -2
- package/dist/instructions/viewSeasonMembershipStatus.js +3 -3
- package/dist/instructions/withdrawSeasonDeposit.d.ts +3 -1
- package/dist/instructions/withdrawSeasonDeposit.js +3 -7
- package/dist/optimistic/index.d.ts +1 -1
- package/dist/optimistic/index.js +2 -1
- package/dist/types/proof_of_take.d.ts +43 -447
- package/dist/types.d.ts +0 -3
- package/dist/utils/accountUpdates.d.ts +34 -6
- package/dist/utils/accountUpdates.js +57 -10
- package/dist/utils/constants.d.ts +0 -1
- package/dist/utils/constants.js +1 -2
- package/dist/utils/pdaManager.d.ts +6 -6
- package/dist/utils/pdaManager.js +11 -11
- package/dist/utils/pdas.d.ts +21 -12
- package/dist/utils/pdas.js +36 -20
- package/dist/utils/tierPenalty.d.ts +8 -0
- package/dist/utils/tierPenalty.js +30 -0
- package/package.json +1 -1
- package/dist/getters/getTokenVault.d.ts +0 -30
- package/dist/getters/getTokenVault.js +0 -56
|
@@ -13,6 +13,34 @@ import { Miztake, UserStats, MiztakeStatistics, SeasonSettings, Season, SeasonMe
|
|
|
13
13
|
* @returns Current Unix timestamp in seconds
|
|
14
14
|
*/
|
|
15
15
|
export declare function getCurrentTimestamp(now?: BN): BN;
|
|
16
|
+
/**
|
|
17
|
+
* Build the Season account object that is expected to be created by on-chain lazy initialization.
|
|
18
|
+
*
|
|
19
|
+
* This is a PURE helper (no RPC). It mirrors `season_helpers::initialize_season`:
|
|
20
|
+
* - `season_state = Active`
|
|
21
|
+
* - `started_at = current_time`
|
|
22
|
+
* - `ends_at = current_time + season_duration`
|
|
23
|
+
* - all counters and totals initialized to zero
|
|
24
|
+
* - schedule `eligible_stake_per_window` initialized to 21 zeros
|
|
25
|
+
* - PDA bump derived locally from seeds (no RPC)
|
|
26
|
+
*
|
|
27
|
+
* IMPORTANT:
|
|
28
|
+
* To match on-chain state exactly, you must supply the same `startedAt` that the transaction
|
|
29
|
+
* will observe on-chain (i.e. `Clock::get()?.unix_timestamp` at execution time) and the same
|
|
30
|
+
* season duration as stored in SeasonSettings at that moment. If you don't have settings locally,
|
|
31
|
+
* we fall back to the canonical defaults (7 days, 21 windows).
|
|
32
|
+
*/
|
|
33
|
+
export declare function expectedToBeLazyInitialized(params: {
|
|
34
|
+
/** Season number to initialize. */
|
|
35
|
+
seasonNumber: BN;
|
|
36
|
+
/** Unix timestamp in seconds used as `started_at` (i64 on-chain). */
|
|
37
|
+
startedAt: BN;
|
|
38
|
+
/**
|
|
39
|
+
* Optional settings snapshot (recommended) to compute `endsAt` and `totalWindows`.
|
|
40
|
+
* Providing this avoids drift if settings ever change.
|
|
41
|
+
*/
|
|
42
|
+
seasonSettings?: Pick<SeasonSettings, "seasonDuration" | "totalWindowsPerSeason" | "lastSeasonEndsAt">;
|
|
43
|
+
}): Season;
|
|
16
44
|
/**
|
|
17
45
|
* Create an empty/initialized UserStats object
|
|
18
46
|
* Used when initializing a new user stats account
|
|
@@ -66,11 +94,11 @@ export declare function updateMiztakeStatisticsForCreation(statistics: MiztakeSt
|
|
|
66
94
|
* @param user - User's public key
|
|
67
95
|
* @param seasonNumber - Season number
|
|
68
96
|
* @param windowNumber - Window number
|
|
69
|
-
* @param
|
|
97
|
+
* @param tier - Tier number (1..=5)
|
|
70
98
|
* @param miztakeId - The miztake ID to associate
|
|
71
99
|
* @returns Initialized/Updated UserWindowParticipation object
|
|
72
100
|
*/
|
|
73
|
-
export declare function initializeUserWindowParticipation(user: PublicKey, seasonNumber: BN, windowNumber: BN,
|
|
101
|
+
export declare function initializeUserWindowParticipation(user: PublicKey, seasonNumber: BN, windowNumber: BN, tier: number, miztakeId: BN): UserWindowParticipation;
|
|
74
102
|
/**
|
|
75
103
|
* Initialize RewardWindow
|
|
76
104
|
* Mirrors the logic from season_helpers::initialize_window
|
|
@@ -97,7 +125,7 @@ export declare function updateMiztakeForSeasonUse(miztake: Miztake, seasonNumber
|
|
|
97
125
|
* Mirrors the initialization from join_season.rs (lines 84-96)
|
|
98
126
|
*
|
|
99
127
|
* @param user - User's public key
|
|
100
|
-
* @param
|
|
128
|
+
* @param tier - Tier number (1..=5)
|
|
101
129
|
* @param seasonNumber - Season number
|
|
102
130
|
* @param depositTier - Tier chosen at join time
|
|
103
131
|
* @param depositAmount - Active deposit amount (participates in rewards/penalties)
|
|
@@ -106,7 +134,7 @@ export declare function updateMiztakeForSeasonUse(miztake: Miztake, seasonNumber
|
|
|
106
134
|
* @param joinedWindowNumber - Window number when joined
|
|
107
135
|
* @returns Initialized SeasonMembership object
|
|
108
136
|
*/
|
|
109
|
-
export declare function initializeSeasonMembership(user: PublicKey,
|
|
137
|
+
export declare function initializeSeasonMembership(user: PublicKey, seasonNumber: BN, depositTier: SeasonDepositTier, referrer: PublicKey, depositAmount: BN, depositEscrowedAmount: BN, joinedAt: BN, joinedWindowNumber: BN, bump: number): SeasonMembership;
|
|
110
138
|
/**
|
|
111
139
|
* Update Season after a user joins
|
|
112
140
|
* Mirrors the update from join_season.rs (lines 98-104)
|
|
@@ -197,7 +225,7 @@ export declare function updateMembershipForClaim(membership: SeasonMembership, r
|
|
|
197
225
|
* @param referredUser - The user who missed the window
|
|
198
226
|
* @param seasonNumber - Season number
|
|
199
227
|
* @param windowNumber - Window number
|
|
200
|
-
* @param
|
|
228
|
+
* @param tier - Tier number (1..=5)
|
|
201
229
|
* @param claimant - Referrer (or root admin if no referrer)
|
|
202
230
|
* @param perWindowPenalty - Tier penalty per window (base units)
|
|
203
231
|
* @param claimedAt - Unix timestamp in seconds (i64 on-chain, represented as BN in SDK)
|
|
@@ -206,7 +234,7 @@ export declare function initializeReferralPenaltyClaim(params: {
|
|
|
206
234
|
referredUser: PublicKey;
|
|
207
235
|
seasonNumber: BN;
|
|
208
236
|
windowNumber: BN;
|
|
209
|
-
|
|
237
|
+
tier: number;
|
|
210
238
|
claimant: PublicKey;
|
|
211
239
|
perWindowPenalty: BN;
|
|
212
240
|
claimedAt?: BN;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getCurrentTimestamp = getCurrentTimestamp;
|
|
4
|
+
exports.expectedToBeLazyInitialized = expectedToBeLazyInitialized;
|
|
4
5
|
exports.createEmptyUserStats = createEmptyUserStats;
|
|
5
6
|
exports.initializeUserStats = initializeUserStats;
|
|
6
7
|
exports.updateUserStatsForMiztakeCreation = updateUserStatsForMiztakeCreation;
|
|
@@ -42,6 +43,55 @@ function getCurrentTimestamp(now) {
|
|
|
42
43
|
return now;
|
|
43
44
|
return new anchor_1.BN(Math.floor(Date.now() / 1000)); // Convert JS milliseconds → seconds
|
|
44
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Build the Season account object that is expected to be created by on-chain lazy initialization.
|
|
48
|
+
*
|
|
49
|
+
* This is a PURE helper (no RPC). It mirrors `season_helpers::initialize_season`:
|
|
50
|
+
* - `season_state = Active`
|
|
51
|
+
* - `started_at = current_time`
|
|
52
|
+
* - `ends_at = current_time + season_duration`
|
|
53
|
+
* - all counters and totals initialized to zero
|
|
54
|
+
* - schedule `eligible_stake_per_window` initialized to 21 zeros
|
|
55
|
+
* - PDA bump derived locally from seeds (no RPC)
|
|
56
|
+
*
|
|
57
|
+
* IMPORTANT:
|
|
58
|
+
* To match on-chain state exactly, you must supply the same `startedAt` that the transaction
|
|
59
|
+
* will observe on-chain (i.e. `Clock::get()?.unix_timestamp` at execution time) and the same
|
|
60
|
+
* season duration as stored in SeasonSettings at that moment. If you don't have settings locally,
|
|
61
|
+
* we fall back to the canonical defaults (7 days, 21 windows).
|
|
62
|
+
*/
|
|
63
|
+
function expectedToBeLazyInitialized(params) {
|
|
64
|
+
const seasonDuration = params.seasonSettings?.seasonDuration ?? new anchor_1.BN(604800); // 7 days
|
|
65
|
+
const totalWindows = params.seasonSettings?.totalWindowsPerSeason ?? 21;
|
|
66
|
+
// Derive bump seed locally (mirrors Anchor ctx.bumps.season).
|
|
67
|
+
const [, bump] = (0, pdas_1.getSeasonPda)(params.seasonNumber);
|
|
68
|
+
const lastSeasonEndsAt = params.seasonSettings?.lastSeasonEndsAt ?? new anchor_1.BN(0);
|
|
69
|
+
// If lastSeasonEndsAt is 0 (first season), use params.startedAt.
|
|
70
|
+
// Otherwise, use lastSeasonEndsAt exactly (gapless).
|
|
71
|
+
// Note: We ignore params.startedAt in the gapless case to match on-chain logic,
|
|
72
|
+
// but in practice the caller should ideally pass the correct gapless time.
|
|
73
|
+
const effectiveStartedAt = lastSeasonEndsAt.isZero()
|
|
74
|
+
? params.startedAt
|
|
75
|
+
: lastSeasonEndsAt;
|
|
76
|
+
return {
|
|
77
|
+
seasonNumber: params.seasonNumber,
|
|
78
|
+
seasonState: types_1.SeasonState.Active,
|
|
79
|
+
startedAt: effectiveStartedAt,
|
|
80
|
+
endsAt: effectiveStartedAt.add(seasonDuration),
|
|
81
|
+
totalWindows,
|
|
82
|
+
totalMembers: new anchor_1.BN(0),
|
|
83
|
+
copperMembersCount: new anchor_1.BN(0),
|
|
84
|
+
silverMembersCount: new anchor_1.BN(0),
|
|
85
|
+
goldMembersCount: new anchor_1.BN(0),
|
|
86
|
+
platinumMembersCount: new anchor_1.BN(0),
|
|
87
|
+
mithrilMembersCount: new anchor_1.BN(0),
|
|
88
|
+
eligibleStakePerWindow: Array.from({ length: 21 }, () => new anchor_1.BN(0)),
|
|
89
|
+
totalDepositsHeld: new anchor_1.BN(0),
|
|
90
|
+
totalSuccessfulPosts: new anchor_1.BN(0),
|
|
91
|
+
totalPenaltiesCollected: new anchor_1.BN(0),
|
|
92
|
+
bump,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
45
95
|
/**
|
|
46
96
|
* Create an empty/initialized UserStats object
|
|
47
97
|
* Used when initializing a new user stats account
|
|
@@ -135,17 +185,16 @@ function updateMiztakeStatisticsForCreation(statistics) {
|
|
|
135
185
|
* @param user - User's public key
|
|
136
186
|
* @param seasonNumber - Season number
|
|
137
187
|
* @param windowNumber - Window number
|
|
138
|
-
* @param
|
|
188
|
+
* @param tier - Tier number (1..=5)
|
|
139
189
|
* @param miztakeId - The miztake ID to associate
|
|
140
190
|
* @returns Initialized/Updated UserWindowParticipation object
|
|
141
191
|
*/
|
|
142
|
-
function initializeUserWindowParticipation(user, seasonNumber, windowNumber,
|
|
143
|
-
const [, bump] = (0, pdas_1.getUserWindowParticipationPda)(user,
|
|
192
|
+
function initializeUserWindowParticipation(user, seasonNumber, windowNumber, tier, miztakeId) {
|
|
193
|
+
const [, bump] = (0, pdas_1.getUserWindowParticipationPda)(seasonNumber, user, tier, windowNumber);
|
|
144
194
|
return {
|
|
145
195
|
user,
|
|
146
196
|
seasonNumber,
|
|
147
197
|
windowNumber,
|
|
148
|
-
seasonMembershipId,
|
|
149
198
|
postedSuccessfully: false,
|
|
150
199
|
claimedReward: false,
|
|
151
200
|
rewardAmount: new anchor_1.BN(0),
|
|
@@ -203,7 +252,7 @@ function updateMiztakeForSeasonUse(miztake, seasonNumber, windowNumber) {
|
|
|
203
252
|
* Mirrors the initialization from join_season.rs (lines 84-96)
|
|
204
253
|
*
|
|
205
254
|
* @param user - User's public key
|
|
206
|
-
* @param
|
|
255
|
+
* @param tier - Tier number (1..=5)
|
|
207
256
|
* @param seasonNumber - Season number
|
|
208
257
|
* @param depositTier - Tier chosen at join time
|
|
209
258
|
* @param depositAmount - Active deposit amount (participates in rewards/penalties)
|
|
@@ -212,9 +261,8 @@ function updateMiztakeForSeasonUse(miztake, seasonNumber, windowNumber) {
|
|
|
212
261
|
* @param joinedWindowNumber - Window number when joined
|
|
213
262
|
* @returns Initialized SeasonMembership object
|
|
214
263
|
*/
|
|
215
|
-
function initializeSeasonMembership(user,
|
|
264
|
+
function initializeSeasonMembership(user, seasonNumber, depositTier, referrer, depositAmount, depositEscrowedAmount, joinedAt, joinedWindowNumber, bump) {
|
|
216
265
|
return {
|
|
217
|
-
id: seasonMembershipId,
|
|
218
266
|
owner: user,
|
|
219
267
|
referrer,
|
|
220
268
|
seasonNumber,
|
|
@@ -481,20 +529,19 @@ function updateMembershipForClaim(membership, rewardAmount) {
|
|
|
481
529
|
* @param referredUser - The user who missed the window
|
|
482
530
|
* @param seasonNumber - Season number
|
|
483
531
|
* @param windowNumber - Window number
|
|
484
|
-
* @param
|
|
532
|
+
* @param tier - Tier number (1..=5)
|
|
485
533
|
* @param claimant - Referrer (or root admin if no referrer)
|
|
486
534
|
* @param perWindowPenalty - Tier penalty per window (base units)
|
|
487
535
|
* @param claimedAt - Unix timestamp in seconds (i64 on-chain, represented as BN in SDK)
|
|
488
536
|
*/
|
|
489
537
|
function initializeReferralPenaltyClaim(params) {
|
|
490
|
-
const [, bump] = (0, pdas_1.getReferralPenaltyClaimPda)(params.
|
|
538
|
+
const [, bump] = (0, pdas_1.getReferralPenaltyClaimPda)(params.seasonNumber, params.referredUser, params.tier, params.windowNumber);
|
|
491
539
|
const claimedAt = getCurrentTimestamp(params.claimedAt);
|
|
492
540
|
const amount = params.perWindowPenalty.muln(20).divn(100);
|
|
493
541
|
return {
|
|
494
542
|
referredUser: params.referredUser,
|
|
495
543
|
seasonNumber: params.seasonNumber,
|
|
496
544
|
windowNumber: params.windowNumber,
|
|
497
|
-
seasonMembershipId: params.seasonMembershipId,
|
|
498
545
|
claimant: params.claimant,
|
|
499
546
|
amount,
|
|
500
547
|
claimedAt,
|
|
@@ -7,7 +7,6 @@ export declare const ADMIN_PUBLIC_KEY: PublicKey;
|
|
|
7
7
|
export declare const MIZD_TOKEN_MINT: PublicKey;
|
|
8
8
|
export declare const DEFAULT_FEE_RECIPIENT: PublicKey;
|
|
9
9
|
export declare const MIZTAKE_STATISTICS_SEED = "miztake_statistics";
|
|
10
|
-
export declare const TOKEN_VAULT_SEED = "token_vault";
|
|
11
10
|
export declare const USER_STATS_SEED = "user_stats";
|
|
12
11
|
export declare const MIZTAKE_SEED = "miztake";
|
|
13
12
|
export declare const REFERRAL_PENALTY_CLAIM_SEED = "referral_penalty_claim";
|
package/dist/utils/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MIN_HASH_LENGTH = exports.MAX_USERNAME_LENGTH = exports.MAX_MAX_CLAIMABLE = exports.MIN_MAX_CLAIMABLE = exports.MAX_FEE = exports.MIN_FEE = exports.DEFAULT_MAX_CLAIMABLE = exports.DEFAULT_MIZTAKE_FEE = exports.REFERRAL_PENALTY_CLAIM_SEED = exports.MIZTAKE_SEED = exports.USER_STATS_SEED = exports.
|
|
3
|
+
exports.MIN_HASH_LENGTH = exports.MAX_USERNAME_LENGTH = exports.MAX_MAX_CLAIMABLE = exports.MIN_MAX_CLAIMABLE = exports.MAX_FEE = exports.MIN_FEE = exports.DEFAULT_MAX_CLAIMABLE = exports.DEFAULT_MIZTAKE_FEE = exports.REFERRAL_PENALTY_CLAIM_SEED = exports.MIZTAKE_SEED = exports.USER_STATS_SEED = exports.MIZTAKE_STATISTICS_SEED = exports.DEFAULT_FEE_RECIPIENT = exports.MIZD_TOKEN_MINT = exports.ADMIN_PUBLIC_KEY = exports.PROGRAM_ID = void 0;
|
|
4
4
|
const web3_js_1 = require("@solana/web3.js");
|
|
5
5
|
/**
|
|
6
6
|
* Proof of Miztake Program Constants
|
|
@@ -15,7 +15,6 @@ exports.MIZD_TOKEN_MINT = new web3_js_1.PublicKey("mizdS9fDNUKWZcXBeRhJoJQHJJmsT
|
|
|
15
15
|
exports.DEFAULT_FEE_RECIPIENT = new web3_js_1.PublicKey("Dkhu2VgGPfvXPVuohG2fPfryRacWMpNBJXvRGF1dhzUh");
|
|
16
16
|
// Seeds for PDAs
|
|
17
17
|
exports.MIZTAKE_STATISTICS_SEED = "miztake_statistics";
|
|
18
|
-
exports.TOKEN_VAULT_SEED = "token_vault";
|
|
19
18
|
exports.USER_STATS_SEED = "user_stats";
|
|
20
19
|
exports.MIZTAKE_SEED = "miztake";
|
|
21
20
|
exports.REFERRAL_PENALTY_CLAIM_SEED = "referral_penalty_claim";
|
|
@@ -13,8 +13,8 @@ export declare class PDAManager {
|
|
|
13
13
|
telegramId: BN;
|
|
14
14
|
seasonNumber: BN;
|
|
15
15
|
windowNumber: BN;
|
|
16
|
-
seasonMembershipId: BN;
|
|
17
16
|
user: PublicKey;
|
|
17
|
+
tier: number;
|
|
18
18
|
}): {
|
|
19
19
|
miztake: PublicKey;
|
|
20
20
|
userStats: PublicKey;
|
|
@@ -31,7 +31,7 @@ export declare class PDAManager {
|
|
|
31
31
|
static deriveJoinSeasonPdas(params: {
|
|
32
32
|
user: PublicKey;
|
|
33
33
|
seasonNumber: BN;
|
|
34
|
-
|
|
34
|
+
tier: number;
|
|
35
35
|
}): {
|
|
36
36
|
seasonSettings: PublicKey;
|
|
37
37
|
season: PublicKey;
|
|
@@ -46,7 +46,7 @@ export declare class PDAManager {
|
|
|
46
46
|
user: PublicKey;
|
|
47
47
|
seasonNumber: BN;
|
|
48
48
|
windowNumber: BN;
|
|
49
|
-
|
|
49
|
+
tier: number;
|
|
50
50
|
/** SHA-256 hex string (64 chars) */
|
|
51
51
|
miztakeShaHash: string;
|
|
52
52
|
}): {
|
|
@@ -64,7 +64,7 @@ export declare class PDAManager {
|
|
|
64
64
|
user: PublicKey;
|
|
65
65
|
seasonNumber: BN;
|
|
66
66
|
windowNumber: BN;
|
|
67
|
-
|
|
67
|
+
tier: number;
|
|
68
68
|
}): {
|
|
69
69
|
seasonSettings: PublicKey;
|
|
70
70
|
season: PublicKey;
|
|
@@ -79,7 +79,7 @@ export declare class PDAManager {
|
|
|
79
79
|
static deriveWithdrawDepositPdas(params: {
|
|
80
80
|
user: PublicKey;
|
|
81
81
|
seasonNumber: BN;
|
|
82
|
-
|
|
82
|
+
tier: number;
|
|
83
83
|
}): {
|
|
84
84
|
seasonSettings: PublicKey;
|
|
85
85
|
season: PublicKey;
|
|
@@ -94,7 +94,7 @@ export declare class PDAManager {
|
|
|
94
94
|
referredUser: PublicKey;
|
|
95
95
|
seasonNumber: BN;
|
|
96
96
|
windowNumber: BN;
|
|
97
|
-
|
|
97
|
+
tier: number;
|
|
98
98
|
}): {
|
|
99
99
|
seasonSettings: PublicKey;
|
|
100
100
|
season: PublicKey;
|
package/dist/utils/pdaManager.js
CHANGED
|
@@ -17,9 +17,9 @@ class PDAManager {
|
|
|
17
17
|
miztakeStatistics: (0, pdas_1.getMiztakeStatisticsPda)()[0],
|
|
18
18
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
19
19
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
20
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.
|
|
20
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
|
|
21
21
|
rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[0],
|
|
22
|
-
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.
|
|
22
|
+
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.user, params.tier, params.windowNumber)[0],
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
@@ -29,7 +29,7 @@ class PDAManager {
|
|
|
29
29
|
return {
|
|
30
30
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
31
31
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
32
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.
|
|
32
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
|
|
33
33
|
seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)()[0],
|
|
34
34
|
seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)()[0],
|
|
35
35
|
};
|
|
@@ -40,10 +40,10 @@ class PDAManager {
|
|
|
40
40
|
static deriveConfirmedPostPdas(params) {
|
|
41
41
|
return {
|
|
42
42
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
43
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.
|
|
43
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
|
|
44
44
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
45
45
|
rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[0],
|
|
46
|
-
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.
|
|
46
|
+
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.user, params.tier, params.windowNumber)[0],
|
|
47
47
|
miztake: (0, pdas_1.getMiztakePda)(params.miztakeShaHash)[0],
|
|
48
48
|
};
|
|
49
49
|
}
|
|
@@ -55,8 +55,8 @@ class PDAManager {
|
|
|
55
55
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
56
56
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
57
57
|
rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[0],
|
|
58
|
-
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.
|
|
59
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.
|
|
58
|
+
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.user, params.tier, params.windowNumber)[0],
|
|
59
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
|
|
60
60
|
seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)()[0],
|
|
61
61
|
};
|
|
62
62
|
}
|
|
@@ -67,7 +67,7 @@ class PDAManager {
|
|
|
67
67
|
return {
|
|
68
68
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
69
69
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
70
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.
|
|
70
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
|
|
71
71
|
seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)()[0],
|
|
72
72
|
seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)()[0],
|
|
73
73
|
};
|
|
@@ -79,9 +79,9 @@ class PDAManager {
|
|
|
79
79
|
return {
|
|
80
80
|
seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
|
|
81
81
|
season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
|
|
82
|
-
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.referredUser, params.
|
|
83
|
-
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.
|
|
84
|
-
referralPenaltyClaim: (0, pdas_1.getReferralPenaltyClaimPda)(params.
|
|
82
|
+
seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.referredUser, params.tier)[0],
|
|
83
|
+
userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.referredUser, params.tier, params.windowNumber)[0],
|
|
84
|
+
referralPenaltyClaim: (0, pdas_1.getReferralPenaltyClaimPda)(params.seasonNumber, params.referredUser, params.tier, params.windowNumber)[0],
|
|
85
85
|
seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)()[0],
|
|
86
86
|
};
|
|
87
87
|
}
|
package/dist/utils/pdas.d.ts
CHANGED
|
@@ -7,10 +7,6 @@ import { BN } from "@coral-xyz/anchor";
|
|
|
7
7
|
* Derive the MiztakeStatistics PDA
|
|
8
8
|
*/
|
|
9
9
|
export declare function getMiztakeStatisticsPda(): [PublicKey, number];
|
|
10
|
-
/**
|
|
11
|
-
* Derive the Token Vault PDA
|
|
12
|
-
*/
|
|
13
|
-
export declare function getTokenVaultPda(): [PublicKey, number];
|
|
14
10
|
/**
|
|
15
11
|
* Derive the UserStats PDA for a given telegram ID
|
|
16
12
|
* @param telegramId - The user's Telegram ID
|
|
@@ -32,10 +28,17 @@ export declare function getSeasonSettingsPda(): [PublicKey, number];
|
|
|
32
28
|
export declare function getSeasonPda(seasonNumber: BN): [PublicKey, number];
|
|
33
29
|
/**
|
|
34
30
|
* Derive the SeasonMembership PDA
|
|
31
|
+
* PDA model:
|
|
32
|
+
* seeds = ["season_membership", season_number_le_u64, user_pubkey_bytes, tier_u8]
|
|
33
|
+
*
|
|
34
|
+
* Tier mapping (u8):
|
|
35
|
+
* 1 = copper, 2 = silver, 3 = gold, 4 = platinum, 5 = mithril
|
|
36
|
+
*
|
|
37
|
+
* @param seasonNumber - The season number
|
|
35
38
|
* @param user - The user's public key
|
|
36
|
-
* @param
|
|
39
|
+
* @param tier - Tier number (1..=5)
|
|
37
40
|
*/
|
|
38
|
-
export declare function getSeasonMembershipPda(user: PublicKey,
|
|
41
|
+
export declare function getSeasonMembershipPda(seasonNumber: BN, user: PublicKey, tier: number): [PublicKey, number];
|
|
39
42
|
/**
|
|
40
43
|
* Derive the RewardWindow PDA
|
|
41
44
|
* @param seasonNumber - The season number
|
|
@@ -44,12 +47,15 @@ export declare function getSeasonMembershipPda(user: PublicKey, seasonMembership
|
|
|
44
47
|
export declare function getRewardWindowPda(seasonNumber: BN, windowNumber: BN): [PublicKey, number];
|
|
45
48
|
/**
|
|
46
49
|
* Derive the UserWindowParticipation PDA
|
|
47
|
-
*
|
|
50
|
+
* PDA model:
|
|
51
|
+
* seeds = ["user_window", season_number_le_u64, user_pubkey_bytes, tier_u8, window_number_le_u64]
|
|
52
|
+
*
|
|
48
53
|
* @param seasonNumber - The season number
|
|
54
|
+
* @param user - The user's public key
|
|
55
|
+
* @param tier - Tier number (1..=5)
|
|
49
56
|
* @param windowNumber - The window number
|
|
50
|
-
* @param seasonMembershipId - The membership ID
|
|
51
57
|
*/
|
|
52
|
-
export declare function getUserWindowParticipationPda(
|
|
58
|
+
export declare function getUserWindowParticipationPda(seasonNumber: BN, user: PublicKey, tier: number, windowNumber: BN): [PublicKey, number];
|
|
53
59
|
/**
|
|
54
60
|
* Derive the Season Deposit Vault PDA
|
|
55
61
|
*/
|
|
@@ -60,9 +66,12 @@ export declare function getSeasonDepositVaultPda(): [PublicKey, number];
|
|
|
60
66
|
export declare function getSeasonEscrowVaultPda(): [PublicKey, number];
|
|
61
67
|
/**
|
|
62
68
|
* Derive the ReferralPenaltyClaim PDA
|
|
63
|
-
*
|
|
69
|
+
* PDA model:
|
|
70
|
+
* seeds = ["referral_penalty_claim", season_number_le_u64, referred_user_pubkey_bytes, tier_u8, window_number_le_u64]
|
|
71
|
+
*
|
|
64
72
|
* @param seasonNumber - The season number
|
|
73
|
+
* @param referredUser - The referred user's public key (the user who missed)
|
|
74
|
+
* @param tier - Tier number (1..=5)
|
|
65
75
|
* @param windowNumber - The window number
|
|
66
|
-
* @param seasonMembershipId - The referred user's membership id
|
|
67
76
|
*/
|
|
68
|
-
export declare function getReferralPenaltyClaimPda(
|
|
77
|
+
export declare function getReferralPenaltyClaimPda(seasonNumber: BN, referredUser: PublicKey, tier: number, windowNumber: BN): [PublicKey, number];
|
package/dist/utils/pdas.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getMiztakeStatisticsPda = getMiztakeStatisticsPda;
|
|
4
|
-
exports.getTokenVaultPda = getTokenVaultPda;
|
|
5
4
|
exports.getUserStatsPda = getUserStatsPda;
|
|
6
5
|
exports.getMiztakePda = getMiztakePda;
|
|
7
6
|
exports.getSeasonSettingsPda = getSeasonSettingsPda;
|
|
@@ -24,12 +23,6 @@ const conversions_1 = require("./conversions");
|
|
|
24
23
|
function getMiztakeStatisticsPda() {
|
|
25
24
|
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.MIZTAKE_STATISTICS_SEED)], constants_1.PROGRAM_ID);
|
|
26
25
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Derive the Token Vault PDA
|
|
29
|
-
*/
|
|
30
|
-
function getTokenVaultPda() {
|
|
31
|
-
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_VAULT_SEED)], constants_1.PROGRAM_ID);
|
|
32
|
-
}
|
|
33
26
|
/**
|
|
34
27
|
* Derive the UserStats PDA for a given telegram ID
|
|
35
28
|
* @param telegramId - The user's Telegram ID
|
|
@@ -60,14 +53,25 @@ function getSeasonPda(seasonNumber) {
|
|
|
60
53
|
}
|
|
61
54
|
/**
|
|
62
55
|
* Derive the SeasonMembership PDA
|
|
56
|
+
* PDA model:
|
|
57
|
+
* seeds = ["season_membership", season_number_le_u64, user_pubkey_bytes, tier_u8]
|
|
58
|
+
*
|
|
59
|
+
* Tier mapping (u8):
|
|
60
|
+
* 1 = copper, 2 = silver, 3 = gold, 4 = platinum, 5 = mithril
|
|
61
|
+
*
|
|
62
|
+
* @param seasonNumber - The season number
|
|
63
63
|
* @param user - The user's public key
|
|
64
|
-
* @param
|
|
64
|
+
* @param tier - Tier number (1..=5)
|
|
65
65
|
*/
|
|
66
|
-
function getSeasonMembershipPda(user,
|
|
66
|
+
function getSeasonMembershipPda(seasonNumber, user, tier) {
|
|
67
|
+
if (!Number.isInteger(tier) || tier < 1 || tier > 5) {
|
|
68
|
+
throw new Error("Invalid tier: must be an integer between 1 and 5");
|
|
69
|
+
}
|
|
67
70
|
return web3_js_1.PublicKey.findProgramAddressSync([
|
|
68
71
|
Buffer.from("season_membership"),
|
|
72
|
+
seasonNumber.toArrayLike(Buffer, "le", 8),
|
|
69
73
|
user.toBuffer(),
|
|
70
|
-
|
|
74
|
+
Buffer.from([tier]),
|
|
71
75
|
], constants_1.PROGRAM_ID);
|
|
72
76
|
}
|
|
73
77
|
/**
|
|
@@ -84,18 +88,24 @@ function getRewardWindowPda(seasonNumber, windowNumber) {
|
|
|
84
88
|
}
|
|
85
89
|
/**
|
|
86
90
|
* Derive the UserWindowParticipation PDA
|
|
87
|
-
*
|
|
91
|
+
* PDA model:
|
|
92
|
+
* seeds = ["user_window", season_number_le_u64, user_pubkey_bytes, tier_u8, window_number_le_u64]
|
|
93
|
+
*
|
|
88
94
|
* @param seasonNumber - The season number
|
|
95
|
+
* @param user - The user's public key
|
|
96
|
+
* @param tier - Tier number (1..=5)
|
|
89
97
|
* @param windowNumber - The window number
|
|
90
|
-
* @param seasonMembershipId - The membership ID
|
|
91
98
|
*/
|
|
92
|
-
function getUserWindowParticipationPda(user,
|
|
99
|
+
function getUserWindowParticipationPda(seasonNumber, user, tier, windowNumber) {
|
|
100
|
+
if (!Number.isInteger(tier) || tier < 1 || tier > 5) {
|
|
101
|
+
throw new Error("Invalid tier: must be an integer between 1 and 5");
|
|
102
|
+
}
|
|
93
103
|
return web3_js_1.PublicKey.findProgramAddressSync([
|
|
94
104
|
Buffer.from("user_window"),
|
|
95
|
-
user.toBuffer(),
|
|
96
105
|
seasonNumber.toArrayLike(Buffer, "le", 8),
|
|
106
|
+
user.toBuffer(),
|
|
107
|
+
Buffer.from([tier]),
|
|
97
108
|
windowNumber.toArrayLike(Buffer, "le", 8),
|
|
98
|
-
seasonMembershipId.toArrayLike(Buffer, "le", 8),
|
|
99
109
|
], constants_1.PROGRAM_ID);
|
|
100
110
|
}
|
|
101
111
|
/**
|
|
@@ -112,17 +122,23 @@ function getSeasonEscrowVaultPda() {
|
|
|
112
122
|
}
|
|
113
123
|
/**
|
|
114
124
|
* Derive the ReferralPenaltyClaim PDA
|
|
115
|
-
*
|
|
125
|
+
* PDA model:
|
|
126
|
+
* seeds = ["referral_penalty_claim", season_number_le_u64, referred_user_pubkey_bytes, tier_u8, window_number_le_u64]
|
|
127
|
+
*
|
|
116
128
|
* @param seasonNumber - The season number
|
|
129
|
+
* @param referredUser - The referred user's public key (the user who missed)
|
|
130
|
+
* @param tier - Tier number (1..=5)
|
|
117
131
|
* @param windowNumber - The window number
|
|
118
|
-
* @param seasonMembershipId - The referred user's membership id
|
|
119
132
|
*/
|
|
120
|
-
function getReferralPenaltyClaimPda(referredUser,
|
|
133
|
+
function getReferralPenaltyClaimPda(seasonNumber, referredUser, tier, windowNumber) {
|
|
134
|
+
if (!Number.isInteger(tier) || tier < 1 || tier > 5) {
|
|
135
|
+
throw new Error("Invalid tier: must be an integer between 1 and 5");
|
|
136
|
+
}
|
|
121
137
|
return web3_js_1.PublicKey.findProgramAddressSync([
|
|
122
138
|
Buffer.from(constants_1.REFERRAL_PENALTY_CLAIM_SEED),
|
|
123
|
-
referredUser.toBuffer(),
|
|
124
139
|
seasonNumber.toArrayLike(Buffer, "le", 8),
|
|
140
|
+
referredUser.toBuffer(),
|
|
141
|
+
Buffer.from([tier]),
|
|
125
142
|
windowNumber.toArrayLike(Buffer, "le", 8),
|
|
126
|
-
seasonMembershipId.toArrayLike(Buffer, "le", 8),
|
|
127
143
|
], constants_1.PROGRAM_ID);
|
|
128
144
|
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { BN } from "@coral-xyz/anchor";
|
|
2
2
|
import { SeasonDepositTier } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Validate and normalize a tier number (1..=5).
|
|
5
|
+
*/
|
|
6
|
+
export declare function assertValidTierNumber(tier: number): number;
|
|
7
|
+
/**
|
|
8
|
+
* Convert numeric tier (1..=5) to the Anchor enum representation.
|
|
9
|
+
*/
|
|
10
|
+
export declare function tierNumberToDepositTier(tier: number): SeasonDepositTier;
|
|
3
11
|
/**
|
|
4
12
|
* Tier-based per-window penalty amount (base units, 7 decimals).
|
|
5
13
|
*
|
|
@@ -1,7 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertValidTierNumber = assertValidTierNumber;
|
|
4
|
+
exports.tierNumberToDepositTier = tierNumberToDepositTier;
|
|
3
5
|
exports.getTierPenaltyPerWindow = getTierPenaltyPerWindow;
|
|
4
6
|
const anchor_1 = require("@coral-xyz/anchor");
|
|
7
|
+
/**
|
|
8
|
+
* Validate and normalize a tier number (1..=5).
|
|
9
|
+
*/
|
|
10
|
+
function assertValidTierNumber(tier) {
|
|
11
|
+
if (!Number.isInteger(tier) || tier < 1 || tier > 5) {
|
|
12
|
+
throw new Error("Invalid tier: must be an integer between 1 and 5");
|
|
13
|
+
}
|
|
14
|
+
return tier;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convert numeric tier (1..=5) to the Anchor enum representation.
|
|
18
|
+
*/
|
|
19
|
+
function tierNumberToDepositTier(tier) {
|
|
20
|
+
switch (assertValidTierNumber(tier)) {
|
|
21
|
+
case 1:
|
|
22
|
+
return { copper: {} };
|
|
23
|
+
case 2:
|
|
24
|
+
return { silver: {} };
|
|
25
|
+
case 3:
|
|
26
|
+
return { gold: {} };
|
|
27
|
+
case 4:
|
|
28
|
+
return { platinum: {} };
|
|
29
|
+
case 5:
|
|
30
|
+
return { mithril: {} };
|
|
31
|
+
}
|
|
32
|
+
// unreachable
|
|
33
|
+
throw new Error("Invalid tier");
|
|
34
|
+
}
|
|
5
35
|
/**
|
|
6
36
|
* Tier-based per-window penalty amount (base units, 7 decimals).
|
|
7
37
|
*
|
package/package.json
CHANGED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Connection } from "@solana/web3.js";
|
|
2
|
-
import { BN } from "@coral-xyz/anchor";
|
|
3
|
-
/**
|
|
4
|
-
* Get the token vault account information
|
|
5
|
-
*
|
|
6
|
-
* @param connection - Solana connection
|
|
7
|
-
* @returns Token vault account data
|
|
8
|
-
*/
|
|
9
|
-
export declare function getTokenVault(connection: Connection): Promise<{
|
|
10
|
-
address: import("@solana/web3.js").PublicKey;
|
|
11
|
-
data: {
|
|
12
|
-
mint: import("@solana/web3.js").PublicKey;
|
|
13
|
-
owner: import("@solana/web3.js").PublicKey;
|
|
14
|
-
amount: any;
|
|
15
|
-
delegate: import("@solana/web3.js").PublicKey;
|
|
16
|
-
delegatedAmount: bigint;
|
|
17
|
-
isInitialized: boolean;
|
|
18
|
-
isFrozen: boolean;
|
|
19
|
-
isNative: boolean;
|
|
20
|
-
closeAuthority: import("@solana/web3.js").PublicKey;
|
|
21
|
-
};
|
|
22
|
-
}>;
|
|
23
|
-
/**
|
|
24
|
-
* Check if token vault is initialized
|
|
25
|
-
*/
|
|
26
|
-
export declare function isVaultInitialized(connection: Connection): Promise<boolean>;
|
|
27
|
-
/**
|
|
28
|
-
* Get vault balance (amount of MIZD tokens in vault)
|
|
29
|
-
*/
|
|
30
|
-
export declare function getVaultTokenBalance(connection: Connection): Promise<BN>;
|