@eulerxyz/euler-v2-sdk 0.1.3-beta → 0.2.1-beta

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 (237) hide show
  1. package/README.md +24 -25
  2. package/dist/src/entities/Account.d.ts +50 -49
  3. package/dist/src/entities/Account.d.ts.map +1 -1
  4. package/dist/src/entities/Account.js +80 -66
  5. package/dist/src/entities/Account.js.map +1 -1
  6. package/dist/src/entities/ERC4626Vault.d.ts +6 -5
  7. package/dist/src/entities/ERC4626Vault.d.ts.map +1 -1
  8. package/dist/src/entities/ERC4626Vault.js +13 -6
  9. package/dist/src/entities/ERC4626Vault.js.map +1 -1
  10. package/dist/src/entities/EVault.d.ts +30 -15
  11. package/dist/src/entities/EVault.d.ts.map +1 -1
  12. package/dist/src/entities/EVault.js +66 -14
  13. package/dist/src/entities/EVault.js.map +1 -1
  14. package/dist/src/entities/EulerEarn.d.ts +3 -0
  15. package/dist/src/entities/EulerEarn.d.ts.map +1 -1
  16. package/dist/src/entities/EulerEarn.js +12 -3
  17. package/dist/src/entities/EulerEarn.js.map +1 -1
  18. package/dist/src/entities/EulerLabels.d.ts +74 -0
  19. package/dist/src/entities/EulerLabels.d.ts.map +1 -1
  20. package/dist/src/entities/Portfolio.d.ts +20 -19
  21. package/dist/src/entities/Portfolio.d.ts.map +1 -1
  22. package/dist/src/entities/Portfolio.js +34 -17
  23. package/dist/src/entities/Portfolio.js.map +1 -1
  24. package/dist/src/entities/Wallet.d.ts +1 -0
  25. package/dist/src/entities/Wallet.d.ts.map +1 -1
  26. package/dist/src/entities/Wallet.js +2 -2
  27. package/dist/src/entities/Wallet.js.map +1 -1
  28. package/dist/src/index.d.ts +4 -1
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +4 -1
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/plugins/keyring/keyringPlugin.d.ts.map +1 -1
  33. package/dist/src/plugins/keyring/keyringPlugin.js +59 -10
  34. package/dist/src/plugins/keyring/keyringPlugin.js.map +1 -1
  35. package/dist/src/plugins/pyth/pythPlugin.d.ts.map +1 -1
  36. package/dist/src/plugins/pyth/pythPlugin.js +132 -11
  37. package/dist/src/plugins/pyth/pythPlugin.js.map +1 -1
  38. package/dist/src/plugins/types.d.ts +4 -7
  39. package/dist/src/plugins/types.d.ts.map +1 -1
  40. package/dist/src/plugins/types.js.map +1 -1
  41. package/dist/src/sdk/buildSDK.d.ts +10 -4
  42. package/dist/src/sdk/buildSDK.d.ts.map +1 -1
  43. package/dist/src/sdk/buildSDK.js +359 -110
  44. package/dist/src/sdk/buildSDK.js.map +1 -1
  45. package/dist/src/sdk/config.d.ts +74 -0
  46. package/dist/src/sdk/config.d.ts.map +1 -0
  47. package/dist/src/sdk/config.js +187 -0
  48. package/dist/src/sdk/config.js.map +1 -0
  49. package/dist/src/sdk/defaultConfig.d.ts +5 -2
  50. package/dist/src/sdk/defaultConfig.d.ts.map +1 -1
  51. package/dist/src/sdk/defaultConfig.js +21 -18
  52. package/dist/src/sdk/defaultConfig.js.map +1 -1
  53. package/dist/src/sdk/sdk.d.ts +4 -3
  54. package/dist/src/sdk/sdk.d.ts.map +1 -1
  55. package/dist/src/sdk/sdk.js +2 -4
  56. package/dist/src/sdk/sdk.js.map +1 -1
  57. package/dist/src/services/accountService/accountService.d.ts.map +1 -1
  58. package/dist/src/services/accountService/accountService.js +10 -7
  59. package/dist/src/services/accountService/accountService.js.map +1 -1
  60. package/dist/src/services/accountService/accountServiceConfig.d.ts +1 -1
  61. package/dist/src/services/accountService/accountServiceConfig.d.ts.map +1 -1
  62. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.d.ts +2 -2
  63. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.d.ts.map +1 -1
  64. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.js +22 -17
  65. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.js.map +1 -1
  66. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts +1 -1
  67. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts.map +1 -1
  68. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js +16 -17
  69. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js.map +1 -1
  70. package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.d.ts.map +1 -1
  71. package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.js +58 -53
  72. package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.js.map +1 -1
  73. package/dist/src/services/deploymentService/deploymentService.d.ts +1 -0
  74. package/dist/src/services/deploymentService/deploymentService.d.ts.map +1 -1
  75. package/dist/src/services/deploymentService/deploymentService.js.map +1 -1
  76. package/dist/src/services/eulerLabelsService/eulerLabelsService.d.ts +18 -1
  77. package/dist/src/services/eulerLabelsService/eulerLabelsService.d.ts.map +1 -1
  78. package/dist/src/services/eulerLabelsService/eulerLabelsService.js +373 -30
  79. package/dist/src/services/eulerLabelsService/eulerLabelsService.js.map +1 -1
  80. package/dist/src/services/executionService/encode.d.ts +15 -11
  81. package/dist/src/services/executionService/encode.d.ts.map +1 -1
  82. package/dist/src/services/executionService/encode.js +242 -23
  83. package/dist/src/services/executionService/encode.js.map +1 -1
  84. package/dist/src/services/executionService/execute.d.ts +2 -1
  85. package/dist/src/services/executionService/execute.d.ts.map +1 -1
  86. package/dist/src/services/executionService/execute.js +10 -6
  87. package/dist/src/services/executionService/execute.js.map +1 -1
  88. package/dist/src/services/executionService/executionService.d.ts +45 -7
  89. package/dist/src/services/executionService/executionService.d.ts.map +1 -1
  90. package/dist/src/services/executionService/executionService.js +325 -20
  91. package/dist/src/services/executionService/executionService.js.map +1 -1
  92. package/dist/src/services/executionService/executionServiceTypes.d.ts +109 -1
  93. package/dist/src/services/executionService/executionServiceTypes.d.ts.map +1 -1
  94. package/dist/src/services/executionService/executionServiceTypes.js.map +1 -1
  95. package/dist/src/services/executionService/index.d.ts +1 -1
  96. package/dist/src/services/executionService/index.d.ts.map +1 -1
  97. package/dist/src/services/executionService/index.js.map +1 -1
  98. package/dist/src/services/executionService/simulate.d.ts.map +1 -1
  99. package/dist/src/services/executionService/simulate.js +3 -2
  100. package/dist/src/services/executionService/simulate.js.map +1 -1
  101. package/dist/src/services/intrinsicApyService/adapters/intrinsicApyV3Adapter/intrinsicApyV3AdapterTypes.d.ts +1 -1
  102. package/dist/src/services/intrinsicApyService/adapters/intrinsicApyV3Adapter/intrinsicApyV3AdapterTypes.d.ts.map +1 -1
  103. package/dist/src/services/oracleAdapterService/oracleAdapterService.d.ts +5 -0
  104. package/dist/src/services/oracleAdapterService/oracleAdapterService.d.ts.map +1 -1
  105. package/dist/src/services/oracleAdapterService/oracleAdapterService.js +38 -11
  106. package/dist/src/services/oracleAdapterService/oracleAdapterService.js.map +1 -1
  107. package/dist/src/services/priceService/backendClient.d.ts +7 -11
  108. package/dist/src/services/priceService/backendClient.d.ts.map +1 -1
  109. package/dist/src/services/priceService/backendClient.js +7 -14
  110. package/dist/src/services/priceService/backendClient.js.map +1 -1
  111. package/dist/src/services/priceService/index.d.ts +2 -2
  112. package/dist/src/services/priceService/index.d.ts.map +1 -1
  113. package/dist/src/services/priceService/index.js +1 -1
  114. package/dist/src/services/priceService/index.js.map +1 -1
  115. package/dist/src/services/priceService/priceService.d.ts +21 -18
  116. package/dist/src/services/priceService/priceService.d.ts.map +1 -1
  117. package/dist/src/services/priceService/priceService.js +61 -101
  118. package/dist/src/services/priceService/priceService.js.map +1 -1
  119. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts +4 -1
  120. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts.map +1 -1
  121. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js +20 -4
  122. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js.map +1 -1
  123. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts.map +1 -1
  124. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js +5 -2
  125. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js.map +1 -1
  126. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts +2 -0
  127. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts.map +1 -1
  128. package/dist/src/services/rewardsService/rewardsService.d.ts +6 -1
  129. package/dist/src/services/rewardsService/rewardsService.d.ts.map +1 -1
  130. package/dist/src/services/rewardsService/rewardsService.js +128 -3
  131. package/dist/src/services/rewardsService/rewardsService.js.map +1 -1
  132. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts +5 -3
  133. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts.map +1 -1
  134. package/dist/src/services/swapService/swapService.d.ts +4 -6
  135. package/dist/src/services/swapService/swapService.d.ts.map +1 -1
  136. package/dist/src/services/swapService/swapService.js +90 -99
  137. package/dist/src/services/swapService/swapService.js.map +1 -1
  138. package/dist/src/services/swapService/swapVerification.d.ts +28 -0
  139. package/dist/src/services/swapService/swapVerification.d.ts.map +1 -0
  140. package/dist/src/services/swapService/swapVerification.js +138 -0
  141. package/dist/src/services/swapService/swapVerification.js.map +1 -0
  142. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.d.ts +1 -1
  143. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.d.ts.map +1 -1
  144. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.js +6 -13
  145. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.js.map +1 -1
  146. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts +1 -1
  147. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts.map +1 -1
  148. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js +69 -51
  149. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js.map +1 -1
  150. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.d.ts +5 -2
  151. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.d.ts.map +1 -1
  152. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.js +50 -18
  153. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.js.map +1 -1
  154. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts +1 -1
  155. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts.map +1 -1
  156. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js +106 -111
  157. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js.map +1 -1
  158. package/dist/src/services/vaults/eVaultService/eVaultService.d.ts +4 -4
  159. package/dist/src/services/vaults/eVaultService/eVaultService.d.ts.map +1 -1
  160. package/dist/src/services/vaults/eVaultService/eVaultService.js +56 -57
  161. package/dist/src/services/vaults/eVaultService/eVaultService.js.map +1 -1
  162. package/dist/src/services/vaults/eVaultService/eVaultServiceConfig.d.ts +1 -1
  163. package/dist/src/services/vaults/eVaultService/eVaultServiceConfig.d.ts.map +1 -1
  164. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.d.ts +1 -1
  165. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.d.ts.map +1 -1
  166. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.js +22 -21
  167. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.js.map +1 -1
  168. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.d.ts.map +1 -1
  169. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js +27 -32
  170. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js.map +1 -1
  171. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.d.ts +1 -1
  172. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.d.ts.map +1 -1
  173. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.js +113 -72
  174. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.js.map +1 -1
  175. package/dist/src/services/vaults/eulerEarnService/eulerEarnService.d.ts +5 -5
  176. package/dist/src/services/vaults/eulerEarnService/eulerEarnService.d.ts.map +1 -1
  177. package/dist/src/services/vaults/eulerEarnService/eulerEarnService.js +30 -28
  178. package/dist/src/services/vaults/eulerEarnService/eulerEarnService.js.map +1 -1
  179. package/dist/src/services/vaults/eulerEarnService/eulerEarnServiceConfig.d.ts +1 -1
  180. package/dist/src/services/vaults/eulerEarnService/eulerEarnServiceConfig.d.ts.map +1 -1
  181. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.d.ts +1 -1
  182. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.d.ts.map +1 -1
  183. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.js +10 -7
  184. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.js.map +1 -1
  185. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.d.ts.map +1 -1
  186. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.js +6 -8
  187. package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.js.map +1 -1
  188. package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.d.ts +2 -2
  189. package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.d.ts.map +1 -1
  190. package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.js +13 -18
  191. package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.js.map +1 -1
  192. package/dist/src/services/vaults/vaultMetaService/adapters/VaultTypeV3Adapter.d.ts +1 -1
  193. package/dist/src/services/vaults/vaultMetaService/adapters/VaultTypeV3Adapter.d.ts.map +1 -1
  194. package/dist/src/services/vaults/vaultMetaService/vaultMetaService.d.ts +3 -3
  195. package/dist/src/services/vaults/vaultMetaService/vaultMetaService.d.ts.map +1 -1
  196. package/dist/src/services/vaults/vaultMetaService/vaultMetaService.js +31 -32
  197. package/dist/src/services/vaults/vaultMetaService/vaultMetaService.js.map +1 -1
  198. package/dist/src/services/walletService/adapters/walletOnchainAdapter.d.ts +5 -1
  199. package/dist/src/services/walletService/adapters/walletOnchainAdapter.d.ts.map +1 -1
  200. package/dist/src/services/walletService/adapters/walletOnchainAdapter.js +181 -40
  201. package/dist/src/services/walletService/adapters/walletOnchainAdapter.js.map +1 -1
  202. package/dist/src/services/walletService/walletService.d.ts +1 -1
  203. package/dist/src/services/walletService/walletService.d.ts.map +1 -1
  204. package/dist/src/services/walletService/walletService.js +4 -3
  205. package/dist/src/services/walletService/walletService.js.map +1 -1
  206. package/dist/src/utils/accountComputations.d.ts +14 -13
  207. package/dist/src/utils/accountComputations.d.ts.map +1 -1
  208. package/dist/src/utils/accountComputations.js +59 -37
  209. package/dist/src/utils/accountComputations.js.map +1 -1
  210. package/dist/src/utils/buildQuery.d.ts +1 -0
  211. package/dist/src/utils/buildQuery.d.ts.map +1 -1
  212. package/dist/src/utils/buildQuery.js +1 -1
  213. package/dist/src/utils/buildQuery.js.map +1 -1
  214. package/dist/src/utils/entityDiagnostics.d.ts +75 -12
  215. package/dist/src/utils/entityDiagnostics.d.ts.map +1 -1
  216. package/dist/src/utils/entityDiagnostics.js +85 -19
  217. package/dist/src/utils/entityDiagnostics.js.map +1 -1
  218. package/dist/src/utils/eulerLabels.d.ts +34 -0
  219. package/dist/src/utils/eulerLabels.d.ts.map +1 -0
  220. package/dist/src/utils/eulerLabels.js +156 -0
  221. package/dist/src/utils/eulerLabels.js.map +1 -0
  222. package/dist/src/utils/healthCheckSets.d.ts +14 -0
  223. package/dist/src/utils/healthCheckSets.d.ts.map +1 -0
  224. package/dist/src/utils/healthCheckSets.js +174 -0
  225. package/dist/src/utils/healthCheckSets.js.map +1 -0
  226. package/dist/src/utils/normalization.d.ts +10 -4
  227. package/dist/src/utils/normalization.d.ts.map +1 -1
  228. package/dist/src/utils/normalization.js +38 -11
  229. package/dist/src/utils/normalization.js.map +1 -1
  230. package/dist/src/utils/oracle.d.ts.map +1 -1
  231. package/dist/src/utils/oracle.js +12 -1
  232. package/dist/src/utils/oracle.js.map +1 -1
  233. package/dist/src/utils/parsing.d.ts +2 -2
  234. package/dist/src/utils/parsing.d.ts.map +1 -1
  235. package/dist/src/utils/parsing.js +12 -22
  236. package/dist/src/utils/parsing.js.map +1 -1
  237. package/package.json +1 -1
