@streamflow/staking 7.5.3 → 8.0.0-alpha.p284.726ba98
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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Note that this is only a type helper and is not the actual IDL. The original
|
|
5
5
|
* IDL can be found at `target/idl/reward_pool.json`.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
type RewardPool = {
|
|
8
8
|
address: "RWRDdfRbi3339VgKxTAXg4cjyniF7cbhNbMxZWiSKmj";
|
|
9
9
|
metadata: {
|
|
10
10
|
name: "rewardPool";
|
|
@@ -963,3 +963,5 @@ export type RewardPool = {
|
|
|
963
963
|
}
|
|
964
964
|
];
|
|
965
965
|
};
|
|
966
|
+
|
|
967
|
+
export type { RewardPool };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"reward_pool.js"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Note that this is only a type helper and is not the actual IDL. The original
|
|
5
5
|
* IDL can be found at `target/idl/stake_pool.json`.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
type StakePool = {
|
|
8
8
|
address: "STAKEvGqQTtzJZH6BWDcbpzXXn2BBerPAgQ3EGLN2GH";
|
|
9
9
|
metadata: {
|
|
10
10
|
name: "stakePool";
|
|
@@ -950,3 +950,5 @@ export type StakePool = {
|
|
|
950
950
|
}
|
|
951
951
|
];
|
|
952
952
|
};
|
|
953
|
+
|
|
954
|
+
export type { StakePool };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"stake_pool.js"}
|
package/package.json
CHANGED
|
@@ -1,35 +1,80 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@streamflow/staking",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0-alpha.p284.726ba98",
|
|
4
4
|
"description": "JavaScript SDK to interact with Streamflow Staking protocol.",
|
|
5
5
|
"homepage": "https://github.com/streamflow-finance/js-sdk/",
|
|
6
|
-
"main": "dist/
|
|
7
|
-
"
|
|
6
|
+
"main": "./dist/cjs/index.cjs",
|
|
7
|
+
"module": "./dist/esm/index.js",
|
|
8
|
+
"types": "./dist/esm/index.d.ts",
|
|
8
9
|
"type": "module",
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=18"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
9
16
|
"exports": {
|
|
10
17
|
".": {
|
|
11
|
-
"types":
|
|
18
|
+
"types": {
|
|
19
|
+
"import": "./dist/esm/index.d.ts",
|
|
20
|
+
"require": "./dist/cjs/index.d.cts"
|
|
21
|
+
},
|
|
12
22
|
"import": "./dist/esm/index.js",
|
|
13
|
-
"require": "./dist/cjs/index.
|
|
23
|
+
"require": "./dist/cjs/index.cjs"
|
|
24
|
+
},
|
|
25
|
+
"./solana/idl/reward_pool.json": {
|
|
26
|
+
"import": "./dist/esm/solana/descriptor/idl/reward_pool.json",
|
|
27
|
+
"require": "./dist/esm/solana/descriptor/idl/reward_pool.json",
|
|
28
|
+
"default": "./dist/esm/solana/descriptor/idl/reward_pool.json"
|
|
29
|
+
},
|
|
30
|
+
"./solana/idl/stake_pool.json": {
|
|
31
|
+
"import": "./dist/esm/solana/descriptor/idl/stake_pool.json",
|
|
32
|
+
"require": "./dist/esm/solana/descriptor/idl/stake_pool.json",
|
|
33
|
+
"default": "./dist/esm/solana/descriptor/idl/stake_pool.json"
|
|
34
|
+
},
|
|
35
|
+
"./solana/idl/fee_manager.json": {
|
|
36
|
+
"import": "./dist/esm/solana/descriptor/idl/fee_manager.json",
|
|
37
|
+
"require": "./dist/esm/solana/descriptor/idl/fee_manager.json",
|
|
38
|
+
"default": "./dist/esm/solana/descriptor/idl/fee_manager.json"
|
|
39
|
+
},
|
|
40
|
+
"./solana/descriptor/reward_pool": {
|
|
41
|
+
"types": {
|
|
42
|
+
"import": "./dist/esm/solana/descriptor/reward_pool.d.ts",
|
|
43
|
+
"require": "./dist/cjs/solana/descriptor/reward_pool.d.cts"
|
|
44
|
+
},
|
|
45
|
+
"import": "./dist/esm/solana/descriptor/reward_pool.js",
|
|
46
|
+
"require": "./dist/cjs/solana/descriptor/reward_pool.cjs"
|
|
47
|
+
},
|
|
48
|
+
"./solana/descriptor/stake_pool": {
|
|
49
|
+
"types": {
|
|
50
|
+
"import": "./dist/esm/solana/descriptor/stake_pool.d.ts",
|
|
51
|
+
"require": "./dist/cjs/solana/descriptor/stake_pool.d.cts"
|
|
52
|
+
},
|
|
53
|
+
"import": "./dist/esm/solana/descriptor/stake_pool.js",
|
|
54
|
+
"require": "./dist/cjs/solana/descriptor/stake_pool.cjs"
|
|
55
|
+
},
|
|
56
|
+
"./solana/descriptor/fee_manager": {
|
|
57
|
+
"types": {
|
|
58
|
+
"import": "./dist/esm/solana/descriptor/fee_manager.d.ts",
|
|
59
|
+
"require": "./dist/cjs/solana/descriptor/fee_manager.d.cts"
|
|
60
|
+
},
|
|
61
|
+
"import": "./dist/esm/solana/descriptor/fee_manager.js",
|
|
62
|
+
"require": "./dist/cjs/solana/descriptor/fee_manager.cjs"
|
|
14
63
|
},
|
|
15
|
-
"./
|
|
16
|
-
"types": "./dist/esm/solana/descriptor/*",
|
|
17
|
-
"import": "./dist/esm/solana/descriptor/*",
|
|
18
|
-
"require": "./dist/cjs/solana/descriptor/*"
|
|
19
|
-
}
|
|
64
|
+
"./package.json": "./package.json"
|
|
20
65
|
},
|
|
21
66
|
"scripts": {
|
|
22
|
-
"
|
|
23
|
-
"build
|
|
24
|
-
"
|
|
67
|
+
"copyIdls": "mkdir -p dist/esm/solana/descriptor/idl && cp solana/descriptor/idl/*.json dist/esm/solana/descriptor/idl/",
|
|
68
|
+
"build": "rm -rf dist && tsup && pnpm copyIdls",
|
|
69
|
+
"tsc:lint": "tsc --noEmit",
|
|
25
70
|
"pack": "pnpm build && pnpm pack",
|
|
26
71
|
"lint": "eslint --fix .",
|
|
27
|
-
"test": "vitest",
|
|
28
|
-
"prepublishOnly": "pnpm run lint && pnpm run test
|
|
72
|
+
"test": "vitest run --passWithNoTests",
|
|
73
|
+
"prepublishOnly": "pnpm run lint && pnpm run test && pnpm run build"
|
|
29
74
|
},
|
|
30
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "76b5232d96fdb7bf7c52d437bd7733bb4afc53ca",
|
|
31
76
|
"devDependencies": {
|
|
32
|
-
"@streamflow/eslint-config": "
|
|
77
|
+
"@streamflow/eslint-config": "8.0.0-alpha.p284.726ba98",
|
|
33
78
|
"@types/bn.js": "5.1.1",
|
|
34
79
|
"typescript": "^5.6.3"
|
|
35
80
|
},
|
|
@@ -40,7 +85,7 @@
|
|
|
40
85
|
"@solana/spl-token": "0.4.9",
|
|
41
86
|
"@solana/wallet-adapter-base": "0.9.19",
|
|
42
87
|
"@solana/web3.js": "1.95.4",
|
|
43
|
-
"@streamflow/common": "
|
|
88
|
+
"@streamflow/common": "8.0.0-alpha.p284.726ba98",
|
|
44
89
|
"bn.js": "5.2.1",
|
|
45
90
|
"borsh": "^2.0.0",
|
|
46
91
|
"bs58": "5.0.0",
|
|
@@ -1,61 +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
|
-
const common_1 = require("@streamflow/common");
|
|
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 vitest_1 = require("vitest");
|
|
11
|
-
const rewards_js_1 = require("../../solana/lib/rewards.js");
|
|
12
|
-
const constants_js_1 = require("../../solana/constants.js");
|
|
13
|
-
const populateRewardEntry = (effectiveStakedAmount, rewardAmount, rewardPeriod, periods) => {
|
|
14
|
-
const rewardEntry = new rewards_js_1.RewardEntryAccumulator(new bn_js_1.default(0), new bn_js_1.default(0), new bn_js_1.default(0), web3_js_1.PublicKey.default, web3_js_1.PublicKey.default, new bn_js_1.default(0), new bn_js_1.default(0), new bn_js_1.default(0), []);
|
|
15
|
-
if (effectiveStakedAmount && rewardAmount && rewardPeriod) {
|
|
16
|
-
rewardEntry.accountedAmount = rewardEntry.getAccountableAmount(new bn_js_1.default(0), rewardPeriod.muln(periods || 1), effectiveStakedAmount, rewardAmount, rewardPeriod);
|
|
17
|
-
}
|
|
18
|
-
return rewardEntry;
|
|
19
|
-
};
|
|
20
|
-
(0, vitest_1.describe)("RewardEntryAccumulator", () => {
|
|
21
|
-
(0, vitest_1.describe)("getClaimableAmount", () => {
|
|
22
|
-
const testCases = [
|
|
23
|
-
[9, 9, 1, 0.0025, new bn_js_1.default(2500000)],
|
|
24
|
-
[6, 9, 1, 0.0025, new bn_js_1.default(2500000000)],
|
|
25
|
-
[9, 6, 1, 0.0025, new bn_js_1.default(2500)],
|
|
26
|
-
[1, 8, 1, 0.0025, new bn_js_1.default(25000000000000)],
|
|
27
|
-
];
|
|
28
|
-
testCases.forEach(([stakeTokenDecimals, rewardTokenDecimals, periods, rewardRate, expectedRewardAmount]) => {
|
|
29
|
-
(0, vitest_1.test)(`test decimals - ${stakeTokenDecimals}/${rewardTokenDecimals}/${periods}/${rewardRate}`, () => {
|
|
30
|
-
const stakedAmount = (0, common_1.getBN)(1, stakeTokenDecimals);
|
|
31
|
-
const effectiveStakedAmount = stakedAmount.mul(constants_js_1.SCALE_PRECISION_FACTOR_BN);
|
|
32
|
-
const rewardPeriod = new bn_js_1.default(1);
|
|
33
|
-
const rewardAmount = (0, rewards_js_1.calculateRewardAmountFromRate)(rewardRate, stakeTokenDecimals, rewardTokenDecimals);
|
|
34
|
-
const rewardEntry = populateRewardEntry(effectiveStakedAmount, rewardAmount, rewardPeriod, periods);
|
|
35
|
-
const claimableAmount = rewardEntry.getClaimableAmount();
|
|
36
|
-
(0, vitest_1.expect)(rewardAmount.toString()).toEqual(expectedRewardAmount.toString());
|
|
37
|
-
(0, vitest_1.expect)(claimableAmount.toString()).toEqual((0, common_1.getBN)(rewardRate, rewardTokenDecimals).muln(periods).toString());
|
|
38
|
-
(0, vitest_1.expect)((0, rewards_js_1.calculateRewardRateFromAmount)(rewardAmount, stakeTokenDecimals, rewardTokenDecimals)).toEqual(rewardRate);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
(0, vitest_1.test)(`test decimals - negative difference`, () => {
|
|
42
|
-
let rewardAmount = (0, rewards_js_1.calculateRewardAmountFromRate)(0.0025, 18, 1);
|
|
43
|
-
(0, vitest_1.expect)(rewardAmount.toString()).toEqual(new bn_js_1.default(0).toString());
|
|
44
|
-
rewardAmount = (0, rewards_js_1.calculateRewardAmountFromRate)(0.0025, 12, 4);
|
|
45
|
-
(0, vitest_1.expect)(rewardAmount.toString()).toEqual(new bn_js_1.default(0).toString());
|
|
46
|
-
});
|
|
47
|
-
(0, vitest_1.test)(`test decimals - precision loss`, () => {
|
|
48
|
-
const stakeTokenDecimals = 12;
|
|
49
|
-
const rewardTokenDecimals = 6;
|
|
50
|
-
const stakedAmount = (0, common_1.getBN)(1, stakeTokenDecimals);
|
|
51
|
-
const effectiveStakedAmount = stakedAmount.mul(constants_js_1.SCALE_PRECISION_FACTOR_BN);
|
|
52
|
-
const rewardPeriod = new bn_js_1.default(1);
|
|
53
|
-
const rewardAmount = (0, rewards_js_1.calculateRewardAmountFromRate)(0.0025, stakeTokenDecimals, rewardTokenDecimals);
|
|
54
|
-
const rewardEntry = populateRewardEntry(effectiveStakedAmount, rewardAmount, rewardPeriod);
|
|
55
|
-
const claimableAmount = rewardEntry.getClaimableAmount();
|
|
56
|
-
(0, vitest_1.expect)(rewardAmount.toString()).toEqual(new bn_js_1.default(2).toString());
|
|
57
|
-
(0, vitest_1.expect)(claimableAmount.toString()).toEqual((0, common_1.getBN)(0.002, rewardTokenDecimals).toString());
|
|
58
|
-
(0, vitest_1.expect)((0, rewards_js_1.calculateRewardRateFromAmount)(rewardAmount, stakeTokenDecimals, rewardTokenDecimals)).toEqual(0.002);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
});
|
package/dist/cjs/index.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
-
};
|
|
21
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
|
-
if (mod && mod.__esModule) return mod;
|
|
23
|
-
var result = {};
|
|
24
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
25
|
-
__setModuleDefault(result, mod);
|
|
26
|
-
return result;
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.constants = exports.SolanaStakingClient = void 0;
|
|
30
|
-
var client_js_1 = require("./solana/client.js");
|
|
31
|
-
Object.defineProperty(exports, "SolanaStakingClient", { enumerable: true, get: function () { return client_js_1.SolanaStakingClient; } });
|
|
32
|
-
__exportStar(require("./solana/types.js"), exports);
|
|
33
|
-
__exportStar(require("./solana/lib/derive-accounts.js"), exports);
|
|
34
|
-
__exportStar(require("./solana/lib/rewards.js"), exports);
|
|
35
|
-
__exportStar(require("./solana/lib/fee-amounts.js"), exports);
|
|
36
|
-
__exportStar(require("./solana/lib/stake-weight.js"), exports);
|
|
37
|
-
exports.constants = __importStar(require("./solana/constants.js"));
|
|
@@ -1,336 +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.SolanaStakingClient = void 0;
|
|
7
|
-
const anchor_1 = require("@coral-xyz/anchor");
|
|
8
|
-
const spl_token_1 = require("@solana/spl-token");
|
|
9
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
10
|
-
const common_1 = require("@streamflow/common");
|
|
11
|
-
const solana_1 = require("@streamflow/common/solana");
|
|
12
|
-
const constants_js_1 = require("./constants.js");
|
|
13
|
-
const fee_manager_json_1 = __importDefault(require("./descriptor/idl/fee_manager.json"));
|
|
14
|
-
const reward_pool_json_1 = __importDefault(require("./descriptor/idl/reward_pool.json"));
|
|
15
|
-
const stake_pool_json_1 = __importDefault(require("./descriptor/idl/stake_pool.json"));
|
|
16
|
-
const derive_accounts_js_1 = require("./lib/derive-accounts.js");
|
|
17
|
-
class SolanaStakingClient {
|
|
18
|
-
constructor({ clusterUrl, cluster = common_1.ICluster.Mainnet, commitment = "confirmed", programIds, sendRate = 1, sendThrottler, }) {
|
|
19
|
-
this.cluster = cluster;
|
|
20
|
-
this.commitment = commitment;
|
|
21
|
-
this.connection = new web3_js_1.Connection(clusterUrl, this.commitment);
|
|
22
|
-
this.sendThrottler = sendThrottler ?? (0, solana_1.buildSendThrottler)(sendRate);
|
|
23
|
-
const stakePoolIdl = {
|
|
24
|
-
...stake_pool_json_1.default,
|
|
25
|
-
address: programIds?.stakePool ?? constants_js_1.STAKE_POOL_PROGRAM_ID[cluster] ?? stake_pool_json_1.default.address,
|
|
26
|
-
};
|
|
27
|
-
const rewardPoolIdl = {
|
|
28
|
-
...reward_pool_json_1.default,
|
|
29
|
-
address: programIds?.rewardPool ?? constants_js_1.REWARD_POOL_PROGRAM_ID[cluster] ?? reward_pool_json_1.default.address,
|
|
30
|
-
};
|
|
31
|
-
const feeManagerIdl = {
|
|
32
|
-
...fee_manager_json_1.default,
|
|
33
|
-
address: programIds?.feeManager ?? fee_manager_json_1.default.address,
|
|
34
|
-
};
|
|
35
|
-
this.programs = {
|
|
36
|
-
stakePoolProgram: new anchor_1.Program(stakePoolIdl, {
|
|
37
|
-
connection: this.connection,
|
|
38
|
-
}),
|
|
39
|
-
rewardPoolProgram: new anchor_1.Program(rewardPoolIdl, {
|
|
40
|
-
connection: this.connection,
|
|
41
|
-
}),
|
|
42
|
-
feeManagerProgram: new anchor_1.Program(feeManagerIdl, {
|
|
43
|
-
connection: this.connection,
|
|
44
|
-
}),
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
getCurrentProgramId(programKey) {
|
|
48
|
-
const program = this.programs[programKey];
|
|
49
|
-
(0, common_1.invariant)(program, `Program ${programKey} is not found`);
|
|
50
|
-
return program.programId;
|
|
51
|
-
}
|
|
52
|
-
getCommitment() {
|
|
53
|
-
return typeof this.commitment == "string" ? this.commitment : this.commitment.commitment;
|
|
54
|
-
}
|
|
55
|
-
async getStakePool(id) {
|
|
56
|
-
const { stakePoolProgram } = this.programs;
|
|
57
|
-
return stakePoolProgram.account.stakePool.fetch(id);
|
|
58
|
-
}
|
|
59
|
-
async searchStakePools(criteria = {}) {
|
|
60
|
-
const { stakePoolProgram } = this.programs;
|
|
61
|
-
return stakePoolProgram.account.stakePool.all((0, solana_1.getFilters)(criteria, constants_js_1.STAKE_POOL_BYTE_OFFSETS));
|
|
62
|
-
}
|
|
63
|
-
async getStakeEntry(id) {
|
|
64
|
-
const { stakePoolProgram } = this.programs;
|
|
65
|
-
return stakePoolProgram.account.stakeEntry.fetch(id);
|
|
66
|
-
}
|
|
67
|
-
async searchStakeEntries(criteria = {}) {
|
|
68
|
-
const { stakePoolProgram } = this.programs;
|
|
69
|
-
return stakePoolProgram.account.stakeEntry.all((0, solana_1.getFilters)(criteria, constants_js_1.STAKE_ENTRY_BYTE_OFFSETS));
|
|
70
|
-
}
|
|
71
|
-
async searchRewardPools(criteria = {}) {
|
|
72
|
-
const { rewardPoolProgram } = this.programs;
|
|
73
|
-
return rewardPoolProgram.account.rewardPool.all((0, solana_1.getFilters)(criteria, constants_js_1.REWARD_POOL_BYTE_OFFSETS));
|
|
74
|
-
}
|
|
75
|
-
async searchRewardEntries(criteria) {
|
|
76
|
-
const { rewardPoolProgram } = this.programs;
|
|
77
|
-
return rewardPoolProgram.account.rewardEntry.all((0, solana_1.getFilters)(criteria, constants_js_1.REWARD_ENTRY_BYTE_OFFSETS));
|
|
78
|
-
}
|
|
79
|
-
async getFee(target) {
|
|
80
|
-
const perTargetFee = await this.getFeeValueIfExists(target);
|
|
81
|
-
if (perTargetFee) {
|
|
82
|
-
return perTargetFee;
|
|
83
|
-
}
|
|
84
|
-
return this.getDefaultFeeValue();
|
|
85
|
-
}
|
|
86
|
-
getDefaultFeeValue() {
|
|
87
|
-
const { feeManagerProgram } = this.programs;
|
|
88
|
-
const feeValueKey = (0, derive_accounts_js_1.deriveConfigPDA)(feeManagerProgram.programId);
|
|
89
|
-
return feeManagerProgram.account.config.fetch(feeValueKey);
|
|
90
|
-
}
|
|
91
|
-
getFeeValueIfExists(target) {
|
|
92
|
-
const { feeManagerProgram } = this.programs;
|
|
93
|
-
const feeValueKey = (0, derive_accounts_js_1.deriveFeeValuePDA)(feeManagerProgram.programId, new web3_js_1.PublicKey(target));
|
|
94
|
-
return feeManagerProgram.account.feeValue.fetchNullable(feeValueKey);
|
|
95
|
-
}
|
|
96
|
-
async createStakePool(data, extParams) {
|
|
97
|
-
const { ixs, publicKey } = await this.prepareCreateStakePoolInstructions(data, extParams);
|
|
98
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
99
|
-
return {
|
|
100
|
-
ixs,
|
|
101
|
-
txId: signature,
|
|
102
|
-
metadataId: publicKey,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
async prepareCreateStakePoolInstructions({ maxWeight, maxDuration, minDuration, mint, permissionless = false, freezeStakeMint = null, unstakePeriod = null, nonce, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID, }, extParams) {
|
|
106
|
-
const { stakePoolProgram } = this.programs;
|
|
107
|
-
const creator = extParams.invoker.publicKey;
|
|
108
|
-
(0, common_1.invariant)(creator, "Undefined invoker publicKey");
|
|
109
|
-
const createInstruction = await stakePoolProgram.methods
|
|
110
|
-
.createPool(nonce, maxWeight, minDuration, maxDuration, permissionless, freezeStakeMint, unstakePeriod)
|
|
111
|
-
.accounts({
|
|
112
|
-
creator,
|
|
113
|
-
mint,
|
|
114
|
-
tokenProgram: tokenProgramId,
|
|
115
|
-
})
|
|
116
|
-
.instruction();
|
|
117
|
-
const stakePoolPDA = (0, derive_accounts_js_1.deriveStakePoolPDA)(stakePoolProgram.programId, (0, solana_1.pk)(mint), creator, nonce);
|
|
118
|
-
return { ixs: [createInstruction], publicKey: stakePoolPDA };
|
|
119
|
-
}
|
|
120
|
-
async stake(data, extParams) {
|
|
121
|
-
const { ixs } = await this.prepareStakeInstructions(data, extParams);
|
|
122
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
123
|
-
return {
|
|
124
|
-
ixs,
|
|
125
|
-
txId: signature,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
async prepareStakeInstructions({ nonce, amount, duration, stakePool, stakePoolMint, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID }, extParams) {
|
|
129
|
-
const { stakePoolProgram } = this.programs;
|
|
130
|
-
const staker = extParams.invoker.publicKey;
|
|
131
|
-
(0, common_1.invariant)(staker, "Undefined invoker publicKey");
|
|
132
|
-
const mint = (0, derive_accounts_js_1.deriveStakeMintPDA)(stakePoolProgram.programId, (0, solana_1.pk)(stakePool));
|
|
133
|
-
const stakeMintAccountKey = (0, spl_token_1.getAssociatedTokenAddressSync)(mint, staker, true, (0, solana_1.pk)(tokenProgramId));
|
|
134
|
-
const poolMintAccountKey = (0, spl_token_1.getAssociatedTokenAddressSync)((0, solana_1.pk)(stakePoolMint), staker, true, (0, solana_1.pk)(tokenProgramId));
|
|
135
|
-
const instruction = await stakePoolProgram.methods
|
|
136
|
-
.stake(nonce, amount, duration)
|
|
137
|
-
.accounts({
|
|
138
|
-
stakePool: stakePool,
|
|
139
|
-
tokenProgram: tokenProgramId,
|
|
140
|
-
from: poolMintAccountKey,
|
|
141
|
-
to: stakeMintAccountKey,
|
|
142
|
-
authority: staker,
|
|
143
|
-
payer: staker,
|
|
144
|
-
})
|
|
145
|
-
.instruction();
|
|
146
|
-
return { ixs: [instruction] };
|
|
147
|
-
}
|
|
148
|
-
async unstake(data, extParams) {
|
|
149
|
-
const { ixs } = await this.prepareUnstakeInstructions(data, extParams);
|
|
150
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
151
|
-
return {
|
|
152
|
-
ixs,
|
|
153
|
-
txId: signature,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
async prepareUnstakeInstructions({ stakePool, stakePoolMint, nonce, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID }, extParams) {
|
|
157
|
-
const { stakePoolProgram } = this.programs;
|
|
158
|
-
const staker = extParams.invoker.publicKey;
|
|
159
|
-
(0, common_1.invariant)(staker, "Undefined invoker publicKey");
|
|
160
|
-
const stakeMintKey = (0, derive_accounts_js_1.deriveStakeMintPDA)(stakePoolProgram.programId, (0, solana_1.pk)(stakePool));
|
|
161
|
-
const stakeEntryKey = (0, derive_accounts_js_1.deriveStakeEntryPDA)(stakePoolProgram.programId, (0, solana_1.pk)(stakePool), staker, nonce);
|
|
162
|
-
const poolMintAccountKey = (0, spl_token_1.getAssociatedTokenAddressSync)((0, solana_1.pk)(stakePoolMint), staker, true, (0, solana_1.pk)(tokenProgramId));
|
|
163
|
-
const stakeMintAccountKey = (0, spl_token_1.getAssociatedTokenAddressSync)(stakeMintKey, staker, true, (0, solana_1.pk)(tokenProgramId));
|
|
164
|
-
const instruction = await stakePoolProgram.methods
|
|
165
|
-
.unstake()
|
|
166
|
-
.accounts({
|
|
167
|
-
stakeEntry: stakeEntryKey,
|
|
168
|
-
to: poolMintAccountKey,
|
|
169
|
-
from: stakeMintAccountKey,
|
|
170
|
-
authority: staker,
|
|
171
|
-
tokenProgram: tokenProgramId,
|
|
172
|
-
})
|
|
173
|
-
.instruction();
|
|
174
|
-
return { ixs: [instruction] };
|
|
175
|
-
}
|
|
176
|
-
async createRewardPool(data, extParams) {
|
|
177
|
-
const { ixs, publicKey } = await this.prepareCreateRewardPoolInstructions(data, extParams);
|
|
178
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
179
|
-
return {
|
|
180
|
-
ixs,
|
|
181
|
-
txId: signature,
|
|
182
|
-
metadataId: publicKey,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
async prepareCreateRewardPoolInstructions({ nonce, rewardAmount, rewardPeriod, rewardMint, permissionless = false, stakePool, lastClaimPeriodOpt, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID, }, extParams) {
|
|
186
|
-
const { rewardPoolProgram } = this.programs;
|
|
187
|
-
const creator = extParams.invoker.publicKey;
|
|
188
|
-
(0, common_1.invariant)(creator, "Undefined invoker publicKey");
|
|
189
|
-
const instruction = await rewardPoolProgram.methods
|
|
190
|
-
.createPool(nonce, rewardAmount, rewardPeriod, permissionless, lastClaimPeriodOpt)
|
|
191
|
-
.accounts({
|
|
192
|
-
creator,
|
|
193
|
-
stakePool,
|
|
194
|
-
mint: rewardMint,
|
|
195
|
-
tokenProgram: tokenProgramId,
|
|
196
|
-
})
|
|
197
|
-
.instruction();
|
|
198
|
-
const rewardPoolKey = (0, derive_accounts_js_1.deriveRewardPoolPDA)(rewardPoolProgram.programId, (0, solana_1.pk)(stakePool), (0, solana_1.pk)(rewardMint), nonce);
|
|
199
|
-
return { publicKey: rewardPoolKey, ixs: [instruction] };
|
|
200
|
-
}
|
|
201
|
-
async claimRewards(data, extParams) {
|
|
202
|
-
const { ixs } = await this.prepareClaimRewardsInstructions(data, extParams);
|
|
203
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
204
|
-
return {
|
|
205
|
-
ixs,
|
|
206
|
-
txId: signature,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
async prepareClaimRewardsInstructions({ rewardPoolNonce, depositNonce, stakePool, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID, rewardMint }, extParams) {
|
|
210
|
-
const { stakePoolProgram, rewardPoolProgram } = this.programs;
|
|
211
|
-
const staker = extParams.invoker.publicKey;
|
|
212
|
-
(0, common_1.invariant)(staker, "Undefined invoker publicKey");
|
|
213
|
-
const instruction = await rewardPoolProgram.methods
|
|
214
|
-
.claimRewards()
|
|
215
|
-
.accounts({
|
|
216
|
-
stakeEntry: (0, derive_accounts_js_1.deriveStakeEntryPDA)(stakePoolProgram.programId, (0, solana_1.pk)(stakePool), staker, depositNonce),
|
|
217
|
-
rewardPool: (0, derive_accounts_js_1.deriveRewardPoolPDA)(rewardPoolProgram.programId, (0, solana_1.pk)(stakePool), (0, solana_1.pk)(rewardMint), rewardPoolNonce),
|
|
218
|
-
claimant: staker,
|
|
219
|
-
tokenProgram: tokenProgramId,
|
|
220
|
-
to: (0, spl_token_1.getAssociatedTokenAddressSync)((0, solana_1.pk)(rewardMint), staker, true, (0, solana_1.pk)(tokenProgramId)),
|
|
221
|
-
})
|
|
222
|
-
.instruction();
|
|
223
|
-
return { ixs: [instruction] };
|
|
224
|
-
}
|
|
225
|
-
async fundPool(data, extParams) {
|
|
226
|
-
const { ixs } = await this.prepareFundPoolInstructions(data, extParams);
|
|
227
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
228
|
-
return {
|
|
229
|
-
ixs,
|
|
230
|
-
txId: signature,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
async prepareFundPoolInstructions({ amount, tokenProgramId = spl_token_1.TOKEN_PROGRAM_ID, rewardMint, stakePool, feeValue, nonce }, extParams) {
|
|
234
|
-
const { rewardPoolProgram } = this.programs;
|
|
235
|
-
const staker = extParams.invoker.publicKey;
|
|
236
|
-
(0, common_1.invariant)(staker, "Undefined invoker publicKey");
|
|
237
|
-
const existingFee = await this.getFeeValueIfExists(staker);
|
|
238
|
-
const rewardMintPk = (0, solana_1.pk)(rewardMint);
|
|
239
|
-
const tokenProgramPk = (0, solana_1.pk)(tokenProgramId);
|
|
240
|
-
const treasuryATA = !existingFee || existingFee.streamflowFee.gtn(0)
|
|
241
|
-
? await (0, solana_1.checkOrCreateAtaBatch)(this.connection, [constants_js_1.STREAMFLOW_TREASURY_PUBLIC_KEY], rewardMintPk, extParams.invoker, tokenProgramPk)
|
|
242
|
-
: null;
|
|
243
|
-
const rewardPoolPda = (0, derive_accounts_js_1.deriveRewardPoolPDA)(rewardPoolProgram.programId, (0, solana_1.pk)(stakePool), rewardMintPk, nonce);
|
|
244
|
-
const instruction = await rewardPoolProgram.methods
|
|
245
|
-
.fundPool(amount)
|
|
246
|
-
.accountsPartial({
|
|
247
|
-
funder: staker,
|
|
248
|
-
rewardPool: rewardPoolPda,
|
|
249
|
-
from: (0, spl_token_1.getAssociatedTokenAddressSync)(rewardMintPk, staker, true, tokenProgramPk),
|
|
250
|
-
tokenProgram: tokenProgramId,
|
|
251
|
-
vault: (0, derive_accounts_js_1.deriveRewardVaultPDA)(rewardPoolProgram.programId, rewardPoolPda),
|
|
252
|
-
mint: rewardMint,
|
|
253
|
-
feeValue,
|
|
254
|
-
})
|
|
255
|
-
.instruction();
|
|
256
|
-
return { ixs: treasuryATA ? treasuryATA.concat([instruction]) : [instruction] };
|
|
257
|
-
}
|
|
258
|
-
async createRewardEntry(data, extParams) {
|
|
259
|
-
const { ixs } = await this.prepareCreateRewardEntryInstructions(data, extParams);
|
|
260
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
261
|
-
return {
|
|
262
|
-
ixs,
|
|
263
|
-
txId: signature,
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
async prepareCreateRewardEntryInstructions({ stakePool, rewardPoolNonce, depositNonce, rewardMint }, extParams) {
|
|
267
|
-
const { stakePoolProgram, rewardPoolProgram } = this.programs;
|
|
268
|
-
const staker = extParams.invoker.publicKey;
|
|
269
|
-
(0, common_1.invariant)(staker, "Undefined invoker publicKey");
|
|
270
|
-
const instruction = await rewardPoolProgram.methods
|
|
271
|
-
.createEntry()
|
|
272
|
-
.accounts({
|
|
273
|
-
payer: staker,
|
|
274
|
-
authority: staker,
|
|
275
|
-
stakeEntry: (0, derive_accounts_js_1.deriveStakeEntryPDA)(stakePoolProgram.programId, (0, solana_1.pk)(stakePool), staker, depositNonce),
|
|
276
|
-
rewardPool: (0, derive_accounts_js_1.deriveRewardPoolPDA)(rewardPoolProgram.programId, (0, solana_1.pk)(stakePool), (0, solana_1.pk)(rewardMint), rewardPoolNonce),
|
|
277
|
-
})
|
|
278
|
-
.instruction();
|
|
279
|
-
return { ixs: [instruction] };
|
|
280
|
-
}
|
|
281
|
-
async updateRewardPool(data, extParams) {
|
|
282
|
-
const { ixs } = await this.prepareUpdateRewardPoolInstructions(data, extParams);
|
|
283
|
-
const { signature } = await this.execute(ixs, extParams);
|
|
284
|
-
return {
|
|
285
|
-
ixs,
|
|
286
|
-
txId: signature,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
async prepareUpdateRewardPoolInstructions({ rewardPool, rewardAmount, rewardPeriod, stakePool }, extParams) {
|
|
290
|
-
const { rewardPoolProgram } = this.programs;
|
|
291
|
-
const invoker = extParams.invoker.publicKey;
|
|
292
|
-
(0, common_1.invariant)(invoker, "Undefined invoker publicKey");
|
|
293
|
-
const instruction = await rewardPoolProgram.methods
|
|
294
|
-
.updatePool(rewardAmount, rewardPeriod)
|
|
295
|
-
.accountsPartial({
|
|
296
|
-
stakePool,
|
|
297
|
-
authority: invoker,
|
|
298
|
-
rewardPool,
|
|
299
|
-
})
|
|
300
|
-
.instruction();
|
|
301
|
-
return { ixs: [instruction] };
|
|
302
|
-
}
|
|
303
|
-
decode(programKey, accountName, accInfo) {
|
|
304
|
-
const decodingProgram = this.programs[programKey];
|
|
305
|
-
(0, common_1.invariant)(decodingProgram, `Decoding program with key ${programKey} is not available`);
|
|
306
|
-
return decodingProgram.coder.accounts.decode(accountName.toString(), accInfo);
|
|
307
|
-
}
|
|
308
|
-
getDiscriminator(programKey, accountName) {
|
|
309
|
-
const decodingProgram = this.programs[programKey];
|
|
310
|
-
(0, common_1.invariant)(decodingProgram, `Decoding program with key ${programKey} is not available`);
|
|
311
|
-
const accountEntity = decodingProgram.idl.accounts.find((acc) => acc.name === accountName);
|
|
312
|
-
(0, common_1.invariant)(accountEntity, `Decoding program with key ${programKey} doesn't specify account with name ${accountName.toString()}`);
|
|
313
|
-
return accountEntity.discriminator;
|
|
314
|
-
}
|
|
315
|
-
async execute(ixs, extParams) {
|
|
316
|
-
const { tx, hash, context } = await (0, solana_1.prepareTransaction)(this.connection, (0, solana_1.prepareBaseInstructions)(this.connection, extParams).concat(ixs), extParams.invoker.publicKey);
|
|
317
|
-
try {
|
|
318
|
-
const signature = await (0, solana_1.signAndExecuteTransaction)(this.connection, extParams.invoker, tx, {
|
|
319
|
-
hash,
|
|
320
|
-
context,
|
|
321
|
-
commitment: this.getCommitment(),
|
|
322
|
-
}, { sendThrottler: this.sendThrottler });
|
|
323
|
-
return { signature };
|
|
324
|
-
}
|
|
325
|
-
catch (err) {
|
|
326
|
-
if (err instanceof Error) {
|
|
327
|
-
const parsed = (0, anchor_1.translateError)(err, (0, anchor_1.parseIdlErrors)(this.programs.stakePoolProgram.idl));
|
|
328
|
-
if (parsed) {
|
|
329
|
-
throw new common_1.ContractError(err, parsed.name, parsed.message);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
throw err;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
exports.SolanaStakingClient = SolanaStakingClient;
|