@kamino-finance/klend-sdk 7.0.1 → 7.0.3
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/action.d.ts.map +1 -1
- package/dist/classes/action.js +5 -4
- package/dist/classes/action.js.map +1 -1
- package/dist/classes/market.d.ts +9 -7
- package/dist/classes/market.d.ts.map +1 -1
- package/dist/classes/market.js +49 -16
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/reserve.d.ts +2 -2
- package/dist/classes/reserve.d.ts.map +1 -1
- package/dist/classes/reserve.js +2 -2
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/vault.d.ts +5 -3
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +6 -4
- package/dist/classes/vault.js.map +1 -1
- package/dist/leverage/operations.d.ts.map +1 -1
- package/dist/leverage/operations.js +4 -1
- package/dist/leverage/operations.js.map +1 -1
- package/dist/utils/oracle.d.ts +1 -1
- package/dist/utils/oracle.d.ts.map +1 -1
- package/dist/utils/oracle.js +2 -2
- package/dist/utils/oracle.js.map +1 -1
- package/package.json +2 -2
- package/src/classes/action.ts +5 -9
- package/src/classes/market.ts +91 -21
- package/src/classes/reserve.ts +4 -2
- package/src/classes/vault.ts +15 -4
- package/src/leverage/operations.ts +4 -1
- package/src/utils/oracle.ts +3 -2
package/dist/utils/oracle.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export type ScopePriceRefreshConfig = {
|
|
|
23
23
|
scopeConfigurations: [Address, Configuration][];
|
|
24
24
|
};
|
|
25
25
|
export declare function getTokenOracleDataSync(allOracleAccounts: AllOracleAccounts, reserves: Reserve[]): [Reserve, TokenOracleData | undefined][];
|
|
26
|
-
export declare function getTokenOracleData(rpc: Rpc<GetMultipleAccountsApi>, reserves: Reserve[]): Promise<Array<[Reserve, TokenOracleData | undefined]>>;
|
|
26
|
+
export declare function getTokenOracleData(rpc: Rpc<GetMultipleAccountsApi>, reserves: Reserve[], oracleAccounts?: AllOracleAccounts): Promise<Array<[Reserve, TokenOracleData | undefined]>>;
|
|
27
27
|
export type AllOracleAccounts = Map<Address, Account<Base64EncodedDataResponse>>;
|
|
28
28
|
export declare function getAllOracleAccounts(rpc: Rpc<GetMultipleAccountsApi>, reserves: Reserve[]): Promise<AllOracleAccounts>;
|
|
29
29
|
export type PythPrices = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/utils/oracle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qEAAqE,CAAC;AAGnG,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAQjC,OAAO,EAAE,aAAa,EAAE,MAAM,sEAAsE,CAAC;AAGrG,eAAO,MAAM,yBAAyB,EAAE,OAA0B,CAAC;AAGnE,eAAO,MAAM,iBAAiB,EAAE,OAA2D,CAAC;AAM5F,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;CACjD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,4CAyD/F;AAGD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,CAAC,sBAAsB,CAAC,EAChC,QAAQ,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/utils/oracle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qEAAqE,CAAC;AAGnG,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAQjC,OAAO,EAAE,aAAa,EAAE,MAAM,sEAAsE,CAAC;AAGrG,eAAO,MAAM,yBAAyB,EAAE,OAA0B,CAAC;AAGnE,eAAO,MAAM,iBAAiB,EAAE,OAA2D,CAAC;AAM5F,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;CACjD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,4CAyD/F;AAGD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,CAAC,sBAAsB,CAAC,EAChC,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,CAAC,EAAE,iBAAiB,GACjC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAGxD;AAED,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAEjF,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,GAAG,CAAC,sBAAsB,CAAC,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,iBAAiB,CAAC,CA4B5B;AAMD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,EAC/B,cAAc,EAAE,iBAAiB,GAChC,UAAU,GAAG,IAAI,CAwCnB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,gBAAgB,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9C,cAAc,EAAE,iBAAiB,GAChC,cAAc,GAAG,IAAI,CA4BvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,MAAM,EAAE,GACd,cAAc,GAAG,IAAI,CAsBvB"}
|
package/dist/utils/oracle.js
CHANGED
|
@@ -77,8 +77,8 @@ function getTokenOracleDataSync(allOracleAccounts, reserves) {
|
|
|
77
77
|
return tokenOracleDataForReserves;
|
|
78
78
|
}
|
|
79
79
|
// TODO: Add freshness of the latest price to match sc logic
|
|
80
|
-
async function getTokenOracleData(rpc, reserves) {
|
|
81
|
-
const allOracleAccounts = await getAllOracleAccounts(rpc, reserves);
|
|
80
|
+
async function getTokenOracleData(rpc, reserves, oracleAccounts) {
|
|
81
|
+
const allOracleAccounts = oracleAccounts ?? (await getAllOracleAccounts(rpc, reserves));
|
|
82
82
|
return getTokenOracleDataSync(allOracleAccounts, reserves);
|
|
83
83
|
}
|
|
84
84
|
async function getAllOracleAccounts(rpc, reserves) {
|
package/dist/utils/oracle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/utils/oracle.ts"],"names":[],"mappings":";;;;;;AA6CA,wDAyDC;AAGD,
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/utils/oracle.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kamino-finance/klend-sdk",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.3",
|
|
4
4
|
"description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@coral-xyz/borsh": "^0.28.0",
|
|
65
65
|
"@kamino-finance/farms-sdk": "^3.1.0",
|
|
66
66
|
"@kamino-finance/kliquidity-sdk": "^8.4.0",
|
|
67
|
-
"@kamino-finance/scope-sdk": "^10.0.
|
|
67
|
+
"@kamino-finance/scope-sdk": "^10.0.4",
|
|
68
68
|
"@solana-program/address-lookup-table": "^0.7.0",
|
|
69
69
|
"@solana-program/system": "^0.7.0",
|
|
70
70
|
"@solana-program/token": "^0.5.1",
|
package/src/classes/action.ts
CHANGED
|
@@ -429,15 +429,11 @@ export class KaminoAction {
|
|
|
429
429
|
}
|
|
430
430
|
|
|
431
431
|
async addScopeRefreshIxs(scope: Scope, tokens: number[], scopeConfig: Address) {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
},
|
|
438
|
-
tokens
|
|
439
|
-
)
|
|
440
|
-
);
|
|
432
|
+
const refreshIx = await scope.refreshPriceListIx({ config: scopeConfig }, tokens);
|
|
433
|
+
if (refreshIx) {
|
|
434
|
+
this.setupIxsLabels.unshift(`refreshScopePrices`);
|
|
435
|
+
this.setupIxs.unshift(refreshIx);
|
|
436
|
+
}
|
|
441
437
|
}
|
|
442
438
|
|
|
443
439
|
static async buildBorrowTxns(
|
package/src/classes/market.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { KaminoObligation } from './obligation';
|
|
|
20
20
|
import { KaminoReserve, KaminoReserveRpcApi } from './reserve';
|
|
21
21
|
import { LendingMarket, Obligation, ReferrerTokenState, Reserve, UserMetadata } from '../@codegen/klend/accounts';
|
|
22
22
|
import {
|
|
23
|
+
AllOracleAccounts,
|
|
23
24
|
cacheOrGetPythPrices,
|
|
24
25
|
cacheOrGetScopePrice,
|
|
25
26
|
cacheOrGetSwitchboardPrice,
|
|
@@ -48,7 +49,7 @@ import { PROGRAM_ID } from '../@codegen/klend/programId';
|
|
|
48
49
|
import { Scope, U16_MAX } from '@kamino-finance/scope-sdk';
|
|
49
50
|
import { OraclePrices } from '@kamino-finance/scope-sdk/dist/@codegen/scope/accounts/OraclePrices';
|
|
50
51
|
import { Fraction } from './fraction';
|
|
51
|
-
import { chunks, KaminoPrices, MintToPriceMap } from '@kamino-finance/kliquidity-sdk';
|
|
52
|
+
import { batchFetch, chunks, KaminoPrices, MintToPriceMap } from '@kamino-finance/kliquidity-sdk';
|
|
52
53
|
import { parseTokenSymbol, parseZeroPaddedUtf8 } from './utils';
|
|
53
54
|
import { ObligationZP } from '../@codegen/klend/zero_padding';
|
|
54
55
|
import { checkDefined } from '../utils/validations';
|
|
@@ -99,6 +100,10 @@ export class KaminoMarket {
|
|
|
99
100
|
recentSlotDurationMs: number,
|
|
100
101
|
programId: Address = PROGRAM_ID
|
|
101
102
|
) {
|
|
103
|
+
if (recentSlotDurationMs <= 0) {
|
|
104
|
+
throw new Error('Recent slot duration cannot be 0');
|
|
105
|
+
}
|
|
106
|
+
|
|
102
107
|
this.address = marketAddress;
|
|
103
108
|
this.rpc = rpc;
|
|
104
109
|
this.state = state;
|
|
@@ -134,10 +139,6 @@ export class KaminoMarket {
|
|
|
134
139
|
return null;
|
|
135
140
|
}
|
|
136
141
|
|
|
137
|
-
if (recentSlotDurationMs <= 0) {
|
|
138
|
-
throw new Error('Recent slot duration cannot be 0');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
142
|
const reserves = withReserves
|
|
142
143
|
? await getReservesForMarket(marketAddress, rpc, programId, recentSlotDurationMs)
|
|
143
144
|
: new Map<Address, KaminoReserve>();
|
|
@@ -156,6 +157,68 @@ export class KaminoMarket {
|
|
|
156
157
|
return new KaminoMarket(connection, market, marketAddress, reserves, recentSlotDurationMs, programId);
|
|
157
158
|
}
|
|
158
159
|
|
|
160
|
+
static async loadMultiple(
|
|
161
|
+
connection: Rpc<KaminoMarketRpcApi>,
|
|
162
|
+
markets: Address[],
|
|
163
|
+
recentSlotDurationMs: number,
|
|
164
|
+
programId: Address = PROGRAM_ID,
|
|
165
|
+
withReserves: boolean = true,
|
|
166
|
+
oracleAccounts?: AllOracleAccounts
|
|
167
|
+
) {
|
|
168
|
+
const marketStates = await batchFetch(markets, (market) =>
|
|
169
|
+
LendingMarket.fetchMultiple(connection, market, programId)
|
|
170
|
+
);
|
|
171
|
+
const kaminoMarkets = new Map<Address, KaminoMarket>();
|
|
172
|
+
for (let i = 0; i < markets.length; i++) {
|
|
173
|
+
const market = marketStates[i];
|
|
174
|
+
const marketAddress = markets[i];
|
|
175
|
+
if (market === null) {
|
|
176
|
+
throw Error(`Could not fetch LendingMarket account state for market ${marketAddress}`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const marketReserves = withReserves
|
|
180
|
+
? await getReservesForMarket(marketAddress, connection, programId, recentSlotDurationMs, oracleAccounts)
|
|
181
|
+
: new Map<Address, KaminoReserve>();
|
|
182
|
+
|
|
183
|
+
kaminoMarkets.set(
|
|
184
|
+
marketAddress,
|
|
185
|
+
new KaminoMarket(connection, market, marketAddress, marketReserves, recentSlotDurationMs, programId)
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return kaminoMarkets;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
static async loadMultipleWithReserves(
|
|
192
|
+
connection: Rpc<KaminoMarketRpcApi>,
|
|
193
|
+
markets: Address[],
|
|
194
|
+
reserves: Map<Address, Map<Address, KaminoReserve>>,
|
|
195
|
+
recentSlotDurationMs: number,
|
|
196
|
+
programId: Address = PROGRAM_ID
|
|
197
|
+
) {
|
|
198
|
+
const marketStates = await batchFetch(markets, (market) =>
|
|
199
|
+
LendingMarket.fetchMultiple(connection, market, programId)
|
|
200
|
+
);
|
|
201
|
+
const kaminoMarkets = new Map<Address, KaminoMarket>();
|
|
202
|
+
for (let i = 0; i < markets.length; i++) {
|
|
203
|
+
const market = marketStates[i];
|
|
204
|
+
const marketAddress = markets[i];
|
|
205
|
+
if (market === null) {
|
|
206
|
+
throw Error(`Could not fetch LendingMarket account state for market ${marketAddress}`);
|
|
207
|
+
}
|
|
208
|
+
const marketReserves = reserves.get(marketAddress);
|
|
209
|
+
if (!marketReserves) {
|
|
210
|
+
throw Error(
|
|
211
|
+
`Could not get reserves for market ${marketAddress} from the reserves map argument supplied to this method`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
kaminoMarkets.set(
|
|
215
|
+
marketAddress,
|
|
216
|
+
new KaminoMarket(connection, market, marketAddress, marketReserves, recentSlotDurationMs, programId)
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
return kaminoMarkets;
|
|
220
|
+
}
|
|
221
|
+
|
|
159
222
|
async reload(): Promise<void> {
|
|
160
223
|
const market = await LendingMarket.fetch(this.rpc, this.getAddress(), this.programId);
|
|
161
224
|
if (market === null) {
|
|
@@ -395,7 +458,7 @@ export class KaminoMarket {
|
|
|
395
458
|
: debtReserve.getMaxBorrowAmountWithCollReserve(this, collReserve, slot);
|
|
396
459
|
}
|
|
397
460
|
|
|
398
|
-
async loadReserves() {
|
|
461
|
+
async loadReserves(oracleAccounts?: AllOracleAccounts) {
|
|
399
462
|
const addresses = [...this.reserves.keys()];
|
|
400
463
|
const reserveAccounts = await this.rpc
|
|
401
464
|
.getMultipleAccounts(addresses, { commitment: 'processed', encoding: 'base64' })
|
|
@@ -411,7 +474,7 @@ export class KaminoMarket {
|
|
|
411
474
|
}
|
|
412
475
|
return reserveAccount;
|
|
413
476
|
});
|
|
414
|
-
const reservesAndOracles = await getTokenOracleData(this.getRpc(), deserializedReserves);
|
|
477
|
+
const reservesAndOracles = await getTokenOracleData(this.getRpc(), deserializedReserves, oracleAccounts);
|
|
415
478
|
const kaminoReserves = new Map<Address, KaminoReserve>();
|
|
416
479
|
reservesAndOracles.forEach(([reserve, oracle], index) => {
|
|
417
480
|
if (!oracle) {
|
|
@@ -881,9 +944,13 @@ export class KaminoMarket {
|
|
|
881
944
|
return finalObligations;
|
|
882
945
|
}
|
|
883
946
|
|
|
884
|
-
async getAllUserObligations(
|
|
947
|
+
async getAllUserObligations(
|
|
948
|
+
user: Address,
|
|
949
|
+
commitment: Commitment = 'processed',
|
|
950
|
+
slot?: bigint
|
|
951
|
+
): Promise<KaminoObligation[]> {
|
|
885
952
|
const [currentSlot, obligations] = await Promise.all([
|
|
886
|
-
this.rpc.getSlot().send(),
|
|
953
|
+
slot !== undefined ? Promise.resolve(slot) : this.rpc.getSlot().send(),
|
|
887
954
|
this.rpc
|
|
888
955
|
.getProgramAccounts(this.programId, {
|
|
889
956
|
filters: [
|
|
@@ -1261,8 +1328,7 @@ export class KaminoMarket {
|
|
|
1261
1328
|
/**
|
|
1262
1329
|
* Get all Scope prices used by all the market reserves
|
|
1263
1330
|
*/
|
|
1264
|
-
async getAllScopePrices(scope: Scope): Promise<KaminoPrices> {
|
|
1265
|
-
const allOraclePrices = await this.getReserveOraclePrices(scope);
|
|
1331
|
+
async getAllScopePrices(scope: Scope, allOraclePrices: Map<Address, OraclePrices>): Promise<KaminoPrices> {
|
|
1266
1332
|
const spot: MintToPriceMap = {};
|
|
1267
1333
|
const twaps: MintToPriceMap = {};
|
|
1268
1334
|
for (const reserve of this.reserves.values()) {
|
|
@@ -1271,7 +1337,7 @@ export class KaminoMarket {
|
|
|
1271
1337
|
const oracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;
|
|
1272
1338
|
const chain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;
|
|
1273
1339
|
const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);
|
|
1274
|
-
const oraclePrices = allOraclePrices.get(
|
|
1340
|
+
const oraclePrices = allOraclePrices.get(oracle);
|
|
1275
1341
|
if (oraclePrices && oracle && isNotNullPubkey(oracle) && chain && Scope.isScopeChainValid(chain)) {
|
|
1276
1342
|
const spotPrice = await scope.getPriceFromChain(chain, oraclePrices);
|
|
1277
1343
|
spot[tokenMint] = { price: spotPrice.price, name: tokenName };
|
|
@@ -1287,16 +1353,18 @@ export class KaminoMarket {
|
|
|
1287
1353
|
/**
|
|
1288
1354
|
* Get all Scope/Pyth/Switchboard prices used by all the market reserves
|
|
1289
1355
|
*/
|
|
1290
|
-
async getAllPrices(): Promise<KlendPrices> {
|
|
1356
|
+
async getAllPrices(oracleAccounts?: AllOracleAccounts): Promise<KlendPrices> {
|
|
1291
1357
|
const klendPrices: KlendPrices = {
|
|
1292
1358
|
scope: { spot: {}, twap: {} },
|
|
1293
1359
|
pyth: { spot: {}, twap: {} },
|
|
1294
1360
|
switchboard: { spot: {}, twap: {} },
|
|
1295
1361
|
};
|
|
1296
|
-
const allOracleAccounts =
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1362
|
+
const allOracleAccounts =
|
|
1363
|
+
oracleAccounts ??
|
|
1364
|
+
(await getAllOracleAccounts(
|
|
1365
|
+
this.rpc,
|
|
1366
|
+
this.getReserves().map((x) => x.state)
|
|
1367
|
+
));
|
|
1300
1368
|
const pythCache = new Map<Address, PythPrices>();
|
|
1301
1369
|
const switchboardCache = new Map<Address, CandidatePrice>();
|
|
1302
1370
|
const scopeCache = new Map<Address, OraclePrices>();
|
|
@@ -1506,7 +1574,8 @@ export async function getReservesForMarket(
|
|
|
1506
1574
|
marketAddress: Address,
|
|
1507
1575
|
rpc: Rpc<KaminoReserveRpcApi>,
|
|
1508
1576
|
programId: Address,
|
|
1509
|
-
recentSlotDurationMs: number
|
|
1577
|
+
recentSlotDurationMs: number,
|
|
1578
|
+
oracleAccounts?: AllOracleAccounts
|
|
1510
1579
|
): Promise<Map<Address, KaminoReserve>> {
|
|
1511
1580
|
const reserves = await rpc
|
|
1512
1581
|
.getProgramAccounts(programId, {
|
|
@@ -1537,7 +1606,7 @@ export async function getReservesForMarket(
|
|
|
1537
1606
|
}
|
|
1538
1607
|
return reserveAccount;
|
|
1539
1608
|
});
|
|
1540
|
-
const reservesAndOracles = await getTokenOracleData(rpc, deserializedReserves);
|
|
1609
|
+
const reservesAndOracles = await getTokenOracleData(rpc, deserializedReserves, oracleAccounts);
|
|
1541
1610
|
const reservesByAddress = new Map<Address, KaminoReserve>();
|
|
1542
1611
|
reservesAndOracles.forEach(([reserve, oracle], index) => {
|
|
1543
1612
|
if (!oracle) {
|
|
@@ -1553,14 +1622,15 @@ export async function getSingleReserve(
|
|
|
1553
1622
|
reservePk: Address,
|
|
1554
1623
|
rpc: Rpc<KaminoReserveRpcApi>,
|
|
1555
1624
|
recentSlotDurationMs: number,
|
|
1556
|
-
reserveData?: Reserve
|
|
1625
|
+
reserveData?: Reserve,
|
|
1626
|
+
oracleAccounts?: AllOracleAccounts
|
|
1557
1627
|
): Promise<KaminoReserve> {
|
|
1558
1628
|
const reserve = reserveData ?? (await Reserve.fetch(rpc, reservePk));
|
|
1559
1629
|
|
|
1560
1630
|
if (reserve === null) {
|
|
1561
1631
|
throw new Error(`Reserve account ${reservePk} does not exist`);
|
|
1562
1632
|
}
|
|
1563
|
-
const reservesAndOracles = await getTokenOracleData(rpc, [reserve]);
|
|
1633
|
+
const reservesAndOracles = await getTokenOracleData(rpc, [reserve], oracleAccounts);
|
|
1564
1634
|
const [, oracle] = reservesAndOracles[0];
|
|
1565
1635
|
|
|
1566
1636
|
if (!oracle) {
|
package/src/classes/reserve.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from '@solana/kit';
|
|
17
17
|
import Decimal from 'decimal.js';
|
|
18
18
|
import {
|
|
19
|
+
AllOracleAccounts,
|
|
19
20
|
DEFAULT_PUBLIC_KEY,
|
|
20
21
|
getTokenOracleData,
|
|
21
22
|
globalConfigPda,
|
|
@@ -102,14 +103,15 @@ export class KaminoReserve {
|
|
|
102
103
|
address: Address,
|
|
103
104
|
rpc: Rpc<KaminoReserveRpcApi>,
|
|
104
105
|
recentSlotDurationMs: number,
|
|
105
|
-
reserveState?: Reserve
|
|
106
|
+
reserveState?: Reserve,
|
|
107
|
+
oracleAccounts?: AllOracleAccounts
|
|
106
108
|
) {
|
|
107
109
|
const reserve = reserveState ?? (await Reserve.fetch(rpc, address));
|
|
108
110
|
if (reserve === null) {
|
|
109
111
|
throw new Error(`Reserve account ${address} does not exist`);
|
|
110
112
|
}
|
|
111
113
|
|
|
112
|
-
const tokenOracleDataWithReserve = await getTokenOracleData(rpc, [reserve]);
|
|
114
|
+
const tokenOracleDataWithReserve = await getTokenOracleData(rpc, [reserve], oracleAccounts);
|
|
113
115
|
if (!tokenOracleDataWithReserve[0]) {
|
|
114
116
|
throw new Error('Token oracle data not found');
|
|
115
117
|
}
|
package/src/classes/vault.ts
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
TransactionSigner,
|
|
24
24
|
} from '@solana/kit';
|
|
25
25
|
import {
|
|
26
|
+
AllOracleAccounts,
|
|
26
27
|
DEFAULT_PUBLIC_KEY,
|
|
27
28
|
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
28
29
|
getAssociatedTokenAddress,
|
|
@@ -2361,9 +2362,13 @@ export class KaminoVaultClient {
|
|
|
2361
2362
|
/**
|
|
2362
2363
|
* This will load the onchain state for all the reserves that the vaults have allocations for, deduplicating the reserves
|
|
2363
2364
|
* @param vaults - the vault states to load reserves for
|
|
2365
|
+
* @param oracleAccounts (optional) all reserve oracle accounts, if not supplied will make an additional rpc call to fetch these accounts
|
|
2364
2366
|
* @returns a hashmap from each reserve pubkey to the reserve state
|
|
2365
2367
|
*/
|
|
2366
|
-
async loadVaultsReserves(
|
|
2368
|
+
async loadVaultsReserves(
|
|
2369
|
+
vaults: VaultState[],
|
|
2370
|
+
oracleAccounts?: AllOracleAccounts
|
|
2371
|
+
): Promise<Map<Address, KaminoReserve>> {
|
|
2367
2372
|
const vaultReservesAddressesSet = new Set<Address>(vaults.flatMap((vault) => this.getVaultReserves(vault)));
|
|
2368
2373
|
const vaultReservesAddresses = [...vaultReservesAddressesSet];
|
|
2369
2374
|
const reserveAccounts = await this.getConnection()
|
|
@@ -2382,7 +2387,7 @@ export class KaminoVaultClient {
|
|
|
2382
2387
|
return reserveAccount;
|
|
2383
2388
|
});
|
|
2384
2389
|
|
|
2385
|
-
const reservesAndOracles = await getTokenOracleData(this.getConnection(), deserializedReserves);
|
|
2390
|
+
const reservesAndOracles = await getTokenOracleData(this.getConnection(), deserializedReserves, oracleAccounts);
|
|
2386
2391
|
|
|
2387
2392
|
const kaminoReserves = new Map<Address, KaminoReserve>();
|
|
2388
2393
|
|
|
@@ -2409,13 +2414,15 @@ export class KaminoVaultClient {
|
|
|
2409
2414
|
* @param [slot] - the slot for which to retrieve the vault collaterals for. Optional. If not provided the function will fetch the current slot
|
|
2410
2415
|
* @param [vaultReservesMap] - hashmap from each reserve pubkey to the reserve state. Optional. If provided the function will be significantly faster as it will not have to fetch the reserves
|
|
2411
2416
|
* @param [kaminoMarkets] - a list of all the kamino markets. Optional. If provided the function will be significantly faster as it will not have to fetch the markets
|
|
2417
|
+
* @param oracleAccounts (optional) all reserve oracle accounts, if not supplied will make an additional rpc call to fetch these accounts
|
|
2412
2418
|
* @returns a hashmap from each reserve pubkey to the market overview of the collaterals that can be used and the min and max loan to value ratio in that market
|
|
2413
2419
|
*/
|
|
2414
2420
|
async getVaultCollaterals(
|
|
2415
2421
|
vaultState: VaultState,
|
|
2416
2422
|
slot: Slot,
|
|
2417
2423
|
vaultReservesMap?: Map<Address, KaminoReserve>,
|
|
2418
|
-
kaminoMarkets?: KaminoMarket[]
|
|
2424
|
+
kaminoMarkets?: KaminoMarket[],
|
|
2425
|
+
oracleAccounts?: AllOracleAccounts
|
|
2419
2426
|
): Promise<Map<Address, MarketOverview>> {
|
|
2420
2427
|
const vaultReservesStateMap = vaultReservesMap ? vaultReservesMap : await this.loadVaultReserves(vaultState);
|
|
2421
2428
|
const vaultReservesState: KaminoReserve[] = [];
|
|
@@ -2439,7 +2446,11 @@ export class KaminoVaultClient {
|
|
|
2439
2446
|
const missingReservesStates = (await Reserve.fetchMultiple(this.getConnection(), [...missingReserves])).filter(
|
|
2440
2447
|
(reserve) => reserve !== null
|
|
2441
2448
|
);
|
|
2442
|
-
const missingReservesAndOracles = await getTokenOracleData(
|
|
2449
|
+
const missingReservesAndOracles = await getTokenOracleData(
|
|
2450
|
+
this.getConnection(),
|
|
2451
|
+
missingReservesStates,
|
|
2452
|
+
oracleAccounts
|
|
2453
|
+
);
|
|
2443
2454
|
missingReservesAndOracles.forEach(([reserve, oracle], index) => {
|
|
2444
2455
|
const fetchedReserve = new KaminoReserve(
|
|
2445
2456
|
reserve,
|
|
@@ -1684,7 +1684,10 @@ export const getScopeRefreshIx = async (
|
|
|
1684
1684
|
for (const [configPubkey, config] of scopeRefreshConfig.scopeConfigurations) {
|
|
1685
1685
|
const tokenIds = scopeTokensMap.get(config.oraclePrices);
|
|
1686
1686
|
if (tokenIds && tokenIds.length > 0) {
|
|
1687
|
-
|
|
1687
|
+
const refreshIx = await scopeRefreshConfig.scope.refreshPriceListIx({ config: configPubkey }, tokenIds);
|
|
1688
|
+
if (refreshIx) {
|
|
1689
|
+
scopeRefreshIxs.push(refreshIx);
|
|
1690
|
+
}
|
|
1688
1691
|
}
|
|
1689
1692
|
}
|
|
1690
1693
|
}
|
package/src/utils/oracle.ts
CHANGED
|
@@ -105,9 +105,10 @@ export function getTokenOracleDataSync(allOracleAccounts: AllOracleAccounts, res
|
|
|
105
105
|
// TODO: Add freshness of the latest price to match sc logic
|
|
106
106
|
export async function getTokenOracleData(
|
|
107
107
|
rpc: Rpc<GetMultipleAccountsApi>,
|
|
108
|
-
reserves: Reserve[]
|
|
108
|
+
reserves: Reserve[],
|
|
109
|
+
oracleAccounts?: AllOracleAccounts
|
|
109
110
|
): Promise<Array<[Reserve, TokenOracleData | undefined]>> {
|
|
110
|
-
const allOracleAccounts = await getAllOracleAccounts(rpc, reserves);
|
|
111
|
+
const allOracleAccounts = oracleAccounts ?? (await getAllOracleAccounts(rpc, reserves));
|
|
111
112
|
return getTokenOracleDataSync(allOracleAccounts, reserves);
|
|
112
113
|
}
|
|
113
114
|
|