@@ -9,6 +9,8 @@ import * as encodeHelpers from "./encode.js";
9
9
  import { isEVCBatchOperation } from "./executionServiceTypes.js";
10
10
  import { executeTransactionPlan, } from "./execute.js";
11
11
  import { deriveStateOverrides, estimateGasForTransactionPlan, simulateTransactionPlan, } from "./simulate.js";
12
+ import { adjustForInterest, getSwapInputAmount, } from "../swapService/swapVerification.js";
13
+ import { SwapperMode } from "../swapService/swapServiceTypes.js";
12
14
  const TOKENS_REQUIRING_ZERO_APPROVAL_RESET = {
13
15
  1: [getAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7")],
14
16
  };
@@ -26,6 +28,118 @@ function cloneBatchEntries(entries) {
26
28
  ? { type: "operation", name: entry.name, items: [...entry.items] }
27
29
  : entry);
28
30
  }
31
+ function hasSuppliedPosition(position) {
32
+ return position.assets > 0n || position.shares > 0n;
33
+ }
34
+ function getStateTransition(item) {
35
+ try {
36
+ const decoded = decodeFunctionData({
37
+ abi: ethereumVaultConnectorAbi,
38
+ data: item.data,
39
+ });
40
+ if (decoded.functionName === "enableCollateral" ||
41
+ decoded.functionName === "disableCollateral" ||
42
+ decoded.functionName === "enableController") {
43
+ const [account, vault] = decoded.args;
44
+ return {
45
+ kind: decoded.functionName === "enableController"
46
+ ? "controller"
47
+ : "collateral",
48
+ action: decoded.functionName.startsWith("enable")
49
+ ? "enable"
50
+ : "disable",
51
+ account,
52
+ vault,
53
+ };
54
+ }
55
+ }
56
+ catch { }
57
+ try {
58
+ const decoded = decodeFunctionData({
59
+ abi: eVaultAbi,
60
+ data: item.data,
61
+ });
62
+ if (decoded.functionName === "disableController") {
63
+ return {
64
+ kind: "controller",
65
+ action: "disable",
66
+ account: item.onBehalfOfAccount,
67
+ vault: item.targetContract,
68
+ };
69
+ }
70
+ }
71
+ catch { }
72
+ return undefined;
73
+ }
74
+ function stateTransitionKey(transition) {
75
+ return `${transition.kind}:${getAddress(transition.account)}:${getAddress(transition.vault)}`;
76
+ }
77
+ function normalizeEVCStateTransitions(entries) {
78
+ const entryRefs = entries.map((entry) => isEVCBatchOperation(entry)
79
+ ? entry.items.map((item) => ({
80
+ item,
81
+ remove: false,
82
+ transition: getStateTransition(item),
83
+ }))
84
+ : [
85
+ {
86
+ item: entry,
87
+ remove: false,
88
+ transition: getStateTransition(entry),
89
+ },
90
+ ]);
91
+ const refs = entryRefs.flat();
92
+ const collateralStacks = new Map();
93
+ const controllerLast = new Map();
94
+ for (const ref of refs) {
95
+ const transition = ref.transition;
96
+ if (!transition)
97
+ continue;
98
+ const key = stateTransitionKey(transition);
99
+ if (transition.kind === "collateral") {
100
+ const stack = collateralStacks.get(key) ?? [];
101
+ const previous = stack[stack.length - 1];
102
+ if (previous?.action === transition.action) {
103
+ ref.remove = true;
104
+ }
105
+ else if (previous) {
106
+ previous.ref.remove = true;
107
+ ref.remove = true;
108
+ stack.pop();
109
+ }
110
+ else {
111
+ stack.push({ action: transition.action, ref });
112
+ }
113
+ collateralStacks.set(key, stack);
114
+ continue;
115
+ }
116
+ const previous = controllerLast.get(key);
117
+ if (previous?.action === transition.action) {
118
+ ref.remove = true;
119
+ }
120
+ else {
121
+ controllerLast.set(key, { action: transition.action });
122
+ }
123
+ }
124
+ const result = [];
125
+ entries.forEach((entry, index) => {
126
+ const refsForEntry = entryRefs[index] ?? [];
127
+ if (isEVCBatchOperation(entry)) {
128
+ const items = refsForEntry
129
+ .filter((ref) => !ref.remove)
130
+ .map((ref) => ref.item);
131
+ if (items.length > 0) {
132
+ result.push({ type: "operation", name: entry.name, items });
133
+ }
134
+ return;
135
+ }
136
+ const ref = refsForEntry[0];
137
+ if (ref && !ref.remove) {
138
+ result.push(ref.item);
139
+ }
140
+ });
141
+ return result;
142
+ }
29
143
  const WAD = 10n ** 18n;
