@t2000/sdk 0.16.16 → 0.16.18

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/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { I as InvestmentTrade, S as StrategyDefinition, A as AutoInvestSchedule, a as AutoInvestStatus, T as T2000Options, b as SendResult, B as BalanceResponse, c as TransactionRecord, D as DepositInfo, L as LendingAdapter, d as SwapAdapter, e as SaveResult, W as WithdrawResult, M as MaxWithdrawResult, f as BorrowResult, R as RepayResult, g as MaxBorrowResult, H as HealthFactorResult, h as SwapResult, i as InvestResult, j as InvestEarnResult, k as StrategyBuyResult, l as StrategySellResult, m as StrategyRebalanceResult, n as StrategyStatusResult, o as AutoInvestRunResult, P as PortfolioResult, p as InvestmentPosition, q as PositionsResult, r as RatesResult, s as LendingRates, t as RebalanceResult, E as EarningsResult, F as FundStatusResult, u as SentinelAgent, v as SentinelAttackResult, G as GasMethod } from './index-BOkO4S7r.cjs';
2
- export { w as AdapterCapability, x as AdapterPositions, y as AdapterTxResult, z as AssetRates, C as CetusAdapter, J as GasReserve, K as HealthInfo, N as NaviAdapter, O as PerpsAdapter, Q as PerpsPosition, U as PositionEntry, V as PositionSide, X as ProtocolDescriptor, Y as ProtocolRegistry, Z as RebalanceStep, _ as SentinelVerdict, $ as SuilendAdapter, a0 as SwapQuote, a1 as TradePositionsResult, a2 as TradeResult, a3 as allDescriptors, a4 as cetusDescriptor, a5 as getSentinelInfo, a6 as listSentinels, a7 as naviDescriptor, a8 as requestAttack, a9 as sentinelAttack, aa as sentinelDescriptor, ab as settleAttack, ac as submitPrompt, ad as suilendDescriptor } from './index-BOkO4S7r.cjs';
1
+ import { I as InvestmentTrade, S as StrategyDefinition, A as AutoInvestSchedule, a as AutoInvestStatus, T as T2000Options, b as SendResult, B as BalanceResponse, c as TransactionRecord, D as DepositInfo, L as LendingAdapter, d as SwapAdapter, e as SaveResult, W as WithdrawResult, M as MaxWithdrawResult, f as BorrowResult, R as RepayResult, g as MaxBorrowResult, H as HealthFactorResult, h as SwapResult, i as InvestResult, j as InvestEarnResult, k as StrategyBuyResult, l as StrategySellResult, m as StrategyRebalanceResult, n as StrategyStatusResult, o as AutoInvestRunResult, P as PortfolioResult, p as InvestmentPosition, q as PositionsResult, r as RatesResult, s as LendingRates, t as RebalanceResult, E as EarningsResult, F as FundStatusResult, u as SentinelAgent, v as SentinelAttackResult, G as GasMethod } from './index-BRjfwac2.cjs';
2
+ export { w as AdapterCapability, x as AdapterPositions, y as AdapterTxResult, z as AssetRates, C as CetusAdapter, J as GasReserve, K as HealthInfo, N as NaviAdapter, O as PerpsAdapter, Q as PerpsPosition, U as PositionEntry, V as PositionSide, X as ProtocolDescriptor, Y as ProtocolRegistry, Z as RebalanceStep, _ as SentinelVerdict, $ as SuilendAdapter, a0 as SwapQuote, a1 as TradePositionsResult, a2 as TradeResult, a3 as allDescriptors, a4 as cetusDescriptor, a5 as getSentinelInfo, a6 as listSentinels, a7 as naviDescriptor, a8 as requestAttack, a9 as sentinelAttack, aa as sentinelDescriptor, ab as settleAttack, ac as submitPrompt, ad as suilendDescriptor } from './index-BRjfwac2.cjs';
3
3
  import { EventEmitter } from 'eventemitter3';
4
4
  import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';
