@suilend/sdk 11.6.0 → 11.7.0-next.g08471e2

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/client.d.ts CHANGED
@@ -8,6 +8,7 @@ import { NewConfigArgs as CreateRateLimiterConfigArgs } from "./_generated/suile
8
8
  import { CreateReserveConfigArgs } from "./_generated/suilend/reserve-config/functions";
9
9
  import { type PriceUpdateDataSource } from "./lib/pyth";
10
10
  import { Side } from "./lib/types";
11
+ export declare function needsPriceRefresh(stalenessSeconds: number): boolean;
11
12
  export declare const ADMIN_ADDRESS: string;
12
13
  export declare const LENDING_MARKET_REGISTRY_ID: string;
13
14
  export declare const LENDING_MARKET_ID: string, LENDING_MARKET_TYPE: string;
package/client.js CHANGED
@@ -28,6 +28,19 @@ const isSui = (coinType) => normalizeStructTag(coinType) === NORMALIZED_SUI_COIN
28
28
  // refresh would come from a package the contract does not accept.
29
29
  const WORMHOLE_STATE_ID = "0xdbca52b9fb4f712e25f61f974586d93ac541bcf8389564f0323bb07215168b5c";
30
30
  const PYTH_STATE_ID = "0x03719fae774ddab3cfcaa53bbc046f0cbe21410019b6280811bf3f9f4b05839d";
31
+ // Mirrors suilend::oracles's MAX_FORWARD_SECONDS (move/contracts/suilend/sources/oracles.move);
32
+ // `refresh_reserve_price` now rejects a forward-dated price the same as a stale one.
33
+ const MAX_FORWARD_SECONDS = 60;
34
+ // Whether the currently on-chain price object is fresh enough to skip fetching (and pushing)
35
+ // a new Pyth update before submitting the PTB. `stalenessSeconds` is negative for a
36
+ // forward-dated publish time; unlike backward staleness, that gap only shrinks as real time
37
+ // passes before the transaction lands, so the on-chain bound itself is used with no margin.
38
+ export function needsPriceRefresh(stalenessSeconds) {
39
+ // 20s, not MAX_STALENESS_SECONDS (60): the update has to leave the object fresh enough to
40
+ // still satisfy `refresh_reserve_price` after the transaction lands, not merely fresh at
41
+ // the moment it is read.
42
+ return stalenessSeconds > 20 || stalenessSeconds < -MAX_FORWARD_SECONDS;
43
+ }
31
44
  export const ADMIN_ADDRESS = process.env.NEXT_PUBLIC_SUILEND_USE_BETA_MARKET === "true"
32
45
  ? "0xa902504c338e17f44dfee1bd1c3cad1ff03326579b9cdcfe2762fc12c46fc033" // beta owner
33
46
  : "0xb1ffbc2e1915f44b8f271a703becc1bf8aa79bc22431a58900a102892b783c25";
@@ -502,10 +515,7 @@ export class SuilendClient {
502
515
  });
503
516
  const publishTime = priceInfoPublishTime(object.json, priceInfoObjectId);
504
517
  const stalenessSeconds = Date.now() / 1000 - Number(publishTime);
505
- // 20s, not MAX_STALENESS_SECONDS (60): the update has to leave the
506
- // object fresh enough to still satisfy `refresh_reserve_price` after
507
- // the transaction lands, not merely fresh at the moment it is read.
508
- if (stalenessSeconds > 20) {
518
+ if (needsPriceRefresh(stalenessSeconds)) {
509
519
  stalePriceIdentifiers.push(priceIdentifiers[+i]);
510
520
  }
511
521
  })()));
@@ -11,6 +11,10 @@ export declare const RESERVES_CUSTOM_ORDER: Record<string, string[]>;
11
11
  export declare const NORMALIZED_MAYA_COINTYPE: string;
12
12
  export declare const NORMALIZED_mPOINTS_COINTYPE: string;
13
13
  export declare const NORMALIZED_TREATS_COINTYPE: string;
