@@ -21,6 +21,7 @@ import {
2121 unwrapExecutionParams ,
2222} from "@streamflow/common/solana" ;
2323import type PQueue from "p-queue" ;
24+ import BN from "bn.js" ;
2425
2526import {
2627 REWARD_ENTRY_BYTE_OFFSETS ,
@@ -33,10 +34,12 @@ import {
3334 STREAMFLOW_TREASURY_PUBLIC_KEY ,
3435} from "./constants.js" ;
3536import { type FeeManager as FeeManagerProgramType } from "./descriptor/fee_manager.js" ;
37+ import GovernorIDL from "./descriptor/idl/governor.json" ;
3638import FeeManagerIDL from "./descriptor/idl/fee_manager.json" ;
3739import RewardPoolIDL from "./descriptor/idl/reward_pool.json" ;
3840import RewardPoolDynamicIDL from "./descriptor/idl/reward_pool_dynamic.json" ;
3941import StakePoolIDL from "./descriptor/idl/stake_pool.json" ;
42+ import { type Governor as GovernorProgramType } from "./descriptor/governor.js" ;
4043import { type RewardPool as RewardPoolProgramType } from "./descriptor/reward_pool.js" ;
4144import { type RewardPoolDynamic as RewardPoolDynamicProgramType } from "./descriptor/reward_pool_dynamic.js" ;
4245import { 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" ;
5254import 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
8285type 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 } )
0 commit comments