5
5
  import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { I as InvestmentTrade, S as StrategyDefinition, A as AutoInvestSchedule, a as AutoInvestStatus, T as T2000Options, b as SendResult, B as BalanceResponse, c as TransactionRecord, D as DepositInfo, L as LendingAdapter, d as SwapAdapter, e as SaveResult, W as WithdrawResult, M as MaxWithdrawResult, f as BorrowResult, R as RepayResult, g as MaxBorrowResult, H as HealthFactorResult, h as SwapResult, i as InvestResult, j as InvestEarnResult, k as StrategyBuyResult, l as StrategySellResult, m as StrategyRebalanceResult, n as StrategyStatusResult, o as AutoInvestRunResult, P as PortfolioResult, p as InvestmentPosition, q as PositionsResult, r as RatesResult, s as LendingRates, t as RebalanceResult, E as EarningsResult, F as FundStatusResult, u as SentinelAgent, v as SentinelAttackResult, G as GasMethod } from './index-BOkO4S7r.js';
2
- export { w as AdapterCapability, x as AdapterPositions, y as AdapterTxResult, z as AssetRates, C as CetusAdapter, J as GasReserve, K as HealthInfo, N as NaviAdapter, O as PerpsAdapter, Q as PerpsPosition, U as PositionEntry, V as PositionSide, X as ProtocolDescriptor, Y as ProtocolRegistry, Z as RebalanceStep, _ as SentinelVerdict, $ as SuilendAdapter, a0 as SwapQuote, a1 as TradePositionsResult, a2 as TradeResult, a3 as allDescriptors, a4 as cetusDescriptor, a5 as getSentinelInfo, a6 as listSentinels, a7 as naviDescriptor, a8 as requestAttack, a9 as sentinelAttack, aa as sentinelDescriptor, ab as settleAttack, ac as submitPrompt, ad as suilendDescriptor } from './index-BOkO4S7r.js';
1
+ import { I as InvestmentTrade, S as StrategyDefinition, A as AutoInvestSchedule, a as AutoInvestStatus, T as T2000Options, b as SendResult, B as BalanceResponse, c as TransactionRecord, D as DepositInfo, L as LendingAdapter, d as SwapAdapter, e as SaveResult, W as WithdrawResult, M as MaxWithdrawResult, f as BorrowResult, R as RepayResult, g as MaxBorrowResult, H as HealthFactorResult, h as SwapResult, i as InvestResult, j as InvestEarnResult, k as StrategyBuyResult, l as StrategySellResult, m as StrategyRebalanceResult, n as StrategyStatusResult, o as AutoInvestRunResult, P as PortfolioResult, p as InvestmentPosition, q as PositionsResult, r as RatesResult, s as LendingRates, t as RebalanceResult, E as EarningsResult, F as FundStatusResult, u as SentinelAgent, v as SentinelAttackResult, G as GasMethod } from './index-BRjfwac2.js';
2
+ export { w as AdapterCapability, x as AdapterPositions, y as AdapterTxResult, z as AssetRates, C as CetusAdapter, J as GasReserve, K as HealthInfo, N as NaviAdapter, O as PerpsAdapter, Q as PerpsPosition, U as PositionEntry, V as PositionSide, X as ProtocolDescriptor, Y as ProtocolRegistry, Z as RebalanceStep, _ as SentinelVerdict, $ as SuilendAdapter, a0 as SwapQuote, a1 as TradePositionsResult, a2 as TradeResult, a3 as allDescriptors, a4 as cetusDescriptor, a5 as getSentinelInfo, a6 as listSentinels, a7 as naviDescriptor, a8 as requestAttack, a9 as sentinelAttack, aa as sentinelDescriptor, ab as settleAttack, ac as submitPrompt, ad as suilendDescriptor } from './index-BRjfwac2.js';
3
3
  import { EventEmitter } from 'eventemitter3';
4
4
  import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';
5
5
  import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
