Skip to content

Commit 4c06bdf

Browse files
authored
feat: support create v2, update idls to support stake boundaries, expose governor (#305)
* feat: support create v2, update idls to support stake boundaries, expose governor
1 parent 476b654 commit 4c06bdf

File tree

19 files changed

+3607
-51
lines changed

19 files changed

+3607
-51
lines changed

lerna.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{
2-
"packages": ["packages/*"],
3-
"version": "8.7.0",
2+
"packages": [
3+
"packages/*"
4+
],
5+
"version": "8.8.0",
46
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
57
"command": {
68
"run": {

packages/common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@streamflow/common",
3-
"version": "8.7.0",
3+
"version": "8.8.0",
44
"description": "Common utilities and types used by streamflow packages.",
55
"homepage": "https://github.com/streamflow-finance/js-sdk/",
66
"type": "module",

packages/distributor/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@streamflow/distributor",
3-
"version": "8.7.0",
3+
"version": "8.8.0",
44
"description": "JavaScript SDK to interact with Streamflow Airdrop protocol.",
55
"homepage": "https://github.com/streamflow-finance/js-sdk/",
66
"main": "./dist/cjs/index.cjs",

packages/eslint-config/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@streamflow/eslint-config",
3-
"version": "8.7.0",
3+
"version": "8.8.0",
44
"description": "ESLint configuration for Streamflow protocol.",
55
"homepage": "https://github.com/streamflow-finance/js-sdk/",
66
"engines": {

packages/launchpad/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@streamflow/launchpad",
3-
"version": "8.7.0",
3+
"version": "8.8.0",
44
"description": "JavaScript SDK to interact with Streamflow Launchpad protocol.",
55
"homepage": "https://github.com/streamflow-finance/js-sdk/",
66
"main": "./dist/cjs/index.cjs",

packages/staking/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@streamflow/staking",
3-
"version": "8.7.0",
3+
"version": "8.8.0",
44
"description": "JavaScript SDK to interact with Streamflow Staking protocol.",
55
"homepage": "https://github.com/streamflow-finance/js-sdk/",
66
"main": "./dist/cjs/index.cjs",

packages/staking/solana/client.ts

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
unwrapExecutionParams,
2222
} from "@streamflow/common/solana";
2323
import type PQueue from "p-queue";
24+
import BN from "bn.js";
2425

2526
import {
2627
REWARD_ENTRY_BYTE_OFFSETS,
@@ -33,10 +34,12 @@ import {
3334
STREAMFLOW_TREASURY_PUBLIC_KEY,
3435
} from "./constants.js";
3536
import { type FeeManager as FeeManagerProgramType } from "./descriptor/fee_manager.js";
37+
import GovernorIDL from "./descriptor/idl/governor.json";
3638
import FeeManagerIDL from "./descriptor/idl/fee_manager.json";
3739
import RewardPoolIDL from "./descriptor/idl/reward_pool.json";
3840
import RewardPoolDynamicIDL from "./descriptor/idl/reward_pool_dynamic.json";
3941
import StakePoolIDL from "./descriptor/idl/stake_pool.json";
42+
import { type Governor as GovernorProgramType } from "./descriptor/governor.js";
4043
import { type RewardPool as RewardPoolProgramType } from "./descriptor/reward_pool.js";
4144
import { type RewardPoolDynamic as RewardPoolDynamicProgramType } from "./descriptor/reward_pool_dynamic.js";
4245
import { type StakePool as StakePoolProgramType } from "./descriptor/stake_pool.js";
@@ -46,7 +49,6 @@ import {
4649
deriveRewardPoolPDA,
4750
deriveRewardVaultPDA,
4851
deriveStakeEntryPDA,
49-
deriveStakeMintPDA,
5052
deriveStakePoolPDA,
5153
} from "./lib/derive-accounts.js";
5254
import type {
@@ -77,6 +79,7 @@ interface Programs {
7779
rewardPoolProgram: Program<RewardPoolProgramType>;
7880
rewardPoolDynamicProgram: Program<RewardPoolDynamicProgramType>;
7981
feeManagerProgram: Program<FeeManagerProgramType>;
82+
governor: Program<GovernorProgramType>;
8083
}
8184

8285
type CreationResult = ITransactionResult & { metadataId: PublicKey };
@@ -90,6 +93,7 @@ interface IInitOptions {
9093
rewardPool?: string;
9194
rewardPoolDynamic?: string;
9295
feeManager?: string;
96+
governor?: string;
9397
};
9498
sendRate?: number;
9599
sendThrottler?: PQueue;
@@ -134,6 +138,10 @@ export class SolanaStakingClient {
134138
...FeeManagerIDL,
135139
address: programIds?.feeManager ?? FeeManagerIDL.address,
136140
} as FeeManagerProgramType;
141+
const governorIdl = {
142+
...GovernorIDL,
143+
address: programIds?.governor ?? GovernorIDL.address,
144+
};
137145
this.programs = {
138146
stakePoolProgram: new Program(stakePoolIdl, {
139147
connection: this.connection,
@@ -147,6 +155,9 @@ export class SolanaStakingClient {
147155
feeManagerProgram: new Program(feeManagerIdl, {
148156
connection: this.connection,
149157
}) as Program<FeeManagerProgramType>,
158+
governor: new Program(governorIdl, {
159+
connection: this.connection,
160+
}) as Program<GovernorProgramType>,
150161
};
151162
}
152163

@@ -238,16 +249,42 @@ export class SolanaStakingClient {
238249
permissionless = false,
239250
freezeStakeMint = null,
240251
unstakePeriod = null,
252+
maxTotalStakeCumulative,
253+
expiryTs,
254+
autoUnstake,
241255
nonce,
242256
tokenProgramId = TOKEN_PROGRAM_ID,
243257
}: CreateStakePoolArgs,
244258
extParams: IInteractSolanaExt,
245259
) {
246260
const { stakePoolProgram } = this.programs;
247261
const creator = extParams.invoker.publicKey;
262+
const v2ParamsSet = maxTotalStakeCumulative !== undefined || expiryTs !== undefined || autoUnstake !== undefined;
248263
invariant(creator, "Undefined invoker publicKey");
249-
const createInstruction = await stakePoolProgram.methods
250-
.createPool(nonce, maxWeight, minDuration, maxDuration, permissionless, freezeStakeMint, unstakePeriod)
264+
const createInstruction = await (
265+
v2ParamsSet
266+
? stakePoolProgram.methods.createPoolV2(
267+
nonce,
268+
maxWeight,
269+
minDuration,
270+
maxDuration,
271+
permissionless,
272+
freezeStakeMint ?? false,
273+
unstakePeriod ?? new BN(0),
274+
maxTotalStakeCumulative ?? new BN(0),
275+
expiryTs ?? new BN(0),
276+
autoUnstake ?? false,
277+
)
278+
: stakePoolProgram.methods.createPool(
279+
nonce,
280+
maxWeight,
281+
minDuration,
282+
maxDuration,
283+
permissionless,
284+
freezeStakeMint,
285+
unstakePeriod,
286+
)
287+
)
251288
.accounts({
252289
creator,
253290
mint,
@@ -327,16 +364,13 @@ export class SolanaStakingClient {
327364
const { stakePoolProgram } = this.programs;
328365
const staker = extParams.invoker.publicKey;
329366
invariant(staker, "Undefined invoker publicKey");
330-
const mint = deriveStakeMintPDA(stakePoolProgram.programId, pk(stakePool));
331-
const stakeMintAccountKey = getAssociatedTokenAddressSync(mint, staker, true, pk(tokenProgramId));
332367
const poolMintAccountKey = getAssociatedTokenAddressSync(pk(stakePoolMint), staker, true, pk(tokenProgramId));
333368
const instruction = await stakePoolProgram.methods
334369
.stake(nonce, amount, duration)
335370
.accounts({
336371
stakePool: stakePool,
337372
tokenProgram: tokenProgramId,
338373
from: poolMintAccountKey,
339-
to: stakeMintAccountKey,
340374
authority: staker,
341375
payer: staker,
342376
})
@@ -458,16 +492,13 @@ export class SolanaStakingClient {
458492
const { stakePoolProgram } = this.programs;
459493
const staker = extParams.invoker.publicKey;
460494
invariant(staker, "Undefined invoker publicKey");
461-
const stakeMintKey = deriveStakeMintPDA(stakePoolProgram.programId, pk(stakePool));
462495
const stakeEntryKey = deriveStakeEntryPDA(stakePoolProgram.programId, pk(stakePool), staker, nonce);
463496
const poolMintAccountKey = getAssociatedTokenAddressSync(pk(stakePoolMint), staker, true, pk(tokenProgramId));
464-
const stakeMintAccountKey = getAssociatedTokenAddressSync(stakeMintKey, staker, true, pk(tokenProgramId));
465497
const instruction = await stakePoolProgram.methods
466498
.unstake(shouldClose)
467499
.accounts({
468500
stakeEntry: stakeEntryKey,
469501
to: poolMintAccountKey,
470-
from: stakeMintAccountKey,
471502
authority: staker,
472503
tokenProgram: tokenProgramId,
473504
})

packages/staking/solana/descriptor/fee_manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export type FeeManager = {
88
"address": "FEELzfBhsWXTNJX53zZcDVfRNoFYZQ6cZA3jLiGVL16V",
99
"metadata": {
1010
"name": "feeManager",
11-
"version": "2.2.0",
11+
"version": "2.4.0",
1212
"spec": "0.1.0",
1313
"description": "Stores Fees and other admin configuration for the Staking protocol"
1414
},

0 commit comments

Comments
 (0)