proof-of-take-sdk 3.0.0 → 3.0.2

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 (79) hide show
  1. package/dist/client.js +3 -3
  2. package/dist/getters/getMiztake.d.ts +2 -2
  3. package/dist/getters/getMiztake.js +2 -15
  4. package/dist/getters/getMiztakeStatistics.js +2 -2
  5. package/dist/getters/getReferralPenaltyClaim.d.ts +9 -0
  6. package/dist/getters/getReferralPenaltyClaim.js +20 -0
  7. package/dist/getters/getRewardWindow.d.ts +9 -0
  8. package/dist/getters/getRewardWindow.js +20 -0
  9. package/dist/getters/getSeason.d.ts +8 -0
  10. package/dist/getters/getSeason.js +20 -0
  11. package/dist/getters/getSeasonMembership.d.ts +9 -0
  12. package/dist/getters/getSeasonMembership.js +18 -0
  13. package/dist/getters/getSeasonSettings.d.ts +8 -0
  14. package/dist/getters/getSeasonSettings.js +18 -0
  15. package/dist/getters/getUserStats.js +3 -10
  16. package/dist/getters/getUserWindowParticipation.d.ts +9 -0
  17. package/dist/getters/getUserWindowParticipation.js +20 -0
  18. package/dist/getters/index.d.ts +6 -0
  19. package/dist/getters/index.js +6 -0
  20. package/dist/idl/idl.d.ts +5 -0
  21. package/dist/idl/idl.js +5 -1
  22. package/dist/idl/proof_of_take.json +32 -0
  23. package/dist/index.d.ts +7 -1
  24. package/dist/index.js +10 -2
  25. package/dist/instructions/claimReferralPenaltyForWindow.d.ts +17 -14
  26. package/dist/instructions/claimReferralPenaltyForWindow.js +7 -4
  27. package/dist/instructions/claimWindowRewards.d.ts +14 -10
  28. package/dist/instructions/claimWindowRewards.js +6 -3
  29. package/dist/instructions/closeAuxiliaryAccounts.d.ts +8 -26
  30. package/dist/instructions/confirmedPostOnX.d.ts +14 -11
  31. package/dist/instructions/confirmedPostOnX.js +8 -3
  32. package/dist/instructions/createMiztake.d.ts +25 -28
  33. package/dist/instructions/createMiztake.js +12 -9
  34. package/dist/instructions/initializeEscrowVault.d.ts +5 -9
  35. package/dist/instructions/initializeSeasonSettings.d.ts +5 -9
  36. package/dist/instructions/initializeSeasonVault.d.ts +5 -9
  37. package/dist/instructions/initializeStatistics.d.ts +6 -7
  38. package/dist/instructions/initializeStatistics.js +12 -8
  39. package/dist/instructions/joinSeason.d.ts +18 -20
  40. package/dist/instructions/joinSeason.js +2 -1
  41. package/dist/instructions/toggleSeasonPause.d.ts +7 -9
  42. package/dist/instructions/toggleSeasonPause.js +1 -0
  43. package/dist/instructions/updateSeasonAdmin.d.ts +7 -9
  44. package/dist/instructions/updateSeasonAdmin.js +1 -0
  45. package/dist/instructions/viewSeasonMembershipStatus.d.ts +2 -2
  46. package/dist/instructions/viewWindowStatus.d.ts +2 -2
  47. package/dist/instructions/viewWindowStatus.js +3 -1
  48. package/dist/instructions/withdrawSeasonDeposit.d.ts +2 -2
  49. package/dist/types/anchorAccounts.d.ts +18 -0
  50. package/dist/types/anchorAccounts.js +2 -0
  51. package/dist/types/anchorViews.d.ts +11 -0
  52. package/dist/types/anchorViews.js +2 -0
  53. package/dist/types/instructionResults.d.ts +18 -19
  54. package/dist/types/proof_of_take.d.ts +32 -0
  55. package/dist/types.d.ts +53 -5
  56. package/dist/utils/accountConverters.d.ts +19 -0
  57. package/dist/utils/accountConverters.js +153 -0
  58. package/dist/utils/accountUpdates.d.ts +3 -3
  59. package/dist/utils/accountUpdates.js +40 -31
  60. package/dist/utils/conversions.d.ts +21 -1
  61. package/dist/utils/conversions.js +57 -9
  62. package/dist/utils/depositTier.d.ts +3 -0
  63. package/dist/utils/depositTier.js +21 -0
  64. package/dist/utils/enumHelpers.d.ts +5 -13
  65. package/dist/utils/enumHelpers.js +8 -0
  66. package/dist/utils/fetchAccount.d.ts +11 -0
  67. package/dist/utils/fetchAccount.js +23 -0
  68. package/dist/utils/index.js +1 -0
  69. package/dist/utils/pdaManager.d.ts +15 -14
  70. package/dist/utils/pdaManager.js +33 -26
  71. package/dist/utils/pdas.d.ts +9 -8
  72. package/dist/utils/pdas.js +24 -20
  73. package/dist/utils/programHelpers.js +1 -1
  74. package/dist/utils/signerHelpers.d.ts +2 -1
  75. package/dist/utils/simulationHelpers.js +7 -6
  76. package/dist/utils/tierPenalty.d.ts +2 -2
  77. package/dist/utils/tierPenalty.js +13 -11
  78. package/dist/utils/transactionBuilder.js +9 -7
  79. package/package.json +1 -1
