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.
Files changed (34) hide show
  1. package/dist/getters/index.d.ts +0 -1
  2. package/dist/getters/index.js +0 -1
  3. package/dist/idl/proof_of_take.json +54 -458
  4. package/dist/instructions/claimReferralPenaltyForWindow.d.ts +2 -1
  5. package/dist/instructions/claimReferralPenaltyForWindow.js +4 -4
  6. package/dist/instructions/claimWindowRewards.d.ts +2 -1
  7. package/dist/instructions/claimWindowRewards.js +2 -2
  8. package/dist/instructions/confirmedPostOnX.d.ts +3 -1
  9. package/dist/instructions/confirmedPostOnX.js +4 -10
  10. package/dist/instructions/createMiztake.d.ts +3 -2
  11. package/dist/instructions/createMiztake.js +5 -5
  12. package/dist/instructions/joinSeason.d.ts +3 -3
  13. package/dist/instructions/joinSeason.js +9 -20
  14. package/dist/instructions/viewSeasonMembershipStatus.d.ts +2 -2
  15. package/dist/instructions/viewSeasonMembershipStatus.js +3 -3
  16. package/dist/instructions/withdrawSeasonDeposit.d.ts +3 -1
  17. package/dist/instructions/withdrawSeasonDeposit.js +3 -7
  18. package/dist/optimistic/index.d.ts +1 -1
  19. package/dist/optimistic/index.js +2 -1
  20. package/dist/types/proof_of_take.d.ts +43 -447
  21. package/dist/types.d.ts +0 -3
  22. package/dist/utils/accountUpdates.d.ts +34 -6
  23. package/dist/utils/accountUpdates.js +57 -10
  24. package/dist/utils/constants.d.ts +0 -1
  25. package/dist/utils/constants.js +1 -2
  26. package/dist/utils/pdaManager.d.ts +6 -6
  27. package/dist/utils/pdaManager.js +11 -11
  28. package/dist/utils/pdas.d.ts +21 -12
  29. package/dist/utils/pdas.js +36 -20
  30. package/dist/utils/tierPenalty.d.ts +8 -0
  31. package/dist/utils/tierPenalty.js +30 -0
  32. package/package.json +1 -1
  33. package/dist/getters/getTokenVault.d.ts +0 -30
  34. 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 seasonMembershipId - Season membership ID
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, seasonMembershipId: BN, miztakeId: BN): UserWindowParticipation;
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 seasonMembershipId - Membership ID
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, seasonMembershipId: BN, seasonNumber: BN, depositTier: SeasonDepositTier, referrer: PublicKey, depositAmount: BN, depositEscrowedAmount: BN, joinedAt: BN, joinedWindowNumber: BN, bump: number): SeasonMembership;
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 seasonMembershipId - Referred user's membership id
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
- seasonMembershipId: BN;
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 seasonMembershipId - Season membership ID
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, seasonMembershipId, miztakeId) {
143
- const [, bump] = (0, pdas_1.getUserWindowParticipationPda)(user, seasonNumber, windowNumber, seasonMembershipId);
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 seasonMembershipId - Membership ID
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, seasonMembershipId, seasonNumber, depositTier, referrer, depositAmount, depositEscrowedAmount, joinedAt, joinedWindowNumber, bump) {
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 seasonMembershipId - Referred user's membership id
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.referredUser, params.seasonNumber, params.windowNumber, params.seasonMembershipId);
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";
@@ -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.TOKEN_VAULT_SEED = exports.MIZTAKE_STATISTICS_SEED = exports.DEFAULT_FEE_RECIPIENT = exports.MIZD_TOKEN_MINT = exports.ADMIN_PUBLIC_KEY = exports.PROGRAM_ID = void 0;
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
- seasonMembershipId: BN;
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
- seasonMembershipId: BN;
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
- seasonMembershipId: BN;
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
- seasonMembershipId: BN;
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
- referredSeasonMembershipId: BN;
97
+ tier: number;
98
98
  }): {
99
99
  seasonSettings: PublicKey;
100
100
  season: PublicKey;
@@ -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.seasonMembershipId)[0],
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.user, params.seasonNumber, params.windowNumber, params.seasonMembershipId)[0],
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.seasonMembershipId)[0],
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.seasonMembershipId)[0],
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.user, params.seasonNumber, params.windowNumber, params.seasonMembershipId)[0],
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.user, params.seasonNumber, params.windowNumber, params.seasonMembershipId)[0],
59
- seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.user, params.seasonMembershipId)[0],
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.seasonMembershipId)[0],
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.referredSeasonMembershipId)[0],
83
- userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.referredUser, params.seasonNumber, params.windowNumber, params.referredSeasonMembershipId)[0],
84
- referralPenaltyClaim: (0, pdas_1.getReferralPenaltyClaimPda)(params.referredUser, params.seasonNumber, params.windowNumber, params.referredSeasonMembershipId)[0],
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
  }
@@ -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 seasonMembershipId - The membership ID
39
+ * @param tier - Tier number (1..=5)
37
40
  */
38
- export declare function getSeasonMembershipPda(user: PublicKey, seasonMembershipId: BN): [PublicKey, number];
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
- * @param user - The user's public key
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(user: PublicKey, seasonNumber: BN, windowNumber: BN, seasonMembershipId: BN): [PublicKey, number];
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
- * @param referredUser - The referred user's public key (the user who missed)
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(referredUser: PublicKey, seasonNumber: BN, windowNumber: BN, seasonMembershipId: BN): [PublicKey, number];
77
+ export declare function getReferralPenaltyClaimPda(seasonNumber: BN, referredUser: PublicKey, tier: number, windowNumber: BN): [PublicKey, number];
@@ -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 seasonMembershipId - The membership ID
64
+ * @param tier - Tier number (1..=5)
65
65
  */
66
- function getSeasonMembershipPda(user, seasonMembershipId) {
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
- seasonMembershipId.toArrayLike(Buffer, "le", 8),
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
- * @param user - The user's public key
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, seasonNumber, windowNumber, seasonMembershipId) {
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
- * @param referredUser - The referred user's public key (the user who missed)
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, seasonNumber, windowNumber, seasonMembershipId) {
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,6 +1,6 @@
1
1
  {
2
2
  "name": "proof-of-take-sdk",
3
- "version": "1.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "TypeScript SDK for Proof of Take Solana program",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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>;