1#![allow(deprecated)]
6#![allow(clippy::too_many_arguments)]
7
8use spl_token::native_mint;
9use {
10 crate::{
11 find_deposit_authority_program_address, find_ephemeral_stake_program_address,
12 find_stake_program_address, find_transient_stake_program_address,
13 find_withdraw_authority_program_address,
14 inline_mpl_token_metadata::{self, pda::find_metadata_account},
15 state::{Fee, FeeType, StakePool, ValidatorList, ValidatorStakeInfo},
16 MAX_VALIDATORS_TO_UPDATE,
17 },
18 borsh::{BorshDeserialize, BorshSchema, BorshSerialize},
19 solana_program::{
20 instruction::{AccountMeta, Instruction},
21 program_error::ProgramError,
22 pubkey::Pubkey,
23 stake,
24 stake_history::Epoch,
25 system_program, sysvar,
26 },
27 std::num::NonZeroU32,
28};
29
30#[repr(C)]
33#[derive(Clone, Debug, PartialEq, BorshSerialize, BorshDeserialize, BorshSchema)]
34pub enum PreferredValidatorType {
35 Deposit,
37 Withdraw,
39}
40
41#[repr(C)]
44#[derive(Clone, Debug, PartialEq, BorshSerialize, BorshDeserialize, BorshSchema)]
45pub enum FundingType {
46 StakeDeposit,
48 SolDeposit,
50 SolWithdraw,
52}
53
54#[repr(C)]
56#[derive(Clone, Debug, PartialEq, BorshSerialize, BorshDeserialize)]
57pub enum StakePoolInstruction {
58 Initialize {
76 fee: Fee,
78 withdrawal_fee: Fee,
80 deposit_fee: Fee,
82 referral_fee: u8,
84 max_validators: u32,
86 },
87
88 AddValidatorToPool(u32),
115
116 RemoveValidatorFromPool,
132
133 DecreaseValidatorStake {
164 lamports: u64,
166 transient_stake_seed: u64,
168 },
169
170 IncreaseValidatorStake {
205 lamports: u64,
207 transient_stake_seed: u64,
209 },
210
211 SetPreferredValidator {
225 validator_type: PreferredValidatorType,
227 validator_vote_address: Option<Pubkey>,
230 },
231
232 UpdateValidatorListBalance {
250 start_index: u32,
252 no_merge: bool,
257 },
258
259 UpdateStakePoolBalance,
270
271 CleanupRemovedValidatorEntries,
276
277 DepositStake,
301
302 WithdrawStake(u64),
339
340 SetManager,
347
348 SetFee {
353 fee: FeeType,
355 },
356
357 SetStaker,
363
364 DepositSol(u64),
380
381 SetFundingAuthority(FundingType),
388
389 WithdrawSol(u64),
407
408 CreateTokenMetadata {
419 name: String,
421 symbol: String,
423 uri: String,
425 },
426 UpdateTokenMetadata {
435 name: String,
437 symbol: String,
439 uri: String,
441 },
442
443 IncreaseAdditionalValidatorStake {
480 lamports: u64,
482 transient_stake_seed: u64,
484 ephemeral_stake_seed: u64,
486 },
487
488 DecreaseAdditionalValidatorStake {
518 lamports: u64,
520 transient_stake_seed: u64,
522 ephemeral_stake_seed: u64,
524 },
525
526 DecreaseValidatorStakeWithReserve {
557 lamports: u64,
559 transient_stake_seed: u64,
561 },
562
563 #[deprecated(
614 since = "2.0.0",
615 note = "The stake redelegate instruction used in this will not be enabled."
616 )]
617 Redelegate {
618 #[allow(dead_code)] lamports: u64,
621 #[allow(dead_code)] source_transient_stake_seed: u64,
624 #[allow(dead_code)] ephemeral_stake_seed: u64,
627 #[allow(dead_code)] destination_transient_stake_seed: u64,
632 },
633
634 DepositStakeWithSlippage {
658 minimum_pool_tokens_out: u64,
660 },
661
662 WithdrawStakeWithSlippage {
688 pool_tokens_in: u64,
690 minimum_lamports_out: u64,
692 },
693
694 DepositSolWithSlippage {
711 lamports_in: u64,
713 minimum_pool_tokens_out: u64,
715 },
716
717 WithdrawSolWithSlippage {
736 pool_tokens_in: u64,
738 minimum_lamports_out: u64,
740 },
741
742 DepositWsolWithSession {
763 lamports_in: u64,
765 minimum_pool_tokens_out: u64,
767 },
768
769 WithdrawWsolWithSession {
790 pool_tokens_in: u64,
792 minimum_lamports_out: u64,
794 },
795
796 WithdrawStakeWithSession {
816 pool_tokens_in: u64,
818 minimum_lamports_out: u64,
820 user_stake_seed: u64,
822 },
823
824 WithdrawFromStakeAccountWithSession {
834 lamports: u64,
836 user_stake_seed: u64,
838 },
839}
840
841pub fn initialize(
843 program_id: &Pubkey,
844 stake_pool: &Pubkey,
845 manager: &Pubkey,
846 staker: &Pubkey,
847 stake_pool_withdraw_authority: &Pubkey,
848 validator_list: &Pubkey,
849 reserve_stake: &Pubkey,
850 pool_mint: &Pubkey,
851 manager_pool_account: &Pubkey,
852 token_program_id: &Pubkey,
853 deposit_authority: Option<Pubkey>,
854 fee: Fee,
855 withdrawal_fee: Fee,
856 deposit_fee: Fee,
857 referral_fee: u8,
858 max_validators: u32,
859) -> Instruction {
860 let init_data = StakePoolInstruction::Initialize {
861 fee,
862 withdrawal_fee,
863 deposit_fee,
864 referral_fee,
865 max_validators,
866 };
867 let data = borsh::to_vec(&init_data).unwrap();
868 let mut accounts = vec![
869 AccountMeta::new(*stake_pool, false),
870 AccountMeta::new_readonly(*manager, true),
871 AccountMeta::new_readonly(*staker, false),
872 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
873 AccountMeta::new(*validator_list, false),
874 AccountMeta::new_readonly(*reserve_stake, false),
875 AccountMeta::new(*pool_mint, false),
876 AccountMeta::new(*manager_pool_account, false),
877 AccountMeta::new_readonly(*token_program_id, false),
878 ];
879 if let Some(deposit_authority) = deposit_authority {
880 accounts.push(AccountMeta::new_readonly(deposit_authority, true));
881 }
882 Instruction {
883 program_id: *program_id,
884 accounts,
885 data,
886 }
887}
888
889pub fn add_validator_to_pool(
892 program_id: &Pubkey,
893 stake_pool: &Pubkey,
894 staker: &Pubkey,
895 reserve: &Pubkey,
896 stake_pool_withdraw: &Pubkey,
897 validator_list: &Pubkey,
898 stake: &Pubkey,
899 validator: &Pubkey,
900 seed: Option<NonZeroU32>,
901) -> Instruction {
902 let accounts = vec![
903 AccountMeta::new(*stake_pool, false),
904 AccountMeta::new_readonly(*staker, true),
905 AccountMeta::new(*reserve, false),
906 AccountMeta::new_readonly(*stake_pool_withdraw, false),
907 AccountMeta::new(*validator_list, false),
908 AccountMeta::new(*stake, false),
909 AccountMeta::new_readonly(*validator, false),
910 AccountMeta::new_readonly(sysvar::rent::id(), false),
911 AccountMeta::new_readonly(sysvar::clock::id(), false),
912 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
913 #[allow(deprecated)]
914 AccountMeta::new_readonly(stake::config::id(), false),
915 AccountMeta::new_readonly(system_program::id(), false),
916 AccountMeta::new_readonly(stake::program::id(), false),
917 ];
918 let data = borsh::to_vec(&StakePoolInstruction::AddValidatorToPool(
919 seed.map(|s| s.get()).unwrap_or(0),
920 ))
921 .unwrap();
922 Instruction {
923 program_id: *program_id,
924 accounts,
925 data,
926 }
927}
928
929pub fn remove_validator_from_pool(
932 program_id: &Pubkey,
933 stake_pool: &Pubkey,
934 staker: &Pubkey,
935 stake_pool_withdraw: &Pubkey,
936 validator_list: &Pubkey,
937 stake_account: &Pubkey,
938 transient_stake_account: &Pubkey,
939) -> Instruction {
940 let accounts = vec![
941 AccountMeta::new(*stake_pool, false),
942 AccountMeta::new_readonly(*staker, true),
943 AccountMeta::new_readonly(*stake_pool_withdraw, false),
944 AccountMeta::new(*validator_list, false),
945 AccountMeta::new(*stake_account, false),
946 AccountMeta::new(*transient_stake_account, false),
947 AccountMeta::new_readonly(sysvar::clock::id(), false),
948 AccountMeta::new_readonly(stake::program::id(), false),
949 ];
950 Instruction {
951 program_id: *program_id,
952 accounts,
953 data: borsh::to_vec(&StakePoolInstruction::RemoveValidatorFromPool).unwrap(),
954 }
955}
956
957#[deprecated(
960 since = "0.7.0",
961 note = "please use `decrease_validator_stake_with_reserve`"
962)]
963pub fn decrease_validator_stake(
964 program_id: &Pubkey,
965 stake_pool: &Pubkey,
966 staker: &Pubkey,
967 stake_pool_withdraw_authority: &Pubkey,
968 validator_list: &Pubkey,
969 validator_stake: &Pubkey,
970 transient_stake: &Pubkey,
971 lamports: u64,
972 transient_stake_seed: u64,
973) -> Instruction {
974 let accounts = vec![
975 AccountMeta::new_readonly(*stake_pool, false),
976 AccountMeta::new_readonly(*staker, true),
977 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
978 AccountMeta::new(*validator_list, false),
979 AccountMeta::new(*validator_stake, false),
980 AccountMeta::new(*transient_stake, false),
981 AccountMeta::new_readonly(sysvar::clock::id(), false),
982 AccountMeta::new_readonly(sysvar::rent::id(), false),
983 AccountMeta::new_readonly(system_program::id(), false),
984 AccountMeta::new_readonly(stake::program::id(), false),
985 ];
986 Instruction {
987 program_id: *program_id,
988 accounts,
989 data: borsh::to_vec(&StakePoolInstruction::DecreaseValidatorStake {
990 lamports,
991 transient_stake_seed,
992 })
993 .unwrap(),
994 }
995}
996
997pub fn decrease_additional_validator_stake(
1000 program_id: &Pubkey,
1001 stake_pool: &Pubkey,
1002 staker: &Pubkey,
1003 stake_pool_withdraw_authority: &Pubkey,
1004 validator_list: &Pubkey,
1005 reserve_stake: &Pubkey,
1006 validator_stake: &Pubkey,
1007 ephemeral_stake: &Pubkey,
1008 transient_stake: &Pubkey,
1009 lamports: u64,
1010 transient_stake_seed: u64,
1011 ephemeral_stake_seed: u64,
1012) -> Instruction {
1013 let accounts = vec![
1014 AccountMeta::new_readonly(*stake_pool, false),
1015 AccountMeta::new_readonly(*staker, true),
1016 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1017 AccountMeta::new(*validator_list, false),
1018 AccountMeta::new(*reserve_stake, false),
1019 AccountMeta::new(*validator_stake, false),
1020 AccountMeta::new(*ephemeral_stake, false),
1021 AccountMeta::new(*transient_stake, false),
1022 AccountMeta::new_readonly(sysvar::clock::id(), false),
1023 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1024 AccountMeta::new_readonly(system_program::id(), false),
1025 AccountMeta::new_readonly(stake::program::id(), false),
1026 ];
1027 Instruction {
1028 program_id: *program_id,
1029 accounts,
1030 data: borsh::to_vec(&StakePoolInstruction::DecreaseAdditionalValidatorStake {
1031 lamports,
1032 transient_stake_seed,
1033 ephemeral_stake_seed,
1034 })
1035 .unwrap(),
1036 }
1037}
1038
1039pub fn decrease_validator_stake_with_reserve(
1042 program_id: &Pubkey,
1043 stake_pool: &Pubkey,
1044 staker: &Pubkey,
1045 stake_pool_withdraw_authority: &Pubkey,
1046 validator_list: &Pubkey,
1047 reserve_stake: &Pubkey,
1048 validator_stake: &Pubkey,
1049 transient_stake: &Pubkey,
1050 lamports: u64,
1051 transient_stake_seed: u64,
1052) -> Instruction {
1053 let accounts = vec![
1054 AccountMeta::new_readonly(*stake_pool, false),
1055 AccountMeta::new_readonly(*staker, true),
1056 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1057 AccountMeta::new(*validator_list, false),
1058 AccountMeta::new(*reserve_stake, false),
1059 AccountMeta::new(*validator_stake, false),
1060 AccountMeta::new(*transient_stake, false),
1061 AccountMeta::new_readonly(sysvar::clock::id(), false),
1062 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1063 AccountMeta::new_readonly(system_program::id(), false),
1064 AccountMeta::new_readonly(stake::program::id(), false),
1065 ];
1066 Instruction {
1067 program_id: *program_id,
1068 accounts,
1069 data: borsh::to_vec(&StakePoolInstruction::DecreaseValidatorStakeWithReserve {
1070 lamports,
1071 transient_stake_seed,
1072 })
1073 .unwrap(),
1074 }
1075}
1076
1077pub fn increase_validator_stake(
1080 program_id: &Pubkey,
1081 stake_pool: &Pubkey,
1082 staker: &Pubkey,
1083 stake_pool_withdraw_authority: &Pubkey,
1084 validator_list: &Pubkey,
1085 reserve_stake: &Pubkey,
1086 transient_stake: &Pubkey,
1087 validator_stake: &Pubkey,
1088 validator: &Pubkey,
1089 lamports: u64,
1090 transient_stake_seed: u64,
1091) -> Instruction {
1092 let accounts = vec![
1093 AccountMeta::new_readonly(*stake_pool, false),
1094 AccountMeta::new_readonly(*staker, true),
1095 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1096 AccountMeta::new(*validator_list, false),
1097 AccountMeta::new(*reserve_stake, false),
1098 AccountMeta::new(*transient_stake, false),
1099 AccountMeta::new_readonly(*validator_stake, false),
1100 AccountMeta::new_readonly(*validator, false),
1101 AccountMeta::new_readonly(sysvar::clock::id(), false),
1102 AccountMeta::new_readonly(sysvar::rent::id(), false),
1103 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1104 #[allow(deprecated)]
1105 AccountMeta::new_readonly(stake::config::id(), false),
1106 AccountMeta::new_readonly(system_program::id(), false),
1107 AccountMeta::new_readonly(stake::program::id(), false),
1108 ];
1109 Instruction {
1110 program_id: *program_id,
1111 accounts,
1112 data: borsh::to_vec(&StakePoolInstruction::IncreaseValidatorStake {
1113 lamports,
1114 transient_stake_seed,
1115 })
1116 .unwrap(),
1117 }
1118}
1119
1120pub fn increase_additional_validator_stake(
1123 program_id: &Pubkey,
1124 stake_pool: &Pubkey,
1125 staker: &Pubkey,
1126 stake_pool_withdraw_authority: &Pubkey,
1127 validator_list: &Pubkey,
1128 reserve_stake: &Pubkey,
1129 ephemeral_stake: &Pubkey,
1130 transient_stake: &Pubkey,
1131 validator_stake: &Pubkey,
1132 validator: &Pubkey,
1133 lamports: u64,
1134 transient_stake_seed: u64,
1135 ephemeral_stake_seed: u64,
1136) -> Instruction {
1137 let accounts = vec![
1138 AccountMeta::new_readonly(*stake_pool, false),
1139 AccountMeta::new_readonly(*staker, true),
1140 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1141 AccountMeta::new(*validator_list, false),
1142 AccountMeta::new(*reserve_stake, false),
1143 AccountMeta::new(*ephemeral_stake, false),
1144 AccountMeta::new(*transient_stake, false),
1145 AccountMeta::new_readonly(*validator_stake, false),
1146 AccountMeta::new_readonly(*validator, false),
1147 AccountMeta::new_readonly(sysvar::clock::id(), false),
1148 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1149 #[allow(deprecated)]
1150 AccountMeta::new_readonly(stake::config::id(), false),
1151 AccountMeta::new_readonly(system_program::id(), false),
1152 AccountMeta::new_readonly(stake::program::id(), false),
1153 ];
1154 Instruction {
1155 program_id: *program_id,
1156 accounts,
1157 data: borsh::to_vec(&StakePoolInstruction::IncreaseAdditionalValidatorStake {
1158 lamports,
1159 transient_stake_seed,
1160 ephemeral_stake_seed,
1161 })
1162 .unwrap(),
1163 }
1164}
1165
1166#[deprecated(
1169 since = "2.0.0",
1170 note = "The stake redelegate instruction used in this will not be enabled."
1171)]
1172pub fn redelegate(
1173 program_id: &Pubkey,
1174 stake_pool: &Pubkey,
1175 staker: &Pubkey,
1176 stake_pool_withdraw_authority: &Pubkey,
1177 validator_list: &Pubkey,
1178 reserve_stake: &Pubkey,
1179 source_validator_stake: &Pubkey,
1180 source_transient_stake: &Pubkey,
1181 ephemeral_stake: &Pubkey,
1182 destination_transient_stake: &Pubkey,
1183 destination_validator_stake: &Pubkey,
1184 validator: &Pubkey,
1185 lamports: u64,
1186 source_transient_stake_seed: u64,
1187 ephemeral_stake_seed: u64,
1188 destination_transient_stake_seed: u64,
1189) -> Instruction {
1190 let accounts = vec![
1191 AccountMeta::new_readonly(*stake_pool, false),
1192 AccountMeta::new_readonly(*staker, true),
1193 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1194 AccountMeta::new(*validator_list, false),
1195 AccountMeta::new(*reserve_stake, false),
1196 AccountMeta::new(*source_validator_stake, false),
1197 AccountMeta::new(*source_transient_stake, false),
1198 AccountMeta::new(*ephemeral_stake, false),
1199 AccountMeta::new(*destination_transient_stake, false),
1200 AccountMeta::new_readonly(*destination_validator_stake, false),
1201 AccountMeta::new_readonly(*validator, false),
1202 AccountMeta::new_readonly(sysvar::clock::id(), false),
1203 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1204 #[allow(deprecated)]
1205 AccountMeta::new_readonly(stake::config::id(), false),
1206 AccountMeta::new_readonly(system_program::id(), false),
1207 AccountMeta::new_readonly(stake::program::id(), false),
1208 ];
1209 Instruction {
1210 program_id: *program_id,
1211 accounts,
1212 data: borsh::to_vec(&StakePoolInstruction::Redelegate {
1213 lamports,
1214 source_transient_stake_seed,
1215 ephemeral_stake_seed,
1216 destination_transient_stake_seed,
1217 })
1218 .unwrap(),
1219 }
1220}
1221
1222pub fn set_preferred_validator(
1224 program_id: &Pubkey,
1225 stake_pool_address: &Pubkey,
1226 staker: &Pubkey,
1227 validator_list_address: &Pubkey,
1228 validator_type: PreferredValidatorType,
1229 validator_vote_address: Option<Pubkey>,
1230) -> Instruction {
1231 Instruction {
1232 program_id: *program_id,
1233 accounts: vec![
1234 AccountMeta::new(*stake_pool_address, false),
1235 AccountMeta::new_readonly(*staker, true),
1236 AccountMeta::new_readonly(*validator_list_address, false),
1237 ],
1238 data: borsh::to_vec(&StakePoolInstruction::SetPreferredValidator {
1239 validator_type,
1240 validator_vote_address,
1241 })
1242 .unwrap(),
1243 }
1244}
1245
1246pub fn add_validator_to_pool_with_vote(
1249 program_id: &Pubkey,
1250 stake_pool: &StakePool,
1251 stake_pool_address: &Pubkey,
1252 vote_account_address: &Pubkey,
1253 seed: Option<NonZeroU32>,
1254) -> Instruction {
1255 let pool_withdraw_authority =
1256 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1257 let (stake_account_address, _) =
1258 find_stake_program_address(program_id, vote_account_address, stake_pool_address, seed);
1259 add_validator_to_pool(
1260 program_id,
1261 stake_pool_address,
1262 &stake_pool.staker,
1263 &stake_pool.reserve_stake,
1264 &pool_withdraw_authority,
1265 &stake_pool.validator_list,
1266 &stake_account_address,
1267 vote_account_address,
1268 seed,
1269 )
1270}
1271
1272pub fn remove_validator_from_pool_with_vote(
1275 program_id: &Pubkey,
1276 stake_pool: &StakePool,
1277 stake_pool_address: &Pubkey,
1278 vote_account_address: &Pubkey,
1279 validator_stake_seed: Option<NonZeroU32>,
1280 transient_stake_seed: u64,
1281) -> Instruction {
1282 let pool_withdraw_authority =
1283 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1284 let (stake_account_address, _) = find_stake_program_address(
1285 program_id,
1286 vote_account_address,
1287 stake_pool_address,
1288 validator_stake_seed,
1289 );
1290 let (transient_stake_account, _) = find_transient_stake_program_address(
1291 program_id,
1292 vote_account_address,
1293 stake_pool_address,
1294 transient_stake_seed,
1295 );
1296 remove_validator_from_pool(
1297 program_id,
1298 stake_pool_address,
1299 &stake_pool.staker,
1300 &pool_withdraw_authority,
1301 &stake_pool.validator_list,
1302 &stake_account_address,
1303 &transient_stake_account,
1304 )
1305}
1306
1307pub fn increase_validator_stake_with_vote(
1310 program_id: &Pubkey,
1311 stake_pool: &StakePool,
1312 stake_pool_address: &Pubkey,
1313 vote_account_address: &Pubkey,
1314 lamports: u64,
1315 validator_stake_seed: Option<NonZeroU32>,
1316 transient_stake_seed: u64,
1317) -> Instruction {
1318 let pool_withdraw_authority =
1319 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1320 let (transient_stake_address, _) = find_transient_stake_program_address(
1321 program_id,
1322 vote_account_address,
1323 stake_pool_address,
1324 transient_stake_seed,
1325 );
1326 let (validator_stake_address, _) = find_stake_program_address(
1327 program_id,
1328 vote_account_address,
1329 stake_pool_address,
1330 validator_stake_seed,
1331 );
1332
1333 increase_validator_stake(
1334 program_id,
1335 stake_pool_address,
1336 &stake_pool.staker,
1337 &pool_withdraw_authority,
1338 &stake_pool.validator_list,
1339 &stake_pool.reserve_stake,
1340 &transient_stake_address,
1341 &validator_stake_address,
1342 vote_account_address,
1343 lamports,
1344 transient_stake_seed,
1345 )
1346}
1347
1348pub fn increase_additional_validator_stake_with_vote(
1351 program_id: &Pubkey,
1352 stake_pool: &StakePool,
1353 stake_pool_address: &Pubkey,
1354 vote_account_address: &Pubkey,
1355 lamports: u64,
1356 validator_stake_seed: Option<NonZeroU32>,
1357 transient_stake_seed: u64,
1358 ephemeral_stake_seed: u64,
1359) -> Instruction {
1360 let pool_withdraw_authority =
1361 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1362 let (ephemeral_stake_address, _) =
1363 find_ephemeral_stake_program_address(program_id, stake_pool_address, ephemeral_stake_seed);
1364 let (transient_stake_address, _) = find_transient_stake_program_address(
1365 program_id,
1366 vote_account_address,
1367 stake_pool_address,
1368 transient_stake_seed,
1369 );
1370 let (validator_stake_address, _) = find_stake_program_address(
1371 program_id,
1372 vote_account_address,
1373 stake_pool_address,
1374 validator_stake_seed,
1375 );
1376
1377 increase_additional_validator_stake(
1378 program_id,
1379 stake_pool_address,
1380 &stake_pool.staker,
1381 &pool_withdraw_authority,
1382 &stake_pool.validator_list,
1383 &stake_pool.reserve_stake,
1384 &ephemeral_stake_address,
1385 &transient_stake_address,
1386 &validator_stake_address,
1387 vote_account_address,
1388 lamports,
1389 transient_stake_seed,
1390 ephemeral_stake_seed,
1391 )
1392}
1393
1394pub fn decrease_validator_stake_with_vote(
1397 program_id: &Pubkey,
1398 stake_pool: &StakePool,
1399 stake_pool_address: &Pubkey,
1400 vote_account_address: &Pubkey,
1401 lamports: u64,
1402 validator_stake_seed: Option<NonZeroU32>,
1403 transient_stake_seed: u64,
1404) -> Instruction {
1405 let pool_withdraw_authority =
1406 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1407 let (validator_stake_address, _) = find_stake_program_address(
1408 program_id,
1409 vote_account_address,
1410 stake_pool_address,
1411 validator_stake_seed,
1412 );
1413 let (transient_stake_address, _) = find_transient_stake_program_address(
1414 program_id,
1415 vote_account_address,
1416 stake_pool_address,
1417 transient_stake_seed,
1418 );
1419 decrease_validator_stake_with_reserve(
1420 program_id,
1421 stake_pool_address,
1422 &stake_pool.staker,
1423 &pool_withdraw_authority,
1424 &stake_pool.validator_list,
1425 &stake_pool.reserve_stake,
1426 &validator_stake_address,
1427 &transient_stake_address,
1428 lamports,
1429 transient_stake_seed,
1430 )
1431}
1432
1433pub fn increase_additional_validator_stake_with_list(
1436 program_id: &Pubkey,
1437 stake_pool: &StakePool,
1438 validator_list: &ValidatorList,
1439 stake_pool_address: &Pubkey,
1440 vote_account_address: &Pubkey,
1441 lamports: u64,
1442 ephemeral_stake_seed: u64,
1443) -> Result<Instruction, ProgramError> {
1444 let validator_info = validator_list
1445 .find(vote_account_address)
1446 .ok_or(ProgramError::InvalidInstructionData)?;
1447 let transient_stake_seed = u64::from(validator_info.transient_seed_suffix);
1448 let validator_stake_seed = NonZeroU32::new(validator_info.validator_seed_suffix.into());
1449 Ok(increase_additional_validator_stake_with_vote(
1450 program_id,
1451 stake_pool,
1452 stake_pool_address,
1453 vote_account_address,
1454 lamports,
1455 validator_stake_seed,
1456 transient_stake_seed,
1457 ephemeral_stake_seed,
1458 ))
1459}
1460
1461pub fn decrease_additional_validator_stake_with_list(
1464 program_id: &Pubkey,
1465 stake_pool: &StakePool,
1466 validator_list: &ValidatorList,
1467 stake_pool_address: &Pubkey,
1468 vote_account_address: &Pubkey,
1469 lamports: u64,
1470 ephemeral_stake_seed: u64,
1471) -> Result<Instruction, ProgramError> {
1472 let validator_info = validator_list
1473 .find(vote_account_address)
1474 .ok_or(ProgramError::InvalidInstructionData)?;
1475 let transient_stake_seed = u64::from(validator_info.transient_seed_suffix);
1476 let validator_stake_seed = NonZeroU32::new(validator_info.validator_seed_suffix.into());
1477 Ok(decrease_additional_validator_stake_with_vote(
1478 program_id,
1479 stake_pool,
1480 stake_pool_address,
1481 vote_account_address,
1482 lamports,
1483 validator_stake_seed,
1484 transient_stake_seed,
1485 ephemeral_stake_seed,
1486 ))
1487}
1488
1489pub fn decrease_additional_validator_stake_with_vote(
1492 program_id: &Pubkey,
1493 stake_pool: &StakePool,
1494 stake_pool_address: &Pubkey,
1495 vote_account_address: &Pubkey,
1496 lamports: u64,
1497 validator_stake_seed: Option<NonZeroU32>,
1498 transient_stake_seed: u64,
1499 ephemeral_stake_seed: u64,
1500) -> Instruction {
1501 let pool_withdraw_authority =
1502 find_withdraw_authority_program_address(program_id, stake_pool_address).0;
1503 let (validator_stake_address, _) = find_stake_program_address(
1504 program_id,
1505 vote_account_address,
1506 stake_pool_address,
1507 validator_stake_seed,
1508 );
1509 let (ephemeral_stake_address, _) =
1510 find_ephemeral_stake_program_address(program_id, stake_pool_address, ephemeral_stake_seed);
1511 let (transient_stake_address, _) = find_transient_stake_program_address(
1512 program_id,
1513 vote_account_address,
1514 stake_pool_address,
1515 transient_stake_seed,
1516 );
1517 decrease_additional_validator_stake(
1518 program_id,
1519 stake_pool_address,
1520 &stake_pool.staker,
1521 &pool_withdraw_authority,
1522 &stake_pool.validator_list,
1523 &stake_pool.reserve_stake,
1524 &validator_stake_address,
1525 &ephemeral_stake_address,
1526 &transient_stake_address,
1527 lamports,
1528 transient_stake_seed,
1529 ephemeral_stake_seed,
1530 )
1531}
1532
1533#[deprecated(
1536 since = "1.1.0",
1537 note = "please use `update_validator_list_balance_chunk`"
1538)]
1539pub fn update_validator_list_balance(
1540 program_id: &Pubkey,
1541 stake_pool: &Pubkey,
1542 stake_pool_withdraw_authority: &Pubkey,
1543 validator_list_address: &Pubkey,
1544 reserve_stake: &Pubkey,
1545 validator_list: &ValidatorList,
1546 validator_vote_accounts: &[Pubkey],
1547 start_index: u32,
1548 no_merge: bool,
1549) -> Instruction {
1550 let mut accounts = vec![
1551 AccountMeta::new_readonly(*stake_pool, false),
1552 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1553 AccountMeta::new(*validator_list_address, false),
1554 AccountMeta::new(*reserve_stake, false),
1555 AccountMeta::new_readonly(sysvar::clock::id(), false),
1556 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1557 AccountMeta::new_readonly(stake::program::id(), false),
1558 ];
1559 accounts.append(
1560 &mut validator_vote_accounts
1561 .iter()
1562 .flat_map(|vote_account_address| {
1563 let validator_stake_info = validator_list.find(vote_account_address);
1564 if let Some(validator_stake_info) = validator_stake_info {
1565 let (validator_stake_account, _) = find_stake_program_address(
1566 program_id,
1567 vote_account_address,
1568 stake_pool,
1569 NonZeroU32::new(validator_stake_info.validator_seed_suffix.into()),
1570 );
1571 let (transient_stake_account, _) = find_transient_stake_program_address(
1572 program_id,
1573 vote_account_address,
1574 stake_pool,
1575 validator_stake_info.transient_seed_suffix.into(),
1576 );
1577 vec![
1578 AccountMeta::new(validator_stake_account, false),
1579 AccountMeta::new(transient_stake_account, false),
1580 ]
1581 } else {
1582 vec![]
1583 }
1584 })
1585 .collect::<Vec<AccountMeta>>(),
1586 );
1587 Instruction {
1588 program_id: *program_id,
1589 accounts,
1590 data: borsh::to_vec(&StakePoolInstruction::UpdateValidatorListBalance {
1591 start_index,
1592 no_merge,
1593 })
1594 .unwrap(),
1595 }
1596}
1597
1598pub fn update_validator_list_balance_chunk(
1606 program_id: &Pubkey,
1607 stake_pool: &Pubkey,
1608 stake_pool_withdraw_authority: &Pubkey,
1609 validator_list_address: &Pubkey,
1610 reserve_stake: &Pubkey,
1611 validator_list: &ValidatorList,
1612 len: usize,
1613 start_index: usize,
1614 no_merge: bool,
1615) -> Result<Instruction, ProgramError> {
1616 let mut accounts = vec![
1617 AccountMeta::new_readonly(*stake_pool, false),
1618 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1619 AccountMeta::new(*validator_list_address, false),
1620 AccountMeta::new(*reserve_stake, false),
1621 AccountMeta::new_readonly(sysvar::clock::id(), false),
1622 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1623 AccountMeta::new_readonly(stake::program::id(), false),
1624 ];
1625 let validator_list_subslice = validator_list
1626 .validators
1627 .get(start_index..start_index.saturating_add(len))
1628 .ok_or(ProgramError::InvalidInstructionData)?;
1629 accounts.extend(validator_list_subslice.iter().flat_map(
1630 |ValidatorStakeInfo {
1631 vote_account_address,
1632 validator_seed_suffix,
1633 transient_seed_suffix,
1634 ..
1635 }| {
1636 let (validator_stake_account, _) = find_stake_program_address(
1637 program_id,
1638 vote_account_address,
1639 stake_pool,
1640 NonZeroU32::new((*validator_seed_suffix).into()),
1641 );
1642 let (transient_stake_account, _) = find_transient_stake_program_address(
1643 program_id,
1644 vote_account_address,
1645 stake_pool,
1646 (*transient_seed_suffix).into(),
1647 );
1648 [
1649 AccountMeta::new(validator_stake_account, false),
1650 AccountMeta::new(transient_stake_account, false),
1651 ]
1652 },
1653 ));
1654 Ok(Instruction {
1655 program_id: *program_id,
1656 accounts,
1657 data: borsh::to_vec(&StakePoolInstruction::UpdateValidatorListBalance {
1658 start_index: start_index.try_into().unwrap(),
1659 no_merge,
1660 })
1661 .unwrap(),
1662 })
1663}
1664
1665pub fn update_stale_validator_list_balance_chunk(
1671 program_id: &Pubkey,
1672 stake_pool: &Pubkey,
1673 stake_pool_withdraw_authority: &Pubkey,
1674 validator_list_address: &Pubkey,
1675 reserve_stake: &Pubkey,
1676 validator_list: &ValidatorList,
1677 len: usize,
1678 start_index: usize,
1679 no_merge: bool,
1680 current_epoch: Epoch,
1681) -> Result<Option<Instruction>, ProgramError> {
1682 let validator_list_subslice = validator_list
1683 .validators
1684 .get(start_index..start_index.saturating_add(len))
1685 .ok_or(ProgramError::InvalidInstructionData)?;
1686 if validator_list_subslice.iter().all(|info| {
1687 let last_update_epoch: u64 = info.last_update_epoch.into();
1688 last_update_epoch >= current_epoch
1689 }) {
1690 return Ok(None);
1691 }
1692 update_validator_list_balance_chunk(
1693 program_id,
1694 stake_pool,
1695 stake_pool_withdraw_authority,
1696 validator_list_address,
1697 reserve_stake,
1698 validator_list,
1699 len,
1700 start_index,
1701 no_merge,
1702 )
1703 .map(Some)
1704}
1705
1706pub fn update_stake_pool_balance(
1709 program_id: &Pubkey,
1710 stake_pool: &Pubkey,
1711 withdraw_authority: &Pubkey,
1712 validator_list_storage: &Pubkey,
1713 reserve_stake: &Pubkey,
1714 manager_fee_account: &Pubkey,
1715 stake_pool_mint: &Pubkey,
1716 token_program_id: &Pubkey,
1717) -> Instruction {
1718 let accounts = vec![
1719 AccountMeta::new(*stake_pool, false),
1720 AccountMeta::new_readonly(*withdraw_authority, false),
1721 AccountMeta::new(*validator_list_storage, false),
1722 AccountMeta::new_readonly(*reserve_stake, false),
1723 AccountMeta::new(*manager_fee_account, false),
1724 AccountMeta::new(*stake_pool_mint, false),
1725 AccountMeta::new_readonly(*token_program_id, false),
1726 ];
1727 Instruction {
1728 program_id: *program_id,
1729 accounts,
1730 data: borsh::to_vec(&StakePoolInstruction::UpdateStakePoolBalance).unwrap(),
1731 }
1732}
1733
1734pub fn cleanup_removed_validator_entries(
1737 program_id: &Pubkey,
1738 stake_pool: &Pubkey,
1739 validator_list_storage: &Pubkey,
1740) -> Instruction {
1741 let accounts = vec![
1742 AccountMeta::new(*stake_pool, false),
1743 AccountMeta::new(*validator_list_storage, false),
1744 ];
1745 Instruction {
1746 program_id: *program_id,
1747 accounts,
1748 data: borsh::to_vec(&StakePoolInstruction::CleanupRemovedValidatorEntries).unwrap(),
1749 }
1750}
1751
1752pub fn update_stake_pool(
1755 program_id: &Pubkey,
1756 stake_pool: &StakePool,
1757 validator_list: &ValidatorList,
1758 stake_pool_address: &Pubkey,
1759 no_merge: bool,
1760) -> (Vec<Instruction>, Vec<Instruction>) {
1761 let (withdraw_authority, _) =
1762 find_withdraw_authority_program_address(program_id, stake_pool_address);
1763
1764 let update_list_instructions = validator_list
1765 .validators
1766 .chunks(MAX_VALIDATORS_TO_UPDATE)
1767 .enumerate()
1768 .map(|(i, chunk)| {
1769 update_validator_list_balance_chunk(
1771 program_id,
1772 stake_pool_address,
1773 &withdraw_authority,
1774 &stake_pool.validator_list,
1775 &stake_pool.reserve_stake,
1776 validator_list,
1777 chunk.len(),
1778 i.saturating_mul(MAX_VALIDATORS_TO_UPDATE),
1779 no_merge,
1780 )
1781 .unwrap()
1782 })
1783 .collect();
1784
1785 let final_instructions = vec![
1786 update_stake_pool_balance(
1787 program_id,
1788 stake_pool_address,
1789 &withdraw_authority,
1790 &stake_pool.validator_list,
1791 &stake_pool.reserve_stake,
1792 &stake_pool.manager_fee_account,
1793 &stake_pool.pool_mint,
1794 &stake_pool.token_program_id,
1795 ),
1796 cleanup_removed_validator_entries(
1797 program_id,
1798 stake_pool_address,
1799 &stake_pool.validator_list,
1800 ),
1801 ];
1802 (update_list_instructions, final_instructions)
1803}
1804
1805pub fn update_stale_stake_pool(
1812 program_id: &Pubkey,
1813 stake_pool: &StakePool,
1814 validator_list: &ValidatorList,
1815 stake_pool_address: &Pubkey,
1816 no_merge: bool,
1817 current_epoch: Epoch,
1818) -> (Vec<Instruction>, Vec<Instruction>) {
1819 let (withdraw_authority, _) =
1820 find_withdraw_authority_program_address(program_id, stake_pool_address);
1821
1822 let update_list_instructions = validator_list
1823 .validators
1824 .chunks(MAX_VALIDATORS_TO_UPDATE)
1825 .enumerate()
1826 .filter_map(|(i, chunk)| {
1827 update_stale_validator_list_balance_chunk(
1829 program_id,
1830 stake_pool_address,
1831 &withdraw_authority,
1832 &stake_pool.validator_list,
1833 &stake_pool.reserve_stake,
1834 validator_list,
1835 chunk.len(),
1836 i.saturating_mul(MAX_VALIDATORS_TO_UPDATE),
1837 no_merge,
1838 current_epoch,
1839 )
1840 .unwrap()
1841 })
1842 .collect();
1843
1844 let final_instructions = vec![
1845 update_stake_pool_balance(
1846 program_id,
1847 stake_pool_address,
1848 &withdraw_authority,
1849 &stake_pool.validator_list,
1850 &stake_pool.reserve_stake,
1851 &stake_pool.manager_fee_account,
1852 &stake_pool.pool_mint,
1853 &stake_pool.token_program_id,
1854 ),
1855 cleanup_removed_validator_entries(
1856 program_id,
1857 stake_pool_address,
1858 &stake_pool.validator_list,
1859 ),
1860 ];
1861 (update_list_instructions, final_instructions)
1862}
1863
1864fn deposit_stake_internal(
1865 program_id: &Pubkey,
1866 stake_pool: &Pubkey,
1867 validator_list_storage: &Pubkey,
1868 stake_pool_deposit_authority: Option<&Pubkey>,
1869 stake_pool_withdraw_authority: &Pubkey,
1870 deposit_stake_address: &Pubkey,
1871 deposit_stake_withdraw_authority: &Pubkey,
1872 validator_stake_account: &Pubkey,
1873 reserve_stake_account: &Pubkey,
1874 pool_tokens_to: &Pubkey,
1875 manager_fee_account: &Pubkey,
1876 referrer_pool_tokens_account: &Pubkey,
1877 pool_mint: &Pubkey,
1878 token_program_id: &Pubkey,
1879 minimum_pool_tokens_out: Option<u64>,
1880) -> Vec<Instruction> {
1881 let mut instructions = vec![];
1882 let mut accounts = vec![
1883 AccountMeta::new(*stake_pool, false),
1884 AccountMeta::new(*validator_list_storage, false),
1885 ];
1886 if let Some(stake_pool_deposit_authority) = stake_pool_deposit_authority {
1887 accounts.push(AccountMeta::new_readonly(
1888 *stake_pool_deposit_authority,
1889 true,
1890 ));
1891 instructions.extend_from_slice(&[
1892 stake::instruction::authorize(
1893 deposit_stake_address,
1894 deposit_stake_withdraw_authority,
1895 stake_pool_deposit_authority,
1896 stake::state::StakeAuthorize::Staker,
1897 None,
1898 ),
1899 stake::instruction::authorize(
1900 deposit_stake_address,
1901 deposit_stake_withdraw_authority,
1902 stake_pool_deposit_authority,
1903 stake::state::StakeAuthorize::Withdrawer,
1904 None,
1905 ),
1906 ]);
1907 } else {
1908 let stake_pool_deposit_authority =
1909 find_deposit_authority_program_address(program_id, stake_pool).0;
1910 accounts.push(AccountMeta::new_readonly(
1911 stake_pool_deposit_authority,
1912 false,
1913 ));
1914 instructions.extend_from_slice(&[
1915 stake::instruction::authorize(
1916 deposit_stake_address,
1917 deposit_stake_withdraw_authority,
1918 &stake_pool_deposit_authority,
1919 stake::state::StakeAuthorize::Staker,
1920 None,
1921 ),
1922 stake::instruction::authorize(
1923 deposit_stake_address,
1924 deposit_stake_withdraw_authority,
1925 &stake_pool_deposit_authority,
1926 stake::state::StakeAuthorize::Withdrawer,
1927 None,
1928 ),
1929 ]);
1930 };
1931
1932 accounts.extend_from_slice(&[
1933 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
1934 AccountMeta::new(*deposit_stake_address, false),
1935 AccountMeta::new(*validator_stake_account, false),
1936 AccountMeta::new(*reserve_stake_account, false),
1937 AccountMeta::new(*pool_tokens_to, false),
1938 AccountMeta::new(*manager_fee_account, false),
1939 AccountMeta::new(*referrer_pool_tokens_account, false),
1940 AccountMeta::new(*pool_mint, false),
1941 AccountMeta::new_readonly(sysvar::clock::id(), false),
1942 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
1943 AccountMeta::new_readonly(*token_program_id, false),
1944 AccountMeta::new_readonly(stake::program::id(), false),
1945 ]);
1946 instructions.push(
1947 if let Some(minimum_pool_tokens_out) = minimum_pool_tokens_out {
1948 Instruction {
1949 program_id: *program_id,
1950 accounts,
1951 data: borsh::to_vec(&StakePoolInstruction::DepositStakeWithSlippage {
1952 minimum_pool_tokens_out,
1953 })
1954 .unwrap(),
1955 }
1956 } else {
1957 Instruction {
1958 program_id: *program_id,
1959 accounts,
1960 data: borsh::to_vec(&StakePoolInstruction::DepositStake).unwrap(),
1961 }
1962 },
1963 );
1964 instructions
1965}
1966
1967pub fn deposit_stake(
1970 program_id: &Pubkey,
1971 stake_pool: &Pubkey,
1972 validator_list_storage: &Pubkey,
1973 stake_pool_withdraw_authority: &Pubkey,
1974 deposit_stake_address: &Pubkey,
1975 deposit_stake_withdraw_authority: &Pubkey,
1976 validator_stake_account: &Pubkey,
1977 reserve_stake_account: &Pubkey,
1978 pool_tokens_to: &Pubkey,
1979 manager_fee_account: &Pubkey,
1980 referrer_pool_tokens_account: &Pubkey,
1981 pool_mint: &Pubkey,
1982 token_program_id: &Pubkey,
1983) -> Vec<Instruction> {
1984 deposit_stake_internal(
1985 program_id,
1986 stake_pool,
1987 validator_list_storage,
1988 None,
1989 stake_pool_withdraw_authority,
1990 deposit_stake_address,
1991 deposit_stake_withdraw_authority,
1992 validator_stake_account,
1993 reserve_stake_account,
1994 pool_tokens_to,
1995 manager_fee_account,
1996 referrer_pool_tokens_account,
1997 pool_mint,
1998 token_program_id,
1999 None,
2000 )
2001}
2002
2003pub fn deposit_stake_with_slippage(
2005 program_id: &Pubkey,
2006 stake_pool: &Pubkey,
2007 validator_list_storage: &Pubkey,
2008 stake_pool_withdraw_authority: &Pubkey,
2009 deposit_stake_address: &Pubkey,
2010 deposit_stake_withdraw_authority: &Pubkey,
2011 validator_stake_account: &Pubkey,
2012 reserve_stake_account: &Pubkey,
2013 pool_tokens_to: &Pubkey,
2014 manager_fee_account: &Pubkey,
2015 referrer_pool_tokens_account: &Pubkey,
2016 pool_mint: &Pubkey,
2017 token_program_id: &Pubkey,
2018 minimum_pool_tokens_out: u64,
2019) -> Vec<Instruction> {
2020 deposit_stake_internal(
2021 program_id,
2022 stake_pool,
2023 validator_list_storage,
2024 None,
2025 stake_pool_withdraw_authority,
2026 deposit_stake_address,
2027 deposit_stake_withdraw_authority,
2028 validator_stake_account,
2029 reserve_stake_account,
2030 pool_tokens_to,
2031 manager_fee_account,
2032 referrer_pool_tokens_account,
2033 pool_mint,
2034 token_program_id,
2035 Some(minimum_pool_tokens_out),
2036 )
2037}
2038
2039pub fn deposit_stake_with_authority(
2043 program_id: &Pubkey,
2044 stake_pool: &Pubkey,
2045 validator_list_storage: &Pubkey,
2046 stake_pool_deposit_authority: &Pubkey,
2047 stake_pool_withdraw_authority: &Pubkey,
2048 deposit_stake_address: &Pubkey,
2049 deposit_stake_withdraw_authority: &Pubkey,
2050 validator_stake_account: &Pubkey,
2051 reserve_stake_account: &Pubkey,
2052 pool_tokens_to: &Pubkey,
2053 manager_fee_account: &Pubkey,
2054 referrer_pool_tokens_account: &Pubkey,
2055 pool_mint: &Pubkey,
2056 token_program_id: &Pubkey,
2057) -> Vec<Instruction> {
2058 deposit_stake_internal(
2059 program_id,
2060 stake_pool,
2061 validator_list_storage,
2062 Some(stake_pool_deposit_authority),
2063 stake_pool_withdraw_authority,
2064 deposit_stake_address,
2065 deposit_stake_withdraw_authority,
2066 validator_stake_account,
2067 reserve_stake_account,
2068 pool_tokens_to,
2069 manager_fee_account,
2070 referrer_pool_tokens_account,
2071 pool_mint,
2072 token_program_id,
2073 None,
2074 )
2075}
2076
2077pub fn deposit_stake_with_authority_and_slippage(
2082 program_id: &Pubkey,
2083 stake_pool: &Pubkey,
2084 validator_list_storage: &Pubkey,
2085 stake_pool_deposit_authority: &Pubkey,
2086 stake_pool_withdraw_authority: &Pubkey,
2087 deposit_stake_address: &Pubkey,
2088 deposit_stake_withdraw_authority: &Pubkey,
2089 validator_stake_account: &Pubkey,
2090 reserve_stake_account: &Pubkey,
2091 pool_tokens_to: &Pubkey,
2092 manager_fee_account: &Pubkey,
2093 referrer_pool_tokens_account: &Pubkey,
2094 pool_mint: &Pubkey,
2095 token_program_id: &Pubkey,
2096 minimum_pool_tokens_out: u64,
2097) -> Vec<Instruction> {
2098 deposit_stake_internal(
2099 program_id,
2100 stake_pool,
2101 validator_list_storage,
2102 Some(stake_pool_deposit_authority),
2103 stake_pool_withdraw_authority,
2104 deposit_stake_address,
2105 deposit_stake_withdraw_authority,
2106 validator_stake_account,
2107 reserve_stake_account,
2108 pool_tokens_to,
2109 manager_fee_account,
2110 referrer_pool_tokens_account,
2111 pool_mint,
2112 token_program_id,
2113 Some(minimum_pool_tokens_out),
2114 )
2115}
2116
2117fn deposit_sol_internal(
2119 program_id: &Pubkey,
2120 stake_pool: &Pubkey,
2121 stake_pool_withdraw_authority: &Pubkey,
2122 reserve_stake_account: &Pubkey,
2123 lamports_from: &Pubkey,
2124 pool_tokens_to: &Pubkey,
2125 manager_fee_account: &Pubkey,
2126 referrer_pool_tokens_account: &Pubkey,
2127 pool_mint: &Pubkey,
2128 token_program_id: &Pubkey,
2129 sol_deposit_authority: Option<&Pubkey>,
2130 lamports_in: u64,
2131 minimum_pool_tokens_out: Option<u64>,
2132) -> Instruction {
2133 let mut accounts = vec![
2134 AccountMeta::new(*stake_pool, false),
2135 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
2136 AccountMeta::new(*reserve_stake_account, false),
2137 AccountMeta::new(*lamports_from, true),
2138 AccountMeta::new(*pool_tokens_to, false),
2139 AccountMeta::new(*manager_fee_account, false),
2140 AccountMeta::new(*referrer_pool_tokens_account, false),
2141 AccountMeta::new(*pool_mint, false),
2142 AccountMeta::new_readonly(system_program::id(), false),
2143 AccountMeta::new_readonly(*token_program_id, false),
2144 ];
2145 if let Some(sol_deposit_authority) = sol_deposit_authority {
2146 accounts.push(AccountMeta::new_readonly(*sol_deposit_authority, true));
2147 }
2148 if let Some(minimum_pool_tokens_out) = minimum_pool_tokens_out {
2149 Instruction {
2150 program_id: *program_id,
2151 accounts,
2152 data: borsh::to_vec(&StakePoolInstruction::DepositSolWithSlippage {
2153 lamports_in,
2154 minimum_pool_tokens_out,
2155 })
2156 .unwrap(),
2157 }
2158 } else {
2159 Instruction {
2160 program_id: *program_id,
2161 accounts,
2162 data: borsh::to_vec(&StakePoolInstruction::DepositSol(lamports_in)).unwrap(),
2163 }
2164 }
2165}
2166
2167pub fn deposit_sol(
2169 program_id: &Pubkey,
2170 stake_pool: &Pubkey,
2171 stake_pool_withdraw_authority: &Pubkey,
2172 reserve_stake_account: &Pubkey,
2173 lamports_from: &Pubkey,
2174 pool_tokens_to: &Pubkey,
2175 manager_fee_account: &Pubkey,
2176 referrer_pool_tokens_account: &Pubkey,
2177 pool_mint: &Pubkey,
2178 token_program_id: &Pubkey,
2179 lamports_in: u64,
2180) -> Instruction {
2181 deposit_sol_internal(
2182 program_id,
2183 stake_pool,
2184 stake_pool_withdraw_authority,
2185 reserve_stake_account,
2186 lamports_from,
2187 pool_tokens_to,
2188 manager_fee_account,
2189 referrer_pool_tokens_account,
2190 pool_mint,
2191 token_program_id,
2192 None,
2193 lamports_in,
2194 None,
2195 )
2196}
2197
2198pub fn deposit_sol_with_slippage(
2201 program_id: &Pubkey,
2202 stake_pool: &Pubkey,
2203 stake_pool_withdraw_authority: &Pubkey,
2204 reserve_stake_account: &Pubkey,
2205 lamports_from: &Pubkey,
2206 pool_tokens_to: &Pubkey,
2207 manager_fee_account: &Pubkey,
2208 referrer_pool_tokens_account: &Pubkey,
2209 pool_mint: &Pubkey,
2210 token_program_id: &Pubkey,
2211 lamports_in: u64,
2212 minimum_pool_tokens_out: u64,
2213) -> Instruction {
2214 deposit_sol_internal(
2215 program_id,
2216 stake_pool,
2217 stake_pool_withdraw_authority,
2218 reserve_stake_account,
2219 lamports_from,
2220 pool_tokens_to,
2221 manager_fee_account,
2222 referrer_pool_tokens_account,
2223 pool_mint,
2224 token_program_id,
2225 None,
2226 lamports_in,
2227 Some(minimum_pool_tokens_out),
2228 )
2229}
2230
2231pub fn deposit_sol_with_authority(
2235 program_id: &Pubkey,
2236 stake_pool: &Pubkey,
2237 sol_deposit_authority: &Pubkey,
2238 stake_pool_withdraw_authority: &Pubkey,
2239 reserve_stake_account: &Pubkey,
2240 lamports_from: &Pubkey,
2241 pool_tokens_to: &Pubkey,
2242 manager_fee_account: &Pubkey,
2243 referrer_pool_tokens_account: &Pubkey,
2244 pool_mint: &Pubkey,
2245 token_program_id: &Pubkey,
2246 lamports_in: u64,
2247) -> Instruction {
2248 deposit_sol_internal(
2249 program_id,
2250 stake_pool,
2251 stake_pool_withdraw_authority,
2252 reserve_stake_account,
2253 lamports_from,
2254 pool_tokens_to,
2255 manager_fee_account,
2256 referrer_pool_tokens_account,
2257 pool_mint,
2258 token_program_id,
2259 Some(sol_deposit_authority),
2260 lamports_in,
2261 None,
2262 )
2263}
2264
2265pub fn deposit_sol_with_authority_and_slippage(
2268 program_id: &Pubkey,
2269 stake_pool: &Pubkey,
2270 sol_deposit_authority: &Pubkey,
2271 stake_pool_withdraw_authority: &Pubkey,
2272 reserve_stake_account: &Pubkey,
2273 lamports_from: &Pubkey,
2274 pool_tokens_to: &Pubkey,
2275 manager_fee_account: &Pubkey,
2276 referrer_pool_tokens_account: &Pubkey,
2277 pool_mint: &Pubkey,
2278 token_program_id: &Pubkey,
2279 lamports_in: u64,
2280 minimum_pool_tokens_out: u64,
2281) -> Instruction {
2282 deposit_sol_internal(
2283 program_id,
2284 stake_pool,
2285 stake_pool_withdraw_authority,
2286 reserve_stake_account,
2287 lamports_from,
2288 pool_tokens_to,
2289 manager_fee_account,
2290 referrer_pool_tokens_account,
2291 pool_mint,
2292 token_program_id,
2293 Some(sol_deposit_authority),
2294 lamports_in,
2295 Some(minimum_pool_tokens_out),
2296 )
2297}
2298
2299fn withdraw_stake_internal(
2300 program_id: &Pubkey,
2301 stake_pool: &Pubkey,
2302 validator_list_storage: &Pubkey,
2303 stake_pool_withdraw: &Pubkey,
2304 stake_to_split: &Pubkey,
2305 stake_to_receive: &Pubkey,
2306 user_stake_authority: &Pubkey,
2307 user_transfer_authority: &Pubkey,
2308 user_pool_token_account: &Pubkey,
2309 manager_fee_account: &Pubkey,
2310 pool_mint: &Pubkey,
2311 token_program_id: &Pubkey,
2312 pool_tokens_in: u64,
2313 minimum_lamports_out: Option<u64>,
2314) -> Instruction {
2315 let accounts = vec![
2316 AccountMeta::new(*stake_pool, false),
2317 AccountMeta::new(*validator_list_storage, false),
2318 AccountMeta::new_readonly(*stake_pool_withdraw, false),
2319 AccountMeta::new(*stake_to_split, false),
2320 AccountMeta::new(*stake_to_receive, false),
2321 AccountMeta::new_readonly(*user_stake_authority, false),
2322 AccountMeta::new_readonly(*user_transfer_authority, true),
2323 AccountMeta::new(*user_pool_token_account, false),
2324 AccountMeta::new(*manager_fee_account, false),
2325 AccountMeta::new(*pool_mint, false),
2326 AccountMeta::new_readonly(sysvar::clock::id(), false),
2327 AccountMeta::new_readonly(*token_program_id, false),
2328 AccountMeta::new_readonly(stake::program::id(), false),
2329 ];
2330 if let Some(minimum_lamports_out) = minimum_lamports_out {
2331 Instruction {
2332 program_id: *program_id,
2333 accounts,
2334 data: borsh::to_vec(&StakePoolInstruction::WithdrawStakeWithSlippage {
2335 pool_tokens_in,
2336 minimum_lamports_out,
2337 })
2338 .unwrap(),
2339 }
2340 } else {
2341 Instruction {
2342 program_id: *program_id,
2343 accounts,
2344 data: borsh::to_vec(&StakePoolInstruction::WithdrawStake(pool_tokens_in)).unwrap(),
2345 }
2346 }
2347}
2348
2349pub fn withdraw_stake(
2351 program_id: &Pubkey,
2352 stake_pool: &Pubkey,
2353 validator_list_storage: &Pubkey,
2354 stake_pool_withdraw: &Pubkey,
2355 stake_to_split: &Pubkey,
2356 stake_to_receive: &Pubkey,
2357 user_stake_authority: &Pubkey,
2358 user_transfer_authority: &Pubkey,
2359 user_pool_token_account: &Pubkey,
2360 manager_fee_account: &Pubkey,
2361 pool_mint: &Pubkey,
2362 token_program_id: &Pubkey,
2363 pool_tokens_in: u64,
2364) -> Instruction {
2365 withdraw_stake_internal(
2366 program_id,
2367 stake_pool,
2368 validator_list_storage,
2369 stake_pool_withdraw,
2370 stake_to_split,
2371 stake_to_receive,
2372 user_stake_authority,
2373 user_transfer_authority,
2374 user_pool_token_account,
2375 manager_fee_account,
2376 pool_mint,
2377 token_program_id,
2378 pool_tokens_in,
2379 None,
2380 )
2381}
2382
2383pub fn withdraw_stake_with_slippage(
2385 program_id: &Pubkey,
2386 stake_pool: &Pubkey,
2387 validator_list_storage: &Pubkey,
2388 stake_pool_withdraw: &Pubkey,
2389 stake_to_split: &Pubkey,
2390 stake_to_receive: &Pubkey,
2391 user_stake_authority: &Pubkey,
2392 user_transfer_authority: &Pubkey,
2393 user_pool_token_account: &Pubkey,
2394 manager_fee_account: &Pubkey,
2395 pool_mint: &Pubkey,
2396 token_program_id: &Pubkey,
2397 pool_tokens_in: u64,
2398 minimum_lamports_out: u64,
2399) -> Instruction {
2400 withdraw_stake_internal(
2401 program_id,
2402 stake_pool,
2403 validator_list_storage,
2404 stake_pool_withdraw,
2405 stake_to_split,
2406 stake_to_receive,
2407 user_stake_authority,
2408 user_transfer_authority,
2409 user_pool_token_account,
2410 manager_fee_account,
2411 pool_mint,
2412 token_program_id,
2413 pool_tokens_in,
2414 Some(minimum_lamports_out),
2415 )
2416}
2417
2418fn withdraw_sol_internal(
2419 program_id: &Pubkey,
2420 stake_pool: &Pubkey,
2421 stake_pool_withdraw_authority: &Pubkey,
2422 user_transfer_authority: &Pubkey,
2423 pool_tokens_from: &Pubkey,
2424 reserve_stake_account: &Pubkey,
2425 lamports_to: &Pubkey,
2426 manager_fee_account: &Pubkey,
2427 pool_mint: &Pubkey,
2428 token_program_id: &Pubkey,
2429 sol_withdraw_authority: Option<&Pubkey>,
2430 pool_tokens_in: u64,
2431 minimum_lamports_out: Option<u64>,
2432) -> Instruction {
2433 let mut accounts = vec![
2434 AccountMeta::new(*stake_pool, false),
2435 AccountMeta::new_readonly(*stake_pool_withdraw_authority, false),
2436 AccountMeta::new_readonly(*user_transfer_authority, true),
2437 AccountMeta::new(*pool_tokens_from, false),
2438 AccountMeta::new(*reserve_stake_account, false),
2439 AccountMeta::new(*lamports_to, false),
2440 AccountMeta::new(*manager_fee_account, false),
2441 AccountMeta::new(*pool_mint, false),
2442 AccountMeta::new_readonly(sysvar::clock::id(), false),
2443 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
2444 AccountMeta::new_readonly(stake::program::id(), false),
2445 AccountMeta::new_readonly(*token_program_id, false),
2446 ];
2447 if let Some(sol_withdraw_authority) = sol_withdraw_authority {
2448 accounts.push(AccountMeta::new_readonly(*sol_withdraw_authority, true));
2449 }
2450 if let Some(minimum_lamports_out) = minimum_lamports_out {
2451 Instruction {
2452 program_id: *program_id,
2453 accounts,
2454 data: borsh::to_vec(&StakePoolInstruction::WithdrawSolWithSlippage {
2455 pool_tokens_in,
2456 minimum_lamports_out,
2457 })
2458 .unwrap(),
2459 }
2460 } else {
2461 Instruction {
2462 program_id: *program_id,
2463 accounts,
2464 data: borsh::to_vec(&StakePoolInstruction::WithdrawSol(pool_tokens_in)).unwrap(),
2465 }
2466 }
2467}
2468
2469pub fn withdraw_sol(
2471 program_id: &Pubkey,
2472 stake_pool: &Pubkey,
2473 stake_pool_withdraw_authority: &Pubkey,
2474 user_transfer_authority: &Pubkey,
2475 pool_tokens_from: &Pubkey,
2476 reserve_stake_account: &Pubkey,
2477 lamports_to: &Pubkey,
2478 manager_fee_account: &Pubkey,
2479 pool_mint: &Pubkey,
2480 token_program_id: &Pubkey,
2481 pool_tokens_in: u64,
2482) -> Instruction {
2483 withdraw_sol_internal(
2484 program_id,
2485 stake_pool,
2486 stake_pool_withdraw_authority,
2487 user_transfer_authority,
2488 pool_tokens_from,
2489 reserve_stake_account,
2490 lamports_to,
2491 manager_fee_account,
2492 pool_mint,
2493 token_program_id,
2494 None,
2495 pool_tokens_in,
2496 None,
2497 )
2498}
2499
2500pub fn withdraw_sol_with_slippage(
2503 program_id: &Pubkey,
2504 stake_pool: &Pubkey,
2505 stake_pool_withdraw_authority: &Pubkey,
2506 user_transfer_authority: &Pubkey,
2507 pool_tokens_from: &Pubkey,
2508 reserve_stake_account: &Pubkey,
2509 lamports_to: &Pubkey,
2510 manager_fee_account: &Pubkey,
2511 pool_mint: &Pubkey,
2512 token_program_id: &Pubkey,
2513 pool_tokens_in: u64,
2514 minimum_lamports_out: u64,
2515) -> Instruction {
2516 withdraw_sol_internal(
2517 program_id,
2518 stake_pool,
2519 stake_pool_withdraw_authority,
2520 user_transfer_authority,
2521 pool_tokens_from,
2522 reserve_stake_account,
2523 lamports_to,
2524 manager_fee_account,
2525 pool_mint,
2526 token_program_id,
2527 None,
2528 pool_tokens_in,
2529 Some(minimum_lamports_out),
2530 )
2531}
2532
2533pub fn withdraw_sol_with_authority(
2537 program_id: &Pubkey,
2538 stake_pool: &Pubkey,
2539 sol_withdraw_authority: &Pubkey,
2540 stake_pool_withdraw_authority: &Pubkey,
2541 user_transfer_authority: &Pubkey,
2542 pool_tokens_from: &Pubkey,
2543 reserve_stake_account: &Pubkey,
2544 lamports_to: &Pubkey,
2545 manager_fee_account: &Pubkey,
2546 pool_mint: &Pubkey,
2547 token_program_id: &Pubkey,
2548 pool_tokens_in: u64,
2549) -> Instruction {
2550 withdraw_sol_internal(
2551 program_id,
2552 stake_pool,
2553 stake_pool_withdraw_authority,
2554 user_transfer_authority,
2555 pool_tokens_from,
2556 reserve_stake_account,
2557 lamports_to,
2558 manager_fee_account,
2559 pool_mint,
2560 token_program_id,
2561 Some(sol_withdraw_authority),
2562 pool_tokens_in,
2563 None,
2564 )
2565}
2566
2567pub fn withdraw_sol_with_authority_and_slippage(
2572 program_id: &Pubkey,
2573 stake_pool: &Pubkey,
2574 sol_withdraw_authority: &Pubkey,
2575 stake_pool_withdraw_authority: &Pubkey,
2576 user_transfer_authority: &Pubkey,
2577 pool_tokens_from: &Pubkey,
2578 reserve_stake_account: &Pubkey,
2579 lamports_to: &Pubkey,
2580 manager_fee_account: &Pubkey,
2581 pool_mint: &Pubkey,
2582 token_program_id: &Pubkey,
2583 pool_tokens_in: u64,
2584 minimum_lamports_out: u64,
2585) -> Instruction {
2586 withdraw_sol_internal(
2587 program_id,
2588 stake_pool,
2589 stake_pool_withdraw_authority,
2590 user_transfer_authority,
2591 pool_tokens_from,
2592 reserve_stake_account,
2593 lamports_to,
2594 manager_fee_account,
2595 pool_mint,
2596 token_program_id,
2597 Some(sol_withdraw_authority),
2598 pool_tokens_in,
2599 Some(minimum_lamports_out),
2600 )
2601}
2602
2603pub fn set_manager(
2605 program_id: &Pubkey,
2606 stake_pool: &Pubkey,
2607 manager: &Pubkey,
2608 new_manager: &Pubkey,
2609 new_fee_receiver: &Pubkey,
2610) -> Instruction {
2611 let accounts = vec![
2612 AccountMeta::new(*stake_pool, false),
2613 AccountMeta::new_readonly(*manager, true),
2614 AccountMeta::new_readonly(*new_manager, true),
2615 AccountMeta::new_readonly(*new_fee_receiver, false),
2616 ];
2617 Instruction {
2618 program_id: *program_id,
2619 accounts,
2620 data: borsh::to_vec(&StakePoolInstruction::SetManager).unwrap(),
2621 }
2622}
2623
2624pub fn set_fee(
2626 program_id: &Pubkey,
2627 stake_pool: &Pubkey,
2628 manager: &Pubkey,
2629 fee: FeeType,
2630) -> Instruction {
2631 let accounts = vec![
2632 AccountMeta::new(*stake_pool, false),
2633 AccountMeta::new_readonly(*manager, true),
2634 ];
2635 Instruction {
2636 program_id: *program_id,
2637 accounts,
2638 data: borsh::to_vec(&StakePoolInstruction::SetFee { fee }).unwrap(),
2639 }
2640}
2641
2642pub fn set_staker(
2644 program_id: &Pubkey,
2645 stake_pool: &Pubkey,
2646 set_staker_authority: &Pubkey,
2647 new_staker: &Pubkey,
2648) -> Instruction {
2649 let accounts = vec![
2650 AccountMeta::new(*stake_pool, false),
2651 AccountMeta::new_readonly(*set_staker_authority, true),
2652 AccountMeta::new_readonly(*new_staker, false),
2653 ];
2654 Instruction {
2655 program_id: *program_id,
2656 accounts,
2657 data: borsh::to_vec(&StakePoolInstruction::SetStaker).unwrap(),
2658 }
2659}
2660
2661pub fn set_funding_authority(
2663 program_id: &Pubkey,
2664 stake_pool: &Pubkey,
2665 manager: &Pubkey,
2666 new_sol_deposit_authority: Option<&Pubkey>,
2667 funding_type: FundingType,
2668) -> Instruction {
2669 let mut accounts = vec![
2670 AccountMeta::new(*stake_pool, false),
2671 AccountMeta::new_readonly(*manager, true),
2672 ];
2673 if let Some(auth) = new_sol_deposit_authority {
2674 accounts.push(AccountMeta::new_readonly(*auth, false))
2675 }
2676 Instruction {
2677 program_id: *program_id,
2678 accounts,
2679 data: borsh::to_vec(&StakePoolInstruction::SetFundingAuthority(funding_type)).unwrap(),
2680 }
2681}
2682
2683pub fn update_token_metadata(
2686 program_id: &Pubkey,
2687 stake_pool: &Pubkey,
2688 manager: &Pubkey,
2689 pool_mint: &Pubkey,
2690 name: String,
2691 symbol: String,
2692 uri: String,
2693) -> Instruction {
2694 let (stake_pool_withdraw_authority, _) =
2695 find_withdraw_authority_program_address(program_id, stake_pool);
2696 let (token_metadata, _) = find_metadata_account(pool_mint);
2697
2698 let accounts = vec![
2699 AccountMeta::new_readonly(*stake_pool, false),
2700 AccountMeta::new_readonly(*manager, true),
2701 AccountMeta::new_readonly(stake_pool_withdraw_authority, false),
2702 AccountMeta::new(token_metadata, false),
2703 AccountMeta::new_readonly(inline_mpl_token_metadata::id(), false),
2704 ];
2705
2706 Instruction {
2707 program_id: *program_id,
2708 accounts,
2709 data: borsh::to_vec(&StakePoolInstruction::UpdateTokenMetadata { name, symbol, uri })
2710 .unwrap(),
2711 }
2712}
2713
2714pub fn create_token_metadata(
2717 program_id: &Pubkey,
2718 stake_pool: &Pubkey,
2719 manager: &Pubkey,
2720 pool_mint: &Pubkey,
2721 payer: &Pubkey,
2722 name: String,
2723 symbol: String,
2724 uri: String,
2725) -> Instruction {
2726 let (stake_pool_withdraw_authority, _) =
2727 find_withdraw_authority_program_address(program_id, stake_pool);
2728 let (token_metadata, _) = find_metadata_account(pool_mint);
2729
2730 let accounts = vec![
2731 AccountMeta::new_readonly(*stake_pool, false),
2732 AccountMeta::new_readonly(*manager, true),
2733 AccountMeta::new_readonly(stake_pool_withdraw_authority, false),
2734 AccountMeta::new_readonly(*pool_mint, false),
2735 AccountMeta::new(*payer, true),
2736 AccountMeta::new(token_metadata, false),
2737 AccountMeta::new_readonly(inline_mpl_token_metadata::id(), false),
2738 AccountMeta::new_readonly(system_program::id(), false),
2739 ];
2740
2741 Instruction {
2742 program_id: *program_id,
2743 accounts,
2744 data: borsh::to_vec(&StakePoolInstruction::CreateTokenMetadata { name, symbol, uri })
2745 .unwrap(),
2746 }
2747}
2748
2749pub fn deposit_wsol_with_session(
2752 program_id: &Pubkey,
2753 stake_pool: &Pubkey,
2754 withdraw_authority: &Pubkey,
2755 reserve_stake: &Pubkey,
2756 session_signer: &Pubkey,
2757 pool_token_account: &Pubkey,
2758 manager_fee_account: &Pubkey,
2759 referrer_pool_account: &Pubkey,
2760 pool_mint: &Pubkey,
2761 token_program_id: &Pubkey,
2762 wsol_token_account: &Pubkey,
2763 transient_wsol_account: &Pubkey,
2764 program_signer: &Pubkey,
2765 payer: &Pubkey,
2766 user_wallet: &Pubkey,
2767 sol_deposit_authority: Option<&Pubkey>,
2768 lamports_in: u64,
2769 minimum_pool_tokens_out: u64,
2770) -> Instruction {
2771 let mut accounts = vec![
2772 AccountMeta::new(*stake_pool, false),
2773 AccountMeta::new_readonly(*withdraw_authority, false),
2774 AccountMeta::new(*reserve_stake, false),
2775 AccountMeta::new_readonly(*session_signer, true),
2776 AccountMeta::new(*pool_token_account, false),
2777 AccountMeta::new(*manager_fee_account, false),
2778 AccountMeta::new(*referrer_pool_account, false),
2779 AccountMeta::new(*pool_mint, false),
2780 AccountMeta::new_readonly(system_program::id(), false),
2781 AccountMeta::new_readonly(*token_program_id, false),
2782 AccountMeta::new_readonly(native_mint::id(), false),
2783 AccountMeta::new(*wsol_token_account, false),
2784 AccountMeta::new(*transient_wsol_account, false),
2785 AccountMeta::new(*program_signer, false),
2786 AccountMeta::new(*payer, true),
2787 AccountMeta::new_readonly(*user_wallet, false),
2788 ];
2789
2790 if let Some(sol_deposit_authority) = sol_deposit_authority {
2791 accounts.push(AccountMeta::new_readonly(*sol_deposit_authority, true));
2792 }
2793
2794 accounts.push(AccountMeta::new_readonly(
2795 spl_associated_token_account::id(),
2796 false,
2797 ));
2798
2799 let data = borsh::to_vec(&StakePoolInstruction::DepositWsolWithSession {
2800 lamports_in,
2801 minimum_pool_tokens_out,
2802 })
2803 .unwrap();
2804
2805 Instruction {
2806 program_id: *program_id,
2807 accounts,
2808 data,
2809 }
2810}
2811
2812pub fn withdraw_wsol_with_session(
2815 program_id: &Pubkey,
2816 stake_pool: &Pubkey,
2817 withdraw_authority: &Pubkey,
2818 session_signer: &Pubkey,
2819 burn_from_pool: &Pubkey,
2820 reserve_stake: &Pubkey,
2821 destination_wsol_account: &Pubkey,
2822 manager_fee_account: &Pubkey,
2823 pool_mint: &Pubkey,
2824 token_program_id: &Pubkey,
2825 program_signer: &Pubkey,
2826 user_wallet: &Pubkey,
2827 sol_withdraw_authority: Option<&Pubkey>,
2828 pool_tokens_in: u64,
2829 minimum_lamports_out: u64,
2830) -> Instruction {
2831 let mut accounts = vec![
2832 AccountMeta::new(*stake_pool, false),
2833 AccountMeta::new_readonly(*withdraw_authority, false),
2834 AccountMeta::new_readonly(*session_signer, true),
2835 AccountMeta::new(*burn_from_pool, false),
2836 AccountMeta::new(*reserve_stake, false),
2837 AccountMeta::new(*destination_wsol_account, false),
2838 AccountMeta::new(*manager_fee_account, false),
2839 AccountMeta::new(*pool_mint, false),
2840 AccountMeta::new_readonly(sysvar::clock::id(), false),
2841 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
2842 AccountMeta::new_readonly(stake::program::id(), false),
2843 AccountMeta::new_readonly(*token_program_id, false),
2844 AccountMeta::new_readonly(native_mint::id(), false),
2845 AccountMeta::new(*program_signer, false),
2846 AccountMeta::new_readonly(*user_wallet, false),
2847 AccountMeta::new_readonly(system_program::id(), false),
2848 ];
2849
2850 if let Some(sol_withdraw_authority) = sol_withdraw_authority {
2851 accounts.push(AccountMeta::new_readonly(*sol_withdraw_authority, true));
2852 }
2853
2854 accounts.push(AccountMeta::new_readonly(
2856 spl_associated_token_account::id(),
2857 false,
2858 ));
2859
2860 let data = borsh::to_vec(&StakePoolInstruction::WithdrawWsolWithSession {
2861 pool_tokens_in,
2862 minimum_lamports_out,
2863 })
2864 .unwrap();
2865
2866 Instruction {
2867 program_id: *program_id,
2868 accounts,
2869 data,
2870 }
2871}
2872
2873pub fn withdraw_stake_with_session(
2875 program_id: &Pubkey,
2876 stake_pool: &Pubkey,
2877 validator_list: &Pubkey,
2878 withdraw_authority: &Pubkey,
2879 stake_to_split: &Pubkey,
2880 stake_to_receive: &Pubkey,
2881 session_signer: &Pubkey,
2882 burn_from_pool: &Pubkey,
2883 manager_fee_account: &Pubkey,
2884 pool_mint: &Pubkey,
2885 token_program_id: &Pubkey,
2886 program_signer: &Pubkey,
2887 reserve_stake: &Pubkey,
2888 pool_tokens_in: u64,
2889 minimum_lamports_out: u64,
2890 user_stake_seed: u64,
2891) -> Instruction {
2892 let accounts = vec![
2893 AccountMeta::new(*stake_pool, false),
2894 AccountMeta::new(*validator_list, false),
2895 AccountMeta::new_readonly(*withdraw_authority, false),
2896 AccountMeta::new(*stake_to_split, false),
2897 AccountMeta::new(*stake_to_receive, false),
2898 AccountMeta::new_readonly(*session_signer, true), AccountMeta::new_readonly(*session_signer, false), AccountMeta::new(*burn_from_pool, false),
2901 AccountMeta::new(*manager_fee_account, false),
2902 AccountMeta::new(*pool_mint, false),
2903 AccountMeta::new_readonly(sysvar::clock::id(), false),
2904 AccountMeta::new_readonly(*token_program_id, false),
2905 AccountMeta::new_readonly(stake::program::id(), false),
2906 AccountMeta::new_readonly(*program_signer, false),
2907 AccountMeta::new_readonly(system_program::id(), false),
2908 AccountMeta::new(*reserve_stake, false),
2909 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
2910 ];
2911
2912 let data = borsh::to_vec(&StakePoolInstruction::WithdrawStakeWithSession {
2913 pool_tokens_in,
2914 minimum_lamports_out,
2915 user_stake_seed,
2916 })
2917 .unwrap();
2918
2919 Instruction {
2920 program_id: *program_id,
2921 accounts,
2922 data,
2923 }
2924}
2925
2926pub fn withdraw_from_stake_account_with_session(
2929 program_id: &Pubkey,
2930 user_stake_account: &Pubkey,
2931 recipient: &Pubkey,
2932 session_signer: &Pubkey,
2933 lamports: u64,
2934 user_stake_seed: u64,
2935) -> Instruction {
2936 let accounts = vec![
2937 AccountMeta::new(*user_stake_account, false),
2938 AccountMeta::new(*recipient, false),
2939 AccountMeta::new_readonly(sysvar::clock::id(), false),
2940 AccountMeta::new_readonly(sysvar::stake_history::id(), false),
2941 AccountMeta::new_readonly(*session_signer, true),
2942 AccountMeta::new_readonly(stake::program::id(), false),
2943 ];
2944
2945 let data = borsh::to_vec(&StakePoolInstruction::WithdrawFromStakeAccountWithSession {
2946 lamports,
2947 user_stake_seed,
2948 })
2949 .unwrap();
2950
2951 Instruction {
2952 program_id: *program_id,
2953 accounts,
2954 data,
2955 }
2956}