@t2000/sdk 0.17.29 → 0.18.0

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.
Files changed (259) hide show
  1. package/dist/adapters/index.d.cts +1 -1
  2. package/dist/adapters/index.d.ts +4 -10
  3. package/dist/adapters/index.js +2107 -15
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/{index-DdtOBw42.d.ts → index-Co0lp99l.d.cts} +23 -1
  6. package/dist/{index-DdtOBw42.d.cts → index-Co0lp99l.d.ts} +23 -1
  7. package/dist/index.cjs +102 -1
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +8 -3
  10. package/dist/index.d.ts +654 -30
  11. package/dist/index.js +6154 -21
  12. package/dist/index.js.map +1 -1
  13. package/package.json +1 -1
  14. package/dist/adapters/cetus.d.ts +0 -29
  15. package/dist/adapters/cetus.d.ts.map +0 -1
  16. package/dist/adapters/cetus.js +0 -74
  17. package/dist/adapters/cetus.js.map +0 -1
  18. package/dist/adapters/cetus.test.d.ts +0 -2
  19. package/dist/adapters/cetus.test.d.ts.map +0 -1
  20. package/dist/adapters/cetus.test.js +0 -57
  21. package/dist/adapters/cetus.test.js.map +0 -1
  22. package/dist/adapters/compliance.test.d.ts +0 -8
  23. package/dist/adapters/compliance.test.d.ts.map +0 -1
  24. package/dist/adapters/compliance.test.js +0 -202
  25. package/dist/adapters/compliance.test.js.map +0 -1
  26. package/dist/adapters/index.d.ts.map +0 -1
  27. package/dist/adapters/navi.d.ts +0 -41
  28. package/dist/adapters/navi.d.ts.map +0 -1
  29. package/dist/adapters/navi.js +0 -102
  30. package/dist/adapters/navi.js.map +0 -1
  31. package/dist/adapters/navi.test.d.ts +0 -2
  32. package/dist/adapters/navi.test.d.ts.map +0 -1
  33. package/dist/adapters/navi.test.js +0 -164
  34. package/dist/adapters/navi.test.js.map +0 -1
  35. package/dist/adapters/registry.d.ts +0 -47
  36. package/dist/adapters/registry.d.ts.map +0 -1
  37. package/dist/adapters/registry.js +0 -162
  38. package/dist/adapters/registry.js.map +0 -1
  39. package/dist/adapters/registry.test.d.ts +0 -2
  40. package/dist/adapters/registry.test.d.ts.map +0 -1
  41. package/dist/adapters/registry.test.js +0 -197
  42. package/dist/adapters/registry.test.js.map +0 -1
  43. package/dist/adapters/suilend.d.ts +0 -71
  44. package/dist/adapters/suilend.d.ts.map +0 -1
  45. package/dist/adapters/suilend.js +0 -826
  46. package/dist/adapters/suilend.js.map +0 -1
  47. package/dist/adapters/suilend.test.d.ts +0 -2
  48. package/dist/adapters/suilend.test.d.ts.map +0 -1
  49. package/dist/adapters/suilend.test.js +0 -294
  50. package/dist/adapters/suilend.test.js.map +0 -1
  51. package/dist/adapters/types.d.ts +0 -160
  52. package/dist/adapters/types.d.ts.map +0 -1
  53. package/dist/adapters/types.js +0 -2
  54. package/dist/adapters/types.js.map +0 -1
  55. package/dist/auto-invest.d.ts +0 -23
  56. package/dist/auto-invest.d.ts.map +0 -1
  57. package/dist/auto-invest.js +0 -131
  58. package/dist/auto-invest.js.map +0 -1
  59. package/dist/auto-invest.test.d.ts +0 -2
  60. package/dist/auto-invest.test.d.ts.map +0 -1
  61. package/dist/auto-invest.test.js +0 -220
  62. package/dist/auto-invest.test.js.map +0 -1
  63. package/dist/constants.d.ts +0 -177
  64. package/dist/constants.d.ts.map +0 -1
  65. package/dist/constants.js +0 -135
  66. package/dist/constants.js.map +0 -1
  67. package/dist/contacts.d.ts +0 -25
  68. package/dist/contacts.d.ts.map +0 -1
  69. package/dist/contacts.js +0 -83
  70. package/dist/contacts.js.map +0 -1
  71. package/dist/contacts.test.d.ts +0 -2
  72. package/dist/contacts.test.d.ts.map +0 -1
  73. package/dist/contacts.test.js +0 -164
  74. package/dist/contacts.test.js.map +0 -1
  75. package/dist/errors.d.ts +0 -26
  76. package/dist/errors.d.ts.map +0 -1
  77. package/dist/errors.js +0 -81
  78. package/dist/errors.js.map +0 -1
  79. package/dist/errors.test.d.ts +0 -2
  80. package/dist/errors.test.d.ts.map +0 -1
  81. package/dist/errors.test.js +0 -48
  82. package/dist/errors.test.js.map +0 -1
  83. package/dist/gas/autoTopUp.d.ts +0 -18
  84. package/dist/gas/autoTopUp.d.ts.map +0 -1
  85. package/dist/gas/autoTopUp.js +0 -55
  86. package/dist/gas/autoTopUp.js.map +0 -1
  87. package/dist/gas/autoTopUp.test.d.ts +0 -2
  88. package/dist/gas/autoTopUp.test.d.ts.map +0 -1
  89. package/dist/gas/autoTopUp.test.js +0 -59
  90. package/dist/gas/autoTopUp.test.js.map +0 -1
  91. package/dist/gas/gasStation.d.ts +0 -23
  92. package/dist/gas/gasStation.d.ts.map +0 -1
  93. package/dist/gas/gasStation.js +0 -58
  94. package/dist/gas/gasStation.js.map +0 -1
  95. package/dist/gas/index.d.ts +0 -4
  96. package/dist/gas/index.d.ts.map +0 -1
  97. package/dist/gas/index.js +0 -4
  98. package/dist/gas/index.js.map +0 -1
  99. package/dist/gas/manager.d.ts +0 -24
  100. package/dist/gas/manager.d.ts.map +0 -1
  101. package/dist/gas/manager.js +0 -142
  102. package/dist/gas/manager.js.map +0 -1
  103. package/dist/gas/manager.test.d.ts +0 -2
  104. package/dist/gas/manager.test.d.ts.map +0 -1
  105. package/dist/gas/manager.test.js +0 -220
  106. package/dist/gas/manager.test.js.map +0 -1
  107. package/dist/gas/serialization.test.d.ts +0 -2
  108. package/dist/gas/serialization.test.d.ts.map +0 -1
  109. package/dist/gas/serialization.test.js +0 -47
  110. package/dist/gas/serialization.test.js.map +0 -1
  111. package/dist/index.d.ts.map +0 -1
  112. package/dist/invest.test.d.ts +0 -2
  113. package/dist/invest.test.d.ts.map +0 -1
  114. package/dist/invest.test.js +0 -256
  115. package/dist/invest.test.js.map +0 -1
  116. package/dist/portfolio.d.ts +0 -39
  117. package/dist/portfolio.d.ts.map +0 -1
  118. package/dist/portfolio.js +0 -201
  119. package/dist/portfolio.js.map +0 -1
  120. package/dist/portfolio.test.d.ts +0 -2
  121. package/dist/portfolio.test.d.ts.map +0 -1
  122. package/dist/portfolio.test.js +0 -301
  123. package/dist/portfolio.test.js.map +0 -1
  124. package/dist/protocols/cetus.d.ts +0 -73
  125. package/dist/protocols/cetus.d.ts.map +0 -1
  126. package/dist/protocols/cetus.js +0 -267
  127. package/dist/protocols/cetus.js.map +0 -1
  128. package/dist/protocols/cetus.test.d.ts +0 -2
  129. package/dist/protocols/cetus.test.d.ts.map +0 -1
  130. package/dist/protocols/cetus.test.js +0 -325
  131. package/dist/protocols/cetus.test.js.map +0 -1
  132. package/dist/protocols/navi.d.ts +0 -59
  133. package/dist/protocols/navi.d.ts.map +0 -1
  134. package/dist/protocols/navi.js +0 -945
  135. package/dist/protocols/navi.js.map +0 -1
  136. package/dist/protocols/navi.test.d.ts +0 -2
  137. package/dist/protocols/navi.test.d.ts.map +0 -1
  138. package/dist/protocols/navi.test.js +0 -339
  139. package/dist/protocols/navi.test.js.map +0 -1
  140. package/dist/protocols/protocolFee.d.ts +0 -17
  141. package/dist/protocols/protocolFee.d.ts.map +0 -1
  142. package/dist/protocols/protocolFee.js +0 -62
  143. package/dist/protocols/protocolFee.js.map +0 -1
  144. package/dist/protocols/protocolFee.test.d.ts +0 -2
  145. package/dist/protocols/protocolFee.test.d.ts.map +0 -1
  146. package/dist/protocols/protocolFee.test.js +0 -137
  147. package/dist/protocols/protocolFee.test.js.map +0 -1
  148. package/dist/protocols/sentinel.d.ts +0 -18
  149. package/dist/protocols/sentinel.d.ts.map +0 -1
  150. package/dist/protocols/sentinel.js +0 -188
  151. package/dist/protocols/sentinel.js.map +0 -1
  152. package/dist/protocols/sentinel.test.d.ts +0 -2
  153. package/dist/protocols/sentinel.test.d.ts.map +0 -1
  154. package/dist/protocols/sentinel.test.js +0 -199
  155. package/dist/protocols/sentinel.test.js.map +0 -1
  156. package/dist/protocols/yieldTracker.d.ts +0 -6
  157. package/dist/protocols/yieldTracker.d.ts.map +0 -1
  158. package/dist/protocols/yieldTracker.js +0 -29
  159. package/dist/protocols/yieldTracker.js.map +0 -1
  160. package/dist/safeguards/enforcer.d.ts +0 -18
  161. package/dist/safeguards/enforcer.d.ts.map +0 -1
  162. package/dist/safeguards/enforcer.js +0 -130
  163. package/dist/safeguards/enforcer.js.map +0 -1
  164. package/dist/safeguards/enforcer.test.d.ts +0 -2
  165. package/dist/safeguards/enforcer.test.d.ts.map +0 -1
  166. package/dist/safeguards/enforcer.test.js +0 -212
  167. package/dist/safeguards/enforcer.test.js.map +0 -1
  168. package/dist/safeguards/errors.d.ts +0 -24
  169. package/dist/safeguards/errors.d.ts.map +0 -1
  170. package/dist/safeguards/errors.js +0 -31
  171. package/dist/safeguards/errors.js.map +0 -1
  172. package/dist/safeguards/index.d.ts +0 -6
  173. package/dist/safeguards/index.d.ts.map +0 -1
  174. package/dist/safeguards/index.js +0 -4
  175. package/dist/safeguards/index.js.map +0 -1
  176. package/dist/safeguards/types.d.ts +0 -16
  177. package/dist/safeguards/types.d.ts.map +0 -1
  178. package/dist/safeguards/types.js +0 -13
  179. package/dist/safeguards/types.js.map +0 -1
  180. package/dist/strategy.d.ts +0 -22
  181. package/dist/strategy.d.ts.map +0 -1
  182. package/dist/strategy.js +0 -113
  183. package/dist/strategy.js.map +0 -1
  184. package/dist/strategy.test.d.ts +0 -2
  185. package/dist/strategy.test.d.ts.map +0 -1
  186. package/dist/strategy.test.js +0 -212
  187. package/dist/strategy.test.js.map +0 -1
  188. package/dist/t2000.d.ts +0 -219
  189. package/dist/t2000.d.ts.map +0 -1
  190. package/dist/t2000.integration.test.d.ts +0 -2
  191. package/dist/t2000.integration.test.d.ts.map +0 -1
  192. package/dist/t2000.integration.test.js +0 -954
  193. package/dist/t2000.integration.test.js.map +0 -1
  194. package/dist/t2000.js +0 -2416
  195. package/dist/t2000.js.map +0 -1
  196. package/dist/types.d.ts +0 -419
  197. package/dist/types.d.ts.map +0 -1
  198. package/dist/types.js +0 -2
  199. package/dist/types.js.map +0 -1
  200. package/dist/utils/format.d.ts +0 -22
  201. package/dist/utils/format.d.ts.map +0 -1
  202. package/dist/utils/format.js +0 -71
  203. package/dist/utils/format.js.map +0 -1
  204. package/dist/utils/format.test.d.ts +0 -2
  205. package/dist/utils/format.test.d.ts.map +0 -1
  206. package/dist/utils/format.test.js +0 -187
  207. package/dist/utils/format.test.js.map +0 -1
  208. package/dist/utils/hashcash.d.ts +0 -2
  209. package/dist/utils/hashcash.d.ts.map +0 -1
  210. package/dist/utils/hashcash.js +0 -27
  211. package/dist/utils/hashcash.js.map +0 -1
  212. package/dist/utils/hashcash.test.d.ts +0 -2
  213. package/dist/utils/hashcash.test.d.ts.map +0 -1
  214. package/dist/utils/hashcash.test.js +0 -40
  215. package/dist/utils/hashcash.test.js.map +0 -1
  216. package/dist/utils/retry.d.ts +0 -9
  217. package/dist/utils/retry.d.ts.map +0 -1
  218. package/dist/utils/retry.js +0 -47
  219. package/dist/utils/retry.js.map +0 -1
  220. package/dist/utils/simulate.d.ts +0 -15
  221. package/dist/utils/simulate.d.ts.map +0 -1
  222. package/dist/utils/simulate.js +0 -75
  223. package/dist/utils/simulate.js.map +0 -1
  224. package/dist/utils/simulate.test.d.ts +0 -2
  225. package/dist/utils/simulate.test.d.ts.map +0 -1
  226. package/dist/utils/simulate.test.js +0 -80
  227. package/dist/utils/simulate.test.js.map +0 -1
  228. package/dist/utils/sui.d.ts +0 -6
  229. package/dist/utils/sui.d.ts.map +0 -1
  230. package/dist/utils/sui.js +0 -28
  231. package/dist/utils/sui.js.map +0 -1
  232. package/dist/utils/sui.test.d.ts +0 -2
  233. package/dist/utils/sui.test.d.ts.map +0 -1
  234. package/dist/utils/sui.test.js +0 -58
  235. package/dist/utils/sui.test.js.map +0 -1
  236. package/dist/wallet/balance.d.ts +0 -4
  237. package/dist/wallet/balance.d.ts.map +0 -1
  238. package/dist/wallet/balance.js +0 -98
  239. package/dist/wallet/balance.js.map +0 -1
  240. package/dist/wallet/history.d.ts +0 -4
  241. package/dist/wallet/history.d.ts.map +0 -1
  242. package/dist/wallet/history.js +0 -38
  243. package/dist/wallet/history.js.map +0 -1
  244. package/dist/wallet/keyManager.d.ts +0 -9
  245. package/dist/wallet/keyManager.d.ts.map +0 -1
  246. package/dist/wallet/keyManager.js +0 -113
  247. package/dist/wallet/keyManager.js.map +0 -1
  248. package/dist/wallet/keyManager.test.d.ts +0 -2
  249. package/dist/wallet/keyManager.test.d.ts.map +0 -1
  250. package/dist/wallet/keyManager.test.js +0 -55
  251. package/dist/wallet/keyManager.test.js.map +0 -1
  252. package/dist/wallet/send.d.ts +0 -24
  253. package/dist/wallet/send.d.ts.map +0 -1
  254. package/dist/wallet/send.js +0 -95
  255. package/dist/wallet/send.js.map +0 -1
  256. package/dist/wallet/send.test.d.ts +0 -2
  257. package/dist/wallet/send.test.d.ts.map +0 -1
  258. package/dist/wallet/send.test.js +0 -69
  259. package/dist/wallet/send.test.js.map +0 -1