14
+ export declare const resolveReserveOrder: (lendingMarketId: string, lendingMarketMetadata?: LendingMarketMetadata) => string[] | undefined;
15
+ export declare const sortReservesByOrder: <T extends {
16
+ coinType: string;
17
+ }>(reserves: T[], order: string[]) => T[];
14
18
  export declare const resolveCoinMetadataForInitialize: (miscCoinTypes: string[], reserveCoinTypes: string[], rewardCoinTypes: string[]) => Promise<{
15
19
  coinMetadataMap: Record<string, import("@suilend/sui-core").Token>;
16
20
  reserveCoinMetadataMap: Record<string, import("@suilend/sui-core").Token>;
package/lib/initialize.js CHANGED
@@ -97,6 +97,38 @@ const TREATS_COINTYPE = "0x0dadb7fa2771c2952f96161fc1f0c105d1f22d53926b9ff2498a8
97
97
  export const NORMALIZED_MAYA_COINTYPE = normalizeStructTag(MAYA_COINTYPE);
98
98
  export const NORMALIZED_mPOINTS_COINTYPE = normalizeStructTag(mPOINTS_COINTYPE);
99
99
  export const NORMALIZED_TREATS_COINTYPE = normalizeStructTag(TREATS_COINTYPE);
100
+ export const resolveReserveOrder = (lendingMarketId, lendingMarketMetadata) => lendingMarketMetadata?.reserveOrder ??
101
+ RESERVES_CUSTOM_ORDER[lendingMarketId];
102
+ const reserveRanks = (order) => {
103
+ const ranks = new Map();
104
+ order.forEach((coinType, index) => {
105
+ if (typeof coinType !== "string")
106
+ return;
107
+ let normalized;
108
+ try {
109
+ normalized = normalizeStructTag(coinType);
110
+ }
111
+ catch {
112
+ return;
113
+ }
114
+ if (!ranks.has(normalized))
115
+ ranks.set(normalized, index);
116
+ });
117
+ return ranks;
118
+ };
119
+ export const sortReservesByOrder = (reserves, order) => {
120
+ const ranks = reserveRanks(order);
121
+ return reserves.slice().sort((a, b) => {
122
+ const aIndex = ranks.get(a.coinType) ?? -1;
123
+ const bIndex = ranks.get(b.coinType) ?? -1;
124
+ if (aIndex > -1 && bIndex > -1)
125
+ return aIndex - bIndex;
126
+ else if (aIndex === -1 && bIndex === -1)
127
+ return 0;
128
+ else
129
+ return aIndex > -1 ? -1 : 1;
130
+ });
131
+ };
100
132
  export const resolveCoinMetadataForInitialize = async (miscCoinTypes, reserveCoinTypes, rewardCoinTypes) => {
101
133
  const { metadata } = await getCoinMetadataMapPartial([
102
134
  ...miscCoinTypes,
@@ -271,17 +303,9 @@ export const initializeSuilend = async (suiGrpcClient, suilendClient, lendingMar
271
303
  // (walReserve.smoothedPrice.value as bigint) = walPrice;
272
304
  // }
273
305
  const lendingMarket = parseLendingMarket(suilendClient.lendingMarket, refreshedRawReserves, coinMetadataMap, nowS, lendingMarketMetadata);
274
- if (!!RESERVES_CUSTOM_ORDER[lendingMarket.id]) {
275
- lendingMarket.reserves = lendingMarket.reserves.slice().sort((a, b) => {
276
- const aCustomOrderIndex = RESERVES_CUSTOM_ORDER[lendingMarket.id].indexOf(a.coinType);
277
- const bCustomOrderIndex = RESERVES_CUSTOM_ORDER[lendingMarket.id].indexOf(b.coinType);
278
- if (aCustomOrderIndex > -1 && bCustomOrderIndex > -1)
279
- return aCustomOrderIndex - bCustomOrderIndex;
280
- else if (aCustomOrderIndex === -1 && bCustomOrderIndex === -1)
281
- return 0;
282
- else
283
- return aCustomOrderIndex > -1 ? -1 : 1;
284
- });
306
+ const reserveOrder = resolveReserveOrder(lendingMarket.id, lendingMarketMetadata);
307
+ if (reserveOrder) {
308
+ lendingMarket.reserves = sortReservesByOrder(lendingMarket.reserves, reserveOrder);
285
309
  }
286
310
  const reserveMap = lendingMarket.reserves.reduce((acc, reserve) => ({ ...acc, [reserve.coinType]: reserve }), {});
287
311
  return {
package/lib/types.d.ts CHANGED
@@ -244,4 +244,5 @@ export type LendingMarketMetadata = {
244
244
  isHidden?: boolean;
245
245
  iconUrl?: string | null;
246
246
  description?: string | null;
247
+ reserveOrder?: string[] | null;
247
248
  };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@suilend/sdk","version":"11.6.0","private":false,"description":"A TypeScript SDK for interacting with the Suilend program","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./client":"./client.js","./mmt":"./mmt.js","./strategies":"./strategies.js","./api/events":"./api/events.js","./api":"./api/index.js","./lib/constants":"./lib/constants.js","./lib":"./lib/index.js","./lib/initialize":"./lib/initialize.js","./lib/liquidityMining":"./lib/liquidityMining.js","./lib/proCompatible":"./lib/proCompatible.js","./lib/pyth":"./lib/pyth.js","./lib/strategyOwnerCap":"./lib/strategyOwnerCap.js","./lib/transactions":"./lib/transactions.js","./lib/types":"./lib/types.js","./margin":"./margin/index.js","./parsers/apiReserveAssetDataEvent":"./parsers/apiReserveAssetDataEvent.js","./parsers":"./parsers/index.js","./parsers/lendingMarket":"./parsers/lendingMarket.js","./parsers/obligation":"./parsers/obligation.js","./parsers/rateLimiter":"./parsers/rateLimiter.js","./parsers/reserve":"./parsers/reserve.js","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.js","./utils/events":"./utils/events.js","./utils/feedId":"./utils/feedId.js","./utils":"./utils/index.js","./utils/obligation":"./utils/obligation.js","./utils/simulate":"./utils/simulate.js","./_generated/_framework/reified":"./_generated/_framework/reified.js","./_generated/_framework/util":"./_generated/_framework/util.js","./_generated/_framework/vector":"./_generated/_framework/vector.js","./_generated/suilend":"./_generated/suilend/index.js","./margin/margin/admin_cap":"./margin/margin/admin_cap.js","./margin/margin/market":"./margin/margin/market.js","./margin/margin/permissions":"./margin/margin/permissions.js","./margin/margin/position":"./margin/margin/position.js","./margin/margin/router":"./margin/margin/router.js","./margin/margin/version":"./margin/margin/version.js","./margin/utils":"./margin/utils/index.js","./_generated/suilend/cell/structs":"./_generated/suilend/cell/structs.js","./_generated/suilend/decimal/structs":"./_generated/suilend/decimal/structs.js","./_generated/suilend/lending-market/functions":"./_generated/suilend/lending-market/functions.js","./_generated/suilend/lending-market/structs":"./_generated/suilend/lending-market/structs.js","./_generated/suilend/lending-market-registry/functions":"./_generated/suilend/lending-market-registry/functions.js","./_generated/suilend/liquidity-mining/structs":"./_generated/suilend/liquidity-mining/structs.js","./_generated/suilend/obligation/structs":"./_generated/suilend/obligation/structs.js","./_generated/suilend/rate-limiter/functions":"./_generated/suilend/rate-limiter/functions.js","./_generated/suilend/rate-limiter/structs":"./_generated/suilend/rate-limiter/structs.js","./_generated/suilend/reserve/structs":"./_generated/suilend/reserve/structs.js","./_generated/suilend/reserve-config/functions":"./_generated/suilend/reserve-config/functions.js","./_generated/suilend/reserve-config/structs":"./_generated/suilend/reserve-config/structs.js","./_generated/_dependencies/source/0x1":"./_generated/_dependencies/source/0x1/index.js","./_generated/_dependencies/source/0x2":"./_generated/_dependencies/source/0x2/index.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/index.js","./margin/margin/deps/std/type_name":"./margin/margin/deps/std/type_name.js","./margin/margin/deps/sui/vec_set":"./margin/margin/deps/sui/vec_set.js","./margin/margin/deps/suilend/lending_market":"./margin/margin/deps/suilend/lending_market.js","./_generated/_dependencies/source/0x1/ascii/structs":"./_generated/_dependencies/source/0x1/ascii/structs.js","./_generated/_dependencies/source/0x1/option/structs":"./_generated/_dependencies/source/0x1/option/structs.js","./_generated/_dependencies/source/0x1/type-name/structs":"./_generated/_dependencies/source/0x1/type-name/structs.js","./_generated/_dependencies/source/0x2/bag/structs":"./_generated/_dependencies/source/0x2/bag/structs.js","./_generated/_dependencies/source/0x2/balance/structs":"./_generated/_dependencies/source/0x2/balance/structs.js","./_generated/_dependencies/source/0x2/object/structs":"./_generated/_dependencies/source/0x2/object/structs.js","./_generated/_dependencies/source/0x2/object-table/structs":"./_generated/_dependencies/source/0x2/object-table/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js"},"types":"./index.d.ts","scripts":{"build":"rm -rf ./dist && tsc && node ./fix-esm-imports.js","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test":"vitest run","lint:ci":"yarn run typecheck","prettier":"prettier --write src/ tests/","release":"yarn run build && node ./release.js && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/fireflyprotocol/lending-mono.git","directory":"ts/sdks/sdk"},"dependencies":{"@bluefin-exchange/bluefin7k-aggregator-sdk":"7.6.3","@cetusprotocol/aggregator-sdk":"1.7.2","@flowx-finance/sdk":"2.1.0","@pythnetwork/hermes-client":"3.1.0","@pythnetwork/pyth-sui-js":"4.0.0","@suilend/springsui-sdk":"4.1.0","bignumber.js":"11.1.5","bn.js":"5.2.5","crypto-js":"4.2.0","lodash":"4.18.1","p-limit":"7.3.2","uuid":"14.0.2"},"devDependencies":{"@mysten/bcs":"2.1.1","@mysten/sui":"2.29.0","@suilend/sui-core":"2.0.1","@tsconfig/recommended":"1.0.13","@types/bn.js":"5.2.0","@types/lodash":"4.17.25","@types/node":"26.4.0","fast-check":"4.9.0","prettier":"3.9.6","ts-node":"10.9.2","typescript":"6.0.3","vite":"8.2.0","vitest":"5.0.0"},"peerDependencies":{"@mysten/bcs":"^2.1.1","@mysten/sui":">=2.22.1 <3","@suilend/sui-core":"^2.0.1"},"type":"module"}
1
+ {"name":"@suilend/sdk","version":"11.7.0-next.g08471e2","private":false,"description":"A TypeScript SDK for interacting with the Suilend program","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./client":"./client.js","./mmt":"./mmt.js","./strategies":"./strategies.js","./api/events":"./api/events.js","./api":"./api/index.js","./lib/constants":"./lib/constants.js","./lib":"./lib/index.js","./lib/initialize":"./lib/initialize.js","./lib/liquidityMining":"./lib/liquidityMining.js","./lib/proCompatible":"./lib/proCompatible.js","./lib/pyth":"./lib/pyth.js","./lib/strategyOwnerCap":"./lib/strategyOwnerCap.js","./lib/transactions":"./lib/transactions.js","./lib/types":"./lib/types.js","./margin":"./margin/index.js","./parsers/apiReserveAssetDataEvent":"./parsers/apiReserveAssetDataEvent.js","./parsers":"./parsers/index.js","./parsers/lendingMarket":"./parsers/lendingMarket.js","./parsers/obligation":"./parsers/obligation.js","./parsers/rateLimiter":"./parsers/rateLimiter.js","./parsers/reserve":"./parsers/reserve.js","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.js","./utils/events":"./utils/events.js","./utils/feedId":"./utils/feedId.js","./utils":"./utils/index.js","./utils/obligation":"./utils/obligation.js","./utils/simulate":"./utils/simulate.js","./_generated/_framework/reified":"./_generated/_framework/reified.js","./_generated/_framework/util":"./_generated/_framework/util.js","./_generated/_framework/vector":"./_generated/_framework/vector.js","./_generated/suilend":"./_generated/suilend/index.js","./margin/margin/admin_cap":"./margin/margin/admin_cap.js","./margin/margin/market":"./margin/margin/market.js","./margin/margin/permissions":"./margin/margin/permissions.js","./margin/margin/position":"./margin/margin/position.js","./margin/margin/router":"./margin/margin/router.js","./margin/margin/version":"./margin/margin/version.js","./margin/utils":"./margin/utils/index.js","./_generated/suilend/cell/structs":"./_generated/suilend/cell/structs.js","./_generated/suilend/decimal/structs":"./_generated/suilend/decimal/structs.js","./_generated/suilend/lending-market/functions":"./_generated/suilend/lending-market/functions.js","./_generated/suilend/lending-market/structs":"./_generated/suilend/lending-market/structs.js","./_generated/suilend/lending-market-registry/functions":"./_generated/suilend/lending-market-registry/functions.js","./_generated/suilend/liquidity-mining/structs":"./_generated/suilend/liquidity-mining/structs.js","./_generated/suilend/obligation/structs":"./_generated/suilend/obligation/structs.js","./_generated/suilend/rate-limiter/functions":"./_generated/suilend/rate-limiter/functions.js","./_generated/suilend/rate-limiter/structs":"./_generated/suilend/rate-limiter/structs.js","./_generated/suilend/reserve/structs":"./_generated/suilend/reserve/structs.js","./_generated/suilend/reserve-config/functions":"./_generated/suilend/reserve-config/functions.js","./_generated/suilend/reserve-config/structs":"./_generated/suilend/reserve-config/structs.js","./_generated/_dependencies/source/0x1":"./_generated/_dependencies/source/0x1/index.js","./_generated/_dependencies/source/0x2":"./_generated/_dependencies/source/0x2/index.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/index.js","./margin/margin/deps/std/type_name":"./margin/margin/deps/std/type_name.js","./margin/margin/deps/sui/vec_set":"./margin/margin/deps/sui/vec_set.js","./margin/margin/deps/suilend/lending_market":"./margin/margin/deps/suilend/lending_market.js","./_generated/_dependencies/source/0x1/ascii/structs":"./_generated/_dependencies/source/0x1/ascii/structs.js","./_generated/_dependencies/source/0x1/option/structs":"./_generated/_dependencies/source/0x1/option/structs.js","./_generated/_dependencies/source/0x1/type-name/structs":"./_generated/_dependencies/source/0x1/type-name/structs.js","./_generated/_dependencies/source/0x2/bag/structs":"./_generated/_dependencies/source/0x2/bag/structs.js","./_generated/_dependencies/source/0x2/balance/structs":"./_generated/_dependencies/source/0x2/balance/structs.js","./_generated/_dependencies/source/0x2/object/structs":"./_generated/_dependencies/source/0x2/object/structs.js","./_generated/_dependencies/source/0x2/object-table/structs":"./_generated/_dependencies/source/0x2/object-table/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js"},"types":"./index.d.ts","scripts":{"build":"rm -rf ./dist && tsc && node ./fix-esm-imports.js","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test":"vitest run","lint:ci":"yarn run typecheck","prettier":"prettier --write src/ tests/","release":"yarn run build && node ./release.js && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/fireflyprotocol/lending-mono.git","directory":"ts/sdks/sdk"},"dependencies":{"@bluefin-exchange/bluefin7k-aggregator-sdk":"7.6.3","@cetusprotocol/aggregator-sdk":"1.7.2","@flowx-finance/sdk":"2.1.0","@pythnetwork/hermes-client":"3.1.0","@pythnetwork/pyth-sui-js":"4.0.0","@suilend/springsui-sdk":"4.1.0","bignumber.js":"11.1.5","bn.js":"5.2.5","crypto-js":"4.2.0","lodash":"4.18.1","p-limit":"7.3.2","uuid":"14.0.2"},"devDependencies":{"@mysten/bcs":"2.1.1","@mysten/sui":"2.29.0","@suilend/sui-core":"2.0.1","@tsconfig/recommended":"1.0.13","@types/bn.js":"5.2.0","@types/lodash":"4.17.25","@types/node":"26.4.0","fast-check":"4.9.0","prettier":"3.9.6","ts-node":"10.9.2","typescript":"6.0.3","vite":"8.2.0","vitest":"5.0.0"},"peerDependencies":{"@mysten/bcs":"^2.1.1","@mysten/sui":">=2.22.1 <3","@suilend/sui-core":"^2.0.1"},"type":"module"}