@streamflow/staking 7.5.3 → 8.0.0-alpha.p287.5172056
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 +2942 -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 +2917 -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,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.deriveFeeValuePDA = exports.deriveConfigPDA = exports.deriveRewardEntryPDA = exports.deriveRewardVaultPDA = exports.deriveRewardPoolPDA = exports.deriveStakeEntryPDA = exports.deriveStakeMintPDA = exports.deriveStakeVaultPDA = exports.deriveStakePoolPDA = void 0;
|
|
7
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
-
// eslint-disable-next-line no-restricted-imports
|
|
9
|
-
const bn_js_1 = __importDefault(require("bn.js"));
|
|
10
|
-
const constants_js_1 = require("../constants.js");
|
|
11
|
-
const deriveStakePoolPDA = (programId, mint, authority, nonce) => {
|
|
12
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.STAKE_POOL_PREFIX, mint.toBuffer(), authority.toBuffer(), new bn_js_1.default(nonce).toArrayLike(Buffer, "le", 1)], programId)[0];
|
|
13
|
-
};
|
|
14
|
-
exports.deriveStakePoolPDA = deriveStakePoolPDA;
|
|
15
|
-
const deriveStakeVaultPDA = (programId, stakePool) => {
|
|
16
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.STAKE_VAULT_PREFIX, stakePool.toBuffer()], programId)[0];
|
|
17
|
-
};
|
|
18
|
-
exports.deriveStakeVaultPDA = deriveStakeVaultPDA;
|
|
19
|
-
const deriveStakeMintPDA = (programId, stakePool) => {
|
|
20
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.STAKE_MINT_PREFIX, stakePool.toBuffer()], programId)[0];
|
|
21
|
-
};
|
|
22
|
-
exports.deriveStakeMintPDA = deriveStakeMintPDA;
|
|
23
|
-
const deriveStakeEntryPDA = (programId, stakePool, authority, nonce) => {
|
|
24
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.STAKE_ENTRY_PREFIX, stakePool.toBuffer(), authority.toBuffer(), new bn_js_1.default(nonce).toArrayLike(Buffer, "le", 4)], programId)[0];
|
|
25
|
-
};
|
|
26
|
-
exports.deriveStakeEntryPDA = deriveStakeEntryPDA;
|
|
27
|
-
const deriveRewardPoolPDA = (programId, stakePool, mint, nonce) => {
|
|
28
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.REWARD_POOL_PREFIX, stakePool.toBuffer(), mint.toBuffer(), new bn_js_1.default(nonce).toArrayLike(Buffer, "le", 1)], programId)[0];
|
|
29
|
-
};
|
|
30
|
-
exports.deriveRewardPoolPDA = deriveRewardPoolPDA;
|
|
31
|
-
const deriveRewardVaultPDA = (programId, rewardPool) => {
|
|
32
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.REWARD_VAULT_PREFIX, rewardPool.toBuffer()], programId)[0];
|
|
33
|
-
};
|
|
34
|
-
exports.deriveRewardVaultPDA = deriveRewardVaultPDA;
|
|
35
|
-
const deriveRewardEntryPDA = (programId, rewardPool, stakeEntry) => {
|
|
36
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.REWARD_ENTRY_PREFIX, rewardPool.toBuffer(), stakeEntry.toBuffer()], programId)[0];
|
|
37
|
-
};
|
|
38
|
-
exports.deriveRewardEntryPDA = deriveRewardEntryPDA;
|
|
39
|
-
const deriveConfigPDA = (programId) => {
|
|
40
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.CONFIG_PREFIX], programId)[0];
|
|
41
|
-
};
|
|
42
|
-
exports.deriveConfigPDA = deriveConfigPDA;
|
|
43
|
-
const deriveFeeValuePDA = (programId, target) => {
|
|
44
|
-
return web3_js_1.PublicKey.findProgramAddressSync([constants_js_1.FEE_VALUE_PREFIX, target.toBuffer()], programId)[0];
|
|
45
|
-
};
|
|
46
|
-
exports.deriveFeeValuePDA = deriveFeeValuePDA;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.calculateDecimalsShift = exports.calculateFeeAmount = void 0;
|
|
4
|
-
exports.calculateAmountWithTransferFees = calculateAmountWithTransferFees;
|
|
5
|
-
const common_1 = require("@streamflow/common");
|
|
6
|
-
const constants_js_1 = require("../constants.js");
|
|
7
|
-
const calculateFeeAmount = (amount, fee = constants_js_1.DEFAULT_FEE_BN) => {
|
|
8
|
-
if (fee.eq(constants_js_1.FEE_PRECISION_FACTOR_BN)) {
|
|
9
|
-
return amount;
|
|
10
|
-
}
|
|
11
|
-
return amount.mul(fee).div(constants_js_1.FEE_PRECISION_FACTOR_BN);
|
|
12
|
-
};
|
|
13
|
-
exports.calculateFeeAmount = calculateFeeAmount;
|
|
14
|
-
const calculateDecimalsShift = (maxWeight, maxShift = 999) => {
|
|
15
|
-
if (maxShift == 0) {
|
|
16
|
-
return 0;
|
|
17
|
-
}
|
|
18
|
-
let decimalsShift = 0;
|
|
19
|
-
while ((maxWeight * constants_js_1.U64_MAX) / BigInt(constants_js_1.SCALE_PRECISION_FACTOR) / BigInt(10 ** decimalsShift) > constants_js_1.U64_MAX) {
|
|
20
|
-
decimalsShift += 1;
|
|
21
|
-
if (decimalsShift == maxShift) {
|
|
22
|
-
return maxShift;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return decimalsShift;
|
|
26
|
-
};
|
|
27
|
-
exports.calculateDecimalsShift = calculateDecimalsShift;
|
|
28
|
-
async function calculateAmountWithTransferFees(connection, transferFeeConfig, transferAmount) {
|
|
29
|
-
const epoch = await connection.getEpochInfo();
|
|
30
|
-
const transferFee = epoch.epoch >= transferFeeConfig.newerTransferFee.epoch
|
|
31
|
-
? transferFeeConfig.newerTransferFee
|
|
32
|
-
: transferFeeConfig.olderTransferFee;
|
|
33
|
-
const transferFeeBasisPoints = BigInt(transferFee.transferFeeBasisPoints);
|
|
34
|
-
let feeCharged = BigInt(0);
|
|
35
|
-
if (transferFeeBasisPoints !== BigInt(0)) {
|
|
36
|
-
const numerator = transferAmount * 10000n;
|
|
37
|
-
const denominator = 10000n - transferFeeBasisPoints;
|
|
38
|
-
const rawPreFeeAmount = (0, common_1.divCeilN)(numerator, denominator);
|
|
39
|
-
const fee = rawPreFeeAmount - transferAmount;
|
|
40
|
-
transferAmount = rawPreFeeAmount;
|
|
41
|
-
feeCharged = fee > transferFee.maximumFee ? transferFee.maximumFee : fee;
|
|
42
|
-
}
|
|
43
|
-
return { transferAmount, feeCharged };
|
|
44
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.calculateRewardAmountFromRate = exports.calculateRewardAmountFromValue = exports.calculateRewardRateFromAmount = exports.calcRewards = exports.RewardEntryAccumulator = void 0;
|
|
7
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
-
// eslint-disable-next-line no-restricted-imports
|
|
9
|
-
const bn_js_1 = __importDefault(require("bn.js"));
|
|
10
|
-
const common_1 = require("@streamflow/common");
|
|
11
|
-
const constants_js_1 = require("../constants.js");
|
|
12
|
-
class RewardEntryAccumulator {
|
|
13
|
-
constructor(lastAccountedTs, claimedAmount, accountedAmount, rewardPool, stakeEntry, createdTs, lastRewardAmount, lastRewardPeriod, buffer) {
|
|
14
|
-
this.lastAccountedTs = lastAccountedTs;
|
|
15
|
-
this.claimedAmount = claimedAmount;
|
|
16
|
-
this.accountedAmount = accountedAmount;
|
|
17
|
-
this.rewardPool = rewardPool;
|
|
18
|
-
this.stakeEntry = stakeEntry;
|
|
19
|
-
this.createdTs = createdTs;
|
|
20
|
-
this.buffer = buffer;
|
|
21
|
-
this.lastRewardAmount = lastRewardAmount;
|
|
22
|
-
this.lastRewardPeriod = lastRewardPeriod;
|
|
23
|
-
}
|
|
24
|
-
static fromEntry(entry) {
|
|
25
|
-
return new this(entry.lastAccountedTs, entry.claimedAmount, entry.accountedAmount, entry.rewardPool, entry.stakeEntry, entry.createdTs, entry.lastRewardAmount, entry.lastRewardPeriod, entry.buffer);
|
|
26
|
-
}
|
|
27
|
-
// Calculate accountable amount by calculating how many seconds have passed since last claim/stake time
|
|
28
|
-
getAccountableAmount(stakedTs, accountableTs, effectiveStakedAmount, rewardAmount, rewardPeriod) {
|
|
29
|
-
const lastAccountedTs = this.lastAccountedTs.gt(new bn_js_1.default(0)) ? this.lastAccountedTs : stakedTs;
|
|
30
|
-
const secondsPassed = accountableTs.sub(lastAccountedTs);
|
|
31
|
-
if (secondsPassed.lt(rewardPeriod)) {
|
|
32
|
-
return new bn_js_1.default(0);
|
|
33
|
-
}
|
|
34
|
-
const periodsPassed = secondsPassed.div(rewardPeriod);
|
|
35
|
-
const claimablePerEffectiveStake = periodsPassed.mul(rewardAmount);
|
|
36
|
-
return claimablePerEffectiveStake.mul(effectiveStakedAmount).div(constants_js_1.SCALE_PRECISION_FACTOR_BN);
|
|
37
|
-
}
|
|
38
|
-
// Calculates claimable amount from accountable amount.
|
|
39
|
-
getClaimableAmount() {
|
|
40
|
-
const claimedAmount = this.claimedAmount.mul(constants_js_1.REWARD_AMOUNT_PRECISION_FACTOR_BN);
|
|
41
|
-
const nonClaimedAmount = this.accountedAmount.sub(claimedAmount);
|
|
42
|
-
return nonClaimedAmount.div(constants_js_1.REWARD_AMOUNT_PRECISION_FACTOR_BN);
|
|
43
|
-
}
|
|
44
|
-
// Get the time of the last unlock
|
|
45
|
-
getLastAccountedTs(stakedTs, claimableTs, rewardPeriod) {
|
|
46
|
-
const lastAccountedTs = this.lastAccountedTs.gtn(0) ? this.lastAccountedTs : stakedTs;
|
|
47
|
-
const totalSecondsPassed = claimableTs.sub(lastAccountedTs);
|
|
48
|
-
const periodsPassed = totalSecondsPassed.div(rewardPeriod);
|
|
49
|
-
const periodsToSeconds = periodsPassed.mul(rewardPeriod);
|
|
50
|
-
return lastAccountedTs.add(periodsToSeconds);
|
|
51
|
-
}
|
|
52
|
-
// Adds accounted amount
|
|
53
|
-
addAccountedAmount(accountedAmount) {
|
|
54
|
-
this.accountedAmount = this.accountedAmount.add(accountedAmount);
|
|
55
|
-
}
|
|
56
|
-
// Adds claimed amount
|
|
57
|
-
addClaimedAmount(claimedAmount) {
|
|
58
|
-
this.claimedAmount = this.claimedAmount.add(claimedAmount);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
exports.RewardEntryAccumulator = RewardEntryAccumulator;
|
|
62
|
-
const createDefaultRewardEntry = (stakeEntry, rewardPool) => {
|
|
63
|
-
return {
|
|
64
|
-
stakeEntry: new web3_js_1.PublicKey(stakeEntry.publicKey),
|
|
65
|
-
rewardPool: new web3_js_1.PublicKey(rewardPool.publicKey),
|
|
66
|
-
createdTs: stakeEntry.account.createdTs,
|
|
67
|
-
lastAccountedTs: new bn_js_1.default(0),
|
|
68
|
-
lastRewardAmount: new bn_js_1.default(0),
|
|
69
|
-
lastRewardPeriod: new bn_js_1.default(0),
|
|
70
|
-
accountedAmount: new bn_js_1.default(0),
|
|
71
|
-
claimedAmount: new bn_js_1.default(0),
|
|
72
|
-
buffer: [],
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
const calcRewards = (rewardEntryAccount, stakeEntryAccount, rewardPoolAccount) => {
|
|
76
|
-
const rewardEntry = rewardEntryAccount?.account ?? createDefaultRewardEntry(stakeEntryAccount, rewardPoolAccount);
|
|
77
|
-
const stakeEntry = stakeEntryAccount.account;
|
|
78
|
-
const rewardPool = rewardPoolAccount.account;
|
|
79
|
-
const rewardEntryAccumulator = RewardEntryAccumulator.fromEntry(rewardEntry);
|
|
80
|
-
if (rewardEntryAccumulator.createdTs.lt(stakeEntry.createdTs)) {
|
|
81
|
-
throw new Error("InvalidRewardEntry");
|
|
82
|
-
}
|
|
83
|
-
const currTs = Math.floor(Date.now() / 1000);
|
|
84
|
-
const stakedTs = rewardPool.createdTs ? bn_js_1.default.max(stakeEntry.createdTs, rewardPool.createdTs) : stakeEntry.createdTs;
|
|
85
|
-
const claimableTs = stakeEntry.closedTs.gtn(0) ? stakeEntry.closedTs : new bn_js_1.default(currTs);
|
|
86
|
-
const amountUpdated = !rewardPool.rewardAmount.eq(rewardPool.lastRewardAmount) &&
|
|
87
|
-
rewardPool.lastAmountUpdateTs.gt(stakeEntry.createdTs) &&
|
|
88
|
-
rewardPool.lastAmountUpdateTs.gt(stakeEntry.closedTs);
|
|
89
|
-
const periodUpdated = !rewardPool.rewardPeriod.eq(rewardPool.lastRewardPeriod) &&
|
|
90
|
-
rewardPool.lastPeriodUpdateTs.gt(stakeEntry.createdTs) &&
|
|
91
|
-
rewardPool.lastPeriodUpdateTs.gt(stakeEntry.closedTs);
|
|
92
|
-
if (amountUpdated || periodUpdated) {
|
|
93
|
-
let firstUpdateTs, secondUpdateTs, rewardAmount, rewardPeriod;
|
|
94
|
-
if (amountUpdated && periodUpdated) {
|
|
95
|
-
if (rewardPool.lastAmountUpdateTs.lt(rewardPool.lastPeriodUpdateTs)) {
|
|
96
|
-
firstUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
97
|
-
secondUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
98
|
-
rewardAmount = rewardPool.rewardAmount;
|
|
99
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
firstUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
103
|
-
secondUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
104
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
105
|
-
rewardPeriod = rewardPool.rewardPeriod;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
else if (amountUpdated) {
|
|
109
|
-
firstUpdateTs = new bn_js_1.default(0);
|
|
110
|
-
secondUpdateTs = rewardPool.lastAmountUpdateTs;
|
|
111
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
112
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
firstUpdateTs = new bn_js_1.default(0);
|
|
116
|
-
secondUpdateTs = rewardPool.lastPeriodUpdateTs;
|
|
117
|
-
rewardAmount = rewardEntryAccumulator.lastRewardAmount;
|
|
118
|
-
rewardPeriod = rewardEntryAccumulator.lastRewardPeriod;
|
|
119
|
-
}
|
|
120
|
-
if (firstUpdateTs.gtn(0)) {
|
|
121
|
-
const firstAccountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, firstUpdateTs, stakeEntry.effectiveAmount, rewardEntryAccumulator.lastRewardAmount, rewardEntryAccumulator.lastRewardPeriod);
|
|
122
|
-
rewardEntryAccumulator.addAccountedAmount(firstAccountableAmount);
|
|
123
|
-
rewardEntryAccumulator.lastAccountedTs = rewardEntryAccumulator.getLastAccountedTs(stakedTs, firstUpdateTs, rewardPool.lastRewardPeriod);
|
|
124
|
-
}
|
|
125
|
-
const secondAccountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, secondUpdateTs, stakeEntry.effectiveAmount, rewardAmount, rewardPeriod);
|
|
126
|
-
rewardEntryAccumulator.addAccountedAmount(secondAccountableAmount);
|
|
127
|
-
rewardEntryAccumulator.lastAccountedTs = rewardEntryAccumulator.getLastAccountedTs(stakedTs, secondUpdateTs, rewardPeriod);
|
|
128
|
-
}
|
|
129
|
-
const accountableAmount = rewardEntryAccumulator.getAccountableAmount(stakedTs, claimableTs, stakeEntry.effectiveAmount, rewardPool.rewardAmount, rewardPool.rewardPeriod);
|
|
130
|
-
rewardEntryAccumulator.addAccountedAmount(accountableAmount);
|
|
131
|
-
return rewardEntryAccumulator.getClaimableAmount();
|
|
132
|
-
};
|
|
133
|
-
exports.calcRewards = calcRewards;
|
|
134
|
-
const calculateRewardRateFromAmount = (rewardAmount, stakeTokenDecimals, rewardTokenDecimals) => {
|
|
135
|
-
const decimals = rewardTokenDecimals + (constants_js_1.REWARD_AMOUNT_DECIMALS - stakeTokenDecimals);
|
|
136
|
-
return (0, common_1.getNumberFromBN)(rewardAmount, decimals);
|
|
137
|
-
};
|
|
138
|
-
exports.calculateRewardRateFromAmount = calculateRewardRateFromAmount;
|
|
139
|
-
const calculateRewardAmountFromValue = (rewardTokenValue, stakeTokenDecimals) => {
|
|
140
|
-
const decimalsDiff = constants_js_1.REWARD_AMOUNT_DECIMALS - stakeTokenDecimals;
|
|
141
|
-
if (decimalsDiff === 0) {
|
|
142
|
-
return rewardTokenValue;
|
|
143
|
-
}
|
|
144
|
-
const diffFactor = new bn_js_1.default(10).pow(new bn_js_1.default(Math.abs(decimalsDiff)));
|
|
145
|
-
if (decimalsDiff > 0) {
|
|
146
|
-
return rewardTokenValue.mul(diffFactor);
|
|
147
|
-
}
|
|
148
|
-
return rewardTokenValue.div(diffFactor);
|
|
149
|
-
};
|
|
150
|
-
exports.calculateRewardAmountFromValue = calculateRewardAmountFromValue;
|
|
151
|
-
const calculateRewardAmountFromRate = (rewardRate, stakeTokenDecimals, rewardTokenDecimals) => {
|
|
152
|
-
return (0, exports.calculateRewardAmountFromValue)((0, common_1.getBN)(rewardRate, rewardTokenDecimals), stakeTokenDecimals);
|
|
153
|
-
};
|
|
154
|
-
exports.calculateRewardAmountFromRate = calculateRewardAmountFromRate;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.calculateStakeWeight = void 0;
|
|
7
|
-
const bn_js_1 = __importDefault(require("bn.js"));
|
|
8
|
-
const constants_js_1 = require("../constants.js");
|
|
9
|
-
const calculateStakeWeight = (minDuration, maxDuration, maxWeight, duration) => {
|
|
10
|
-
const durationSpan = maxDuration.sub(minDuration);
|
|
11
|
-
if (durationSpan.eq(new bn_js_1.default(0))) {
|
|
12
|
-
return constants_js_1.SCALE_PRECISION_FACTOR_BN;
|
|
13
|
-
}
|
|
14
|
-
const durationExceedingMin = duration.sub(minDuration);
|
|
15
|
-
const normalizedWeight = durationExceedingMin.mul(constants_js_1.SCALE_PRECISION_FACTOR_BN).div(durationSpan);
|
|
16
|
-
const weightDiff = maxWeight.sub(constants_js_1.SCALE_PRECISION_FACTOR_BN);
|
|
17
|
-
return bn_js_1.default.max(constants_js_1.SCALE_PRECISION_FACTOR_BN.add(normalizedWeight.mul(weightDiff).div(constants_js_1.SCALE_PRECISION_FACTOR_BN)), constants_js_1.SCALE_PRECISION_FACTOR_BN);
|
|
18
|
-
};
|
|
19
|
-
exports.calculateStakeWeight = calculateStakeWeight;
|
package/dist/cjs/solana/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { getBN } from "@streamflow/common";
|
|
2
|
-
import { PublicKey } from "@solana/web3.js";
|
|
3
|
-
// eslint-disable-next-line no-restricted-imports
|
|
4
|
-
import BN from "bn.js";
|
|
5
|
-
import { describe, expect, test } from "vitest";
|
|
6
|
-
import { RewardEntryAccumulator, calculateRewardAmountFromRate, calculateRewardRateFromAmount, } from "../../solana/lib/rewards.js";
|
|
7
|
-
import { SCALE_PRECISION_FACTOR_BN } from "../../solana/constants.js";
|
|
8
|
-
const populateRewardEntry = (effectiveStakedAmount, rewardAmount, rewardPeriod, periods) => {
|
|
9
|
-
const rewardEntry = new RewardEntryAccumulator(new BN(0), new BN(0), new BN(0), PublicKey.default, PublicKey.default, new BN(0), new BN(0), new BN(0), []);
|
|
10
|
-
if (effectiveStakedAmount && rewardAmount && rewardPeriod) {
|
|
11
|
-
rewardEntry.accountedAmount = rewardEntry.getAccountableAmount(new BN(0), rewardPeriod.muln(periods || 1), effectiveStakedAmount, rewardAmount, rewardPeriod);
|
|
12
|
-
}
|
|
13
|
-
return rewardEntry;
|
|
14
|
-
};
|
|
15
|
-
describe("RewardEntryAccumulator", () => {
|
|
16
|
-
describe("getClaimableAmount", () => {
|
|
17
|
-
const testCases = [
|
|
18
|
-
[9, 9, 1, 0.0025, new BN(2_500_000)],
|
|
19
|
-
[6, 9, 1, 0.0025, new BN(2_500_000_000)],
|
|
20
|
-
[9, 6, 1, 0.0025, new BN(2_500)],
|
|
21
|
-
[1, 8, 1, 0.0025, new BN(25_000_000_000_000)],
|
|
22
|
-
];
|
|
23
|
-
testCases.forEach(([stakeTokenDecimals, rewardTokenDecimals, periods, rewardRate, expectedRewardAmount]) => {
|
|
24
|
-
test(`test decimals - ${stakeTokenDecimals}/${rewardTokenDecimals}/${periods}/${rewardRate}`, () => {
|
|
25
|
-
const stakedAmount = getBN(1, stakeTokenDecimals);
|
|
26
|
-
const effectiveStakedAmount = stakedAmount.mul(SCALE_PRECISION_FACTOR_BN);
|
|
27
|
-
const rewardPeriod = new BN(1);
|
|
28
|
-
const rewardAmount = calculateRewardAmountFromRate(rewardRate, stakeTokenDecimals, rewardTokenDecimals);
|
|
29
|
-
const rewardEntry = populateRewardEntry(effectiveStakedAmount, rewardAmount, rewardPeriod, periods);
|
|
30
|
-
const claimableAmount = rewardEntry.getClaimableAmount();
|
|
31
|
-
expect(rewardAmount.toString()).toEqual(expectedRewardAmount.toString());
|
|
32
|
-
expect(claimableAmount.toString()).toEqual(getBN(rewardRate, rewardTokenDecimals).muln(periods).toString());
|
|
33
|
-
expect(calculateRewardRateFromAmount(rewardAmount, stakeTokenDecimals, rewardTokenDecimals)).toEqual(rewardRate);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
test(`test decimals - negative difference`, () => {
|
|
37
|
-
let rewardAmount = calculateRewardAmountFromRate(0.0025, 18, 1);
|
|
38
|
-
expect(rewardAmount.toString()).toEqual(new BN(0).toString());
|
|
39
|
-
rewardAmount = calculateRewardAmountFromRate(0.0025, 12, 4);
|
|
40
|
-
expect(rewardAmount.toString()).toEqual(new BN(0).toString());
|
|
41
|
-
});
|
|
42
|
-
test(`test decimals - precision loss`, () => {
|
|
43
|
-
const stakeTokenDecimals = 12;
|
|
44
|
-
const rewardTokenDecimals = 6;
|
|
45
|
-
const stakedAmount = getBN(1, stakeTokenDecimals);
|
|
46
|
-
const effectiveStakedAmount = stakedAmount.mul(SCALE_PRECISION_FACTOR_BN);
|
|
47
|
-
const rewardPeriod = new BN(1);
|
|
48
|
-
const rewardAmount = calculateRewardAmountFromRate(0.0025, stakeTokenDecimals, rewardTokenDecimals);
|
|
49
|
-
const rewardEntry = populateRewardEntry(effectiveStakedAmount, rewardAmount, rewardPeriod);
|
|
50
|
-
const claimableAmount = rewardEntry.getClaimableAmount();
|
|
51
|
-
expect(rewardAmount.toString()).toEqual(new BN(2).toString());
|
|
52
|
-
expect(claimableAmount.toString()).toEqual(getBN(0.002, rewardTokenDecimals).toString());
|
|
53
|
-
expect(calculateRewardRateFromAmount(rewardAmount, stakeTokenDecimals, rewardTokenDecimals)).toEqual(0.002);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
});
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { AccountsCoder, Idl, IdlAccounts, Program, ProgramAccount } from "@coral-xyz/anchor";
|
|
2
|
-
import { Commitment, Connection, ConnectionConfig, PublicKey, TransactionInstruction } from "@solana/web3.js";
|
|
3
|
-
import { ICluster, ITransactionResult } from "@streamflow/common";
|
|
4
|
-
import PQueue from "p-queue";
|
|
5
|
-
import { REWARD_ENTRY_BYTE_OFFSETS, STAKE_ENTRY_BYTE_OFFSETS, STAKE_POOL_BYTE_OFFSETS } from "./constants.js";
|
|
6
|
-
import { FeeManager as FeeManagerProgramType } from "./descriptor/fee_manager.js";
|
|
7
|
-
import { RewardPool as RewardPoolProgramType } from "./descriptor/reward_pool.js";
|
|
8
|
-
import { StakePool as StakePoolProgramType } from "./descriptor/stake_pool.js";
|
|
9
|
-
import { ClaimRewardPoolArgs, CreateRewardEntryArgs, CreateRewardPoolArgs, CreateStakePoolArgs, DefaultFeeValueConfig, FeeValue, FundPoolArgs, IInteractSolanaExt, RewardEntry, RewardPool, StakeArgs, StakeEntry, StakePool, UnstakeArgs, UpdateRewardPoolArgs } from "./types.js";
|
|
10
|
-
interface Programs {
|
|
11
|
-
stakePoolProgram: Program<StakePoolProgramType>;
|
|
12
|
-
rewardPoolProgram: Program<RewardPoolProgramType>;
|
|
13
|
-
feeManagerProgram: Program<FeeManagerProgramType>;
|
|
14
|
-
}
|
|
15
|
-
type CreationResult = ITransactionResult & {
|
|
16
|
-
metadataId: PublicKey;
|
|
17
|
-
};
|
|
18
|
-
interface IInitOptions {
|
|
19
|
-
clusterUrl: string;
|
|
20
|
-
cluster?: ICluster;
|
|
21
|
-
commitment?: Commitment | ConnectionConfig;
|
|
22
|
-
programIds?: {
|
|
23
|
-
stakePool?: string;
|
|
24
|
-
rewardPool?: string;
|
|
25
|
-
feeManager?: string;
|
|
26
|
-
};
|
|
27
|
-
sendRate?: number;
|
|
28
|
-
sendThrottler?: PQueue;
|
|
29
|
-
}
|
|
30
|
-
export declare class SolanaStakingClient {
|
|
31
|
-
connection: Connection;
|
|
32
|
-
private readonly cluster;
|
|
33
|
-
private readonly commitment;
|
|
34
|
-
private readonly sendThrottler;
|
|
35
|
-
readonly programs: Programs;
|
|
36
|
-
constructor({ clusterUrl, cluster, commitment, programIds, sendRate, sendThrottler, }: IInitOptions);
|
|
37
|
-
getCurrentProgramId(programKey: keyof Programs): PublicKey;
|
|
38
|
-
getCommitment(): Commitment | undefined;
|
|
39
|
-
getStakePool(id: string | PublicKey): Promise<StakePool>;
|
|
40
|
-
searchStakePools(criteria?: Partial<Pick<StakePool, keyof typeof STAKE_POOL_BYTE_OFFSETS>>): Promise<ProgramAccount<StakePool>[]>;
|
|
41
|
-
getStakeEntry(id: string | PublicKey): Promise<StakeEntry | null>;
|
|
42
|
-
searchStakeEntries(criteria?: Partial<Pick<StakeEntry, keyof typeof STAKE_ENTRY_BYTE_OFFSETS>>): Promise<ProgramAccount<StakeEntry>[]>;
|
|
43
|
-
searchRewardPools(criteria?: Partial<Pick<RewardPool, "stakePool" | "mint">>): Promise<ProgramAccount<RewardPool>[]>;
|
|
44
|
-
searchRewardEntries(criteria: Partial<Pick<RewardEntry, keyof typeof REWARD_ENTRY_BYTE_OFFSETS>>): Promise<ProgramAccount<RewardEntry>[]>;
|
|
45
|
-
getFee(target: string | PublicKey): Promise<FeeValue | DefaultFeeValueConfig>;
|
|
46
|
-
getDefaultFeeValue(): Promise<DefaultFeeValueConfig>;
|
|
47
|
-
getFeeValueIfExists(target: string | PublicKey): Promise<FeeValue | null>;
|
|
48
|
-
createStakePool(data: CreateStakePoolArgs, extParams: IInteractSolanaExt): Promise<CreationResult>;
|
|
49
|
-
prepareCreateStakePoolInstructions({ maxWeight, maxDuration, minDuration, mint, permissionless, freezeStakeMint, unstakePeriod, nonce, tokenProgramId, }: CreateStakePoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
50
|
-
ixs: TransactionInstruction[];
|
|
51
|
-
publicKey: PublicKey;
|
|
52
|
-
}>;
|
|
53
|
-
stake(data: StakeArgs, extParams: IInteractSolanaExt): Promise<ITransactionResult>;
|
|
54
|
-
prepareStakeInstructions({ nonce, amount, duration, stakePool, stakePoolMint, tokenProgramId }: StakeArgs, extParams: IInteractSolanaExt): Promise<{
|
|
55
|
-
ixs: TransactionInstruction[];
|
|
56
|
-
}>;
|
|
57
|
-
unstake(data: UnstakeArgs, extParams: IInteractSolanaExt): Promise<ITransactionResult>;
|
|
58
|
-
prepareUnstakeInstructions({ stakePool, stakePoolMint, nonce, tokenProgramId }: UnstakeArgs, extParams: IInteractSolanaExt): Promise<{
|
|
59
|
-
ixs: TransactionInstruction[];
|
|
60
|
-
}>;
|
|
61
|
-
createRewardPool(data: CreateRewardPoolArgs, extParams: IInteractSolanaExt): Promise<CreationResult>;
|
|
62
|
-
prepareCreateRewardPoolInstructions({ nonce, rewardAmount, rewardPeriod, rewardMint, permissionless, stakePool, lastClaimPeriodOpt, tokenProgramId, }: CreateRewardPoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
63
|
-
publicKey: PublicKey;
|
|
64
|
-
ixs: TransactionInstruction[];
|
|
65
|
-
}>;
|
|
66
|
-
claimRewards(data: ClaimRewardPoolArgs, extParams: IInteractSolanaExt): Promise<ITransactionResult>;
|
|
67
|
-
prepareClaimRewardsInstructions({ rewardPoolNonce, depositNonce, stakePool, tokenProgramId, rewardMint }: ClaimRewardPoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
68
|
-
ixs: TransactionInstruction[];
|
|
69
|
-
}>;
|
|
70
|
-
fundPool(data: FundPoolArgs, extParams: IInteractSolanaExt): Promise<ITransactionResult>;
|
|
71
|
-
prepareFundPoolInstructions({ amount, tokenProgramId, rewardMint, stakePool, feeValue, nonce }: FundPoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
72
|
-
ixs: TransactionInstruction[];
|
|
73
|
-
}>;
|
|
74
|
-
createRewardEntry(data: CreateRewardEntryArgs, extParams: IInteractSolanaExt): Promise<ITransactionResult>;
|
|
75
|
-
prepareCreateRewardEntryInstructions({ stakePool, rewardPoolNonce, depositNonce, rewardMint }: CreateRewardEntryArgs, extParams: IInteractSolanaExt): Promise<{
|
|
76
|
-
ixs: TransactionInstruction[];
|
|
77
|
-
}>;
|
|
78
|
-
updateRewardPool(data: UpdateRewardPoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
79
|
-
ixs: TransactionInstruction[];
|
|
80
|
-
txId: string;
|
|
81
|
-
}>;
|
|
82
|
-
prepareUpdateRewardPoolInstructions({ rewardPool, rewardAmount, rewardPeriod, stakePool }: UpdateRewardPoolArgs, extParams: IInteractSolanaExt): Promise<{
|
|
83
|
-
ixs: TransactionInstruction[];
|
|
84
|
-
}>;
|
|
85
|
-
decode<ProgramName extends keyof Programs = keyof Programs, DecodingProgram = Programs[ProgramName], DerivedIdl extends Idl = DecodingProgram extends Program<infer IDLType> ? IDLType : never, AccountName extends keyof IdlAccounts<DerivedIdl> = keyof IdlAccounts<DerivedIdl>, DecodedAccount = IdlAccounts<DerivedIdl>[AccountName]>(programKey: ProgramName, accountName: AccountName, accInfo: Parameters<AccountsCoder["decode"]>[1]): DecodedAccount;
|
|
86
|
-
getDiscriminator<ProgramName extends keyof Programs = keyof Programs, DecodingProgram = Programs[ProgramName], DerivedIdl extends Idl = DecodingProgram extends Program<infer IDLType> ? IDLType : never, AccountName extends keyof IdlAccounts<DerivedIdl> = keyof IdlAccounts<DerivedIdl>>(programKey: ProgramName, accountName: AccountName): number[];
|
|
87
|
-
private execute;
|
|
88
|
-
}
|
|
89
|
-
export {};
|