@@ -260,6 +260,28 @@ interface InvestEarnResult {
260
260
  gasCost: number;
261
261
  gasMethod: GasMethod;
262
262
  }
263
+ interface InvestRebalanceMove {
264
+ asset: string;
265
+ fromProtocol: string;
266
+ toProtocol: string;
267
+ amount: number;
268
+ oldApy: number;
269
+ newApy: number;
270
+ txDigests: string[];
271
+ gasCost: number;
272
+ }
273
+ interface InvestRebalanceResult {
274
+ executed: boolean;
275
+ moves: InvestRebalanceMove[];
276
+ totalGasCost: number;
277
+ skipped: Array<{
278
+ asset: string;
279
+ protocol: string;
280
+ apy: number;
281
+ bestApy: number;
282
+ reason: string;
283
+ }>;
284
+ }
263
285
  interface StrategyDefinition {
264
286
  name: string;
265
287
  allocations: Record<string, number>;
@@ -751,4 +773,4 @@ declare function attack(client: SuiJsonRpcClient, signer: Ed25519Keypair, sentin
751
773
  /** All registered protocol descriptors — used by the indexer for event classification */
752
774
  declare const allDescriptors: ProtocolDescriptor[];
753
775
 
754
- export { type RebalanceStep as $, type AutoInvestSchedule as A, type BalanceResponse as B, type ClaimRewardsResult as C, type DepositInfo as D, type EarningsResult as E, type FundStatusResult as F, type GasMethod as G, type HealthFactorResult as H, type InvestmentTrade as I, type AssetRates as J, CetusAdapter as K, type LendingAdapter as L, type MaxWithdrawResult as M, type GasReserve as N, type HealthInfo as O, type PendingReward$1 as P, NaviAdapter as Q, type RepayResult as R, type StrategyDefinition as S, type T2000Options as T, type PerpsAdapter as U, type PerpsPosition as V, type WithdrawResult as W, type PositionEntry as X, type PositionSide as Y, type ProtocolDescriptor as Z, ProtocolRegistry as _, type AutoInvestStatus as a, type SentinelVerdict as a0, SuilendAdapter as a1, type SwapQuote as a2, type TradePositionsResult as a3, type TradeResult as a4, allDescriptors as a5, descriptor$2 as a6, getSentinelInfo as a7, listSentinels as a8, descriptor$3 as a9, requestAttack as aa, attack as ab, descriptor as ac, settleAttack as ad, submitPrompt as ae, descriptor$1 as af, type SendResult as b, type TransactionRecord as c, type SwapAdapter as d, type SaveResult as e, type BorrowResult as f, type MaxBorrowResult as g, type SwapResult as h, type InvestResult as i, type InvestEarnResult as j, type StrategyBuyResult as k, type StrategySellResult as l, type StrategyRebalanceResult as m, type StrategyStatusResult as n, type AutoInvestRunResult as o, type PortfolioResult as p, type InvestmentPosition as q, type PositionsResult as r, type RatesResult as s, type LendingRates as t, type RebalanceResult as u, type SentinelAgent as v, type SentinelAttackResult as w, type AdapterCapability as x, type AdapterPositions as y, type AdapterTxResult as z };
776
+ export { type ProtocolDescriptor as $, type AutoInvestSchedule as A, type BalanceResponse as B, type ClaimRewardsResult as C, type DepositInfo as D, type EarningsResult as E, type FundStatusResult as F, type GasMethod as G, type HealthFactorResult as H, type InvestmentTrade as I, type AdapterTxResult as J, type AssetRates as K, type LendingAdapter as L, type MaxWithdrawResult as M, CetusAdapter as N, type GasReserve as O, type PendingReward$1 as P, type HealthInfo as Q, type RepayResult as R, type StrategyDefinition as S, type T2000Options as T, type InvestRebalanceMove as U, NaviAdapter as V, type WithdrawResult as W, type PerpsAdapter as X, type PerpsPosition as Y, type PositionEntry as Z, type PositionSide as _, type AutoInvestStatus as a, ProtocolRegistry as a0, type RebalanceStep as a1, type SentinelVerdict as a2, SuilendAdapter as a3, type SwapQuote as a4, type TradePositionsResult as a5, type TradeResult as a6, allDescriptors as a7, descriptor$2 as a8, getSentinelInfo as a9, listSentinels as aa, descriptor$3 as ab, requestAttack as ac, attack as ad, descriptor as ae, settleAttack as af, submitPrompt as ag, descriptor$1 as ah, type SendResult as b, type TransactionRecord as c, type SwapAdapter as d, type SaveResult as e, type BorrowResult as f, type MaxBorrowResult as g, type SwapResult as h, type InvestResult as i, type InvestEarnResult as j, type InvestRebalanceResult as k, type StrategyBuyResult as l, type StrategySellResult as m, type StrategyRebalanceResult as n, type StrategyStatusResult as o, type AutoInvestRunResult as p, type PortfolioResult as q, type InvestmentPosition as r, type PositionsResult as s, type RatesResult as t, type LendingRates as u, type RebalanceResult as v, type SentinelAgent as w, type SentinelAttackResult as x, type AdapterCapability as y, type AdapterPositions as z };
package/dist/index.cjs CHANGED
@@ -4834,7 +4834,16 @@ To sell investment: t2000 invest sell ${params.amount} ${fromAsset}`,
4834
4834
  if (depositAmount <= 0) {
4835
4835
  throw new T2000Error("INSUFFICIENT_BALANCE", `No ${params.asset} available to deposit (wallet: ${walletAmount}, gas reserve: ${gasReserve})`);
4836
4836
  }
4837
- const { adapter, rate } = await this.registry.bestSaveRate(params.asset);
4837
+ let adapter;
4838
+ let rate;
4839
+ if (params.protocol) {
4840
+ const specific = this.registry.getLending(params.protocol);
4841
+ if (!specific) throw new T2000Error("PROTOCOL_UNAVAILABLE", `Protocol ${params.protocol} not found`);
4842
+ adapter = specific;
4843
+ rate = await specific.getRates(params.asset);
4844
+ } else {
4845
+ ({ adapter, rate } = await this.registry.bestSaveRate(params.asset));
4846
+ }
4838
4847
  const gasResult = await executeWithGas(this.client, this.keypair, async () => {
4839
4848
  const { tx } = await adapter.buildSaveTx(this._address, depositAmount, params.asset);
4840
4849
  return tx;
@@ -4884,6 +4893,98 @@ To sell investment: t2000 invest sell ${params.amount} ${fromAsset}`,
4884
4893
  gasMethod: gasResult.gasMethod
4885
4894
  };
4886
4895
  }
