@streamflow/staking 7.5.3 → 8.0.0-alpha.p287.25d0c28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +2988 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +298 -0
- package/dist/cjs/solana/descriptor/fee_manager.cjs +4 -0
- package/dist/cjs/solana/descriptor/fee_manager.cjs.map +1 -0
- package/dist/cjs/solana/descriptor/fee_manager.d.cts +292 -0
- package/dist/cjs/solana/descriptor/reward_pool.cjs +4 -0
- package/dist/cjs/solana/descriptor/reward_pool.cjs.map +1 -0
- package/dist/cjs/solana/descriptor/reward_pool.d.cts +967 -0
- package/dist/cjs/solana/descriptor/stake_pool.cjs +4 -0
- package/dist/cjs/solana/descriptor/stake_pool.cjs.map +1 -0
- package/dist/cjs/solana/descriptor/stake_pool.d.cts +954 -0
- package/dist/esm/index.d.ts +298 -7
- package/dist/esm/index.js +2963 -7
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/solana/descriptor/fee_manager.d.ts +3 -1
- package/dist/esm/solana/descriptor/fee_manager.js +3 -1
- package/dist/esm/solana/descriptor/fee_manager.js.map +1 -0
- package/dist/esm/solana/descriptor/idl/fee_manager.json +255 -407
- package/dist/esm/solana/descriptor/idl/reward_pool.json +853 -1296
- package/dist/esm/solana/descriptor/idl/stake_pool.json +875 -1247
- package/dist/esm/solana/descriptor/reward_pool.d.ts +3 -1
- package/dist/esm/solana/descriptor/reward_pool.js +3 -1
- package/dist/esm/solana/descriptor/reward_pool.js.map +1 -0
- package/dist/esm/solana/descriptor/stake_pool.d.ts +3 -1
- package/dist/esm/solana/descriptor/stake_pool.js +3 -1
- package/dist/esm/solana/descriptor/stake_pool.js.map +1 -0
- package/package.json +63 -18
- package/dist/cjs/__tests__/solana/rewards.spec.js +0 -61
- package/dist/cjs/index.js +0 -37
- package/dist/cjs/solana/client.js +0 -336
- package/dist/cjs/solana/constants.js +0 -72
- package/dist/cjs/solana/descriptor/fee_manager.js +0 -2
- package/dist/cjs/solana/descriptor/idl/fee_manager.json +0 -436
- package/dist/cjs/solana/descriptor/idl/reward_pool.json +0 -1372
- package/dist/cjs/solana/descriptor/idl/stake_pool.json +0 -1318
- package/dist/cjs/solana/descriptor/reward_pool.js +0 -2
- package/dist/cjs/solana/descriptor/stake_pool.js +0 -2
- package/dist/cjs/solana/lib/derive-accounts.js +0 -46
- package/dist/cjs/solana/lib/fee-amounts.js +0 -44
- package/dist/cjs/solana/lib/rewards.js +0 -154
- package/dist/cjs/solana/lib/stake-weight.js +0 -19
- package/dist/cjs/solana/types.js +0 -2
- package/dist/esm/__tests__/solana/rewards.spec.d.ts +0 -1
- package/dist/esm/__tests__/solana/rewards.spec.js +0 -56
- package/dist/esm/solana/client.d.ts +0 -89
- package/dist/esm/solana/client.js +0 -334
- package/dist/esm/solana/constants.d.ts +0 -54
- package/dist/esm/solana/constants.js +0 -69
- package/dist/esm/solana/lib/derive-accounts.d.ts +0 -10
- package/dist/esm/solana/lib/derive-accounts.js +0 -31
- package/dist/esm/solana/lib/fee-amounts.d.ts +0 -9
- package/dist/esm/solana/lib/fee-amounts.js +0 -38
- package/dist/esm/solana/lib/rewards.d.ts +0 -26
- package/dist/esm/solana/lib/rewards.js +0 -152
- package/dist/esm/solana/lib/stake-weight.d.ts +0 -2
- package/dist/esm/solana/lib/stake-weight.js +0 -12
- package/dist/esm/solana/types.d.ts +0 -77
- package/dist/esm/solana/types.js +0 -1
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { PublicKey } from "@solana/web3.js";
|
|
2
|
-
// eslint-disable-next-line no-restricted-imports
|
|
3
|
-
import BN from "bn.js";
|
|
4
|
-
import { getBN, getNumberFromBN } from "@streamflow/common";
|
|
5
|
-
import { REWARD_AMOUNT_DECIMALS, REWARD_AMOUNT_PRECISION_FACTOR_BN, SCALE_PRECISION_FACTOR_BN } from "../constants.js";
|
|
6
|
-
export class RewardEntryAccumulator {
|
|
7
|
-
lastAccountedTs;
|
|
8
|
-
claimedAmount;
|
|
9
|
-
accountedAmount;
|
|
10
|
-
rewardPool;
|
|
11
|
-
stakeEntry;
|
|
12
|
-
createdTs;
|
|
13
|
-
lastRewardAmount;
|
|
14
|
-
lastRewardPeriod;
|
|
15
|
-
buffer;
|
|
16
|
-
constructor(lastAccountedTs, claimedAmount, accountedAmount, rewardPool, stakeEntry, createdTs, lastRewardAmount, lastRewardPeriod, buffer) {
|
|
17
|
-
this.lastAccountedTs = lastAccountedTs;
|
|
18
|
-
this.claimedAmount = claimedAmount;
|
|
19
|
-
this.accountedAmount = accountedAmount;
|
|
20
|
-
this.rewardPool = rewardPool;
|
|
21
|
-
this.stakeEntry = stakeEntry;
|
|
22
|
-
this.createdTs = createdTs;
|
|
23
|
-
this.buffer = buffer;
|
|
24
|
-
this.lastRewardAmount = lastRewardAmount;
|
|
25
|
-
this.lastRewardPeriod = lastRewardPeriod;
|
|
26
|
-
}
|
|
27
|
-
static fromEntry(entry) {
|
|
28
|
-
return new this(entry.lastAccountedTs, entry.claimedAmount, entry.accountedAmount, entry.rewardPool, entry.stakeEntry, entry.createdTs, entry.lastRewardAmount, entry.lastRewardPeriod, entry.buffer);
|
|
29
|
-
}
|
|
30
|
-
// Calculate accountable amount by calculating how many seconds have passed since last claim/stake time
|
|
31
|
-
getAccountableAmount(stakedTs, accountableTs, effectiveStakedAmount, rewardAmount, rewardPeriod) {
|
|
32
|
-
const lastAccountedTs = this.lastAccountedTs.gt(new BN(0)) ? this.lastAccountedTs : stakedTs;
|
|
33
|
-
const secondsPassed = accountableTs.sub(lastAccountedTs);
|
|
34
|
-
if (secondsPassed.lt(rewardPeriod)) {
|
|
35
|
-
return new BN(0);
|
|
36
|
-
}
|
|
37
|
-
const periodsPassed = secondsPassed.div(rewardPeriod);
|
|
38
|
-
const claimablePerEffectiveStake = periodsPassed.mul(rewardAmount);
|
|
39
|
-
return claimablePerEffectiveStake.mul(effectiveStakedAmount).div(SCALE_PRECISION_FACTOR_BN);
|
|
40
|
-
}
|
|
41
|
-
// Calculates claimable amount from accountable amount.
|
|
42
|
-
getClaimableAmount() {
|
|
43
|
-
const claimedAmount = this.claimedAmount.mul(REWARD_AMOUNT_PRECISION_FACTOR_BN);
|
|
44
|
-
const nonClaimedAmount = this.accountedAmount.sub(claimedAmount);
|
|
45
|
-
return nonClaimedAmount.div(REWARD_AMOUNT_PRECISION_FACTOR_BN);
|
|
46
|
-
}
|
|
47
|
-
// Get the time of the last unlock
|
|
48
|
-
getLastAccountedTs(stakedTs, claimableTs, rewardPeriod) {
|
|
49
|
-
const lastAccountedTs = this.lastAccountedTs.gtn(0) ? this.lastAccountedTs : stakedTs;
|
|
50
|
-
const totalSecondsPassed = claimableTs.sub(lastAccountedTs);
|
|
51
|
-
const periodsPassed = totalSecondsPassed.div(rewardPeriod);
|
|
52
|
-
const periodsToSeconds = periodsPassed.mul(rewardPeriod);
|
|
53
|
-
return lastAccountedTs.add(periodsToSeconds);
|
|
54
|
-
}
|
|
55
|
-
// Adds accounted amount
|
|
56
|
-
addAccountedAmount(accountedAmount) {
|
|
57
|
-
this.accountedAmount = this.accountedAmount.add(accountedAmount);
|
|
58
|
-
}
|
|
59
|
-
// Adds claimed amount
|
|
60
|
-
addClaimedAmount(claimedAmount) {
|
|
61
|
-
this.claimedAmount = this.claimedAmount.add(claimedAmount);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const createDefaultRewardEntry = (stakeEntry, rewardPool) => {
|
|
65
|
-
return {
|
|
66
|
-
stakeEntry: new PublicKey(stakeEntry.publicKey),
|
|
67
|
-
rewardPool: new PublicKey(rewardPool.publicKey),
|
|
68
|
-
createdTs: stakeEntry.account.createdTs,
|
|
69
|
-
lastAccountedTs: new BN(0),
|
|
70
|
-
lastRewardAmount: new BN(0),
|
|
71
|
-
lastRewardPeriod: new BN(0),
|
|
72
|
-
accountedAmount: new BN(0),
|
|
73
|
-
claimedAmount: new BN(0),
|
|
74
|
-
buffer: [],
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
export const calcRewards = (rewardEntryAccount, stakeEntryAccount, rewardPoolAccount) => {
|
|
78
|
-
const rewardEntry = rewardEntryAccount?.account ?? createDefaultRewardEntry(stakeEntryAccount, rewardPoolAccount);
|
|
79
|
-
const stakeEntry = stakeEntryAccount.account;
|
|
80
|
-
const rewardPool = rewardPoolAccount.account;
|
|
81
|
-
const rewardEntryAccumulator = RewardEntryAccumulator.fromEntry(rewardEntry);
|
|
82
|
-
if (rewardEntryAccumulator.createdTs.lt(stakeEntry.createdTs)) {
|
|
83
|
-
throw new Error("InvalidRewardEntry");
|
|
84
|
-
}
|
|
85
|
-
const currTs = Math.floor(Date.now() / 1000);
|
|
86
|
-
const stakedTs = rewardPool.createdTs ? BN.max(stakeEntry.createdTs, rewardPool.createdTs) : stakeEntry.createdTs;
|
|
87
|
-
const claimableTs = stakeEntry.closedTs.gtn(0) ? stakeEntry.closedTs : new BN(currTs);
|
|
88
|
-
const amountUpdated = !rewardPool.rewardAmount.eq(rewardPool.lastRewardAmount) &&
|
|
89
|
-
rewardPool.lastAmountUpdateTs.gt(stakeEntry.createdTs) &&
|
|
90
|
-
rewardPool.lastAmountUpdateTs.gt(stakeEntry.closedTs);
|
|
91
|
-
const periodUpdated = !rewardPool.rewardPeriod.eq(rewardPool.lastRewardPeriod) &&
|
|
92
|
-
rewardPool.lastPeriodUpdateTs.gt(stakeEntry.createdTs) &&
|
|
93
|
-
rewardPool.lastPeriodUpdateTs.gt(stakeEntry.closedTs);
|
|
94
|
-
if (amountUpdated || periodUpdated) {
|
|
95
|
-
let firstUpdateTs, secondUpdateTs, rewardAmount, rewardPeriod;
|
|
96
|
-
if (amountUpdated && periodUpdated) {
|
|
97
|
-
if (rewardPool.lastAmountUpdateTs.lt(rewardPool.lastPeriodUpdateTs)) {
|
|
98
|
-
firstUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
99
|
-
secondUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
100
|
-
rewardAmount = rewardPool.rewardAmount;
|
|
101
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
firstUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
105
|
-
secondUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
106
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
107
|
-
rewardPeriod = rewardPool.rewardPeriod;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else if (amountUpdated) {
|
|
111
|
-
firstUpdateTs = new BN(0);
|
|
112
|
-
secondUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
113
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
114
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
firstUpdateTs = new BN(0);
|
|
118
|
-
secondUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
119
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
120
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
121
|
-
}
|
|
122
|
-
if (firstUpdateTs.gtn(0)) {
|
|
123
|
-
const firstAccountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, firstUpdateTs, stakeEntry.effectiveAmount, rewardEntryAccumulator.lastRewardAmount, rewardEntryAccumulator.lastRewardPeriod);
|
|
124
|
-
rewardEntryAccumulator.addAccountedAmount(firstAccountableAmount);
|
|
125
|
-
rewardEntryAccumulator.lastAccountedTs = rewardEntryAccumulator.getLastAccountedTs(stakedTs, firstUpdateTs, rewardPool.lastRewardPeriod);
|
|
126
|
-
}
|
|
127
|
-
const secondAccountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, secondUpdateTs, stakeEntry.effectiveAmount, rewardAmount, rewardPeriod);
|
|
128
|
-
rewardEntryAccumulator.addAccountedAmount(secondAccountableAmount);
|
|
129
|
-
rewardEntryAccumulator.lastAccountedTs = rewardEntryAccumulator.getLastAccountedTs(stakedTs, secondUpdateTs, rewardPeriod);
|
|
130
|
-
}
|
|
131
|
-
const accountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, claimableTs, stakeEntry.effectiveAmount, rewardPool.rewardAmount, rewardPool.rewardPeriod);
|
|
132
|
-
rewardEntryAccumulator.addAccountedAmount(accountableAmount);
|
|
133
|
-
return rewardEntryAccumulator.getClaimableAmount();
|
|
134
|
-
};
|
|
135
|
-
export const calculateRewardRateFromAmount = (rewardAmount, stakeTokenDecimals, rewardTokenDecimals) => {
|
|
136
|
-
const decimals = rewardTokenDecimals + (REWARD_AMOUNT_DECIMALS - stakeTokenDecimals);
|
|
137
|
-
return getNumberFromBN(rewardAmount, decimals);
|
|
138
|
-
};
|
|
139
|
-
export const calculateRewardAmountFromValue = (rewardTokenValue, stakeTokenDecimals) => {
|
|
140
|
-
const decimalsDiff = REWARD_AMOUNT_DECIMALS - stakeTokenDecimals;
|
|
141
|
-
if (decimalsDiff === 0) {
|
|
142
|
-
return rewardTokenValue;
|
|
143
|
-
}
|
|
144
|
-
const diffFactor = new BN(10).pow(new BN(Math.abs(decimalsDiff)));
|
|
145
|
-
if (decimalsDiff > 0) {
|
|
146
|
-
return rewardTokenValue.mul(diffFactor);
|
|
147
|
-
}
|
|
148
|
-
return rewardTokenValue.div(diffFactor);
|
|
149
|
-
};
|
|
150
|
-
export const calculateRewardAmountFromRate = (rewardRate, stakeTokenDecimals, rewardTokenDecimals) => {
|
|
151
|
-
return calculateRewardAmountFromValue(getBN(rewardRate, rewardTokenDecimals), stakeTokenDecimals);
|
|
152
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import BN from "bn.js";
|
|
2
|
-
import { SCALE_PRECISION_FACTOR_BN } from "../constants.js";
|
|
3
|
-
export const calculateStakeWeight = (minDuration, maxDuration, maxWeight, duration) => {
|
|
4
|
-
const durationSpan = maxDuration.sub(minDuration);
|
|
5
|
-
if (durationSpan.eq(new BN(0))) {
|
|
6
|
-
return SCALE_PRECISION_FACTOR_BN;
|
|
7
|
-
}
|
|
8
|
-
const durationExceedingMin = duration.sub(minDuration);
|
|
9
|
-
const normalizedWeight = durationExceedingMin.mul(SCALE_PRECISION_FACTOR_BN).div(durationSpan);
|
|
10
|
-
const weightDiff = maxWeight.sub(SCALE_PRECISION_FACTOR_BN);
|
|
11
|
-
return BN.max(SCALE_PRECISION_FACTOR_BN.add(normalizedWeight.mul(weightDiff).div(SCALE_PRECISION_FACTOR_BN)), SCALE_PRECISION_FACTOR_BN);
|
|
12
|
-
};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { Address, type IdlAccounts } from "@coral-xyz/anchor";
|
|
2
|
-
import { SignerWalletAdapter } from "@solana/wallet-adapter-base";
|
|
3
|
-
import { Keypair } from "@solana/web3.js";
|
|
4
|
-
import { ITransactionSolanaExt } from "@streamflow/common/solana";
|
|
5
|
-
import BN from "bn.js";
|
|
6
|
-
import { RewardPool as RewardPoolIDL } from "./descriptor/reward_pool.js";
|
|
7
|
-
import { StakePool as StakePoolIDL } from "./descriptor/stake_pool.js";
|
|
8
|
-
import { FeeManager as FeeManagerIDL } from "./descriptor/fee_manager.js";
|
|
9
|
-
export type StakePool = IdlAccounts<StakePoolIDL>["stakePool"];
|
|
10
|
-
export type StakeEntry = IdlAccounts<StakePoolIDL>["stakeEntry"];
|
|
11
|
-
export type RewardEntry = IdlAccounts<RewardPoolIDL>["rewardEntry"];
|
|
12
|
-
export type RewardPool = IdlAccounts<RewardPoolIDL>["rewardPool"];
|
|
13
|
-
export type FeeValue = IdlAccounts<FeeManagerIDL>["feeValue"];
|
|
14
|
-
export type DefaultFeeValueConfig = IdlAccounts<FeeManagerIDL>["config"];
|
|
15
|
-
export interface IInteractSolanaExt extends ITransactionSolanaExt {
|
|
16
|
-
invoker: SignerWalletAdapter | Keypair;
|
|
17
|
-
}
|
|
18
|
-
export interface BaseStakePoolArgs {
|
|
19
|
-
stakePool: Address;
|
|
20
|
-
stakePoolMint: Address;
|
|
21
|
-
}
|
|
22
|
-
interface TokenProgram {
|
|
23
|
-
tokenProgramId?: Address;
|
|
24
|
-
}
|
|
25
|
-
interface StakeBaseArgs extends BaseStakePoolArgs, TokenProgram {
|
|
26
|
-
nonce: number;
|
|
27
|
-
}
|
|
28
|
-
export type UnstakeArgs = StakeBaseArgs;
|
|
29
|
-
export interface StakeArgs extends StakeBaseArgs {
|
|
30
|
-
amount: BN;
|
|
31
|
-
duration: BN;
|
|
32
|
-
payer?: Keypair;
|
|
33
|
-
authority?: Address;
|
|
34
|
-
}
|
|
35
|
-
export interface FundPoolArgs extends BaseStakePoolArgs, TokenProgram {
|
|
36
|
-
amount: BN;
|
|
37
|
-
nonce: number;
|
|
38
|
-
rewardMint: Address;
|
|
39
|
-
feeValue: Address | null;
|
|
40
|
-
}
|
|
41
|
-
export interface CreateRewardEntryArgs extends BaseStakePoolArgs, TokenProgram {
|
|
42
|
-
depositNonce: number;
|
|
43
|
-
rewardPoolNonce: number;
|
|
44
|
-
rewardMint: Address;
|
|
45
|
-
}
|
|
46
|
-
export interface CreateRewardPoolArgs extends BaseStakePoolArgs, TokenProgram {
|
|
47
|
-
stakePoolNonce: number;
|
|
48
|
-
rewardMint: Address;
|
|
49
|
-
nonce: number;
|
|
50
|
-
rewardAmount: BN;
|
|
51
|
-
rewardPeriod: BN;
|
|
52
|
-
permissionless: boolean;
|
|
53
|
-
lastClaimPeriodOpt: BN | null;
|
|
54
|
-
}
|
|
55
|
-
export interface UpdateRewardPoolArgs {
|
|
56
|
-
stakePool: Address;
|
|
57
|
-
rewardAmount: BN | null;
|
|
58
|
-
rewardPeriod: BN | null;
|
|
59
|
-
rewardPool: Address;
|
|
60
|
-
}
|
|
61
|
-
export interface ClaimRewardPoolArgs extends BaseStakePoolArgs, TokenProgram {
|
|
62
|
-
depositNonce: number;
|
|
63
|
-
rewardMint: Address;
|
|
64
|
-
rewardPoolNonce: number;
|
|
65
|
-
}
|
|
66
|
-
export interface CreateStakePoolArgs extends TokenProgram {
|
|
67
|
-
mint: Address;
|
|
68
|
-
nonce: number;
|
|
69
|
-
maxWeight: BN;
|
|
70
|
-
minDuration: BN;
|
|
71
|
-
maxDuration: BN;
|
|
72
|
-
permissionless?: boolean;
|
|
73
|
-
freezeStakeMint?: boolean | null;
|
|
74
|
-
unstakePeriod?: BN | null;
|
|
75
|
-
authority?: Keypair;
|
|
76
|
-
}
|
|
77
|
-
export {};
|
package/dist/esm/solana/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|