@kamino-finance/klend-sdk 5.11.15 → 5.11.17

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.
@@ -16,11 +16,13 @@ import {
16
16
  Chain,
17
17
  DEFAULT_RECENT_SLOT_DURATION_MS,
18
18
  encodeTokenName,
19
+ getMedianSlotDurationInMsFromLastEpochs,
19
20
  initLookupTableIx,
20
21
  KaminoManager,
21
22
  KaminoMarket,
22
23
  KaminoVault,
23
24
  KaminoVaultConfig,
25
+ lamportsToDecimal,
24
26
  LendingMarket,
25
27
  MAINNET_BETA_CHAIN_ID,
26
28
  parseZeroPaddedUtf8,
@@ -84,7 +86,12 @@ async function main() {
84
86
 
85
87
  const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;
86
88
 
87
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
89
+ const kaminoManager = new KaminoManager(
90
+ env.connection,
91
+ DEFAULT_RECENT_SLOT_DURATION_MS,
92
+ env.kLendProgramId,
93
+ env.kVaultProgramId
94
+ );
88
95
 
89
96
  const { market: marketKp, ixns: createMarketIxns } = await kaminoManager.createMarketIxs({
90
97
  admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
@@ -118,7 +125,12 @@ async function main() {
118
125
  }
119
126
 
120
127
  const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;
121
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
128
+ const kaminoManager = new KaminoManager(
129
+ env.connection,
130
+ DEFAULT_RECENT_SLOT_DURATION_MS,
131
+ env.kLendProgramId,
132
+ env.kVaultProgramId
133
+ );
122
134
 
123
135
  const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));
124
136
 
@@ -184,7 +196,12 @@ async function main() {
184
196
  throw new Error('If using multisig mode, multisig is required');
185
197
  }
186
198
 
187
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
199
+ const kaminoManager = new KaminoManager(
200
+ env.connection,
201
+ DEFAULT_RECENT_SLOT_DURATION_MS,
202
+ env.kLendProgramId,
203
+ env.kVaultProgramId
204
+ );
188
205
 
189
206
  const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));
190
207
 
@@ -247,7 +264,12 @@ async function main() {
247
264
  }
248
265
 
249
266
  const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;
250
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
267
+ const kaminoManager = new KaminoManager(
268
+ env.connection,
269
+ DEFAULT_RECENT_SLOT_DURATION_MS,
270
+ env.kLendProgramId,
271
+ env.kVaultProgramId
272
+ );
251
273
 
252
274
  const tokenProgramID = await getAccountOwner(env.connection, tokenMint);
