@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.
- package/dist/classes/manager.d.ts +1 -1
- package/dist/classes/manager.d.ts.map +1 -1
- package/dist/classes/manager.js +3 -3
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/market.d.ts.map +1 -1
- package/dist/classes/market.js +3 -0
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/types.d.ts +2 -0
- package/dist/classes/types.d.ts.map +1 -1
- package/dist/classes/vault.d.ts +1 -1
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +25 -6
- package/dist/classes/vault.js.map +1 -1
- package/dist/client_kamino_manager.d.ts.map +1 -1
- package/dist/client_kamino_manager.js +49 -38
- package/dist/client_kamino_manager.js.map +1 -1
- package/dist/utils/ata.d.ts +15 -2
- package/dist/utils/ata.d.ts.map +1 -1
- package/dist/utils/ata.js +68 -3
- package/dist/utils/ata.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +2 -1
- package/dist/utils/constants.js.map +1 -1
- package/package.json +1 -1
- package/src/classes/manager.ts +5 -6
- package/src/classes/market.ts +4 -0
- package/src/classes/types.ts +3 -0
- package/src/classes/vault.ts +45 -13
- package/src/client_kamino_manager.ts +178 -42
- package/src/utils/ata.ts +102 -4
- package/src/utils/constants.ts +2 -0
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
599
|
-
env.
|
|
600
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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:',
|
|
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(
|
|
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(
|
|
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 =
|
|
952
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 {
|
|
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 {
|
|
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(
|
|
148
|
-
const tokenAccountBalance = await
|
|
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
|
+
};
|