@star-factory/sdk-staking 0.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/README.md +151 -0
- package/dist/cli/set-allowed-mint.d.ts +2 -0
- package/dist/cli/set-allowed-mint.d.ts.map +1 -0
- package/dist/cli/set-allowed-mint.js +78 -0
- package/dist/cli/set-allowed-mint.js.map +1 -0
- package/dist/idl/staking.json +1407 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +598 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +380 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +35 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +47 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StakingSDK = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
6
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
9
|
+
const REWARD_PRECISION = BigInt('1000000000000000000');
|
|
10
|
+
/**
|
|
11
|
+
* StakingSDK - Client SDK for the Staking program
|
|
12
|
+
*
|
|
13
|
+
* All methods use clear Input/Output types for type safety and discoverability.
|
|
14
|
+
*/
|
|
15
|
+
class StakingSDK {
|
|
16
|
+
program;
|
|
17
|
+
provider;
|
|
18
|
+
programId;
|
|
19
|
+
constructor(program, provider) {
|
|
20
|
+
this.program = program;
|
|
21
|
+
this.provider = provider;
|
|
22
|
+
this.programId = program.programId;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Static factory method to create SDK instance
|
|
26
|
+
*/
|
|
27
|
+
static async create(provider, programId) {
|
|
28
|
+
const idl = require('./idl/staking.json');
|
|
29
|
+
if (programId) {
|
|
30
|
+
idl.address = programId.toString();
|
|
31
|
+
}
|
|
32
|
+
const program = new anchor_1.Program(idl, provider);
|
|
33
|
+
return new StakingSDK(program, provider);
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// PDA Derivation (synchronous, no RPC calls)
|
|
37
|
+
// ============================================================================
|
|
38
|
+
getStakePoolPDA() {
|
|
39
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('stake_pool')], this.programId);
|
|
40
|
+
}
|
|
41
|
+
getUserStakePDA(input) {
|
|
42
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('user_stake'), input.user.toBuffer()], this.programId);
|
|
43
|
+
}
|
|
44
|
+
getStakeVaultPDA(input) {
|
|
45
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('stake_vault'), input.stakePool.toBuffer()], this.programId);
|
|
46
|
+
}
|
|
47
|
+
getRewardTokenPDA(input) {
|
|
48
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('reward_token'), input.rewardMint.toBuffer()], this.programId);
|
|
49
|
+
}
|
|
50
|
+
getRewardVaultPDA(input) {
|
|
51
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('reward_vault'), input.stakePool.toBuffer(), input.rewardMint.toBuffer()], this.programId);
|
|
52
|
+
}
|
|
53
|
+
getUserRewardInfoPDA(input) {
|
|
54
|
+
return anchor_1.web3.PublicKey.findProgramAddressSync([Buffer.from('user_reward_info'), input.user.toBuffer(), input.rewardMint.toBuffer()], this.programId);
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Write Methods (submit transactions)
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Initialize the staking pool
|
|
61
|
+
*/
|
|
62
|
+
async initialize(input) {
|
|
63
|
+
const authority = input.authority ?? this.provider.wallet.publicKey;
|
|
64
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
65
|
+
const [stakeVault] = this.getStakeVaultPDA({ stakePool });
|
|
66
|
+
const signature = await this.program.methods
|
|
67
|
+
.initialize()
|
|
68
|
+
.accountsPartial({
|
|
69
|
+
stakePool,
|
|
70
|
+
stakeVault,
|
|
71
|
+
acceptedMint: input.acceptedMint,
|
|
72
|
+
authority,
|
|
73
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
74
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
75
|
+
})
|
|
76
|
+
.rpc();
|
|
77
|
+
return { signature };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stake tokens
|
|
81
|
+
*/
|
|
82
|
+
async stake(input) {
|
|
83
|
+
const user = input.user ?? this.provider.wallet.publicKey;
|
|
84
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
85
|
+
const [userStake] = this.getUserStakePDA({ user });
|
|
86
|
+
const [stakeVault] = this.getStakeVaultPDA({ stakePool });
|
|
87
|
+
const poolAccount = await this.fetchStakePool(stakePool);
|
|
88
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(poolAccount.acceptedMint, user);
|
|
89
|
+
const baseAccounts = {
|
|
90
|
+
stakePool,
|
|
91
|
+
userStake,
|
|
92
|
+
userTokenAccount,
|
|
93
|
+
stakeVault,
|
|
94
|
+
user,
|
|
95
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
96
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
97
|
+
};
|
|
98
|
+
// Check if rewards are active - if so, we MUST include reward accounts
|
|
99
|
+
const rewardMint = input.rewardMint ?? (poolAccount.rewardMint.equals(anchor_1.web3.PublicKey.default) ? null : poolAccount.rewardMint);
|
|
100
|
+
let signature;
|
|
101
|
+
if (rewardMint) {
|
|
102
|
+
const [rewardToken] = this.getRewardTokenPDA({ rewardMint });
|
|
103
|
+
const [userRewardInfo] = this.getUserRewardInfoPDA({ user, rewardMint });
|
|
104
|
+
signature = await this.program.methods
|
|
105
|
+
.stake(input.amount)
|
|
106
|
+
.accountsPartial({
|
|
107
|
+
...baseAccounts,
|
|
108
|
+
rewardMint,
|
|
109
|
+
rewardToken,
|
|
110
|
+
userRewardInfo,
|
|
111
|
+
})
|
|
112
|
+
.rpc();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// No rewards active - use accountsStrict to bypass PDA resolver
|
|
116
|
+
// Pass program ID as placeholder for optional accounts (Anchor treats as None)
|
|
117
|
+
signature = await this.program.methods
|
|
118
|
+
.stake(input.amount)
|
|
119
|
+
.accountsStrict({
|
|
120
|
+
stakePool,
|
|
121
|
+
userStake,
|
|
122
|
+
userTokenAccount,
|
|
123
|
+
stakeVault,
|
|
124
|
+
rewardMint: this.programId,
|
|
125
|
+
rewardToken: this.programId,
|
|
126
|
+
userRewardInfo: this.programId,
|
|
127
|
+
user,
|
|
128
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
129
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
130
|
+
})
|
|
131
|
+
.rpc();
|
|
132
|
+
}
|
|
133
|
+
return { signature };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Unstake tokens (starts 30-day unlock period)
|
|
137
|
+
*/
|
|
138
|
+
async unstake(input) {
|
|
139
|
+
const user = input.user ?? this.provider.wallet.publicKey;
|
|
140
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
141
|
+
const [userStake] = this.getUserStakePDA({ user });
|
|
142
|
+
// Fetch pool to check if rewards are active
|
|
143
|
+
const poolAccount = await this.fetchStakePool(stakePool);
|
|
144
|
+
const baseAccounts = {
|
|
145
|
+
stakePool,
|
|
146
|
+
userStake,
|
|
147
|
+
user,
|
|
148
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
149
|
+
};
|
|
150
|
+
// Check if rewards are active - if so, we MUST include reward accounts
|
|
151
|
+
const rewardMint = input.rewardMint ?? (poolAccount.rewardMint.equals(anchor_1.web3.PublicKey.default) ? null : poolAccount.rewardMint);
|
|
152
|
+
let signature;
|
|
153
|
+
if (rewardMint) {
|
|
154
|
+
const [rewardToken] = this.getRewardTokenPDA({ rewardMint });
|
|
155
|
+
const [userRewardInfo] = this.getUserRewardInfoPDA({ user, rewardMint });
|
|
156
|
+
signature = await this.program.methods
|
|
157
|
+
.unstake(input.amount)
|
|
158
|
+
.accountsPartial({
|
|
159
|
+
...baseAccounts,
|
|
160
|
+
rewardMint,
|
|
161
|
+
rewardToken,
|
|
162
|
+
userRewardInfo,
|
|
163
|
+
})
|
|
164
|
+
.rpc();
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// No rewards active - use accountsStrict to bypass PDA resolver
|
|
168
|
+
signature = await this.program.methods
|
|
169
|
+
.unstake(input.amount)
|
|
170
|
+
.accountsStrict({
|
|
171
|
+
stakePool,
|
|
172
|
+
userStake,
|
|
173
|
+
rewardMint: this.programId,
|
|
174
|
+
rewardToken: this.programId,
|
|
175
|
+
userRewardInfo: this.programId,
|
|
176
|
+
user,
|
|
177
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
178
|
+
})
|
|
179
|
+
.rpc();
|
|
180
|
+
}
|
|
181
|
+
return { signature };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Claim unstaked tokens after 30-day period
|
|
185
|
+
*/
|
|
186
|
+
async claimUnstake(input) {
|
|
187
|
+
const user = input?.user ?? this.provider.wallet.publicKey;
|
|
188
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
189
|
+
const [userStake] = this.getUserStakePDA({ user });
|
|
190
|
+
const [stakeVault] = this.getStakeVaultPDA({ stakePool });
|
|
191
|
+
const poolAccount = await this.fetchStakePool(stakePool);
|
|
192
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(poolAccount.acceptedMint, user);
|
|
193
|
+
const signature = await this.program.methods
|
|
194
|
+
.claimUnstake()
|
|
195
|
+
.accountsPartial({
|
|
196
|
+
stakePool,
|
|
197
|
+
userStake,
|
|
198
|
+
userTokenAccount,
|
|
199
|
+
stakeVault,
|
|
200
|
+
user,
|
|
201
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
202
|
+
})
|
|
203
|
+
.rpc();
|
|
204
|
+
return { signature };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Deposit rewards into the pool (admin only)
|
|
208
|
+
*/
|
|
209
|
+
async depositRewards(input) {
|
|
210
|
+
const authority = input.authority ?? this.provider.wallet.publicKey;
|
|
211
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
212
|
+
const [rewardToken] = this.getRewardTokenPDA({ rewardMint: input.rewardMint });
|
|
213
|
+
const [rewardVault] = this.getRewardVaultPDA({ stakePool, rewardMint: input.rewardMint });
|
|
214
|
+
const adminTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(input.rewardMint, authority);
|
|
215
|
+
const signature = await this.program.methods
|
|
216
|
+
.depositRewards(input.amount)
|
|
217
|
+
.accountsPartial({
|
|
218
|
+
stakePool,
|
|
219
|
+
rewardToken,
|
|
220
|
+
rewardVault,
|
|
221
|
+
rewardMint: input.rewardMint,
|
|
222
|
+
adminTokenAccount,
|
|
223
|
+
authority,
|
|
224
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
225
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
226
|
+
})
|
|
227
|
+
.rpc();
|
|
228
|
+
return { signature };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Claim accumulated rewards
|
|
232
|
+
*/
|
|
233
|
+
async claimRewards(input) {
|
|
234
|
+
const user = input.user ?? this.provider.wallet.publicKey;
|
|
235
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
236
|
+
const [userStake] = this.getUserStakePDA({ user });
|
|
237
|
+
const [rewardToken] = this.getRewardTokenPDA({ rewardMint: input.rewardMint });
|
|
238
|
+
const [userRewardInfo] = this.getUserRewardInfoPDA({ user, rewardMint: input.rewardMint });
|
|
239
|
+
const [rewardVault] = this.getRewardVaultPDA({ stakePool, rewardMint: input.rewardMint });
|
|
240
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(input.rewardMint, user);
|
|
241
|
+
const signature = await this.program.methods
|
|
242
|
+
.claimRewards()
|
|
243
|
+
.accountsPartial({
|
|
244
|
+
stakePool,
|
|
245
|
+
userStake,
|
|
246
|
+
rewardToken,
|
|
247
|
+
userRewardInfo,
|
|
248
|
+
rewardVault,
|
|
249
|
+
rewardMint: input.rewardMint,
|
|
250
|
+
userTokenAccount,
|
|
251
|
+
user,
|
|
252
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
253
|
+
systemProgram: anchor_1.web3.SystemProgram.programId,
|
|
254
|
+
})
|
|
255
|
+
.rpc();
|
|
256
|
+
return { signature };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Toggle pause on contract (admin only) - USE ONLY IN CASE OF EMERGENCY
|
|
260
|
+
*/
|
|
261
|
+
async switchPause(input) {
|
|
262
|
+
const authority = input?.authority ?? this.provider.wallet.publicKey;
|
|
263
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
264
|
+
const signature = await this.program.methods
|
|
265
|
+
.switchPause()
|
|
266
|
+
.accounts({
|
|
267
|
+
stakePool,
|
|
268
|
+
authority,
|
|
269
|
+
})
|
|
270
|
+
.rpc();
|
|
271
|
+
return { signature };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Transfer pool authority to a new account (current authority only)
|
|
275
|
+
*/
|
|
276
|
+
async updateAuthority(input) {
|
|
277
|
+
const authority = input.authority ?? this.provider.wallet.publicKey;
|
|
278
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
279
|
+
const signature = await this.program.methods
|
|
280
|
+
.updateAuthority(input.newAuthority)
|
|
281
|
+
.accounts({
|
|
282
|
+
stakePool,
|
|
283
|
+
authority,
|
|
284
|
+
})
|
|
285
|
+
.rpc();
|
|
286
|
+
return { signature };
|
|
287
|
+
}
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Read Methods (fetch data)
|
|
290
|
+
// ============================================================================
|
|
291
|
+
/**
|
|
292
|
+
* Get stake pool data
|
|
293
|
+
*/
|
|
294
|
+
async getStakePool() {
|
|
295
|
+
const [stakePool] = this.getStakePoolPDA();
|
|
296
|
+
return await this.fetchStakePool(stakePool);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Get user stake data
|
|
300
|
+
*/
|
|
301
|
+
async getUserStake(input) {
|
|
302
|
+
const user = input?.user ?? this.provider.wallet.publicKey;
|
|
303
|
+
const [userStake] = this.getUserStakePDA({ user });
|
|
304
|
+
try {
|
|
305
|
+
return await this.fetchUserStake(userStake);
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get reward token config data
|
|
313
|
+
*/
|
|
314
|
+
async getRewardToken(input) {
|
|
315
|
+
const [rewardToken] = this.getRewardTokenPDA({ rewardMint: input.rewardMint });
|
|
316
|
+
try {
|
|
317
|
+
return await this.fetchRewardToken(rewardToken);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get user reward info data
|
|
325
|
+
*/
|
|
326
|
+
async getUserRewardInfo(input) {
|
|
327
|
+
const user = input.user ?? this.provider.wallet.publicKey;
|
|
328
|
+
const [userRewardInfo] = this.getUserRewardInfoPDA({ user, rewardMint: input.rewardMint });
|
|
329
|
+
try {
|
|
330
|
+
return await this.fetchUserRewardInfo(userRewardInfo);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Calculate user's proportional share of the pool
|
|
338
|
+
*/
|
|
339
|
+
async getUserPoolShare(input) {
|
|
340
|
+
const userStakeData = await this.getUserStake({ user: input?.user });
|
|
341
|
+
if (!userStakeData || userStakeData.stakedAmount.eq(new anchor_1.BN(0))) {
|
|
342
|
+
return { sharePercent: 0 };
|
|
343
|
+
}
|
|
344
|
+
const poolData = await this.getStakePool();
|
|
345
|
+
if (poolData.totalStaked.eq(new anchor_1.BN(0))) {
|
|
346
|
+
return { sharePercent: 0 };
|
|
347
|
+
}
|
|
348
|
+
const sharePercent = userStakeData.stakedAmount
|
|
349
|
+
.mul(new anchor_1.BN(10000))
|
|
350
|
+
.div(poolData.totalStaked)
|
|
351
|
+
.toNumber() / 100;
|
|
352
|
+
return { sharePercent };
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Check if user can claim unstake
|
|
356
|
+
*/
|
|
357
|
+
async canClaimUnstake(input) {
|
|
358
|
+
const userStakeData = await this.getUserStake({ user: input?.user });
|
|
359
|
+
if (!userStakeData || userStakeData.pendingUnstake.eq(new anchor_1.BN(0))) {
|
|
360
|
+
return { canClaim: false };
|
|
361
|
+
}
|
|
362
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
363
|
+
const canClaim = currentTime >= userStakeData.unlockTimestamp.toNumber();
|
|
364
|
+
return { canClaim };
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get time remaining until claim is available
|
|
368
|
+
*/
|
|
369
|
+
async getTimeUntilClaim(input) {
|
|
370
|
+
const userStakeData = await this.getUserStake({ user: input?.user });
|
|
371
|
+
if (!userStakeData || userStakeData.pendingUnstake.eq(new anchor_1.BN(0))) {
|
|
372
|
+
return { secondsRemaining: null };
|
|
373
|
+
}
|
|
374
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
375
|
+
const unlockTime = userStakeData.unlockTimestamp.toNumber();
|
|
376
|
+
const remaining = unlockTime - currentTime;
|
|
377
|
+
return { secondsRemaining: Math.max(0, remaining) };
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get comprehensive unstake status for UI display.
|
|
381
|
+
* Single RPC call that returns all information needed to render unstake UI.
|
|
382
|
+
*/
|
|
383
|
+
async getUnstakeStatus(input) {
|
|
384
|
+
const userStakeData = await this.getUserStake({ user: input?.user });
|
|
385
|
+
// No stake account or no pending unstake
|
|
386
|
+
if (!userStakeData || userStakeData.pendingUnstake.eq(new anchor_1.BN(0))) {
|
|
387
|
+
return {
|
|
388
|
+
hasPendingUnstake: false,
|
|
389
|
+
pendingAmount: new anchor_1.BN(0),
|
|
390
|
+
unlockTimestamp: 0,
|
|
391
|
+
unlockDate: null,
|
|
392
|
+
canClaim: false,
|
|
393
|
+
secondsRemaining: null,
|
|
394
|
+
progressPercent: null,
|
|
395
|
+
timeRemainingFormatted: null,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
399
|
+
const unlockTime = userStakeData.unlockTimestamp.toNumber();
|
|
400
|
+
const secondsRemaining = Math.max(0, unlockTime - currentTime);
|
|
401
|
+
const canClaim = secondsRemaining === 0;
|
|
402
|
+
// Calculate progress percentage (0-100)
|
|
403
|
+
const startTime = unlockTime - types_1.UNLOCK_PERIOD_SECONDS;
|
|
404
|
+
const elapsed = currentTime - startTime;
|
|
405
|
+
const progressPercent = Math.min(100, Math.max(0, (elapsed / types_1.UNLOCK_PERIOD_SECONDS) * 100));
|
|
406
|
+
// Format time remaining
|
|
407
|
+
const timeRemainingFormatted = canClaim ? null : this.formatTimeRemaining(secondsRemaining);
|
|
408
|
+
return {
|
|
409
|
+
hasPendingUnstake: true,
|
|
410
|
+
pendingAmount: userStakeData.pendingUnstake,
|
|
411
|
+
unlockTimestamp: unlockTime,
|
|
412
|
+
unlockDate: new Date(unlockTime * 1000),
|
|
413
|
+
canClaim,
|
|
414
|
+
secondsRemaining: canClaim ? 0 : secondsRemaining,
|
|
415
|
+
progressPercent,
|
|
416
|
+
timeRemainingFormatted,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Calculate pending rewards for a user (without claiming)
|
|
421
|
+
*/
|
|
422
|
+
async getPendingRewards(input) {
|
|
423
|
+
const userStakeData = await this.getUserStake({ user: input.user });
|
|
424
|
+
const rewardTokenData = await this.getRewardToken({ rewardMint: input.rewardMint });
|
|
425
|
+
const userRewardInfo = await this.getUserRewardInfo({
|
|
426
|
+
rewardMint: input.rewardMint,
|
|
427
|
+
user: input.user,
|
|
428
|
+
});
|
|
429
|
+
if (!userStakeData || !rewardTokenData) {
|
|
430
|
+
return { pendingAmount: new anchor_1.BN(0) };
|
|
431
|
+
}
|
|
432
|
+
const stakedAmount = userStakeData.stakedAmount;
|
|
433
|
+
if (stakedAmount.eq(new anchor_1.BN(0))) {
|
|
434
|
+
return { pendingAmount: userRewardInfo?.rewardsEarned ?? new anchor_1.BN(0) };
|
|
435
|
+
}
|
|
436
|
+
// Calculate: (staked * (currentPerToken - userCheckpoint)) / PRECISION + earnedSoFar
|
|
437
|
+
const currentPerToken = BigInt(rewardTokenData.rewardPerTokenStored.toString());
|
|
438
|
+
const userCheckpoint = userRewardInfo
|
|
439
|
+
? BigInt(userRewardInfo.rewardPerTokenPaid.toString())
|
|
440
|
+
: BigInt(0);
|
|
441
|
+
const earnedSoFar = userRewardInfo ? BigInt(userRewardInfo.rewardsEarned.toString()) : BigInt(0);
|
|
442
|
+
const perTokenDelta = currentPerToken - userCheckpoint;
|
|
443
|
+
const newEarned = (BigInt(stakedAmount.toString()) * perTokenDelta) / REWARD_PRECISION;
|
|
444
|
+
return { pendingAmount: new anchor_1.BN((newEarned + earnedSoFar).toString()) };
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Check if protocol is paused
|
|
448
|
+
*/
|
|
449
|
+
async isPaused() {
|
|
450
|
+
const pool = await this.getStakePool();
|
|
451
|
+
return { paused: pool.paused };
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Check if rewards are active (reward mint has been set)
|
|
455
|
+
*/
|
|
456
|
+
async getActiveRewardMint() {
|
|
457
|
+
const pool = await this.getStakePool();
|
|
458
|
+
// Handle case where rewardMint doesn't exist (old contract/IDL)
|
|
459
|
+
if (!pool.rewardMint) {
|
|
460
|
+
return { rewardMint: null, isActive: false };
|
|
461
|
+
}
|
|
462
|
+
// Pubkey.default() is all zeros
|
|
463
|
+
const isDefault = pool.rewardMint.equals(anchor_1.web3.PublicKey.default);
|
|
464
|
+
const rewardMint = isDefault ? null : pool.rewardMint;
|
|
465
|
+
return { rewardMint, isActive: !isDefault };
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Get all stakers and their staking positions.
|
|
469
|
+
* Useful for computing reward distributions or snapshots.
|
|
470
|
+
*/
|
|
471
|
+
async getAllStakers() {
|
|
472
|
+
// UserStake discriminator from IDL: [102, 53, 163, 107, 9, 138, 87, 153]
|
|
473
|
+
const USER_STAKE_DISCRIMINATOR = Buffer.from([102, 53, 163, 107, 9, 138, 87, 153]);
|
|
474
|
+
const USER_STAKE_SIZE = 65; // 8 + 32 + 8 + 8 + 8 + 1
|
|
475
|
+
// Filter by size only, verify discriminator during parsing
|
|
476
|
+
const accounts = await this.provider.connection.getProgramAccounts(this.programId, {
|
|
477
|
+
filters: [{ dataSize: USER_STAKE_SIZE }],
|
|
478
|
+
commitment: 'confirmed',
|
|
479
|
+
});
|
|
480
|
+
const stakers = [];
|
|
481
|
+
let totalStaked = new anchor_1.BN(0);
|
|
482
|
+
let activeStakers = 0;
|
|
483
|
+
for (const { account } of accounts) {
|
|
484
|
+
const data = account.data;
|
|
485
|
+
// Verify discriminator matches UserStake
|
|
486
|
+
const discriminator = data.subarray(0, 8);
|
|
487
|
+
if (!discriminator.equals(USER_STAKE_DISCRIMINATOR)) {
|
|
488
|
+
continue; // Skip non-UserStake accounts
|
|
489
|
+
}
|
|
490
|
+
// Layout:
|
|
491
|
+
// [0..8] discriminator
|
|
492
|
+
// [8..40] user: Pubkey
|
|
493
|
+
// [40..48] staked_amount: u64
|
|
494
|
+
// [48..56] pending_unstake: u64
|
|
495
|
+
// [56..64] unlock_timestamp: i64
|
|
496
|
+
// [64] bump: u8
|
|
497
|
+
const user = new anchor_1.web3.PublicKey(data.subarray(8, 40));
|
|
498
|
+
const stakedAmount = new anchor_1.BN(data.readBigUInt64LE(40).toString());
|
|
499
|
+
const pendingUnstake = new anchor_1.BN(data.readBigUInt64LE(48).toString());
|
|
500
|
+
const unlockTimestamp = new anchor_1.BN(data.readBigInt64LE(56).toString());
|
|
501
|
+
stakers.push({
|
|
502
|
+
wallet: user,
|
|
503
|
+
stakedAmount,
|
|
504
|
+
pendingUnstake,
|
|
505
|
+
unlockTimestamp,
|
|
506
|
+
});
|
|
507
|
+
if (!stakedAmount.isZero()) {
|
|
508
|
+
totalStaked = totalStaked.add(stakedAmount);
|
|
509
|
+
activeStakers++;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
// Sort by wallet address for deterministic ordering
|
|
513
|
+
stakers.sort((a, b) => a.wallet.toBase58().localeCompare(b.wallet.toBase58()));
|
|
514
|
+
return {
|
|
515
|
+
stakers,
|
|
516
|
+
totalStaked,
|
|
517
|
+
activeStakers,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
// ============================================================================
|
|
521
|
+
// Event Listeners
|
|
522
|
+
// ============================================================================
|
|
523
|
+
/**
|
|
524
|
+
* Listen for stake events
|
|
525
|
+
*/
|
|
526
|
+
onStakeEvent(input) {
|
|
527
|
+
return this.program.addEventListener('stakeEvent', input.callback);
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Listen for unstake events
|
|
531
|
+
*/
|
|
532
|
+
onUnstakeEvent(input) {
|
|
533
|
+
return this.program.addEventListener('unstakeEvent', input.callback);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Listen for claim unstake events
|
|
537
|
+
*/
|
|
538
|
+
onClaimUnstakeEvent(input) {
|
|
539
|
+
return this.program.addEventListener('claimUnstakeEvent', input.callback);
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Listen for pause events
|
|
543
|
+
*/
|
|
544
|
+
onPauseEvent(input) {
|
|
545
|
+
return this.program.addEventListener('pauseEvent', input.callback);
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Listen for authority updated events
|
|
549
|
+
*/
|
|
550
|
+
onAuthorityUpdatedEvent(input) {
|
|
551
|
+
return this.program.addEventListener('authorityUpdatedEvent', input.callback);
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Remove event listener
|
|
555
|
+
*/
|
|
556
|
+
async removeEventListener(input) {
|
|
557
|
+
await this.program.removeEventListener(input.listenerId);
|
|
558
|
+
}
|
|
559
|
+
// ============================================================================
|
|
560
|
+
// Private Helpers
|
|
561
|
+
// ============================================================================
|
|
562
|
+
/**
|
|
563
|
+
* Format seconds into human-readable string (e.g., "5d 3h 22m")
|
|
564
|
+
* @internal
|
|
565
|
+
*/
|
|
566
|
+
formatTimeRemaining(seconds) {
|
|
567
|
+
if (seconds <= 0)
|
|
568
|
+
return '0m';
|
|
569
|
+
const days = Math.floor(seconds / 86400);
|
|
570
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
571
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
572
|
+
const parts = [];
|
|
573
|
+
if (days > 0)
|
|
574
|
+
parts.push(`${days}d`);
|
|
575
|
+
if (hours > 0)
|
|
576
|
+
parts.push(`${hours}h`);
|
|
577
|
+
if (minutes > 0 || parts.length === 0)
|
|
578
|
+
parts.push(`${minutes}m`);
|
|
579
|
+
return parts.join(' ');
|
|
580
|
+
}
|
|
581
|
+
get accounts() {
|
|
582
|
+
return this.program.account;
|
|
583
|
+
}
|
|
584
|
+
async fetchStakePool(stakePool) {
|
|
585
|
+
return await this.accounts.stakePool.fetch(stakePool);
|
|
586
|
+
}
|
|
587
|
+
async fetchUserStake(userStake) {
|
|
588
|
+
return await this.accounts.userStake.fetch(userStake);
|
|
589
|
+
}
|
|
590
|
+
async fetchRewardToken(rewardToken) {
|
|
591
|
+
return await this.accounts.rewardToken.fetch(rewardToken);
|
|
592
|
+
}
|
|
593
|
+
async fetchUserRewardInfo(userRewardInfo) {
|
|
594
|
+
return await this.accounts.userRewardInfo.fetch(userRewardInfo);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
exports.StakingSDK = StakingSDK;
|
|
598
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|