@@ -2,7 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bnToU64 = bnToU64;
4
4
  exports.bnToU64Safe = bnToU64Safe;
5
+ exports.toSha256HexString = toSha256HexString;
6
+ exports.isSha256HexString = isSha256HexString;
5
7
  exports.sha256HexToBytes32 = sha256HexToBytes32;
8
+ exports.assertWindowIndex = assertWindowIndex;
9
+ exports.toWindowNumberBn = toWindowNumberBn;
10
+ exports.toEligibleStakePerWindow = toEligibleStakePerWindow;
11
+ exports.toSeasonNumberBn = toSeasonNumberBn;
6
12
  const anchor_1 = require("@coral-xyz/anchor");
7
13
  /**
8
14
  * Safely convert BN to number for u64 fields
@@ -31,23 +37,65 @@ function bnToU64Safe(bn) {
31
37
  }
32
38
  return bn.toNumber();
33
39
  }
34
- /**
35
- * Convert a 64-char SHA-256 hex string to a 32-byte Uint8Array.
36
- *
37
- * IMPORTANT: The on-chain program uses the raw 32-byte digest as PDA seed
38
- * (`seeds = [b\"miztake\", sha_hash_bytes]`), NOT the ASCII prefix of the hex string.
39
- */
40
- function sha256HexToBytes32(shaHex) {
40
+ function toSha256HexString(shaHex) {
41
41
  if (typeof shaHex !== "string") {
42
- throw new Error("sha256HexToBytes32: shaHex must be a string");
42
+ throw new Error("toSha256HexString: shaHex must be a string");
43
43
  }
44
44
  const normalized = shaHex.toLowerCase();
45
45
  if (!/^[0-9a-f]{64}$/.test(normalized)) {
46
- throw new Error("sha256HexToBytes32: expected 64-char lowercase hex string");
46
+ throw new Error("toSha256HexString: expected 64-char hex string");
47
47
  }
48
+ return normalized;
49
+ }
50
+ function isSha256HexString(value) {
51
+ return (typeof value === "string" &&
52
+ /^[0-9a-f]{64}$/.test(value.toLowerCase()));
53
+ }
54
+ function sha256HexToBytes32(shaHex) {
55
+ const normalized = typeof shaHex === "string" ? toSha256HexString(shaHex) : shaHex;
48
56
  const buf = Buffer.from(normalized, "hex");
49
57
  if (buf.length !== 32) {
50
58
  throw new Error("sha256HexToBytes32: decoded length != 32");
51
59
  }
52
60
  return new Uint8Array(buf);
53
61
  }
62
+ /**
63
+ * Validate a window index (0..20).
64
+ * Accepts BN (u64) or number; returns a narrowed WindowIndex.
65
+ */
66
+ function assertWindowIndex(value) {
67
+ const n = typeof value === "number"
68
+ ? value
69
+ : value.toNumber(); // safe: window index is small in this program
70
+ if (!Number.isInteger(n) || n < 0 || n > 20) {
71
+ throw new Error("Invalid window index: must be an integer between 0 and 20");
72
+ }
73
+ return n;
74
+ }
75
+ /**
76
+ * Normalize a window number-like input to BN and validate it's within 0..20.
77
+ */
78
+ function toWindowNumberBn(value) {
79
+ const bn = typeof value === "number" ? new anchor_1.BN(value) : value;
80
+ assertWindowIndex(bn);
81
+ return bn;
82
+ }
83
+ /**
84
+ * Runtime check + safe cast for the on-chain `[u64; 21]` schedule.
85
+ *
86
+ * This avoids `as unknown as ...` casts at call sites.
87
+ */
88
+ function toEligibleStakePerWindow(value) {
89
+ if (value.length !== 21) {
90
+ throw new Error(`Invalid eligibleStakePerWindow length: expected 21, got ${value.length}`);
91
+ }
92
+ // We intentionally cast after validation.
93
+ return value;
94
+ }
95
+ function toSeasonNumberBn(value) {
96
+ const bn = typeof value === "number" ? new anchor_1.BN(value) : value;
97
+ if (bn.isNeg()) {
98
+ throw new Error("Invalid season number: must be >= 0");
99
+ }
100
+ return bn;
101
+ }
@@ -0,0 +1,3 @@
1
+ import { DepositTierName, SeasonDepositTier } from "../types";
2
+ export declare function getDepositTierName(tier: SeasonDepositTier): DepositTierName;
3
+ export declare function isDepositTier(tier: SeasonDepositTier, name: DepositTierName): boolean;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDepositTierName = getDepositTierName;
4
+ exports.isDepositTier = isDepositTier;
5
+ function getDepositTierName(tier) {
6
+ if ("copper" in tier)
7
+ return "copper";
8
+ if ("silver" in tier)
9
+ return "silver";
10
+ if ("gold" in tier)
11
+ return "gold";
12
+ if ("platinum" in tier)
13
+ return "platinum";
14
+ if ("mithril" in tier)
15
+ return "mithril";
16
+ // Exhaustiveness fallback (should be unreachable if SeasonDepositTier stays in sync)
17
+ throw new Error("Unknown depositTier");
18
+ }
19
+ function isDepositTier(tier, name) {
20
+ return getDepositTierName(tier) === name;
21
+ }
@@ -1,4 +1,4 @@
1
- import { SeasonState, WindowState } from "../types";
1
+ import { SeasonState, WindowState, SeasonStateLike, WindowStateLike } from "../types";
2
2
  /**
3
3
  * Enum helper utilities
4
4
  *
@@ -22,9 +22,7 @@ import { SeasonState, WindowState } from "../types";
22
22
  * isSeasonState({ active: {} }, SeasonState.Active) // Anchor object
23
23
  * ```
24
24
  */
25
- export declare function isSeasonState(state: SeasonState | {
26
- [key: string]: {};
27
- } | number, variant: SeasonState): boolean;
25
+ export declare function isSeasonState(state: SeasonStateLike, variant: SeasonState): boolean;
28
26
  /**
29
27
  * Check if a WindowState matches a specific variant
30
28
  *
@@ -40,24 +38,18 @@ export declare function isSeasonState(state: SeasonState | {
40
38
  * isWindowState({ finalized: {} }, WindowState.Finalized)
41
39
  * ```
42
40
  */
43
- export declare function isWindowState(state: WindowState | {
44
- [key: string]: {};
45
- } | number, variant: WindowState): boolean;
41
+ export declare function isWindowState(state: WindowStateLike, variant: WindowState): boolean;
46
42
  /**
47
43
  * Normalize SeasonState to numeric format
48
44
  *
49
45
  * @param state - Season state in any format
50
46
  * @returns Numeric representation (0=Uninitialized, 1=Active, 2=Ended)
51
47
  */
52
- export declare function normalizeSeasonState(state: SeasonState | {
53
- [key: string]: {};
54
- } | number): number;
48
+ export declare function normalizeSeasonState(state: SeasonStateLike): number;
55
49
  /**
56
50
  * Normalize WindowState to numeric format
57
51
  *
58
52
  * @param state - Window state in any format
59
53
  * @returns Numeric representation (0=Uninitialized, 1=Active, 2=Finalized)
60
54
  */
61
- export declare function normalizeWindowState(state: WindowState | {
62
- [key: string]: {};
63
- } | number): number;
55
+ export declare function normalizeWindowState(state: WindowStateLike): number;
@@ -39,6 +39,8 @@ function isSeasonState(state, variant) {
39
39
  // Check if value is Anchor object format
40
40
  if (typeof state === "object" && state !== null && !Array.isArray(state)) {
41
41
  const key = Object.keys(state)[0];
42
+ if (!key)
43
+ return false;
42
44
  return key === variantName;
43
45
  }
44
46
  // Otherwise compare numeric values
@@ -68,6 +70,8 @@ function isWindowState(state, variant) {
68
70
  const variantName = variantMap[variant];
69
71
  if (typeof state === "object" && state !== null && !Array.isArray(state)) {
70
72
  const key = Object.keys(state)[0];
73
+ if (!key)
74
+ return false;
71
75
  return key === variantName;
72
76
  }
73
77
  return state === variant;
@@ -86,6 +90,8 @@ function normalizeSeasonState(state) {
86
90
  };
87
91
  if (typeof state === "object" && state !== null && !Array.isArray(state)) {
88
92
  const key = Object.keys(state)[0];
93
+ if (!key)
94
+ return -1;
89
95
  return map[key] ?? -1;
90
96
  }
91
97
  return state;
@@ -104,6 +110,8 @@ function normalizeWindowState(state) {
104
110
  };
105
111
  if (typeof state === "object" && state !== null && !Array.isArray(state)) {
106
112
  const key = Object.keys(state)[0];
113
+ if (!key)
114
+ return -1;
107
115
  return map[key] ?? -1;
108
116
  }
109
117
  return state;
@@ -0,0 +1,11 @@
1
+ import type { Program } from "@coral-xyz/anchor";
2
+ import type { PublicKey } from "@solana/web3.js";
3
+ /**
4
+ * Typed fetch helper: returns null if the account does not exist / can't be decoded.
5
+ * Keeps callers out of try/catch ladders.
6
+ */
7
+ export declare function fetchAccountOrNull<T>(fetcher: (address: PublicKey) => Promise<T>, address: PublicKey): Promise<T | null>;
8
+ /**
9
+ * Convenience wrapper for Anchor `program.account.<name>.fetch`.
10
+ */
11
+ export declare function fetchProgramAccountOrNull<T>(program: Program, fetcher: (address: PublicKey) => Promise<T>, address: PublicKey): Promise<T | null>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAccountOrNull = fetchAccountOrNull;
4
+ exports.fetchProgramAccountOrNull = fetchProgramAccountOrNull;
5
+ /**
6
+ * Typed fetch helper: returns null if the account does not exist / can't be decoded.
7
+ * Keeps callers out of try/catch ladders.
8
+ */
9
+ async function fetchAccountOrNull(fetcher, address) {
10
+ try {
11
+ return await fetcher(address);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ /**
18
+ * Convenience wrapper for Anchor `program.account.<name>.fetch`.
19
+ */
20
+ async function fetchProgramAccountOrNull(program, fetcher, address) {
21
+ void program; // keeps signature stable if we want to extend later
22
+ return await fetchAccountOrNull(fetcher, address);
23
+ }
@@ -1,2 +1,3 @@
1
+ "use strict";
1
2
  // Utility exports
2
3
  // No additional utility exports needed - all utilities are exported directly from index.ts
@@ -1,5 +1,6 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
2
  import { BN } from "@coral-xyz/anchor";
3
+ import type { SeasonNumberLike, Sha256HexString, TierNumber } from "../types";
3
4
  /**
4
5
  * PDA Manager for deriving related PDAs together
5
6
  * Reduces boilerplate in instruction files
@@ -9,12 +10,12 @@ export declare class PDAManager {
9
10
  * Derive all PDAs needed for create_miztake instruction
10
11
  */
11
12
  static deriveMiztakePdas(params: {
12
- shaHash: string;
13
+ shaHash: Sha256HexString | string;
13
14
  telegramId: BN;
14
- seasonNumber: BN;
15
+ seasonNumber: SeasonNumberLike;
15
16
  windowNumber: BN;
16
17
  user: PublicKey;
17
- tier: number;
18
+ tier: TierNumber;
18
19
  }): {
19
20
  miztake: PublicKey;
20
21
  userStats: PublicKey;
@@ -30,8 +31,8 @@ export declare class PDAManager {
30
31
  */
31
32
  static deriveJoinSeasonPdas(params: {
32
33
  user: PublicKey;
33
- seasonNumber: BN;
34
- tier: number;
34
+ seasonNumber: SeasonNumberLike;
35
+ tier: TierNumber;
35
36
  }): {
36
37
  seasonSettings: PublicKey;
37
38
  season: PublicKey;
@@ -44,11 +45,11 @@ export declare class PDAManager {
44
45
  */
45
46
  static deriveConfirmedPostPdas(params: {
46
47
  user: PublicKey;
47
- seasonNumber: BN;
48
+ seasonNumber: SeasonNumberLike;
48
49
  windowNumber: BN;
49
- tier: number;
50
+ tier: TierNumber;
50
51
  /** SHA-256 hex string (64 chars) */
51
- miztakeShaHash: string;
52
+ miztakeShaHash: Sha256HexString | string;
52
53
  }): {
53
54
  seasonSettings: PublicKey;
54
55
  seasonMembership: PublicKey;
@@ -62,9 +63,9 @@ export declare class PDAManager {
62
63
  */
63
64
  static deriveClaimWindowRewardsPdas(params: {
64
65
  user: PublicKey;
65
- seasonNumber: BN;
66
+ seasonNumber: SeasonNumberLike;
66
67
  windowNumber: BN;
67
- tier: number;
68
+ tier: TierNumber;
68
69
  }): {
69
70
  seasonSettings: PublicKey;
70
71
  season: PublicKey;
@@ -78,8 +79,8 @@ export declare class PDAManager {
78
79
  */
79
80
  static deriveWithdrawDepositPdas(params: {
80
81
  user: PublicKey;
81
- seasonNumber: BN;
82
- tier: number;
82
+ seasonNumber: SeasonNumberLike;
83
+ tier: TierNumber;
83
84
  }): {
84
85
  seasonSettings: PublicKey;
85
86
  season: PublicKey;
@@ -92,9 +93,9 @@ export declare class PDAManager {
92
93
  */
93
94
  static deriveClaimReferralPenaltyForWindowPdas(params: {
94
95
  referredUser: PublicKey;
95
- seasonNumber: BN;
96
+ seasonNumber: SeasonNumberLike;
96
97
  windowNumber: BN;
97
- tier: number;
98
+ tier: TierNumber;
98
99
  }): {
99
100
  seasonSettings: PublicKey;
100
101
  season: PublicKey;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PDAManager = void 0;
4
+ const conversions_1 = require("./conversions");
4
5
  const pdas_1 = require("./pdas");
5
6
  /**
6
7
  * PDA Manager for deriving related PDAs together
@@ -11,39 +12,42 @@ class PDAManager {
11
12
  * Derive all PDAs needed for create_miztake instruction
12
13
  */
13
14
  static deriveMiztakePdas(params) {
15
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
14
16
  return {
15
17
  miztake: (0, pdas_1.getMiztakePda)(params.shaHash)[0],
16
18
  userStats: (0, pdas_1.getUserStatsPda)(params.telegramId)[0],
17
19
  miztakeStatistics: (0, pdas_1.getMiztakeStatisticsPda)()[0],
18
20
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
19
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
20
- seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
21
- rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[0],
22
- userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.user, params.tier, params.windowNumber)[0],
21
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
22
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.user, params.tier)[0],
23
+ rewardWindow: (0, pdas_1.getRewardWindowPda)(seasonNumber, params.windowNumber)[0],
24
+ userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(seasonNumber, params.user, params.tier, params.windowNumber)[0],
23
25
  };
24
26
  }
25
27
  /**
26
28
  * Derive PDAs for join_season instruction
27
29
  */
28
30
  static deriveJoinSeasonPdas(params) {
31
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
29
32
  return {
30
33
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
31
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
32
- seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
33
- seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(params.seasonNumber)[0],
34
- seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)(params.seasonNumber)[0],
34
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
35
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.user, params.tier)[0],
36
+ seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(seasonNumber)[0],
37
+ seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)(seasonNumber)[0],
35
38
  };
36
39
  }
37
40
  /**
38
41
  * Derive PDAs for confirmed_post_on_x instruction
39
42
  */
40
43
  static deriveConfirmedPostPdas(params) {
44
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
41
45
  return {
42
46
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
43
- seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
44
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
45
- rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[0],
46
- userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(params.seasonNumber, params.user, params.tier, params.windowNumber)[0],
47
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.user, params.tier)[0],
48
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
49
+ rewardWindow: (0, pdas_1.getRewardWindowPda)(seasonNumber, params.windowNumber)[0],
50
+ userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(seasonNumber, params.user, params.tier, params.windowNumber)[0],
47
51
  miztake: (0, pdas_1.getMiztakePda)(params.miztakeShaHash)[0],
48
52
  };
49
53
  }
@@ -51,38 +55,41 @@ class PDAManager {
51
55
  * Derive PDAs for claim_window_rewards instruction
52
56
  */
53
57
  static deriveClaimWindowRewardsPdas(params) {
58
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
54
59
  return {
55
60
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
56
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
57
- rewardWindow: (0, pdas_1.getRewardWindowPda)(params.seasonNumber, params.windowNumber)[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
- seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(params.seasonNumber)[0],
61
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
62
+ rewardWindow: (0, pdas_1.getRewardWindowPda)(seasonNumber, params.windowNumber)[0],
63
+ userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(seasonNumber, params.user, params.tier, params.windowNumber)[0],
64
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.user, params.tier)[0],
65
+ seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(seasonNumber)[0],
61
66
  };
62
67
  }
63
68
  /**
64
69
  * Derive PDAs for withdraw_season_deposit instruction
65
70
  */
66
71
  static deriveWithdrawDepositPdas(params) {
72
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
67
73
  return {
68
74
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
69
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[0],
70
- seasonMembership: (0, pdas_1.getSeasonMembershipPda)(params.seasonNumber, params.user, params.tier)[0],
71
- seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(params.seasonNumber)[0],
72
- seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)(params.seasonNumber)[0],
75
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
76
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.user, params.tier)[0],
77
+ seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(seasonNumber)[0],
78
+ seasonEscrowVault: (0, pdas_1.getSeasonEscrowVaultPda)(seasonNumber)[0],
73
79
  };
74
80
  }
75
81
  /**
76
82
  * Derive PDAs for claim_referral_penalty_for_window instruction
77
83
  */
78
84
  static deriveClaimReferralPenaltyForWindowPdas(params) {
85
+ const seasonNumber = (0, conversions_1.toSeasonNumberBn)(params.seasonNumber);
79
86
  return {
80
87
  seasonSettings: (0, pdas_1.getSeasonSettingsPda)()[0],
81
- season: (0, pdas_1.getSeasonPda)(params.seasonNumber)[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
- seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(params.seasonNumber)[0],
88
+ season: (0, pdas_1.getSeasonPda)(seasonNumber)[0],
89
+ seasonMembership: (0, pdas_1.getSeasonMembershipPda)(seasonNumber, params.referredUser, params.tier)[0],
90
+ userWindowParticipation: (0, pdas_1.getUserWindowParticipationPda)(seasonNumber, params.referredUser, params.tier, params.windowNumber)[0],
91
+ referralPenaltyClaim: (0, pdas_1.getReferralPenaltyClaimPda)(seasonNumber, params.referredUser, params.tier, params.windowNumber)[0],
92
+ seasonDepositVault: (0, pdas_1.getSeasonDepositVaultPda)(seasonNumber)[0],
86
93
  };
87
94
  }
88
95
  }
@@ -1,5 +1,6 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
2
  import { BN } from "@coral-xyz/anchor";
3
+ import type { SeasonNumberLike, Sha256HexString, TierNumber } from "../types";
3
4
  /**
4
5
  * PDA (Program Derived Address) derivation helpers
5
6
  */
@@ -16,7 +17,7 @@ export declare function getUserStatsPda(telegramId: BN): [PublicKey, number];
16
17
  * Derive the Miztake PDA for a given SHA hash
17
18
  * @param shaHash - The SHA-256 hash as a 64-char hex string
18
19
  */
19
- export declare function getMiztakePda(shaHash: string): [PublicKey, number];
20
+ export declare function getMiztakePda(shaHash: Sha256HexString | string): [PublicKey, number];
20
21
  /**
21
22
  * Derive the SeasonSettings PDA
22
23
  */
@@ -25,7 +26,7 @@ export declare function getSeasonSettingsPda(): [PublicKey, number];
25
26
  * Derive the Season PDA for a given season number
26
27
  * @param seasonNumber - The season number
27
28
  */
28
- export declare function getSeasonPda(seasonNumber: BN): [PublicKey, number];
29
+ export declare function getSeasonPda(seasonNumber: SeasonNumberLike): [PublicKey, number];
29
30
  /**
30
31
  * Derive the SeasonMembership PDA
31
32
  * PDA model:
@@ -38,13 +39,13 @@ export declare function getSeasonPda(seasonNumber: BN): [PublicKey, number];
38
39
  * @param user - The user's public key
39
40
  * @param tier - Tier number (1..=5)
40
41
  */
41
- export declare function getSeasonMembershipPda(seasonNumber: BN, user: PublicKey, tier: number): [PublicKey, number];
42
+ export declare function getSeasonMembershipPda(seasonNumber: SeasonNumberLike, user: PublicKey, tier: TierNumber): [PublicKey, number];
42
43
  /**
43
44
  * Derive the RewardWindow PDA
44
45
  * @param seasonNumber - The season number
45
46
  * @param windowNumber - The window number
46
47
  */
47
- export declare function getRewardWindowPda(seasonNumber: BN, windowNumber: BN): [PublicKey, number];
48
+ export declare function getRewardWindowPda(seasonNumber: SeasonNumberLike, windowNumber: BN): [PublicKey, number];
48
49
  /**
49
50
  * Derive the UserWindowParticipation PDA
50
51
  * PDA model:
@@ -55,15 +56,15 @@ export declare function getRewardWindowPda(seasonNumber: BN, windowNumber: BN):
55
56
  * @param tier - Tier number (1..=5)
56
57
  * @param windowNumber - The window number
57
58
  */
58
- export declare function getUserWindowParticipationPda(seasonNumber: BN, user: PublicKey, tier: number, windowNumber: BN): [PublicKey, number];
59
+ export declare function getUserWindowParticipationPda(seasonNumber: SeasonNumberLike, user: PublicKey, tier: TierNumber, windowNumber: BN): [PublicKey, number];
59
60
  /**
60
61
  * Derive the Season Deposit Vault PDA
61
62
  */
62
- export declare function getSeasonDepositVaultPda(seasonNumber: BN): [PublicKey, number];
63
+ export declare function getSeasonDepositVaultPda(seasonNumber: SeasonNumberLike): [PublicKey, number];
63
64
  /**
64
65
  * Derive the Season Escrow Vault PDA
65
66
  */
66
- export declare function getSeasonEscrowVaultPda(seasonNumber: BN): [PublicKey, number];
67
+ export declare function getSeasonEscrowVaultPda(seasonNumber: SeasonNumberLike): [PublicKey, number];
67
68
  /**
68
69
  * Derive the ReferralPenaltyClaim PDA
69
70
  * PDA model:
@@ -74,4 +75,4 @@ export declare function getSeasonEscrowVaultPda(seasonNumber: BN): [PublicKey, n
74
75
  * @param tier - Tier number (1..=5)
75
76
  * @param windowNumber - The window number
76
77
  */
77
- export declare function getReferralPenaltyClaimPda(seasonNumber: BN, referredUser: PublicKey, tier: number, windowNumber: BN): [PublicKey, number];
78
+ export declare function getReferralPenaltyClaimPda(seasonNumber: SeasonNumberLike, referredUser: PublicKey, tier: TierNumber, windowNumber: BN): [PublicKey, number];
@@ -14,6 +14,8 @@ exports.getReferralPenaltyClaimPda = getReferralPenaltyClaimPda;
14
14
  const web3_js_1 = require("@solana/web3.js");
15
15
  const constants_1 = require("./constants");
16
16
  const conversions_1 = require("./conversions");
17
+ const tierPenalty_1 = require("./tierPenalty");
18
+ const conversions_2 = require("./conversions");
17
19
  /**
18
20
  * PDA (Program Derived Address) derivation helpers
19
21
  */
@@ -35,7 +37,8 @@ function getUserStatsPda(telegramId) {
35
37
  * @param shaHash - The SHA-256 hash as a 64-char hex string
36
38
  */
37
39
  function getMiztakePda(shaHash) {
38
- const shaHashBytes = (0, conversions_1.sha256HexToBytes32)(shaHash);
40
+ const normalized = typeof shaHash === "string" ? (0, conversions_1.toSha256HexString)(shaHash) : shaHash;
41
+ const shaHashBytes = (0, conversions_1.sha256HexToBytes32)(normalized);
39
42
  return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.MIZTAKE_SEED), shaHashBytes], constants_1.PROGRAM_ID);
40
43
  }
41
44
  /**
@@ -49,7 +52,8 @@ function getSeasonSettingsPda() {
49
52
  * @param seasonNumber - The season number
50
53
  */
51
54
  function getSeasonPda(seasonNumber) {
52
- return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season"), seasonNumber.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
55
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
56
+ return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season"), seasonBn.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
53
57
  }
54
58
  /**
55
59
  * Derive the SeasonMembership PDA
@@ -64,14 +68,13 @@ function getSeasonPda(seasonNumber) {
64
68
  * @param tier - Tier number (1..=5)
65
69
  */
66
70
  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
- }
71
+ const t = (0, tierPenalty_1.assertValidTierNumber)(tier);
72
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
70
73
  return web3_js_1.PublicKey.findProgramAddressSync([
71
74
  Buffer.from("season_membership"),
72
- seasonNumber.toArrayLike(Buffer, "le", 8),
75
+ seasonBn.toArrayLike(Buffer, "le", 8),
73
76
  user.toBuffer(),
74
- Buffer.from([tier]),
77
+ Buffer.from([t]),
75
78
  ], constants_1.PROGRAM_ID);
76
79
  }
77
80
  /**
@@ -80,9 +83,10 @@ function getSeasonMembershipPda(seasonNumber, user, tier) {
80
83
  * @param windowNumber - The window number
81
84
  */
82
85
  function getRewardWindowPda(seasonNumber, windowNumber) {
86
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
83
87
  return web3_js_1.PublicKey.findProgramAddressSync([
84
88
  Buffer.from("reward_window"),
85
- seasonNumber.toArrayLike(Buffer, "le", 8),
89
+ seasonBn.toArrayLike(Buffer, "le", 8),
86
90
  windowNumber.toArrayLike(Buffer, "le", 8),
87
91
  ], constants_1.PROGRAM_ID);
88
92
  }
@@ -97,14 +101,13 @@ function getRewardWindowPda(seasonNumber, windowNumber) {
97
101
  * @param windowNumber - The window number
98
102
  */
99
103
  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
- }
104
+ const t = (0, tierPenalty_1.assertValidTierNumber)(tier);
105
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
103
106
  return web3_js_1.PublicKey.findProgramAddressSync([
104
107
  Buffer.from("user_window"),
105
- seasonNumber.toArrayLike(Buffer, "le", 8),
108
+ seasonBn.toArrayLike(Buffer, "le", 8),
106
109
  user.toBuffer(),
107
- Buffer.from([tier]),
110
+ Buffer.from([t]),
108
111
  windowNumber.toArrayLike(Buffer, "le", 8),
109
112
  ], constants_1.PROGRAM_ID);
110
113
  }
@@ -112,13 +115,15 @@ function getUserWindowParticipationPda(seasonNumber, user, tier, windowNumber) {
112
115
  * Derive the Season Deposit Vault PDA
113
116
  */
114
117
  function getSeasonDepositVaultPda(seasonNumber) {
115
- return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season_deposit_vault"), seasonNumber.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
118
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
119
+ return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season_deposit_vault"), seasonBn.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
116
120
  }
117
121
  /**
118
122
  * Derive the Season Escrow Vault PDA
119
123
  */
120
124
  function getSeasonEscrowVaultPda(seasonNumber) {
121
- return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season_escrow_vault"), seasonNumber.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
125
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
126
+ return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("season_escrow_vault"), seasonBn.toArrayLike(Buffer, "le", 8)], constants_1.PROGRAM_ID);
122
127
  }
123
128
  /**
124
129
  * Derive the ReferralPenaltyClaim PDA
@@ -131,14 +136,13 @@ function getSeasonEscrowVaultPda(seasonNumber) {
131
136
  * @param windowNumber - The window number
132
137
  */
133
138
  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
- }
139
+ const t = (0, tierPenalty_1.assertValidTierNumber)(tier);
140
+ const seasonBn = (0, conversions_2.toSeasonNumberBn)(seasonNumber);
137
141
  return web3_js_1.PublicKey.findProgramAddressSync([
138
142
  Buffer.from(constants_1.REFERRAL_PENALTY_CLAIM_SEED),
139
- seasonNumber.toArrayLike(Buffer, "le", 8),
143
+ seasonBn.toArrayLike(Buffer, "le", 8),
140
144
  referredUser.toBuffer(),
141
- Buffer.from([tier]),
145
+ Buffer.from([t]),
142
146
  windowNumber.toArrayLike(Buffer, "le", 8),
143
147
  ], constants_1.PROGRAM_ID);
144
148
  }
@@ -13,6 +13,6 @@ const anchorHelpers_1 = require("./anchorHelpers");
13
13
  function getProgram(connection) {
14
14
  const provider = (0, anchorHelpers_1.createReadOnlyProvider)(connection);
15
15
  // Ensure a stable program id even if the bundled IDL JSON was generated without `address`.
16
- const idlWithAddress = (0, anchorHelpers_1.withIdlAddress)(idl_1.IDL, constants_1.PROGRAM_ID);
16
+ const idlWithAddress = (0, anchorHelpers_1.withIdlAddress)(idl_1.ANCHOR_IDL, constants_1.PROGRAM_ID);
17
17
  return new anchor_1.Program(idlWithAddress, provider);
18
18
  }
@@ -1,10 +1,11 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
+ export type SignerRole = "admin" | "user" | "payer" | "feePayer" | "claimant" | "currentAdmin";
2
3
  /**
3
4
  * Signer information
4
5
  */
5
6
  export interface SignerInfo {
6
7
  publicKey: PublicKey;
7
- role: string;
8
+ role: SignerRole;
8
9
  }
9
10
  /**
10
11
  * Build signers array with optional fee payer