@suilend/sdk 11.7.0 → 11.7.1-next.g724b51f
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 +1 -0
- package/client.js +14 -4
- package/package.json +1 -1
- package/utils/simulate.js +16 -3
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
|
-
|
|
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
|
})()));
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@suilend/sdk","version":"11.7.
|
|
1
|
+
{"name":"@suilend/sdk","version":"11.7.1-next.g724b51f","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"}
|
package/utils/simulate.js
CHANGED
|
@@ -89,7 +89,7 @@ export const compoundReserveInterest = (reserve, nowS) => {
|
|
|
89
89
|
export const updatePoolRewardsManager = (manager, nowMs) => {
|
|
90
90
|
const updatedManager = { ...manager };
|
|
91
91
|
const timeElapsedMs = nowMs - Number(manager.lastUpdateTimeMs);
|
|
92
|
-
if (manager.totalShares === BigInt(0) || timeElapsedMs
|
|
92
|
+
if (manager.totalShares === BigInt(0) || timeElapsedMs <= 0) {
|
|
93
93
|
return updatedManager;
|
|
94
94
|
}
|
|
95
95
|
updatedManager.poolRewards = updatedManager.poolRewards.map((poolReward) => {
|
|
@@ -270,6 +270,13 @@ export const refreshReservePriceTolerant = async (reserves, pythConnection) => {
|
|
|
270
270
|
});
|
|
271
271
|
return { reserves: updatedReserves, unpricedCoinTypes };
|
|
272
272
|
};
|
|
273
|
+
const warnedStaleRewardSnapshots = new Set();
|
|
274
|
+
const warnStaleRewardSnapshot = (poolRewardId, poolCumulative, userCumulative) => {
|
|
275
|
+
if (warnedStaleRewardSnapshots.has(poolRewardId))
|
|
276
|
+
return;
|
|
277
|
+
warnedStaleRewardSnapshots.add(poolRewardId);
|
|
278
|
+
console.warn(`@suilend/sdk | stale pool-reward snapshot, skipping accrual for ${poolRewardId}: pool cumulativeRewardsPerShare ${poolCumulative} is behind the user's ${userCumulative}`);
|
|
279
|
+
};
|
|
273
280
|
export const updateUserRewardManager = (poolManager, userRewardManager, nowMs) => {
|
|
274
281
|
const updatedUserRewardManager = {
|
|
275
282
|
...userRewardManager,
|
|
@@ -286,8 +293,14 @@ export const updateUserRewardManager = (poolManager, userRewardManager, nowMs) =
|
|
|
286
293
|
const oldReward = updatedUserRewardManager.rewards[i];
|
|
287
294
|
const reward = { ...oldReward };
|
|
288
295
|
if (oldReward != null) {
|
|
289
|
-
const
|
|
290
|
-
|
|
296
|
+
const poolCumulative = decimalToBigNumber(poolReward.cumulativeRewardsPerShare);
|
|
297
|
+
const userCumulative = decimalToBigNumber(oldReward.cumulativeRewardsPerShare);
|
|
298
|
+
if (poolCumulative.lt(userCumulative)) {
|
|
299
|
+
warnStaleRewardSnapshot(poolReward.id, poolCumulative.toString(), userCumulative.toString());
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
const newRewards = poolCumulative
|
|
303
|
+
.minus(userCumulative)
|
|
291
304
|
.multipliedBy(new BigNumber(Number(userRewardManager.share)));
|
|
292
305
|
reward.earnedRewards = stringToDecimal(decimalToBigNumber(oldReward.earnedRewards).plus(newRewards).toString());
|
|
293
306
|
reward.cumulativeRewardsPerShare = poolReward.cumulativeRewardsPerShare;
|