30
144
  // TODO explain how this service is coupled to the concrete abis of ERC4626, permit2 and EVK.
31
145
  // this is a helper service, not a generic one.
@@ -39,6 +153,7 @@ export class ExecutionService {
39
153
  rewardsService;
40
154
  intrinsicApyService;
41
155
  eulerLabelsService;
156
+ processPlugins;
42
157
  constructor(deploymentService, walletService, providerService, vaultMetaService, priceService, rewardsService, intrinsicApyService, eulerLabelsService) {
43
158
  this.deploymentService = deploymentService;
44
159
  this.walletService = walletService;
@@ -73,17 +188,24 @@ export class ExecutionService {
73
188
  setPlugins(plugins) {
74
189
  this.plugins = plugins;
75
190
  }
191
+ setPluginProcessor(processPlugins) {
192
+ this.processPlugins = processPlugins;
193
+ }
76
194
  /** Derive storage overrides needed to simulate the plan against the current account state. */
77
195
  async deriveStateOverrides(chainId, account, transactionPlan, options) {
78
196
  return deriveStateOverrides(this.getSimulationContext(), chainId, account, transactionPlan, options);
79
197
  }
80
198
  /** Simulate the full transaction plan, including approval resolution and plugin-aware batch execution. */
81
199
  async simulateTransactionPlan(chainId, account, transactionPlan, options) {
82
- return simulateTransactionPlan(this.getSimulationContext(), chainId, account, transactionPlan, options);
200
+ const processedPlan = await this.processPlanPlugins(transactionPlan, account, chainId);
201
+ const owner = this.getAccountOwner(account);
202
+ return simulateTransactionPlan(this.getSimulationContext(), chainId, owner, processedPlan, options);
83
203
  }
84
204
  /** Estimate gas for the full transaction plan after applying the same simulation pipeline used for execution. */
85
205
  async estimateGasForTransactionPlan(chainId, account, transactionPlan, options) {
86
- return estimateGasForTransactionPlan(this.getSimulationContext(), chainId, account, transactionPlan, options);
206
+ const processedPlan = await this.processPlanPlugins(transactionPlan, account, chainId);
207
+ const owner = this.getAccountOwner(account);
208
+ return estimateGasForTransactionPlan(this.getSimulationContext(), chainId, owner, processedPlan, options);
87
209
  }
88
210
  /** Execute a transaction plan using caller-provided signing and send callbacks. */
89
211
  async executeTransactionPlan(args) {
@@ -93,6 +215,7 @@ export class ExecutionService {
93
215
  }
94
216
  const helperArgs = {
95
217
  ...args,
218
+ plan: await this.processPlanPlugins(args.plan, args.account, args.chainId),
96
219
  executionService: this,
97
220
  deploymentService: this.deploymentService,
98
221
  providerService,
@@ -112,6 +235,14 @@ export class ExecutionService {
112
235
  describeBatch: (batch) => this.describeBatch(batch),
113
236
  };
114
237
  }
238
+ async processPlanPlugins(plan, account, chainId) {
239
+ return this.processPlugins
240
+ ? this.processPlugins(plan, account, chainId)
241
+ : plan;
242
+ }
243
+ getAccountOwner(account) {
244
+ return typeof account === "string" ? account : account.owner;
245
+ }
115
246
  getCoreAddresses(chainId) {
116
247
  return this.deploymentService.getDeployment(chainId).addresses.coreAddrs;
117
248
  }
@@ -382,6 +513,19 @@ export class ExecutionService {
382
513
  encodeSwapFromWallet(args) {
383
514
  return encodeHelpers.encodeSwapFromWallet(args);
384
515
  }
516
+ encodeSwapAndBorrowFromWallet(args) {
517
+ const { evc } = this.getCoreAddresses(args.chainId);
518
+ return encodeHelpers.encodeSwapAndBorrowFromWallet(evc, args);
519
+ }
520
+ encodeSwapAndRepayFromWallet(args) {
521
+ return encodeHelpers.encodeSwapAndRepayFromWallet(args);
522
+ }
523
+ encodeWithdrawAndSwap(args) {
524
+ return encodeHelpers.encodeWithdrawAndSwap(args);
525
+ }
526
+ encodeRedeemAndSwap(args) {
527
+ return encodeHelpers.encodeRedeemAndSwap(args);
528
+ }
385
529
  /**
386
530
  * Encodes EVC batch items for swapping collateral: withdraw from vaultIn → swap → verify/skim to receiver; optional enable/disable collateral.
387
531
  * Swap quote should come from swapService.fetchDepositQuote() or match the same structure (verify type skimMin).
@@ -514,7 +658,7 @@ export class ExecutionService {
514
658
  * @param args.spender - Address that will be allowed to transfer the token (e.g. vault or Permit2)
515
659
  * @param args.nonce - Unique nonce for this permit (e.g. from Permit2 nonce(owner, token, spender))
516
660
  * @param args.sigDeadline - Signature deadline (defaults to now + 1 hour if omitted)
517
- * @param args.expiration - Permit expiration (defaults to maxUint48 if omitted)
661
+ * @param args.expiration - Permit expiration (defaults to now + 1 hour if omitted)
518
662
  * @returns EIP-712 typed data (domain, types, primaryType, message) for signing
519
663
  */
520
664
  getPermit2TypedData(args) {
@@ -641,7 +785,13 @@ export class ExecutionService {
641
785
  }
642
786
  }
643
787
  }
644
- return [...approvalByKey.values(), ...executableItems];
788
+ const optimizedExecutableItems = executableItems.flatMap((item) => {
789
+ if (item.type !== "evcBatch")
790
+ return [item];
791
+ const items = normalizeEVCStateTransitions(item.items);
792
+ return items.length > 0 ? [{ type: "evcBatch", items }] : [];
793
+ });
794
+ return [...approvalByKey.values(), ...optimizedExecutableItems];
645
795
  }
646
796
  /**
647
797
  * Appends a raw batch item to the last EVC batch in the plan, or creates one.
@@ -721,11 +871,11 @@ export class ExecutionService {
721
871
  * @param args.chainId - Chain ID (used to resolve Permit2 address when usePermit2 is true)
722
872
  * @param args.wallet - Wallet entity with token balances and allowances (assetForVault, assetForPermit2, etc.)
723
873
  * @param args.usePermit2 - If true, prefer Permit2 path (approve Permit2 + sign PermitSingle) when allowance is insufficient (default true)
724
- * @param args.unlimitedApproval - If true, approval/permit amounts use maxUint256/maxUint160 (default true)
874
+ * @param args.unlimitedApproval - If true, direct approvals and Permit2 signed amounts use maxUint256/maxUint160 (default false). Token approvals to Permit2 use maxUint256.
725
875
  * @returns The same plan array with requiredApproval[].resolved populated (approve and/or permit2 data to sign)
726
876
  */
727
877
  resolveRequiredApprovalsWithWallet(args) {
728
- const { plan, wallet, chainId, usePermit2 = true, unlimitedApproval = true, } = args;
878
+ const { plan, wallet, chainId, usePermit2 = true, unlimitedApproval = false, } = args;
729
879
  const deployment = this.deploymentService.getDeployment(chainId);
730
880
  const permit2 = deployment.addresses.coreAddrs.permit2;
731
881
  for (const item of plan) {
@@ -766,7 +916,7 @@ export class ExecutionService {
766
916
  if (!walletAsset || !allowances) {
767
917
  if (usePermit2) {
768
918
  // Need approval to permit2 and permit2 signature
769
- resolvedItems.push(makeApprove(permit2, unlimitedApproval ? maxUint256 : amount));
919
+ resolvedItems.push(makeApprove(permit2, maxUint256));
770
920
  resolvedItems.push(makePermit2(spender, unlimitedApproval ? maxUint160 : amount));
771
921
  }
772
922
  else {
@@ -793,7 +943,7 @@ export class ExecutionService {
793
943
  }
794
944
  // If assetForPermit2 is insufficient, we need both approval and permit2 signature
795
945
  if (!hasSufficientPermit2Allowance) {
796
- addApproveWithOptionalReset(permit2, unlimitedApproval ? maxUint256 : amount, assetForPermit2);
946
+ addApproveWithOptionalReset(permit2, maxUint256, assetForPermit2);
797
947
  resolvedItems.push(makePermit2(spender, unlimitedApproval ? maxUint160 : amount));
798
948
  }
799
949
  else {
@@ -863,6 +1013,55 @@ export class ExecutionService {
863
1013
  });
864
1014
  }
865
1015
  // ========== Transaction plan functions ==========
1016
+ /**
1017
+ * Builds a cleanup plan matching Lite's stale collateral/controller policy.
1018
+ *
1019
+ * Cleanup is derived from the provided account snapshot:
1020
+ * - no enabled controllers: disable all enabled collaterals
1021
+ * - enabled controllers but no active borrows: disable all collaterals, then controllers
1022
+ * - active borrows: disable only enabled collaterals with no supplied position
1023
+ *
1024
+ * If the sub-account snapshot is unavailable, no cleanup is planned.
1025
+ */
1026
+ planCleanup(args) {
1027
+ const { account, subAccount } = args;
1028
+ if (typeof account.getSubAccount !== "function")
1029
+ return [];
1030
+ const subAccountSnapshot = account.getSubAccount(subAccount);
1031
+ if (!subAccountSnapshot)
1032
+ return [];
1033
+ const collaterals = subAccountSnapshot.enabledCollaterals ?? [];
1034
+ const controllers = subAccountSnapshot.enabledControllers ?? [];
1035
+ if (collaterals.length === 0 && controllers.length === 0)
1036
+ return [];
1037
+ const items = [];
1038
+ const disableAllCollaterals = () => {
1039
+ for (const collateral of collaterals) {
1040
+ items.push(this.encodeDisableCollateral(account.chainId, subAccount, collateral));
1041
+ }
1042
+ };
1043
+ if (controllers.length === 0) {
1044
+ disableAllCollaterals();
1045
+ return this.convertBatchItemsToPlan(items, "cleanup");
1046
+ }
1047
+ const hasActiveBorrow = subAccountSnapshot.positions.some((position) => position.borrowed > 0n);
1048
+ if (!hasActiveBorrow) {
1049
+ disableAllCollaterals();
1050
+ for (const controller of controllers) {
1051
+ items.push(this.encodeDisableController(controller, subAccount));
1052
+ }
1053
+ return this.convertBatchItemsToPlan(items, "cleanup");
1054
+ }
1055
+ const depositedVaults = new Set(subAccountSnapshot.positions
1056
+ .filter(hasSuppliedPosition)
1057
+ .map((position) => getAddress(position.vaultAddress)));
1058
+ for (const collateral of collaterals) {
1059
+ if (depositedVaults.has(getAddress(collateral)))
1060
+ continue;
1061
+ items.push(this.encodeDisableCollateral(account.chainId, subAccount, collateral));
1062
+ }
1063
+ return this.convertBatchItemsToPlan(items, "cleanup");
1064
+ }
866
1065
  /**
867
1066
  * Builds a transaction plan for depositing assets into a vault.
868
1067
  * Use `maxUint256` for `amount` to deposit all available assets from the wallet.
@@ -877,7 +1076,7 @@ export class ExecutionService {
877
1076
  * @returns Array of transaction plan items (required approvals + EVC batch)
878
1077
  */
879
1078
  planDeposit(args) {
880
- const { vault, amount, receiver, account, asset, enableCollateral } = args;
1079
+ const { vault, amount, receiver, account, asset, enableCollateral, wrappedNativeInfo, } = args;
881
1080
  const plan = [];
882
1081
  // Default: collateral is not enabled when account/position is not available
883
1082
  const isCollateralEnabled = account?.isCollateralEnabled(receiver, vault) ?? false;
@@ -897,6 +1096,7 @@ export class ExecutionService {
897
1096
  receiver,
898
1097
  owner: account.owner,
899
1098
  enableCollateral: !isCollateralEnabled && enableCollateral,
1099
+ wrappedNativeInfo,
900
1100
  // Permit2 is handled separately in the plan
901
1101
  });
902
1102
  plan.push(...this.convertBatchItemsToPlan(batchItems, "deposit"));
@@ -916,7 +1116,7 @@ export class ExecutionService {
916
1116
  * @returns Array of transaction plan items (required approvals + EVC batch)
917
1117
  */
918
1118
  planMint(args) {
919
- const { vault, shares, receiver, account, asset, enableCollateral, sharesToAssetsExchangeRateWad, } = args;
1119
+ const { vault, shares, receiver, account, asset, enableCollateral, sharesToAssetsExchangeRateWad, wrappedNativeInfo, } = args;
920
1120
  const plan = [];
921
1121
  // Default: collateral is not enabled when account/position is not available
922
1122
  const isCollateralEnabled = account?.isCollateralEnabled(receiver, vault) ?? false;
@@ -939,6 +1139,7 @@ export class ExecutionService {
939
1139
  receiver,
940
1140
  owner: account.owner,
941
1141
  enableCollateral: !isCollateralEnabled && enableCollateral,
1142
+ wrappedNativeInfo,
942
1143
  // Permit2 is handled separately in the plan
943
1144
  });
944
1145
  plan.push(...this.convertBatchItemsToPlan(batchItems, "mint"));
@@ -1059,6 +1260,7 @@ export class ExecutionService {
1059
1260
  enableCollateral,
1060
1261
  collateralVault: collateral?.vault,
1061
1262
  collateralAmount: walletCollateral?.amount,
1263
+ collateralWrappedNativeInfo: walletCollateral?.wrappedNativeInfo,
1062
1264
  collateralShareSource: savingsCollateral
1063
1265
  ? {
1064
1266
  from: savingsCollateral.from,
@@ -1136,15 +1338,16 @@ export class ExecutionService {
1136
1338
  if (!position) {
1137
1339
  throw new Error(`Position not found. Liability vault: ${liabilityVault}, Account: ${receiver}`);
1138
1340
  }
1341
+ const isMax = liabilityAmount === maxUint256;
1342
+ const approvalAmount = adjustForInterest(isMax ? position.borrowed : liabilityAmount);
1139
1343
  // Add approval requirement (will be resolved later with Wallet data)
1140
1344
  plan.push({
1141
1345
  type: "requiredApproval",
1142
1346
  token: position.asset,
1143
1347
  owner: account.owner,
1144
1348
  spender: liabilityVault,
1145
- amount: liabilityAmount,
1349
+ amount: approvalAmount,
1146
1350
  });
1147
- const isMax = liabilityAmount === maxUint256;
1148
1351
  // Build EVC batch items
1149
1352
  const batchItems = this.encodeRepayFromWallet({
1150
1353
  chainId: account.chainId,
@@ -1271,7 +1474,7 @@ export class ExecutionService {
1271
1474
  * @returns Array of transaction plan items (EVC batch: withdraw, swap, verify/repay). Throws if positions not found or liability is zero.
1272
1475
  */
1273
1476
  planRepayWithSwap(args) {
1274
- const { swapQuote, account, cleanupOnMax = false } = args;
1477
+ const { swapQuote, account, cleanupOnMax = false, swapperMode } = args;
1275
1478
  const plan = [];
1276
1479
  const liabilityPosition = account?.getPosition(swapQuote.accountOut, swapQuote.receiver);
1277
1480
  const fromPosition = account?.getPosition(swapQuote.accountIn, swapQuote.vaultIn);
@@ -1289,6 +1492,7 @@ export class ExecutionService {
1289
1492
  maxWithdraw,
1290
1493
  isMax,
1291
1494
  disableControllerOnMax: true,
1495
+ swapperMode,
1292
1496
  });
1293
1497
  if (cleanupOnMax && isMax) {
1294
1498
  this.appendMaxRepayCleanup({
@@ -1317,7 +1521,7 @@ export class ExecutionService {
1317
1521
  * @returns Array of transaction plan items (approval to SwapVerifier + EVC batch)
1318
1522
  */
1319
1523
  planDepositWithSwapFromWallet(args) {
1320
- const { swapQuote, amount, tokenIn, account, enableCollateral } = args;
1524
+ const { swapQuote, amount, tokenIn, account, enableCollateral, wrappedNativeInfo, } = args;
1321
1525
  const plan = [];
1322
1526
  // Approval goes to the transferFromSender contract (which uses permit2 transferFrom internally)
1323
1527
  plan.push({
@@ -1341,6 +1545,7 @@ export class ExecutionService {
1341
1545
  amount,
1342
1546
  sender: account.owner,
1343
1547
  enableCollateral: shouldEnableCollateral,
1548
+ wrappedNativeInfo,
1344
1549
  });
1345
1550
  plan.push(...this.convertBatchItemsToPlan(batchItems, "depositWithSwapFromWallet"));
1346
1551
  return plan;
@@ -1357,7 +1562,7 @@ export class ExecutionService {
1357
1562
  * @returns Array of transaction plan items (approval to SwapVerifier + EVC batch)
1358
1563
  */
1359
1564
  planSwapFromWallet(args) {
1360
- const { swapQuote, amount, tokenIn, account } = args;
1565
+ const { swapQuote, amount, tokenIn, account, wrappedNativeInfo } = args;
1361
1566
  const plan = [];
1362
1567
  plan.push({
1363
1568
  type: "requiredApproval",
@@ -1371,10 +1576,102 @@ export class ExecutionService {
1371
1576
  swapQuote,
1372
1577
  amount,
1373
1578
  sender: account.owner,
1579
+ wrappedNativeInfo,
1374
1580
  });
1375
1581
  plan.push(...this.convertBatchItemsToPlan(batchItems, "swapFromWallet"));
1376
1582
  return plan;
1377
1583
  }
1584
+ planSwapAndBorrowFromWallet(args) {
1585
+ const { swapQuote, amount, tokenIn, account, borrowVault, borrowAmount, borrowAccount = swapQuote.accountOut, receiver = account.owner, collateralVault = swapQuote.receiver, wrappedNativeInfo, } = args;
1586
+ const plan = [];
1587
+ plan.push({
1588
+ type: "requiredApproval",
1589
+ token: tokenIn,
1590
+ owner: account.owner,
1591
+ spender: swapQuote.verify.verifierAddress,
1592
+ amount,
1593
+ });
1594
+ const enableController = !(account?.isControllerEnabled(borrowAccount, borrowVault) ?? false);
1595
+ const enableCollateral = !(account?.isCollateralEnabled(borrowAccount, collateralVault) ?? false);
1596
+ const currentController = account?.getCurrentController(borrowAccount);
1597
+ const batchItems = this.encodeSwapAndBorrowFromWallet({
1598
+ chainId: account.chainId,
1599
+ swapQuote,
1600
+ amount,
1601
+ sender: account.owner,
1602
+ borrowAccount,
1603
+ collateralVault,
1604
+ borrowVault,
1605
+ borrowAmount,
1606
+ receiver,
1607
+ currentController: currentController || undefined,
1608
+ enableController,
1609
+ enableCollateral,
1610
+ wrappedNativeInfo,
1611
+ });
1612
+ plan.push(...this.convertBatchItemsToPlan(batchItems, "swapAndBorrowFromWallet"));
1613
+ return plan;
1614
+ }
1615
+ planSwapAndRepayFromWallet(args) {
1616
+ const { swapQuote, amount, tokenIn, account, liabilityVault = swapQuote.receiver, repayAccount = swapQuote.accountOut, isMax, cleanupOnMax = false, wrappedNativeInfo, } = args;
1617
+ const plan = [];
1618
+ plan.push({
1619
+ type: "requiredApproval",
1620
+ token: tokenIn,
1621
+ owner: account.owner,
1622
+ spender: swapQuote.verify.verifierAddress,
1623
+ amount,
1624
+ });
1625
+ const liabilityPosition = account?.getPosition(repayAccount, liabilityVault);
1626
+ const resolvedIsMax = isMax ??
1627
+ (liabilityPosition !== undefined &&
1628
+ liabilityPosition.borrowed <= BigInt(swapQuote.amountOutMin || 0));
1629
+ const batchItems = this.encodeSwapAndRepayFromWallet({
1630
+ chainId: account.chainId,
1631
+ swapQuote,
1632
+ amount,
1633
+ sender: account.owner,
1634
+ liabilityVault,
1635
+ repayAccount,
1636
+ isMax: resolvedIsMax,
1637
+ disableControllerOnMax: true,
1638
+ wrappedNativeInfo,
1639
+ });
1640
+ if (cleanupOnMax && resolvedIsMax && liabilityPosition) {
1641
+ this.appendMaxRepayCleanup({
1642
+ account,
1643
+ liabilityPosition,
1644
+ receiver: repayAccount,
1645
+ batchItems,
1646
+ });
1647
+ }
1648
+ plan.push(...this.convertBatchItemsToPlan(batchItems, "swapAndRepayFromWallet"));
1649
+ return plan;
1650
+ }
1651
+ planWithdrawAndSwap(args) {
1652
+ const { account, vault, assets, owner, swapQuote } = args;
1653
+ const batchItems = this.encodeWithdrawAndSwap({
1654
+ chainId: account.chainId,
1655
+ vault,
1656
+ assets,
1657
+ owner,
1658
+ sender: account.owner,
1659
+ swapQuote,
1660
+ });
1661
+ return this.convertBatchItemsToPlan(batchItems, "withdrawAndSwap");
1662
+ }
1663
+ planRedeemAndSwap(args) {
1664
+ const { account, vault, shares, owner, swapQuote } = args;
1665
+ const batchItems = this.encodeRedeemAndSwap({
1666
+ chainId: account.chainId,
1667
+ vault,
1668
+ shares,
1669
+ owner,
1670
+ sender: account.owner,
1671
+ swapQuote,
1672
+ });
1673
+ return this.convertBatchItemsToPlan(batchItems, "redeemAndSwap");
1674
+ }
1378
1675
  /**
1379
1676
  * Builds a transaction plan for swapping collateral from one vault to another (withdraw → swap → deposit/skim).
1380
1677
  *
@@ -1384,7 +1681,7 @@ export class ExecutionService {
1384
1681
  * @returns Array of transaction plan items (EVC batch: withdraw, swap, verify/skim, optional enable/disable collateral)
1385
1682
  */
1386
1683
  planSwapCollateral(args) {
1387
- const { swapQuote, account } = args;
1684
+ const { swapQuote, account, swapperMode } = args;
1388
1685
  const plan = [];
1389
1686
  // Check if source collateral needs to be disabled (when all is swapped)
1390
1687
  // Default: when position is not available, assume amounts are zero, so we don't disable collateral
@@ -1403,6 +1700,7 @@ export class ExecutionService {
1403
1700
  enableCollateral,
1404
1701
  disableCollateralOnMax: true,
1405
1702
  isMax,
1703
+ swapperMode,
1406
1704
  });
1407
1705
  plan.push(...this.convertBatchItemsToPlan(batchItems, "swapCollateral"));
1408
1706
  return plan;
@@ -1416,7 +1714,7 @@ export class ExecutionService {
1416
1714
  * @returns Array of transaction plan items (EVC batch: enableController, borrow, swap, verify/repay, optional disableController)
1417
1715
  */
1418
1716
  planSwapDebt(args) {
1419
- const { swapQuote, account } = args;
1717
+ const { swapQuote, account, swapperMode } = args;
1420
1718
  const plan = [];
1421
1719
  const sourcePosition = account?.getPosition(swapQuote.accountIn, swapQuote.vaultIn);
1422
1720
  const isMax = sourcePosition
@@ -1431,6 +1729,7 @@ export class ExecutionService {
1431
1729
  enableController,
1432
1730
  disableControllerOnMax: true,
1433
1731
  isMax,
1732
+ swapperMode,
1434
1733
  });
1435
1734
  plan.push(...this.convertBatchItemsToPlan(batchItems, "swapDebt"));
1436
1735
  return plan;
@@ -1602,7 +1901,7 @@ export class ExecutionService {
1602
1901
  * @returns Array of transaction plan items (optional approval + EVC batch). Throws if swapQuote.accountIn !== swapQuote.accountOut.
1603
1902
  */
1604
1903
  planMultiplyWithSwap(args) {
1605
- const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, account, swapQuote, } = args;
1904
+ const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, collateralWrappedNativeInfo, account, swapQuote, swapperMode, } = args;
1606
1905
  const plan = [];
1607
1906
  // 1. Check if collateral approval is needed (only if depositing collateral)
1608
1907
  if (!collateralShareSource && collateralAmount > 0n) {
@@ -1621,13 +1920,14 @@ export class ExecutionService {
1621
1920
  const receiver = swapQuote.accountIn;
1622
1921
  const liabilityVault = swapQuote.vaultIn;
1623
1922
  const longVault = swapQuote.receiver;
1624
- const liabilityAmount = BigInt(swapQuote.amountIn);
1923
+ const liabilityAmount = getSwapInputAmount(swapQuote, swapperMode ?? SwapperMode.EXACT_IN);
1625
1924
  // 2. Determine if collateral needs to be enabled
1626
1925
  const hasCollateralInput = collateralShareSource
1627
1926
  ? collateralShareSource.shares > 0n
1628
1927
  : collateralAmount > 0n;
1629
1928
  const enableCollateral = hasCollateralInput &&
1630
1929
  !(account?.isCollateralEnabled(receiver, collateralVault) ?? false);
1930
+ const enableCollateralLong = !(account?.isCollateralEnabled(receiver, longVault) ?? false);
1631
1931
  const resolvedCollateralShareSource = collateralShareSource
1632
1932
  ? {
1633
1933
  ...collateralShareSource,
@@ -1654,7 +1954,9 @@ export class ExecutionService {
1654
1954
  currentController: currentController || undefined,
1655
1955
  enableController,
1656
1956
  collateralShareSource: resolvedCollateralShareSource,
1957
+ collateralWrappedNativeInfo,
1657
1958
  swapQuote,
1959
+ enableCollateralLong,
1658
1960
  // Permit2 is handled separately in the plan
1659
1961
  });
1660
1962
  plan.push(...this.convertBatchItemsToPlan(batchItems, "multiplyWithSwap"));
@@ -1676,7 +1978,7 @@ export class ExecutionService {
1676
1978
  * @returns Array of transaction plan items (optional approval + EVC batch)
1677
1979
  */
1678
1980
  planMultiplySameAsset(args) {
1679
- const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, liabilityVault, liabilityAmount, longVault, receiver, account, } = args;
1981
+ const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, collateralWrappedNativeInfo, liabilityVault, liabilityAmount, longVault, receiver, account, } = args;
1680
1982
  const plan = [];
1681
1983
  // 1. Check if collateral approval is needed (only if depositing collateral)
1682
1984
  if (!collateralShareSource && collateralAmount > 0n) {
@@ -1695,6 +1997,7 @@ export class ExecutionService {
1695
1997
  : collateralAmount > 0n;
1696
1998
  const enableCollateral = hasCollateralInput &&
1697
1999
  !(account?.isCollateralEnabled(receiver, collateralVault) ?? false);
2000
+ const enableCollateralLong = !(account?.isCollateralEnabled(receiver, longVault) ?? false);
1698
2001
  const resolvedCollateralShareSource = collateralShareSource
1699
2002
  ? {
1700
2003
  ...collateralShareSource,
@@ -1721,6 +2024,8 @@ export class ExecutionService {
1721
2024
  currentController: currentController || undefined,
1722
2025
  enableController,
1723
2026
  collateralShareSource: resolvedCollateralShareSource,
2027
+ collateralWrappedNativeInfo,
2028
+ enableCollateralLong,
1724
2029
  // Permit2 is handled separately in the plan
1725
2030
  });
1726
2031
  plan.push(...this.convertBatchItemsToPlan(batchItems, "multiplySameAsset"));