package/dist/index.js CHANGED
@@ -183,11 +183,10 @@ function parseMoveAbortMessage(msg) {
183
183
  if (abortMatch) {
184
184
  const code = parseInt(abortMatch[1], 10);
185
185
  const mapped = mapMoveAbortCode(code);
186
- if (mapped.startsWith("Move abort code:")) {
187
- const moduleMatch = msg.match(/in '([^']+)'/);
188
- if (moduleMatch) return `${mapped} (in ${moduleMatch[1]})`;
189
- }
190
- return mapped;
186
+ const moduleMatch = msg.match(/Identifier\("([^"]+)"\)/) ?? msg.match(/in '([^']+)'/);
187
+ const fnMatch = msg.match(/function_name:\s*Some\("([^"]+)"\)/);
188
+ const suffix = moduleMatch ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ""}]` : "";
189
+ return `${mapped}${suffix}`;
191
190
  }
192
191
  return msg;
193
192
  }
@@ -1774,6 +1773,7 @@ SUPPORTED_ASSETS.USDC.type;
1774
1773
  var WAD = 1e18;
1775
1774
  var MIN_HEALTH_FACTOR2 = 1.5;
1776
1775
  var CLOCK2 = "0x6";
1776
+ var SUI_SYSTEM_STATE2 = "0x5";
1777
1777
  var LENDING_MARKET_ID = "0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1";
1778
1778
  var LENDING_MARKET_TYPE = "0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::suilend::MAIN_POOL";
1779
1779
  var SUILEND_PACKAGE = "0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf";
@@ -1789,6 +1789,9 @@ var descriptor4 = {
1789
1789
  "lending_market::create_obligation": "save",
1790
1790
  "lending_market::withdraw_ctokens": "withdraw",
1791
1791
  "lending_market::redeem_ctokens_and_withdraw_liquidity": "withdraw",
1792
+ "lending_market::redeem_ctokens_and_withdraw_liquidity_request": "withdraw",
1793
+ "lending_market::fulfill_liquidity_request": "withdraw",
1794
+ "lending_market::unstake_sui_from_staker": "withdraw",
1792
1795
  "lending_market::borrow": "borrow",
1793
1796
  "lending_market::repay": "repay"
1794
1797
  }
@@ -2133,7 +2136,9 @@ var SuilendAdapter = class {
2133
2136
  const deposited = dep ? dep.ctokenAmount * ratio / 10 ** reserve.mintDecimals : 0;
2134
2137
  const effectiveAmount = Math.min(amount, deposited);
2135
2138
  if (effectiveAmount <= 0) throw new T2000Error("NO_COLLATERAL", `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);
2136
- const rawAmount = Math.floor(effectiveAmount * 10 ** reserve.mintDecimals);
2139
+ const U64_MAX = "18446744073709551615";
2140
+ const isFullWithdraw = dep && effectiveAmount >= deposited * 0.999;
2141
+ const withdrawArg = isFullWithdraw ? U64_MAX : String(Math.floor(effectiveAmount * 10 ** reserve.mintDecimals / ratio));
2137
2142
  const tx = new Transaction();
2138
2143
  tx.setSender(address);
2139
2144
  const [ctokens] = tx.moveCall({
@@ -2144,25 +2149,10 @@ var SuilendAdapter = class {
2144
2149
  tx.pure.u64(reserve.arrayIndex),
2145
2150
  tx.object(caps[0].id),
2146
2151
  tx.object(CLOCK2),
2147
- tx.pure.u64(rawAmount)
2148
- ]
2149
- });
2150
- const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${assetInfo.type}>`;
2151
- const [none] = tx.moveCall({
2152
- target: "0x1::option::none",
2153
- typeArguments: [exemptionType]
2154
- });
2155
- const [coin] = tx.moveCall({
2156
- target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity`,
2157
- typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],
2158
- arguments: [
2159
- tx.object(LENDING_MARKET_ID),
2160
- tx.pure.u64(reserve.arrayIndex),
2161
- tx.object(CLOCK2),
2162
- ctokens,
2163
- none
2152
+ tx.pure("u64", BigInt(withdrawArg))
2164
2153
  ]
2165
2154
  });
2155
+ const coin = this.redeemCtokens(tx, pkg, reserve, assetInfo.type, assetKey, ctokens);
2166
2156
  tx.transferObjects([coin], address);
2167
2157
  return { tx, effectiveAmount };
2168
2158
  }