4896
+ // -- Invest Rebalance --
4897
+ async investRebalance(opts = {}) {
4898
+ this.enforcer.assertNotLocked();
4899
+ const minDiff = opts.minYieldDiff ?? 0.1;
4900
+ const positions = this.portfolio.getPositions().filter((p) => p.earning && p.earningProtocol);
4901
+ if (positions.length === 0) {
4902
+ return { executed: false, moves: [], totalGasCost: 0, skipped: [] };
4903
+ }
4904
+ const moves = [];
4905
+ const skipped = [];
4906
+ let totalGasCost = 0;
4907
+ for (const pos of positions) {
4908
+ const currentProtocol = pos.earningProtocol;
4909
+ let best;
4910
+ try {
4911
+ best = await this.registry.bestSaveRate(pos.asset);
4912
+ } catch {
4913
+ const currentApy2 = pos.earningApy ?? 0;
4914
+ skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy2, bestApy: currentApy2, reason: "no_rates" });
4915
+ continue;
4916
+ }
4917
+ let currentApy = pos.earningApy ?? 0;
4918
+ try {
4919
+ const currentAdapter = this.registry.getLending(currentProtocol);
4920
+ if (currentAdapter) {
4921
+ const liveRate = await currentAdapter.getRates(pos.asset);
4922
+ currentApy = liveRate.saveApy;
4923
+ }
4924
+ } catch {
4925
+ }
4926
+ const apyGain = best.rate.saveApy - currentApy;
4927
+ if (best.adapter.id === currentProtocol || apyGain <= 0) {
4928
+ skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: "already_best" });
4929
+ continue;
4930
+ }
4931
+ if (apyGain < minDiff) {
4932
+ skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: "below_threshold" });
4933
+ continue;
4934
+ }
4935
+ if (opts.dryRun) {
4936
+ moves.push({
4937
+ asset: pos.asset,
4938
+ fromProtocol: this.registry.getLending(currentProtocol)?.name ?? currentProtocol,
4939
+ toProtocol: best.adapter.name,
4940
+ amount: pos.totalAmount,
4941
+ oldApy: currentApy,
4942
+ newApy: best.rate.saveApy,
4943
+ txDigests: [],
4944
+ gasCost: 0
4945
+ });
4946
+ continue;
4947
+ }
4948
+ const txDigests = [];
4949
+ let moveGasCost = 0;
4950
+ const fromAdapter = this.registry.getLending(currentProtocol);
4951
+ if (!fromAdapter) {
4952
+ skipped.push({ asset: pos.asset, protocol: currentProtocol, apy: currentApy, bestApy: best.rate.saveApy, reason: "protocol_unavailable" });
4953
+ continue;
4954
+ }
4955
+ const withdrawResult = await executeWithGas(this.client, this.keypair, async () => {
4956
+ const result = await fromAdapter.buildWithdrawTx(this._address, pos.totalAmount, pos.asset);
4957
+ return result.tx;
4958
+ });
4959
+ txDigests.push(withdrawResult.digest);
4960
+ moveGasCost += withdrawResult.gasCostSui;
4961
+ const depositResult = await executeWithGas(this.client, this.keypair, async () => {
4962
+ const assetInfo = SUPPORTED_ASSETS[pos.asset];
4963
+ const balance = await this.client.getBalance({ owner: this._address, coinType: assetInfo.type });
4964
+ const available = Number(balance.totalBalance) / 10 ** assetInfo.decimals;
4965
+ const gasReserve = pos.asset === "SUI" ? GAS_RESERVE_MIN : 0;
4966
+ const depositAmount = Math.max(0, available - gasReserve);
4967
+ const { tx } = await best.adapter.buildSaveTx(this._address, depositAmount, pos.asset);
4968
+ return tx;
4969
+ });
4970
+ txDigests.push(depositResult.digest);
4971
+ moveGasCost += depositResult.gasCostSui;
4972
+ this.portfolio.recordUnearn(pos.asset);
4973
+ this.portfolio.recordEarn(pos.asset, best.adapter.id, best.rate.saveApy);
4974
+ moves.push({
4975
+ asset: pos.asset,
4976
+ fromProtocol: fromAdapter.name,
4977
+ toProtocol: best.adapter.name,
4978
+ amount: pos.totalAmount,
4979
+ oldApy: currentApy,
4980
+ newApy: best.rate.saveApy,
4981
+ txDigests,
4982
+ gasCost: moveGasCost
4983
+ });
4984
+ totalGasCost += moveGasCost;
4985
+ }
4986
+ return { executed: !opts.dryRun && moves.length > 0, moves, totalGasCost, skipped };
4987
+ }
4887
4988
  // -- Claim Rewards --
4888
4989
  async getPendingRewards() {
4889
4990
  const adapters = this.registry.listLending();