253
275
  const kaminoVaultConfig = new KaminoVaultConfig({
@@ -293,7 +315,12 @@ async function main() {
293
315
  throw new Error('If using multisig mode, multisig is required');
294
316
  }
295
317
 
296
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
318
+ const kaminoManager = new KaminoManager(
319
+ env.connection,
320
+ DEFAULT_RECENT_SLOT_DURATION_MS,
321
+ env.kLendProgramId,
322
+ env.kVaultProgramId
323
+ );
297
324
 
298
325
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
299
326
  const instructions = await kaminoManager.updateVaultConfigIxs(kaminoVault, new PendingVaultAdmin(), newAdmin);
@@ -329,7 +356,12 @@ async function main() {
329
356
  throw new Error('If using multisig mode, multisig is required');
330
357
  }
331
358
 
332
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
359
+ const kaminoManager = new KaminoManager(
360
+ env.connection,
361
+ DEFAULT_RECENT_SLOT_DURATION_MS,
362
+ env.kLendProgramId,
363
+ env.kVaultProgramId
364
+ );
333
365
 
334
366
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
335
367
  const instructions = await kaminoManager.updateVaultConfigIxs(kaminoVault, field, value);
@@ -364,7 +396,12 @@ async function main() {
364
396
  throw new Error('If using multisig mode, multisig is required');
365
397
  }
366
398
 
367
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
399
+ const kaminoManager = new KaminoManager(
400
+ env.connection,
401
+ DEFAULT_RECENT_SLOT_DURATION_MS,
402
+ env.kLendProgramId,
403
+ env.kVaultProgramId
404
+ );
368
405
 
369
406
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
370
407
  const instructions = await kaminoManager.updateVaultConfigIxs(kaminoVault, new ManagementFeeBps(), feeBps);
@@ -401,7 +438,12 @@ async function main() {
401
438
  throw new Error('If using multisig mode, multisig is required');
402
439
  }
403
440
 
404
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
441
+ const kaminoManager = new KaminoManager(
442
+ env.connection,
443
+ DEFAULT_RECENT_SLOT_DURATION_MS,
444
+ env.kLendProgramId,
445
+ env.kVaultProgramId
446
+ );
405
447
 
406
448
  const instructions = await kaminoManager.insertIntoLUTIxs(env.payer.publicKey, lutAddress, addressesArr);
407
449
 
@@ -435,7 +477,12 @@ async function main() {
435
477
  throw new Error('If using multisig mode, multisig is required');
436
478
  }
437
479
 
438
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
480
+ const kaminoManager = new KaminoManager(
481
+ env.connection,
482
+ DEFAULT_RECENT_SLOT_DURATION_MS,
483
+ env.kLendProgramId,
484
+ env.kVaultProgramId
485
+ );
439
486
 
440
487
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
441
488
  const syncLUTIxs = await kaminoManager.syncVaultLUTIxs(kaminoVault);
@@ -471,7 +518,12 @@ async function main() {
471
518
  throw new Error('If using multisig mode, multisig is required');
472
519
  }
473
520
 
474
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
521
+ const kaminoManager = new KaminoManager(
522
+ env.connection,
523
+ DEFAULT_RECENT_SLOT_DURATION_MS,
524
+ env.kLendProgramId,
525
+ env.kVaultProgramId
526
+ );
475
527
 
476
528
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
477
529
  const instructions = await kaminoManager.updateVaultConfigIxs(kaminoVault, new PerformanceFeeBps(), feeBps);
@@ -505,7 +557,12 @@ async function main() {
505
557
  throw new Error('If using multisig mode, multisig is required');
506
558
  }
507
559
 
508
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
560
+ const kaminoManager = new KaminoManager(
561
+ env.connection,
562
+ DEFAULT_RECENT_SLOT_DURATION_MS,
563
+ env.kLendProgramId,
564
+ env.kVaultProgramId
565
+ );
509
566
 
510
567
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
511
568
  const instructions = await kaminoManager.acceptVaultOwnershipIxs(kaminoVault);
@@ -540,7 +597,12 @@ async function main() {
540
597
  throw new Error('If using multisig mode, multisig is required');
541
598
  }
542
599
 
543
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
600
+ const kaminoManager = new KaminoManager(
601
+ env.connection,
602
+ DEFAULT_RECENT_SLOT_DURATION_MS,
603
+ env.kLendProgramId,
604
+ env.kVaultProgramId
605
+ );
544
606
 
545
607
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
546
608
  const instruction = await kaminoManager.giveUpPendingFeesIx(kaminoVault, new Decimal(maxAmountToGiveUp));
@@ -567,7 +629,12 @@ async function main() {
567
629
  throw new Error('If using multisig mode, multisig is required');
568
630
  }
569
631
 
570
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
632
+ const kaminoManager = new KaminoManager(
633
+ env.connection,
634
+ DEFAULT_RECENT_SLOT_DURATION_MS,
635
+ env.kLendProgramId,
636
+ env.kVaultProgramId
637
+ );
571
638
 
572
639
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
573
640
  const instructions = await kaminoManager.withdrawPendingFeesIxs(
@@ -595,10 +662,12 @@ async function main() {
595
662
 
596
663
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
597
664
 
598
- const stakeIxs = await new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId).stakeSharesIxs(
599
- env.payer.publicKey,
600
- kaminoVault
601
- );
665
+ const stakeIxs = await new KaminoManager(
666
+ env.connection,
667
+ DEFAULT_RECENT_SLOT_DURATION_MS,
668
+ env.kLendProgramId,
669
+ env.kVaultProgramId
670
+ ).stakeSharesIxs(env.payer.publicKey, kaminoVault);
602
671
 
603
672
  if (mode === 'multisig' && !multisig) {
604
673
  throw new Error('If using multisig mode, multisig is required');
@@ -631,7 +700,12 @@ async function main() {
631
700
  throw new Error('If using multisig mode, multisig is required');
632
701
  }
633
702
 
634
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
703
+ const kaminoManager = new KaminoManager(
704
+ env.connection,
705
+ DEFAULT_RECENT_SLOT_DURATION_MS,
706
+ env.kLendProgramId,
707
+ env.kVaultProgramId
708
+ );
635
709
  const reserveState = await Reserve.fetch(env.connection, reserveAddress, env.kLendProgramId);
636
710
  if (!reserveState) {
637
711
  throw new Error('Reserve not found');
@@ -682,7 +756,12 @@ async function main() {
682
756
  throw new Error('If using multisig mode, multisig is required');
683
757
  }
684
758
 
685
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
759
+ const kaminoManager = new KaminoManager(
760
+ env.connection,
761
+ DEFAULT_RECENT_SLOT_DURATION_MS,
762
+ env.kLendProgramId,
763
+ env.kVaultProgramId
764
+ );
686
765
 
687
766
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
688
767
  const depositInstructions = await kaminoManager.depositToVaultIxs(env.payer.publicKey, kaminoVault, amount);
@@ -711,7 +790,12 @@ async function main() {
711
790
  throw new Error('If using multisig mode, multisig is required');
712
791
  }
713
792
 
714
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
793
+ const kaminoManager = new KaminoManager(
794
+ env.connection,
795
+ DEFAULT_RECENT_SLOT_DURATION_MS,
796
+ env.kLendProgramId,
797
+ env.kVaultProgramId
798
+ );
715
799
 
716
800
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
717
801
  const withdrawIxs = await kaminoManager.withdrawFromVaultIxs(
@@ -721,7 +805,7 @@ async function main() {
721
805
  await env.connection.getSlot('confirmed')
722
806
  );
723
807
 
724
- const depositSig = await processTxn(
808
+ const withdrawSig = await processTxn(
725
809
  env.client,
726
810
  env.payer,
727
811
  [...withdrawIxs.unstakeFromFarmIfNeededIxs, ...withdrawIxs.withdrawIxs],
@@ -731,7 +815,7 @@ async function main() {
731
815
  800_000
732
816
  );
733
817
 
734
- mode === 'execute' && console.log('User withdraw:', depositSig);
818
+ mode === 'execute' && console.log('User withdraw:', withdrawSig);
735
819
  });
736
820
 
737
821
  commands
@@ -751,7 +835,12 @@ async function main() {
751
835
  throw new Error('If using multisig mode, multisig is required');
752
836
  }
753
837
 
754
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
838
+ const kaminoManager = new KaminoManager(
839
+ env.connection,
840
+ DEFAULT_RECENT_SLOT_DURATION_MS,
841
+ env.kLendProgramId,
842
+ env.kVaultProgramId
843
+ );
755
844
 
756
845
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
757
846
  const instructions = await kaminoManager.investAllReservesIxs(env.payer.publicKey, kaminoVault);
@@ -783,7 +872,12 @@ async function main() {
783
872
  throw new Error('If using multisig mode, multisig is required');
784
873
  }
785
874
 
786
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
875
+ const kaminoManager = new KaminoManager(
876
+ env.connection,
877
+ DEFAULT_RECENT_SLOT_DURATION_MS,
878
+ env.kLendProgramId,
879
+ env.kVaultProgramId
880
+ );
787
881
 
788
882
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
789
883
  const reserveState = await Reserve.fetch(env.connection, new PublicKey(reserve), env.kLendProgramId);
@@ -828,8 +922,9 @@ async function main() {
828
922
  .requiredOption('--vault <string>', 'Vault address')
829
923
  .action(async ({ vault }) => {
830
924
  const env = initializeClient(false, false);
925
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
831
926
 
832
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
927
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
833
928
 
834
929
  const vaultAddress = new PublicKey(vault);
835
930
  const vaultState = await new KaminoVault(vaultAddress, undefined, env.kVaultProgramId).getState(env.connection);
@@ -850,8 +945,9 @@ async function main() {
850
945
  .requiredOption('--vault <string>', 'Vault address')
851
946
  .action(async ({ vault }) => {
852
947
  const env = initializeClient(false, false);
948
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
853
949
 
854
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
950
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
855
951
 
856
952
  const vaultAddress = new PublicKey(vault);
857
953
  const vaultState = await new KaminoVault(vaultAddress, undefined, env.kVaultProgramId).getState(env.connection);
@@ -869,8 +965,9 @@ async function main() {
869
965
  .requiredOption('--vault <string>', 'Vault address')
870
966
  .action(async ({ vault }) => {
871
967
  const env = initializeClient(false, false);
968
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
872
969
 
873
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
970
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
874
971
 
875
972
  const vaultAddress = new PublicKey(vault);
876
973
  const vaultState = await new KaminoVault(vaultAddress, undefined, env.kVaultProgramId).getState(env.connection);
@@ -888,8 +985,9 @@ async function main() {
888
985
  .requiredOption('--wallet <string>', 'User wailt address')
889
986
  .action(async ({ vault, wallet }) => {
890
987
  const env = initializeClient(false, false);
988
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
891
989
 
892
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
990
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
893
991
 
894
992
  const vaultAddress = new PublicKey(vault);
895
993
  const walletAddress = new PublicKey(wallet);
@@ -903,8 +1001,9 @@ async function main() {
903
1001
  .requiredOption('--wallet <string>', 'User wailt address')
904
1002
  .action(async ({ wallet }) => {
905
1003
  const env = initializeClient(false, false);
1004
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
906
1005
 
907
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1006
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
908
1007
 
909
1008
  const walletAddress = new PublicKey(wallet);
910
1009
  const userShares = await kaminoManager.getUserSharesBalanceAllVaults(walletAddress);
@@ -918,8 +1017,9 @@ async function main() {
918
1017
  .requiredOption('--vault <string>', 'Vault address')
919
1018
  .action(async ({ vault }) => {
920
1019
  const env = initializeClient(false, false);
1020
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
921
1021
 
922
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1022
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
923
1023
 
924
1024
  const vaultAddress = new PublicKey(vault);
925
1025
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
@@ -935,8 +1035,9 @@ async function main() {
935
1035
  .requiredOption('--vault <string>', 'Vault address')
936
1036
  .action(async ({ vault }) => {
937
1037
  const env = initializeClient(false, false);
1038
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
938
1039
 
939
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1040
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
940
1041
 
941
1042
  const vaultAddress = new PublicKey(vault);
942
1043
  const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
@@ -948,11 +1049,13 @@ async function main() {
948
1049
 
949
1050
  const vaultState = kaminoVault.state!;
950
1051
 
951
- const sharesIssued = new Decimal(vaultState.sharesIssued.toString()!).div(
952
- new Decimal(vaultState.sharesMintDecimals.toString())
1052
+ const sharesIssued = lamportsToDecimal(
1053
+ vaultState.sharesIssued.toString(),
1054
+ vaultState.sharesMintDecimals.toString()
953
1055
  );
954
1056
 
955
1057
  console.log('farm', vaultState.vaultFarm.toString());
1058
+ console.log('vault token mint', vaultState.tokenMint.toBase58());
956
1059
  console.log('Name: ', kaminoManager.getDecodedVaultName(kaminoVault.state!));
957
1060
  console.log('Shares issued: ', sharesIssued);
958
1061
  printHoldings(holdings);
@@ -961,7 +1064,12 @@ async function main() {
961
1064
 
962
1065
  commands.command('get-oracle-mappings').action(async () => {
963
1066
  const env = initializeClient(false, false);
964
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1067
+ const kaminoManager = new KaminoManager(
1068
+ env.connection,
1069
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1070
+ env.kLendProgramId,
1071
+ env.kVaultProgramId
1072
+ );
965
1073
 
966
1074
  console.log('Getting oracle mappings');
967
1075
  const oracleConfigs = await kaminoManager.getScopeOracleConfigs();
@@ -970,15 +1078,21 @@ async function main() {
970
1078
 
971
1079
  commands.command('get-all-vaults').action(async () => {
972
1080
  const env = initializeClient(false, false);
973
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1081
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
974
1082
 
1083
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
975
1084
  const allVaults = await kaminoManager.getAllVaults();
976
1085
  console.log('all vaults', allVaults);
977
1086
  });
978
1087
 
979
1088
  commands.command('get-all-vaults-pks').action(async () => {
980
1089
  const env = initializeClient(false, false);
981
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1090
+ const kaminoManager = new KaminoManager(
1091
+ env.connection,
1092
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1093
+ env.kLendProgramId,
1094
+ env.kVaultProgramId
1095
+ );
982
1096
 
983
1097
  const allVaults = await kaminoManager.getAllVaults();
984
1098
  console.log(
@@ -994,8 +1108,9 @@ async function main() {
994
1108
  const env = initializeClient(false, false);
995
1109
 
996
1110
  const vaultAddress = new PublicKey(vault);
1111
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
997
1112
 
998
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1113
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
999
1114
  const vaultState = await new KaminoVault(vaultAddress, undefined, env.kVaultProgramId).getState(env.connection);
1000
1115
 
1001
1116
  const simulatedHoldings = await kaminoManager.calculateSimulatedHoldingsWithInterest(vaultState);
@@ -1036,8 +1151,9 @@ async function main() {
1036
1151
  const env = initializeClient(false, false);
1037
1152
 
1038
1153
  const vaultAddress = new PublicKey(vault);
1154
+ const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
1039
1155
 
1040
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1156
+ const kaminoManager = new KaminoManager(env.connection, slotDuration, env.kLendProgramId, env.kVaultProgramId);
1041
1157
  const vaultState = await new KaminoVault(vaultAddress, undefined, env.kVaultProgramId).getState(env.connection);
1042
1158
 
1043
1159
  const computedAllocation = await kaminoManager.getVaultComputedReservesAllocation(vaultState);
@@ -1117,7 +1233,12 @@ async function main() {
1117
1233
  throw new Error('If using multisig mode, multisig is required');
1118
1234
  }
1119
1235
 
1120
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1236
+ const kaminoManager = new KaminoManager(
1237
+ env.connection,
1238
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1239
+ env.kLendProgramId,
1240
+ env.kVaultProgramId
1241
+ );
1121
1242
 
1122
1243
  const newLendingMarket = LendingMarket.fromJSON(JSON.parse(fs.readFileSync(lendingMarketConfigPath, 'utf8')));
1123
1244
 
@@ -1157,7 +1278,12 @@ async function main() {
1157
1278
  throw new Error('If using multisig mode, multisig is required');
1158
1279
  }
1159
1280
 
1160
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1281
+ const kaminoManager = new KaminoManager(
1282
+ env.connection,
1283
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1284
+ env.kLendProgramId,
1285
+ env.kVaultProgramId
1286
+ );
1161
1287
 
1162
1288
  const ixn = kaminoManager.updateLendingMarketOwnerIxs(marketWithAddress);
1163
1289
 
@@ -1195,7 +1321,12 @@ async function main() {
1195
1321
  throw new Error('If using multisig mode, multisig is required');
1196
1322
  }
1197
1323
 
1198
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1324
+ const kaminoManager = new KaminoManager(
1325
+ env.connection,
1326
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1327
+ env.kLendProgramId,
1328
+ env.kVaultProgramId
1329
+ );
1199
1330
 
1200
1331
  const currentName = parseZeroPaddedUtf8(lendingMarketState.name);
1201
1332
  const newNameEncoded = encodeTokenName(newName);
@@ -1251,7 +1382,12 @@ async function main() {
1251
1382
  throw new Error('If using multisig mode, multisig is required');
1252
1383
  }
1253
1384
 
1254
- const kaminoManager = new KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
1385
+ const kaminoManager = new KaminoManager(
1386
+ env.connection,
1387
+ DEFAULT_RECENT_SLOT_DURATION_MS,
1388
+ env.kLendProgramId,
1389
+ env.kVaultProgramId
1390
+ );
1255
1391
 
1256
1392
  const newReserveConfigFields: ReserveConfigFields = {
1257
1393
  ...reserveState.config,
package/src/utils/ata.ts CHANGED
@@ -1,11 +1,22 @@
1
1
  import {
2
2
  ASSOCIATED_TOKEN_PROGRAM_ID,
3
+ NATIVE_MINT,
3
4
  TOKEN_PROGRAM_ID,
5
+ createAssociatedTokenAccountInstruction,
4
6
  createAssociatedTokenAccountIdempotentInstruction as createAtaIx,
7
+ createCloseAccountInstruction,
8
+ getAssociatedTokenAddressSync,
5
9
  } from '@solana/spl-token';
6
- import { ComputeBudgetProgram, Connection, PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
10
+ import {
11
+ AccountInfo,
12
+ ComputeBudgetProgram,
13
+ Connection,
14
+ PublicKey,
15
+ SystemProgram,
16
+ TransactionInstruction,
17
+ } from '@solana/web3.js';
7
18
  import Decimal from 'decimal.js';
8
- import { AnchorProvider } from '@coral-xyz/anchor';
19
+ import { collToLamportsDecimal, DECIMALS_SOL } from '@kamino-finance/kliquidity-sdk/dist';
9
20
 
10
21
  /**
11
22
  * Create an idempotent create ATA instruction
@@ -144,8 +155,8 @@ export function removeBudgetAndAtaIxns(ixns: TransactionInstruction[], mints: st
144
155
  });
145
156
  }
146
157
 
147
- export async function getTokenAccountBalance(provider: AnchorProvider, tokenAccount: PublicKey): Promise<number> {
148
- const tokenAccountBalance = await provider.connection.getTokenAccountBalance(tokenAccount);
158
+ export async function getTokenAccountBalance(connection: Connection, tokenAccount: PublicKey): Promise<number> {
159
+ const tokenAccountBalance = await connection.getTokenAccountBalance(tokenAccount);
149
160
 
150
161
  return Number(tokenAccountBalance.value.amount).valueOf();
151
162
  }
@@ -165,3 +176,90 @@ export async function getTokenAccountBalanceDecimal(
165
176
  const { value } = await connection.getTokenAccountBalance(ata);
166
177
  return new Decimal(value.uiAmountString!);
167
178
  }
179
+
180
+ export type CreateWsolAtaIxs = {
181
+ wsolAta: PublicKey;
182
+ createAtaIxs: TransactionInstruction[];
183
+ closeAtaIxs: TransactionInstruction[];
184
+ };
185
+
186
+ /**
187
+ * Creates a wSOL ata if missing and syncs the balance. If the ata exists and it has more or equal no wrapping happens
188
+ * @param connection - Solana RPC connection (read)
189
+ * @param amount min amount to have in the wSOL ata. If the ata exists and it has more or equal no wrapping happens
190
+ * @param owner - owner of the ata
191
+ * @returns wsolAta: the keypair of the ata, used to sign the initialization transaction; createAtaIxs: a list with ixs to initialize the ata and wrap SOL if needed; closeAtaIxs: a list with ixs to close the ata
192
+ */
193
+ export const createWsolAtaIfMissing = async (
194
+ connection: Connection,
195
+ amount: Decimal,
196
+ owner: PublicKey
197
+ ): Promise<CreateWsolAtaIxs> => {
198
+ const createIxns: TransactionInstruction[] = [];
199
+ const closeIxns: TransactionInstruction[] = [];
200
+
201
+ const wsolAta: PublicKey = getAssociatedTokenAddressSync(NATIVE_MINT, owner, true, TOKEN_PROGRAM_ID);
202
+
203
+ const solDeposit = amount;
204
+ const wsolAtaAccountInfo: AccountInfo<Buffer> | null = await connection.getAccountInfo(wsolAta);
205
+
206
+ // This checks if we need to create it
207
+ if (isWsolInfoInvalid(wsolAtaAccountInfo)) {
208
+ createIxns.push(createAssociatedTokenAccountInstruction(owner, wsolAta, owner, NATIVE_MINT, TOKEN_PROGRAM_ID));
209
+ }
210
+
211
+ let wsolExistingBalanceLamports = new Decimal(0);
212
+ try {
213
+ if (wsolAtaAccountInfo != null) {
214
+ const uiAmount = (await getTokenAccountBalanceDecimal(connection, NATIVE_MINT, owner)).toNumber();
215
+ wsolExistingBalanceLamports = collToLamportsDecimal(new Decimal(uiAmount), DECIMALS_SOL);
216
+ }
217
+ } catch (err) {
218
+ console.log('Err Token Balance', err);
219
+ }
220
+
221
+ if (solDeposit !== null && solDeposit.gt(wsolExistingBalanceLamports)) {
222
+ createIxns.push(
223
+ SystemProgram.transfer({
224
+ fromPubkey: owner,
225
+ toPubkey: wsolAta,
226
+ lamports: BigInt(solDeposit.sub(wsolExistingBalanceLamports).floor().toString()),
227
+ })
228
+ );
229
+ }
230
+
231
+ if (createIxns.length > 0) {
232
+ // Primitive way of wrapping SOL
233
+ createIxns.push(
234
+ new TransactionInstruction({
235
+ keys: [
236
+ {
237
+ pubkey: wsolAta,
238
+ isSigner: false,
239
+ isWritable: true,
240
+ },
241
+ ],
242
+ data: Buffer.from(new Uint8Array([17])),
243
+ programId: TOKEN_PROGRAM_ID,
244
+ })
245
+ );
246
+ }
247
+
248
+ closeIxns.push(createCloseAccountInstruction(wsolAta, owner, owner, [], TOKEN_PROGRAM_ID));
249
+
250
+ return {
251
+ wsolAta,
252
+ createAtaIxs: createIxns,
253
+ closeAtaIxs: closeIxns,
254
+ };
255
+ };
256
+
257
+ export const isWsolInfoInvalid = (wsolAtaAccountInfo: any): boolean => {
258
+ const res =
259
+ wsolAtaAccountInfo === null ||
260
+ (wsolAtaAccountInfo !== null &&
261
+ wsolAtaAccountInfo.data.length === 0 &&
262
+ wsolAtaAccountInfo.owner.eq(PublicKey.default));
263
+
264
+ return res;
265
+ };
@@ -92,3 +92,5 @@ export const SOL_PADDING_FOR_INTEREST = new BN('1000000');
92
92
  */
93
93
  export const MIN_INITIAL_DEPOSIT = 100_000;
94
94
  export const MIN_VAULT_INITIAL_DEPOSIT = 1_000_000_000;
95
+
96
+ export const VAULT_INITIAL_DEPOSIT = 1000;