@kamino-finance/klend-sdk 5.10.10 → 5.10.11
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/README.md +26 -2
- package/dist/classes/manager.d.ts +9 -3
- package/dist/classes/manager.d.ts.map +1 -1
- package/dist/classes/manager.js +10 -2
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/market.d.ts.map +1 -1
- package/dist/classes/market.js +4 -1
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/types.d.ts +7 -0
- package/dist/classes/types.d.ts.map +1 -1
- package/dist/classes/vault.d.ts +23 -11
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +141 -28
- package/dist/classes/vault.js.map +1 -1
- package/dist/client_kamino_manager.d.ts.map +1 -1
- package/dist/client_kamino_manager.js +5 -5
- package/dist/client_kamino_manager.js.map +1 -1
- package/dist/utils/accountListing.d.ts +4 -0
- package/dist/utils/accountListing.d.ts.map +1 -0
- package/dist/utils/accountListing.js +37 -0
- package/dist/utils/accountListing.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +2 -1
- package/src/classes/manager.ts +12 -2
- package/src/classes/market.ts +7 -1
- package/src/classes/types.ts +9 -1
- package/src/classes/vault.ts +182 -31
- package/src/client.ts +11 -0
- package/src/client_kamino_manager.ts +12 -5
- package/src/utils/accountListing.ts +32 -0
- package/src/utils/index.ts +1 -0
package/dist/classes/vault.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { VaultConfigFieldKind } from '../idl_codegen_kamino_vault/types';
|
|
|
4
4
|
import { VaultState } from '../idl_codegen_kamino_vault/accounts';
|
|
5
5
|
import Decimal from 'decimal.js';
|
|
6
6
|
import { ReserveWithAddress } from './reserve';
|
|
7
|
-
import { AcceptVaultOwnershipIxs, DepositIxs, InitVaultIxs, SyncVaultLUTIxs, UpdateReserveAllocationIxs, UpdateVaultConfigIxs, UserSharesForVault, WithdrawIxs } from './types';
|
|
7
|
+
import { AcceptVaultOwnershipIxs, DepositIxs, InitVaultIxs, ReserveAllocationOverview, SyncVaultLUTIxs, UpdateReserveAllocationIxs, UpdateVaultConfigIxs, UserSharesForVault, WithdrawIxs } from './types';
|
|
8
8
|
import { FarmState } from '@kamino-finance/farms-sdk/dist';
|
|
9
9
|
export declare const kaminoVaultId: PublicKey;
|
|
10
10
|
export declare const kaminoVaultStagingId: PublicKey;
|
|
@@ -48,9 +48,10 @@ export declare class KaminoVaultClient {
|
|
|
48
48
|
* @param vault the vault to update
|
|
49
49
|
* @param mode the field to update (based on VaultConfigFieldKind enum)
|
|
50
50
|
* @param value the value to update the field with
|
|
51
|
+
* @param [signer] the signer of the transaction. Optional. If not provided the admin of the vault will be used. It should be used when changing the admin of the vault if we want to batch multiple ixs in the same tx
|
|
51
52
|
* @returns a struct that contains the instruction to update the field and an optional list of instructions to update the lookup table
|
|
52
53
|
*/
|
|
53
|
-
updateVaultConfigIxs(vault: KaminoVault, mode: VaultConfigFieldKind, value: string): Promise<UpdateVaultConfigIxs>;
|
|
54
|
+
updateVaultConfigIxs(vault: KaminoVault, mode: VaultConfigFieldKind, value: string, signer?: PublicKey): Promise<UpdateVaultConfigIxs>;
|
|
54
55
|
/** Sets the farm where the shares can be staked. This is store in vault state and a vault can only have one farm, so the new farm will ovveride the old farm
|
|
55
56
|
* @param vault - vault to set the farm for
|
|
56
57
|
* @param farm - the farm where the vault shares can be staked
|
|
@@ -109,7 +110,7 @@ export declare class KaminoVaultClient {
|
|
|
109
110
|
* This function will return a struct with the instructions to unstake from the farm if necessary and the instructions for the missing ATA creation instructions, as well as one or multiple withdraw instructions, based on how many reserves it's needed to withdraw from. This might have to be split in multiple transactions
|
|
110
111
|
* @param user - user to withdraw
|
|
111
112
|
* @param vault - vault to withdraw from
|
|
112
|
-
* @param shareAmount - share amount to withdraw, in order to withdraw everything, any value > user share amount
|
|
113
|
+
* @param shareAmount - share amount to withdraw (in tokens, not lamports), in order to withdraw everything, any value > user share amount
|
|
113
114
|
* @param slot - current slot, used to estimate the interest earned in the different reserves with allocation from the vault
|
|
114
115
|
* @param [vaultReservesMap] - optional parameter; a hashmap from each reserve pubkey to the reserve state. If provided the function will be significantly faster as it will not have to fetch the reserves
|
|
115
116
|
* @param [farmState] - the state of the vault farm, if the vault has a farm. Optional. If not provided, it will be fetched
|
|
@@ -133,7 +134,7 @@ export declare class KaminoVaultClient {
|
|
|
133
134
|
* @param [vaultReservesMap] - optional parameter; a hashmap from each reserve pubkey to the reserve state. If provided the function will be significantly faster as it will not have to fetch the reserves
|
|
134
135
|
* @returns - an array of invest instructions for each invest action required for the vault reserves
|
|
135
136
|
*/
|
|
136
|
-
investSingleReserveIxs(payer: PublicKey, vault: KaminoVault, reserve: ReserveWithAddress, vaultReservesMap?: PubkeyHashMap<PublicKey, KaminoReserve
|
|
137
|
+
investSingleReserveIxs(payer: PublicKey, vault: KaminoVault, reserve: ReserveWithAddress, vaultReservesMap?: PubkeyHashMap<PublicKey, KaminoReserve>, createAtaIfNeeded?: boolean): Promise<TransactionInstruction[]>;
|
|
137
138
|
/** Convert a string to a u8 representation to be stored on chain */
|
|
138
139
|
encodeVaultName(token: string): Uint8Array;
|
|
139
140
|
/**Convert an u8 array to a string */
|
|
@@ -159,6 +160,11 @@ export declare class KaminoVaultClient {
|
|
|
159
160
|
* @returns - an array of instructions to insert the missing keys into the lookup table
|
|
160
161
|
*/
|
|
161
162
|
insertIntoLookupTableIxs(payer: PublicKey, lookupTable: PublicKey, keys: PublicKey[], accountsInLUT?: PublicKey[]): Promise<TransactionInstruction[]>;
|
|
163
|
+
/** Read the total holdings of a vault and the reserve weights and returns a map from each reserve to how many tokens should be deposited.
|
|
164
|
+
* @param vaultState - the vault state to calculate the allocation for
|
|
165
|
+
* @returns - a map from each reserve to how many tokens should be invested into
|
|
166
|
+
*/
|
|
167
|
+
getVaultComputedReservesAllocation(vaultState: VaultState): Promise<PubkeyHashMap<PublicKey, Decimal>>;
|
|
162
168
|
/**
|
|
163
169
|
* This method returns the user shares balance for a given vault
|
|
164
170
|
* @param user - user to calculate the shares balance for
|
|
@@ -211,9 +217,15 @@ export declare class KaminoVaultClient {
|
|
|
211
217
|
/**
|
|
212
218
|
* This will return the a map between reserve pubkey and the pct of the vault invested amount in each reserve
|
|
213
219
|
* @param vaultState - the kamino vault to get reserves distribution for
|
|
214
|
-
* @returns a
|
|
220
|
+
* @returns a map between reserve pubkey and the allocation pct for the reserve
|
|
215
221
|
*/
|
|
216
222
|
getAllocationsDistribuionPct(vaultState: VaultState): PubkeyHashMap<PublicKey, Decimal>;
|
|
223
|
+
/**
|
|
224
|
+
* This will return the a map between reserve pubkey and the allocation overview for the reserve
|
|
225
|
+
* @param vaultState - the kamino vault to get reserves allocation overview for
|
|
226
|
+
* @returns a map between reserve pubkey and the allocation overview for the reserve
|
|
227
|
+
*/
|
|
228
|
+
getVaultAllocations(vaultState: VaultState): PubkeyHashMap<PublicKey, ReserveAllocationOverview>;
|
|
217
229
|
/**
|
|
218
230
|
* This will return an unsorted hash map of all reserves that the given vault has allocations for, toghether with the amount that can be withdrawn from each of the reserves
|
|
219
231
|
* @param vault - the kamino vault to get available liquidity to withdraw for
|
|
@@ -344,18 +356,18 @@ export declare class KaminoVaultConfig {
|
|
|
344
356
|
readonly tokenMint: PublicKey;
|
|
345
357
|
/** The token mint program id */
|
|
346
358
|
readonly tokenMintProgramId: PublicKey;
|
|
347
|
-
/** The performance fee rate of the vault, expressed as a decimal */
|
|
348
|
-
readonly
|
|
349
|
-
/** The management fee rate of the vault, expressed as a decimal */
|
|
350
|
-
readonly
|
|
359
|
+
/** The performance fee rate of the vault, as percents, expressed as a decimal */
|
|
360
|
+
readonly performanceFeeRatePercentage: Decimal;
|
|
361
|
+
/** The management fee rate of the vault, as percents, expressed as a decimal */
|
|
362
|
+
readonly managementFeeRatePercentage: Decimal;
|
|
351
363
|
/** The name to be stored on cain for the vault (max 40 characters). */
|
|
352
364
|
readonly name: string;
|
|
353
365
|
constructor(args: {
|
|
354
366
|
admin: PublicKey;
|
|
355
367
|
tokenMint: PublicKey;
|
|
356
368
|
tokenMintProgramId: PublicKey;
|
|
357
|
-
|
|
358
|
-
|
|
369
|
+
performanceFeeRatePercentage: Decimal;
|
|
370
|
+
managementFeeRatePercentage: Decimal;
|
|
359
371
|
name: string;
|
|
360
372
|
});
|
|
361
373
|
getPerformanceFeeBps(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/classes/vault.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,UAAU,EAEV,OAAO,EACP,SAAS,EAIT,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,YAAY,EACZ,aAAa,EAEb,aAAa,EACb,OAAO,EAGR,MAAM,QAAQ,CAAC;AA2BhB,OAAO,EAAoB,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,OAAO,MAAM,YAAY,CAAC;AAWjC,OAAO,EAAmC,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAKhF,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAW3D,eAAO,MAAM,aAAa,WAA+D,CAAC;AAC1F,eAAO,MAAM,oBAAoB,WAA+D,CAAC;AAOjG;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAY;IACjD,oBAAoB,EAAE,MAAM,CAAC;gBAG3B,UAAU,EAAE,UAAU,EACtB,oBAAoB,CAAC,EAAE,SAAS,EAChC,mBAAmB,CAAC,EAAE,SAAS,EAC/B,oBAAoB,CAAC,EAAE,MAAM;IAQ/B,aAAa;IAIb,YAAY;IAIZ,OAAO;IAIP;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU;IAwBhE;;;;OAIG;IACG,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,CAAC;IAoG7G;;;;;OAKG;IACG,0BAA0B,CAC9B,KAAK,EAAE,WAAW,EAClB,uBAAuB,EAAE,uBAAuB,GAC/C,OAAO,CAAC,0BAA0B,CAAC;IAwDtC
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/classes/vault.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,UAAU,EAEV,OAAO,EACP,SAAS,EAIT,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,YAAY,EACZ,aAAa,EAEb,aAAa,EACb,OAAO,EAGR,MAAM,QAAQ,CAAC;AA2BhB,OAAO,EAAoB,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,OAAO,MAAM,YAAY,CAAC;AAWjC,OAAO,EAAmC,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAKhF,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,YAAY,EACZ,yBAAyB,EACzB,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAW3D,eAAO,MAAM,aAAa,WAA+D,CAAC;AAC1F,eAAO,MAAM,oBAAoB,WAA+D,CAAC;AAOjG;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAY;IACjD,oBAAoB,EAAE,MAAM,CAAC;gBAG3B,UAAU,EAAE,UAAU,EACtB,oBAAoB,CAAC,EAAE,SAAS,EAChC,mBAAmB,CAAC,EAAE,SAAS,EAC/B,oBAAoB,CAAC,EAAE,MAAM;IAQ/B,aAAa;IAIb,YAAY;IAIZ,OAAO;IAIP;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU;IAwBhE;;;;OAIG;IACG,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,CAAC;IAoG7G;;;;;OAKG;IACG,0BAA0B,CAC9B,KAAK,EAAE,WAAW,EAClB,uBAAuB,EAAE,uBAAuB,GAC/C,OAAO,CAAC,0BAA0B,CAAC;IAwDtC;;;;;;;OAOG;IACG,oBAAoB,CACxB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAmGhC;;;;OAIG;IACG,YAAY,CAChB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,SAAS,EACf,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAQhC;;;;;;OAMG;IACH,OAAO,CAAC,gCAAgC;IAwCxC;;;;OAIG;IACG,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA6CnF;;;;;OAKG;IACG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoB1G;;;;;;OAMG;IACG,sBAAsB,CAC1B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,sBAAsB,EAAE,CAAC;IA4EpC;;;;;;;;OAQG;IACG,UAAU,CACd,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,OAAO,EACpB,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,UAAU,CAAC;IAwFtB;;;;;;;OAOG;IACG,cAAc,CAClB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,OAAO,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiBpC;;;;;;;;;OASG;IACG,WAAW,CACf,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,WAAW,CAAC;YA6CT,yBAAyB;YA6BzB,wBAAwB;IAqGtC;;;;;OAKG;IACG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAuFnG;;;;;;;OAOG;IACG,sBAAsB,CAC1B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,kBAAkB,EAC3B,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,iBAAiB,GAAE,OAAc,GAChC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IA6DpC,oEAAoE;IACpE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAO1C,qCAAqC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAIxC,OAAO,CAAC,WAAW;YAsEL,wBAAwB;YA6BxB,sBAAsB;IAwDpC;;;;;;OAMG;IACG,uBAAuB,CAC3B,KAAK,EAAE,WAAW,EAClB,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,eAAe,CAAC;IAkF3B,OAAO,CAAC,+BAA+B;IAavC;;;;;;;OAOG;IACG,wBAAwB,CAC5B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,IAAI,EAAE,SAAS,EAAE,EACjB,aAAa,CAAC,EAAE,SAAS,EAAE,GAC1B,OAAO,CAAC,sBAAsB,EAAE,CAAC;IA6BpC;;;OAGG;IACG,kCAAkC,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAuC5G;;;;;OAKG;IACG,+BAA+B,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiCvG;;;;;OAKG;IACG,6BAA6B,CACjC,IAAI,EAAE,SAAS,EACf,cAAc,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,GAClC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IA+DxD;;;;OAIG;IACH,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY;IAOrD;;;;;;OAMG;IACG,4BAA4B,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,CAAC,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,OAAO,CAAC;IAkBnB;;;;;;OAMG;IACG,0BAA0B,CAC9B,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EACnC,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAW7C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAqC5C;;;;;;OAMG;IACH,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO;IA2B3F;;;;OAIG;IACH,4BAA4B,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC;IAqBvF;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAmBhG;;;;;;OAMG;YACW,gDAAgD;IAuC9D;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE;IAQnD;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE;IAMhD;;;;OAIG;IACG,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAsCjG;;;;;;;OAOG;IACG,mBAAmB,CACvB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,aAAa,CAAC,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IA2DpD;;;;;;OAMG;IACG,gBAAgB,CACpB,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACtD,OAAO,CAAC,aAAa,CAAC;IAgDzB;;;;;;;;OAQG;IACG,yBAAyB,CAC7B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,yBAAyB,CAAC;IAgBrC;;;;;;;;OAQG;IACG,gBAAgB,CACpB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,aAAa,CAAC,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,aAAa,CAAC;IAoDzB;;;;;;OAMG;IACG,2BAA2B,CAC/B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,oCAAoC,CAAC;IA6ChD;;;;;;OAMG;IACG,uBAAuB,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACtD,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IA6BrD;;;;;;OAMG;IACG,sBAAsB,CAC1B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,GACzD,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;;OAIG;IACG,0BAA0B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1E;;;;;;;OAOG;IACG,sCAAsC,CAC1C,UAAU,EAAE,UAAU,EACtB,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,EAC1D,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,OAAO,GACzB,OAAO,CAAC,wCAAwC,CAAC;IAwBpD;;;;;;OAMG;IACG,sBAAsB,CAC1B,UAAU,EAAE,UAAU,EACtB,oCAAoC,CAAC,EAAE,wCAAwC,EAC/E,gBAAgB,CAAC,EAAE,IAAI,GACtB,OAAO,CAAC,SAAS,CAAC;CA4BtB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;gBAET,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,SAAS,GAAE,SAAyB;IAMvF,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAarD,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAQxD,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CAIxD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,gCAAgC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,CAAC;IACvC,iFAAiF;IACjF,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE;QAChB,KAAK,EAAE,SAAS,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,kBAAkB,EAAE,SAAS,CAAC;QAC9B,4BAA4B,EAAE,OAAO,CAAC;QACtC,2BAA2B,EAAE,OAAO,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC;KACd;IASD,oBAAoB,IAAI,MAAM;IAI9B,mBAAmB,IAAI,MAAM;CAG9B;AAED,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;gBAE3B,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO;IAMtG,wBAAwB,IAAI,OAAO;IAInC,eAAe,IAAI,OAAO;IAI1B,iBAAiB,IAAI,SAAS;CAG/B;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,aAKpH;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,SAAS,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,wCAAwC,GAAG;IACrD,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzD,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,yBAAyB,CAAC;IACvC,gBAAgB,EAAE,aAAa,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC5D,gBAAgB,EAAE,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC3D,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC"}
|
package/dist/classes/vault.js
CHANGED
|
@@ -129,7 +129,7 @@ class KaminoVaultClient {
|
|
|
129
129
|
];
|
|
130
130
|
const insertIntoLUTIxs = await this.insertIntoLookupTableIxs(vaultConfig.admin, lut, accountsToBeInserted, []);
|
|
131
131
|
const setLUTIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.publicKey, new types_1.VaultConfigField.LookupTable(), lut.toString());
|
|
132
|
-
const ixns = [createVaultIx, initVaultIx,
|
|
132
|
+
const ixns = [createVaultIx, initVaultIx, setLUTIx];
|
|
133
133
|
if (vaultConfig.getPerformanceFeeBps() > 0) {
|
|
134
134
|
const setPerformanceFeeIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.publicKey, new types_1.VaultConfigField.PerformanceFeeBps(), vaultConfig.getPerformanceFeeBps().toString());
|
|
135
135
|
ixns.push(setPerformanceFeeIx);
|
|
@@ -142,7 +142,7 @@ class KaminoVaultClient {
|
|
|
142
142
|
const setNameIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.publicKey, new types_1.VaultConfigField.Name(), vaultConfig.name);
|
|
143
143
|
ixns.push(setNameIx);
|
|
144
144
|
}
|
|
145
|
-
return { vault: vaultState, initVaultIxs: { initVaultIxs: ixns, populateLUTIxs: insertIntoLUTIxs } };
|
|
145
|
+
return { vault: vaultState, initVaultIxs: { initVaultIxs: ixns, createLUTIx, populateLUTIxs: insertIntoLUTIxs } };
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
148
148
|
* This method updates the vault reserve allocation cofnig for an exiting vault reserve, or adds a new reserve to the vault if it does not exist.
|
|
@@ -163,7 +163,7 @@ class KaminoVaultClient {
|
|
|
163
163
|
ctokenVault: cTokenVault,
|
|
164
164
|
systemProgram: web3_js_1.SystemProgram.programId,
|
|
165
165
|
rent: web3_js_1.SYSVAR_RENT_PUBKEY,
|
|
166
|
-
reserveCollateralTokenProgram: vaultState.tokenProgram
|
|
166
|
+
reserveCollateralTokenProgram: vaultState.tokenProgram,
|
|
167
167
|
};
|
|
168
168
|
const updateReserveAllocationArgs = {
|
|
169
169
|
weight: new anchor_1.BN(reserveAllocationConfig.targetAllocationWeight),
|
|
@@ -189,15 +189,19 @@ class KaminoVaultClient {
|
|
|
189
189
|
* @param vault the vault to update
|
|
190
190
|
* @param mode the field to update (based on VaultConfigFieldKind enum)
|
|
191
191
|
* @param value the value to update the field with
|
|
192
|
+
* @param [signer] the signer of the transaction. Optional. If not provided the admin of the vault will be used. It should be used when changing the admin of the vault if we want to batch multiple ixs in the same tx
|
|
192
193
|
* @returns a struct that contains the instruction to update the field and an optional list of instructions to update the lookup table
|
|
193
194
|
*/
|
|
194
|
-
async updateVaultConfigIxs(vault, mode, value) {
|
|
195
|
+
async updateVaultConfigIxs(vault, mode, value, signer) {
|
|
195
196
|
const vaultState = await vault.getState(this.getConnection());
|
|
196
197
|
const updateVaultConfigAccs = {
|
|
197
198
|
adminAuthority: vaultState.adminAuthority,
|
|
198
199
|
vaultState: vault.address,
|
|
199
200
|
klendProgram: this._kaminoLendProgramId,
|
|
200
201
|
};
|
|
202
|
+
if (signer) {
|
|
203
|
+
updateVaultConfigAccs.adminAuthority = signer;
|
|
204
|
+
}
|
|
201
205
|
const updateVaultConfigArgs = {
|
|
202
206
|
entry: mode,
|
|
203
207
|
data: Buffer.from([0]),
|
|
@@ -324,14 +328,14 @@ class KaminoVaultClient {
|
|
|
324
328
|
const accountsInExistentLUT = (await (0, lut_utils_1.getAccountsInLUT)(this.getConnection(), vaultState.vaultLookupTable)).filter((account) => !account.equals(vaultState.adminAuthority));
|
|
325
329
|
const LUTIxs = [];
|
|
326
330
|
const [initNewLUTIx, newLUT] = (0, lut_utils_1.initLookupTableIx)(vaultState.pendingAdmin, await this.getConnection().getSlot());
|
|
327
|
-
|
|
328
|
-
const insertIntoLUTIxs = await this.insertIntoLookupTableIxs(vaultState.pendingAdmin, newLUT, accountsInExistentLUT);
|
|
331
|
+
const insertIntoLUTIxs = await this.insertIntoLookupTableIxs(vaultState.pendingAdmin, newLUT, accountsInExistentLUT, []);
|
|
329
332
|
LUTIxs.push(...insertIntoLUTIxs);
|
|
330
|
-
const updateVaultConfigIxs = await this.updateVaultConfigIxs(vault, new types_1.VaultConfigField.LookupTable(), newLUT.toString());
|
|
333
|
+
const updateVaultConfigIxs = await this.updateVaultConfigIxs(vault, new types_1.VaultConfigField.LookupTable(), newLUT.toString(), vaultState.pendingAdmin);
|
|
331
334
|
LUTIxs.push(updateVaultConfigIxs.updateVaultConfigIx);
|
|
332
335
|
LUTIxs.push(...updateVaultConfigIxs.updateLUTIxs);
|
|
333
336
|
const acceptVaultOwnershipIxs = {
|
|
334
337
|
acceptVaultOwnershipIx,
|
|
338
|
+
initNewLUTIx,
|
|
335
339
|
updateLUTIxs: LUTIxs,
|
|
336
340
|
};
|
|
337
341
|
return acceptVaultOwnershipIxs;
|
|
@@ -516,7 +520,7 @@ class KaminoVaultClient {
|
|
|
516
520
|
* This function will return a struct with the instructions to unstake from the farm if necessary and the instructions for the missing ATA creation instructions, as well as one or multiple withdraw instructions, based on how many reserves it's needed to withdraw from. This might have to be split in multiple transactions
|
|
517
521
|
* @param user - user to withdraw
|
|
518
522
|
* @param vault - vault to withdraw from
|
|
519
|
-
* @param shareAmount - share amount to withdraw, in order to withdraw everything, any value > user share amount
|
|
523
|
+
* @param shareAmount - share amount to withdraw (in tokens, not lamports), in order to withdraw everything, any value > user share amount
|
|
520
524
|
* @param slot - current slot, used to estimate the interest earned in the different reserves with allocation from the vault
|
|
521
525
|
* @param [vaultReservesMap] - optional parameter; a hashmap from each reserve pubkey to the reserve state. If provided the function will be significantly faster as it will not have to fetch the reserves
|
|
522
526
|
* @param [farmState] - the state of the vault farm, if the vault has a farm. Optional. If not provided, it will be fetched
|
|
@@ -537,7 +541,7 @@ class KaminoVaultClient {
|
|
|
537
541
|
withdrawIxs.unstakeFromFarmIfNeededIxs.push(unstakeAndWithdrawFromFarmIxs.withdrawIx);
|
|
538
542
|
}
|
|
539
543
|
// if the vault has allocations withdraw otherwise wtihdraw from available ix
|
|
540
|
-
const vaultAllocation = vaultState.vaultAllocationStrategy.find((allocation) => allocation.reserve.equals(web3_js_1.PublicKey.default));
|
|
544
|
+
const vaultAllocation = vaultState.vaultAllocationStrategy.find((allocation) => !allocation.reserve.equals(web3_js_1.PublicKey.default));
|
|
541
545
|
if (vaultAllocation) {
|
|
542
546
|
const withdrawFromVaultIxs = await this.wihdrdrawWithReserveIxns(user, kaminoVault, shareAmount, slot, vaultReservesMap);
|
|
543
547
|
withdrawIxs.withdrawIxs = withdrawFromVaultIxs;
|
|
@@ -629,7 +633,6 @@ class KaminoVaultClient {
|
|
|
629
633
|
}
|
|
630
634
|
return withdrawIxns;
|
|
631
635
|
}
|
|
632
|
-
// todo: make sure we also check the ata of the investor for the vault token exists
|
|
633
636
|
/**
|
|
634
637
|
* This will trigger invest by balancing, based on weights, the reserve allocations of the vault. It can either withdraw or deposit into reserves to balance them. This is a function that should be cranked
|
|
635
638
|
* @param payer wallet that pays the tx
|
|
@@ -637,19 +640,62 @@ class KaminoVaultClient {
|
|
|
637
640
|
* @returns - an array of invest instructions for each invest action required for the vault reserves
|
|
638
641
|
*/
|
|
639
642
|
async investAllReservesIxs(payer, vault) {
|
|
640
|
-
//TODO: Order invest ixns by - invest that removes first, then invest that adds
|
|
641
643
|
const vaultState = await vault.getState(this.getConnection());
|
|
642
|
-
const
|
|
644
|
+
const allReserves = this.getAllVaultReserves(vaultState);
|
|
645
|
+
if (allReserves.length === 0) {
|
|
646
|
+
throw new Error('No reserves found for the vault, please select at least one reserve for the vault');
|
|
647
|
+
}
|
|
648
|
+
const [allReservesStateMap, computedReservesAllocation] = await Promise.all([
|
|
649
|
+
this.loadVaultReserves(vaultState),
|
|
650
|
+
this.getVaultComputedReservesAllocation(vaultState),
|
|
651
|
+
]);
|
|
652
|
+
const tokenProgram = await (0, rpc_1.getAccountOwner)(this.getConnection(), vaultState.tokenMint);
|
|
653
|
+
const [{ ata: _payerTokenAta, createAtaIx }] = (0, utils_2.createAtasIdempotent)(payer, [
|
|
654
|
+
{ mint: vaultState.tokenMint, tokenProgram },
|
|
655
|
+
]);
|
|
656
|
+
// compute total vault holdings and expected distribution based on weights
|
|
657
|
+
const curentVaultAllocations = this.getVaultAllocations(vaultState);
|
|
658
|
+
const reservesToDisinvestFrom = [];
|
|
659
|
+
for (let index = 0; index < allReserves.length; index++) {
|
|
660
|
+
const reservePubkey = allReserves[index];
|
|
661
|
+
const reserveState = allReservesStateMap.get(reservePubkey);
|
|
662
|
+
const computedAllocation = computedReservesAllocation.get(reservePubkey);
|
|
663
|
+
const currentCTokenAllocation = curentVaultAllocations.get(reservePubkey).ctokenAllocation;
|
|
664
|
+
const reserveCollExchangeRate = reserveState.getCollateralExchangeRate();
|
|
665
|
+
const reserveAllocationLiquidityAmount = (0, lib_1.lamportsToDecimal)(currentCTokenAllocation.div(reserveCollExchangeRate), vaultState.tokenMintDecimals.toNumber());
|
|
666
|
+
if (computedAllocation.lt(reserveAllocationLiquidityAmount)) {
|
|
667
|
+
reservesToDisinvestFrom.push(reservePubkey);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
643
670
|
const investIxnsPromises = [];
|
|
644
|
-
|
|
645
|
-
|
|
671
|
+
// invest first the reserves from which we disinvest, then the other ones
|
|
672
|
+
for (const reserve of reservesToDisinvestFrom) {
|
|
673
|
+
const reserveState = allReservesStateMap.get(reserve);
|
|
646
674
|
if (reserveState === null) {
|
|
647
675
|
throw new Error(`Reserve ${reserve.toBase58()} not found`);
|
|
648
676
|
}
|
|
649
|
-
const investIxsPromise = this.investSingleReserveIxs(payer, vault, {
|
|
677
|
+
const investIxsPromise = this.investSingleReserveIxs(payer, vault, {
|
|
678
|
+
address: reserve,
|
|
679
|
+
state: reserveState.state,
|
|
680
|
+
}, allReservesStateMap, false);
|
|
650
681
|
investIxnsPromises.push(investIxsPromise);
|
|
651
682
|
}
|
|
652
|
-
const
|
|
683
|
+
for (const reserve of allReserves) {
|
|
684
|
+
if (!reservesToDisinvestFrom.includes(reserve)) {
|
|
685
|
+
const reserveState = allReservesStateMap.get(reserve);
|
|
686
|
+
if (reserveState === null) {
|
|
687
|
+
throw new Error(`Reserve ${reserve.toBase58()} not found`);
|
|
688
|
+
}
|
|
689
|
+
const investIxsPromise = this.investSingleReserveIxs(payer, vault, {
|
|
690
|
+
address: reserve,
|
|
691
|
+
state: reserveState.state,
|
|
692
|
+
}, allReservesStateMap, false);
|
|
693
|
+
investIxnsPromises.push(investIxsPromise);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
let investIxns = [];
|
|
697
|
+
investIxns.push(createAtaIx);
|
|
698
|
+
investIxns = await Promise.all(investIxnsPromises).then((ixns) => ixns.flat());
|
|
653
699
|
return investIxns;
|
|
654
700
|
}
|
|
655
701
|
// todo: make sure we also check the ata of the investor for the vault token exists
|
|
@@ -661,14 +707,19 @@ class KaminoVaultClient {
|
|
|
661
707
|
* @param [vaultReservesMap] - optional parameter; a hashmap from each reserve pubkey to the reserve state. If provided the function will be significantly faster as it will not have to fetch the reserves
|
|
662
708
|
* @returns - an array of invest instructions for each invest action required for the vault reserves
|
|
663
709
|
*/
|
|
664
|
-
async investSingleReserveIxs(payer, vault, reserve, vaultReservesMap) {
|
|
710
|
+
async investSingleReserveIxs(payer, vault, reserve, vaultReservesMap, createAtaIfNeeded = true) {
|
|
711
|
+
console.log('create invest ix for reserve', reserve.address.toBase58());
|
|
665
712
|
const vaultState = await vault.getState(this.getConnection());
|
|
666
713
|
const cTokenVault = getCTokenVaultPda(vault.address, reserve.address, this._kaminoVaultProgramId);
|
|
667
714
|
const lendingMarketAuth = (0, utils_2.lendingMarketAuthPda)(reserve.state.lendingMarket, this._kaminoLendProgramId)[0];
|
|
715
|
+
const ixs = [];
|
|
668
716
|
const tokenProgram = await (0, rpc_1.getAccountOwner)(this.getConnection(), vaultState.tokenMint);
|
|
669
717
|
const [{ ata: payerTokenAta, createAtaIx }] = (0, utils_2.createAtasIdempotent)(payer, [
|
|
670
718
|
{ mint: vaultState.tokenMint, tokenProgram },
|
|
671
719
|
]);
|
|
720
|
+
if (createAtaIfNeeded) {
|
|
721
|
+
ixs.push(createAtaIx);
|
|
722
|
+
}
|
|
672
723
|
const investAccounts = {
|
|
673
724
|
payer,
|
|
674
725
|
vaultState: vault.address,
|
|
@@ -948,6 +999,45 @@ class KaminoVaultClient {
|
|
|
948
999
|
}
|
|
949
1000
|
return ixns;
|
|
950
1001
|
}
|
|
1002
|
+
/** Read the total holdings of a vault and the reserve weights and returns a map from each reserve to how many tokens should be deposited.
|
|
1003
|
+
* @param vaultState - the vault state to calculate the allocation for
|
|
1004
|
+
* @returns - a map from each reserve to how many tokens should be invested into
|
|
1005
|
+
*/
|
|
1006
|
+
async getVaultComputedReservesAllocation(vaultState) {
|
|
1007
|
+
const holdings = await this.getVaultHoldings(vaultState);
|
|
1008
|
+
const initialVaultAllocations = this.getVaultAllocations(vaultState);
|
|
1009
|
+
const allReserves = this.getAllVaultReserves(vaultState);
|
|
1010
|
+
let totalAllocation = new decimal_js_1.default(0);
|
|
1011
|
+
initialVaultAllocations.forEach((allocation) => {
|
|
1012
|
+
totalAllocation = totalAllocation.add(allocation.targetWeight);
|
|
1013
|
+
});
|
|
1014
|
+
const expectedHoldingsDistribution = new lib_1.PubkeyHashMap();
|
|
1015
|
+
let totalLeftToInvest = holdings.total;
|
|
1016
|
+
let currentAllocationSum = totalAllocation;
|
|
1017
|
+
const ZERO = new decimal_js_1.default(0);
|
|
1018
|
+
while (totalLeftToInvest.gt(ZERO)) {
|
|
1019
|
+
const totalLeftover = totalLeftToInvest;
|
|
1020
|
+
for (const reserve of allReserves) {
|
|
1021
|
+
const reserveWithWeight = initialVaultAllocations.get(reserve);
|
|
1022
|
+
const targetAllocation = reserveWithWeight.targetWeight.mul(totalLeftover).div(currentAllocationSum);
|
|
1023
|
+
const reserveCap = reserveWithWeight.tokenAllocationCap;
|
|
1024
|
+
// todo: check if both target and reserveCap
|
|
1025
|
+
const amountToInvest = decimal_js_1.default.min(targetAllocation, reserveCap, totalLeftToInvest);
|
|
1026
|
+
totalLeftToInvest = totalLeftToInvest.sub(amountToInvest);
|
|
1027
|
+
if (amountToInvest.eq(reserveCap)) {
|
|
1028
|
+
currentAllocationSum = currentAllocationSum.sub(reserveWithWeight.targetWeight);
|
|
1029
|
+
}
|
|
1030
|
+
const reserveHasPreallocation = expectedHoldingsDistribution.has(reserve);
|
|
1031
|
+
if (reserveHasPreallocation) {
|
|
1032
|
+
expectedHoldingsDistribution.set(reserve, expectedHoldingsDistribution.get(reserve).add(amountToInvest));
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
expectedHoldingsDistribution.set(reserve, amountToInvest);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
return expectedHoldingsDistribution;
|
|
1040
|
+
}
|
|
951
1041
|
/**
|
|
952
1042
|
* This method returns the user shares balance for a given vault
|
|
953
1043
|
* @param user - user to calculate the shares balance for
|
|
@@ -1133,13 +1223,12 @@ class KaminoVaultClient {
|
|
|
1133
1223
|
/**
|
|
1134
1224
|
* This will return the a map between reserve pubkey and the pct of the vault invested amount in each reserve
|
|
1135
1225
|
* @param vaultState - the kamino vault to get reserves distribution for
|
|
1136
|
-
* @returns a
|
|
1226
|
+
* @returns a map between reserve pubkey and the allocation pct for the reserve
|
|
1137
1227
|
*/
|
|
1138
1228
|
getAllocationsDistribuionPct(vaultState) {
|
|
1139
1229
|
const allocationsDistributionPct = new lib_1.PubkeyHashMap();
|
|
1140
1230
|
let totalAllocation = new decimal_js_1.default(0);
|
|
1141
1231
|
const filteredAllocations = vaultState.vaultAllocationStrategy.filter((allocation) => !allocation.reserve.equals(web3_js_1.PublicKey.default));
|
|
1142
|
-
console.log('filteredAllocations length', filteredAllocations.length);
|
|
1143
1232
|
filteredAllocations.forEach((allocation) => {
|
|
1144
1233
|
totalAllocation = totalAllocation.add(new decimal_js_1.default(allocation.targetAllocationWeight.toString()));
|
|
1145
1234
|
});
|
|
@@ -1148,6 +1237,26 @@ class KaminoVaultClient {
|
|
|
1148
1237
|
});
|
|
1149
1238
|
return allocationsDistributionPct;
|
|
1150
1239
|
}
|
|
1240
|
+
/**
|
|
1241
|
+
* This will return the a map between reserve pubkey and the allocation overview for the reserve
|
|
1242
|
+
* @param vaultState - the kamino vault to get reserves allocation overview for
|
|
1243
|
+
* @returns a map between reserve pubkey and the allocation overview for the reserve
|
|
1244
|
+
*/
|
|
1245
|
+
getVaultAllocations(vaultState) {
|
|
1246
|
+
const vaultAllocations = new lib_1.PubkeyHashMap();
|
|
1247
|
+
vaultState.vaultAllocationStrategy.map((allocation) => {
|
|
1248
|
+
if (allocation.reserve.equals(web3_js_1.PublicKey.default)) {
|
|
1249
|
+
return;
|
|
1250
|
+
}
|
|
1251
|
+
const allocationOverview = {
|
|
1252
|
+
targetWeight: new decimal_js_1.default(allocation.targetAllocationWeight.toString()),
|
|
1253
|
+
tokenAllocationCap: new decimal_js_1.default(allocation.tokenAllocationCap.toString()),
|
|
1254
|
+
ctokenAllocation: new decimal_js_1.default(allocation.ctokenAllocation.toString()),
|
|
1255
|
+
};
|
|
1256
|
+
vaultAllocations.set(allocation.reserve, allocationOverview);
|
|
1257
|
+
});
|
|
1258
|
+
return vaultAllocations;
|
|
1259
|
+
}
|
|
1151
1260
|
/**
|
|
1152
1261
|
* This will return an unsorted hash map of all reserves that the given vault has allocations for, toghether with the amount that can be withdrawn from each of the reserves
|
|
1153
1262
|
* @param vault - the kamino vault to get available liquidity to withdraw for
|
|
@@ -1188,7 +1297,11 @@ class KaminoVaultClient {
|
|
|
1188
1297
|
* @returns a hashmap from each reserve pubkey to the reserve state
|
|
1189
1298
|
*/
|
|
1190
1299
|
getAllVaultReserves(vault) {
|
|
1191
|
-
return vault.vaultAllocationStrategy
|
|
1300
|
+
return vault.vaultAllocationStrategy
|
|
1301
|
+
.map((vaultAllocation) => vaultAllocation.reserve)
|
|
1302
|
+
.filter((reserve) => {
|
|
1303
|
+
return !reserve.equals(web3_js_1.PublicKey.default);
|
|
1304
|
+
});
|
|
1192
1305
|
}
|
|
1193
1306
|
/**
|
|
1194
1307
|
* This will get the list of all reserve pubkeys that the vault has allocations for ex
|
|
@@ -1594,25 +1707,25 @@ class KaminoVaultConfig {
|
|
|
1594
1707
|
tokenMint;
|
|
1595
1708
|
/** The token mint program id */
|
|
1596
1709
|
tokenMintProgramId;
|
|
1597
|
-
/** The performance fee rate of the vault, expressed as a decimal */
|
|
1598
|
-
|
|
1599
|
-
/** The management fee rate of the vault, expressed as a decimal */
|
|
1600
|
-
|
|
1710
|
+
/** The performance fee rate of the vault, as percents, expressed as a decimal */
|
|
1711
|
+
performanceFeeRatePercentage;
|
|
1712
|
+
/** The management fee rate of the vault, as percents, expressed as a decimal */
|
|
1713
|
+
managementFeeRatePercentage;
|
|
1601
1714
|
/** The name to be stored on cain for the vault (max 40 characters). */
|
|
1602
1715
|
name;
|
|
1603
1716
|
constructor(args) {
|
|
1604
1717
|
this.admin = args.admin;
|
|
1605
1718
|
this.tokenMint = args.tokenMint;
|
|
1606
|
-
this.
|
|
1607
|
-
this.
|
|
1719
|
+
this.performanceFeeRatePercentage = args.performanceFeeRatePercentage;
|
|
1720
|
+
this.managementFeeRatePercentage = args.managementFeeRatePercentage;
|
|
1608
1721
|
this.tokenMintProgramId = args.tokenMintProgramId;
|
|
1609
1722
|
this.name = args.name;
|
|
1610
1723
|
}
|
|
1611
1724
|
getPerformanceFeeBps() {
|
|
1612
|
-
return this.
|
|
1725
|
+
return this.performanceFeeRatePercentage.mul(100).toNumber();
|
|
1613
1726
|
}
|
|
1614
1727
|
getManagementFeeBps() {
|
|
1615
|
-
return this.
|
|
1728
|
+
return this.managementFeeRatePercentage.mul(100).toNumber();
|
|
1616
1729
|
}
|
|
1617
1730
|
}
|
|
1618
1731
|
exports.KaminoVaultConfig = KaminoVaultConfig;
|