@@ -2180,7 +2170,7 @@ var SuilendAdapter = class {
2180
2170
  const deposited = dep ? dep.ctokenAmount * ratio / 10 ** reserve.mintDecimals : 0;
2181
2171
  const effectiveAmount = Math.min(amount, deposited);
2182
2172
  if (effectiveAmount <= 0) throw new T2000Error("NO_COLLATERAL", `Nothing to withdraw for ${assetInfo.displayName} on Suilend`);
2183
- const rawAmount = Math.floor(effectiveAmount * 10 ** reserve.mintDecimals);
2173
+ const ctokenAmount = dep && effectiveAmount >= deposited * 0.999 ? dep.ctokenAmount : Math.floor(effectiveAmount * 10 ** reserve.mintDecimals / ratio);
2184
2174
  const [ctokens] = tx.moveCall({
2185
2175
  target: `${pkg}::lending_market::withdraw_ctokens`,
2186
2176
  typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],
@@ -2189,17 +2179,27 @@ var SuilendAdapter = class {
2189
2179
  tx.pure.u64(reserve.arrayIndex),
2190
2180
  tx.object(caps[0].id),
2191
2181
  tx.object(CLOCK2),
2192
- tx.pure.u64(rawAmount)
2182
+ tx.pure.u64(ctokenAmount)
2193
2183
  ]
2194
2184
  });
2195
- const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${assetInfo.type}>`;
2185
+ const coin = this.redeemCtokens(tx, pkg, reserve, assetInfo.type, assetKey, ctokens);
2186
+ return { coin, effectiveAmount };
2187
+ }
2188
+ /**
2189
+ * 3-step cToken redemption matching the official Suilend SDK flow:
2190
+ * 1. redeem_ctokens_and_withdraw_liquidity_request — creates a LiquidityRequest
2191
+ * 2. unstake_sui_from_staker — (SUI only) unstakes from validators to replenish available_liquidity
2192
+ * 3. fulfill_liquidity_request — splits underlying tokens from the reserve
2193
+ */
2194
+ redeemCtokens(tx, pkg, reserve, coinType, assetKey, ctokens) {
2195
+ const exemptionType = `${SUILEND_PACKAGE}::lending_market::RateLimiterExemption<${LENDING_MARKET_TYPE}, ${coinType}>`;
2196
2196
  const [none] = tx.moveCall({
2197
2197
  target: "0x1::option::none",
2198
2198
  typeArguments: [exemptionType]
2199
2199
  });
2200
- const [coin] = tx.moveCall({
2201
- target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity`,
2202
- typeArguments: [LENDING_MARKET_TYPE, assetInfo.type],
2200
+ const [liquidityRequest] = tx.moveCall({
2201
+ target: `${pkg}::lending_market::redeem_ctokens_and_withdraw_liquidity_request`,
2202
+ typeArguments: [LENDING_MARKET_TYPE, coinType],
2203
2203
  arguments: [
2204
2204
  tx.object(LENDING_MARKET_ID),
2205
2205
  tx.pure.u64(reserve.arrayIndex),
@@ -2208,7 +2208,28 @@ var SuilendAdapter = class {
2208
2208
  none
2209
2209
  ]
2210
2210
  });
2211
- return { coin, effectiveAmount };
2211
+ if (assetKey === "SUI") {
2212
+ tx.moveCall({
2213
+ target: `${pkg}::lending_market::unstake_sui_from_staker`,
2214
+ typeArguments: [LENDING_MARKET_TYPE],
2215
+ arguments: [
2216
+ tx.object(LENDING_MARKET_ID),
2217
+ tx.pure.u64(reserve.arrayIndex),
2218
+ liquidityRequest,
2219
+ tx.object(SUI_SYSTEM_STATE2)
2220
+ ]
2221
+ });
2222
+ }
2223
+ const [coin] = tx.moveCall({
2224
+ target: `${pkg}::lending_market::fulfill_liquidity_request`,
2225
+ typeArguments: [LENDING_MARKET_TYPE, coinType],
2226
+ arguments: [
2227
+ tx.object(LENDING_MARKET_ID),
2228
+ tx.pure.u64(reserve.arrayIndex),
2229
+ liquidityRequest
2230
+ ]
2231
+ });
2232
+ return coin;
2212
2233
  }
2213
2234
  async addSaveToTx(tx, address, coin, asset, options) {
2214
2235
  const assetKey = asset in SUPPORTED_ASSETS ? asset : "USDC";