@defisaver/automation-sdk 3.1.9 → 3.1.14-spark-dev

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 (245) hide show
  1. package/.babelrc +3 -3
  2. package/.editorconfig +9 -9
  3. package/.env.dev +4 -4
  4. package/.eslintignore +6 -6
  5. package/.eslintrc.js +39 -39
  6. package/.mocharc.json +4 -4
  7. package/.nvmrc +1 -1
  8. package/README.md +46 -46
  9. package/cjs/abis/Erc20.json +223 -223
  10. package/cjs/abis/SubStorage.json +21 -21
  11. package/cjs/abis/UniMulticall.json +17 -17
  12. package/cjs/abis/index.d.ts +9 -9
  13. package/cjs/abis/index.js +30 -30
  14. package/cjs/abis/legacy_AaveV2Subscriptions.json +8 -8
  15. package/cjs/abis/legacy_AuthCheck.json +8 -8
  16. package/cjs/abis/legacy_CompoundV2Subscriptions.json +9 -9
  17. package/cjs/abis/legacy_MakerSubscriptions.json +9 -9
  18. package/cjs/automation/private/Automation.d.ts +12 -12
  19. package/cjs/automation/private/Automation.js +42 -42
  20. package/cjs/automation/private/LegacyAutomation.d.ts +25 -25
  21. package/cjs/automation/private/LegacyAutomation.js +118 -118
  22. package/cjs/automation/private/LegacyProtocol.d.ts +22 -22
  23. package/cjs/automation/private/LegacyProtocol.js +41 -41
  24. package/cjs/automation/private/LegacyProtocol.test.d.ts +1 -1
  25. package/cjs/automation/private/LegacyProtocol.test.js +25 -25
  26. package/cjs/automation/private/Protocol.d.ts +22 -22
  27. package/cjs/automation/private/Protocol.js +41 -41
  28. package/cjs/automation/private/Protocol.test.d.ts +1 -1
  29. package/cjs/automation/private/Protocol.test.js +25 -25
  30. package/cjs/automation/private/StrategiesAutomation.d.ts +35 -33
  31. package/cjs/automation/private/StrategiesAutomation.js +198 -181
  32. package/cjs/automation/private/StrategiesAutomation.test.d.ts +1 -1
  33. package/cjs/automation/private/StrategiesAutomation.test.js +696 -671
  34. package/cjs/automation/public/ArbitrumStrategies.d.ts +5 -5
  35. package/cjs/automation/public/ArbitrumStrategies.js +13 -13
  36. package/cjs/automation/public/BaseStrategies.d.ts +5 -5
  37. package/cjs/automation/public/BaseStrategies.js +13 -13
  38. package/cjs/automation/public/EthereumStrategies.d.ts +5 -5
  39. package/cjs/automation/public/EthereumStrategies.js +13 -13
  40. package/cjs/automation/public/OptimismStrategies.d.ts +5 -5
  41. package/cjs/automation/public/OptimismStrategies.js +13 -13
  42. package/cjs/automation/public/Strategies.test.d.ts +1 -1
  43. package/cjs/automation/public/Strategies.test.js +61 -61
  44. package/cjs/automation/public/legacy/LegacyAaveAutomation.d.ts +6 -6
  45. package/cjs/automation/public/legacy/LegacyAaveAutomation.js +20 -20
  46. package/cjs/automation/public/legacy/LegacyCompoundAutomation.d.ts +6 -6
  47. package/cjs/automation/public/legacy/LegacyCompoundAutomation.js +20 -20
  48. package/cjs/automation/public/legacy/LegacyMakerAutomation.d.ts +6 -6
  49. package/cjs/automation/public/legacy/LegacyMakerAutomation.js +20 -20
  50. package/cjs/configuration.d.ts +1 -1
  51. package/cjs/configuration.js +12 -12
  52. package/cjs/constants/index.d.ts +29 -28
  53. package/cjs/constants/index.js +905 -534
  54. package/cjs/index.d.ts +24 -23
  55. package/cjs/index.js +65 -65
  56. package/cjs/services/contractService.d.ts +12 -12
  57. package/cjs/services/contractService.js +54 -54
  58. package/cjs/services/ethereumService.d.ts +7 -7
  59. package/cjs/services/ethereumService.js +56 -49
  60. package/cjs/services/ethereumService.test.d.ts +1 -1
  61. package/cjs/services/ethereumService.test.js +245 -242
  62. package/cjs/services/strategiesService.d.ts +2 -2
  63. package/cjs/services/strategiesService.js +1173 -861
  64. package/cjs/services/strategiesService.test.d.ts +1 -1
  65. package/cjs/services/strategiesService.test.js +111 -110
  66. package/cjs/services/strategySubService.d.ts +129 -107
  67. package/cjs/services/strategySubService.js +414 -300
  68. package/cjs/services/strategySubService.test.d.ts +1 -1
  69. package/cjs/services/strategySubService.test.js +1812 -936
  70. package/cjs/services/subDataService.d.ts +527 -245
  71. package/cjs/services/subDataService.js +1219 -636
  72. package/cjs/services/subDataService.test.d.ts +1 -1
  73. package/cjs/services/subDataService.test.js +2427 -1282
  74. package/cjs/services/triggerService.d.ts +325 -226
  75. package/cjs/services/triggerService.js +616 -433
  76. package/cjs/services/triggerService.test.d.ts +1 -1
  77. package/cjs/services/triggerService.test.js +1317 -926
  78. package/cjs/services/utils.d.ts +30 -30
  79. package/cjs/services/utils.js +190 -182
  80. package/cjs/services/utils.test.d.ts +1 -1
  81. package/cjs/services/utils.test.js +299 -376
  82. package/cjs/types/contracts/generated/Erc20.d.ts +53 -53
  83. package/cjs/types/contracts/generated/Erc20.js +5 -5
  84. package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
  85. package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.js +5 -5
  86. package/cjs/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
  87. package/cjs/types/contracts/generated/Legacy_AuthCheck.js +5 -5
  88. package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
  89. package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +5 -5
  90. package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
  91. package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.js +5 -5
  92. package/cjs/types/contracts/generated/SubStorage.d.ts +114 -114
  93. package/cjs/types/contracts/generated/SubStorage.js +5 -5
  94. package/cjs/types/contracts/generated/UniMulticall.d.ts +55 -55
  95. package/cjs/types/contracts/generated/UniMulticall.js +5 -5
  96. package/cjs/types/contracts/generated/index.d.ts +7 -7
  97. package/cjs/types/contracts/generated/index.js +2 -2
  98. package/cjs/types/contracts/generated/types.d.ts +54 -54
  99. package/cjs/types/contracts/generated/types.js +2 -2
  100. package/cjs/types/enums.d.ts +302 -219
  101. package/cjs/types/enums.js +328 -245
  102. package/cjs/types/index.d.ts +306 -248
  103. package/cjs/types/index.js +2 -2
  104. package/esm/abis/Erc20.json +223 -223
  105. package/esm/abis/SubStorage.json +21 -21
  106. package/esm/abis/UniMulticall.json +17 -17
  107. package/esm/abis/index.d.ts +9 -9
  108. package/esm/abis/index.js +18 -18
  109. package/esm/abis/legacy_AaveV2Subscriptions.json +8 -8
  110. package/esm/abis/legacy_AuthCheck.json +8 -8
  111. package/esm/abis/legacy_CompoundV2Subscriptions.json +9 -9
  112. package/esm/abis/legacy_MakerSubscriptions.json +9 -9
  113. package/esm/automation/private/Automation.d.ts +12 -12
  114. package/esm/automation/private/Automation.js +39 -39
  115. package/esm/automation/private/LegacyAutomation.d.ts +25 -25
  116. package/esm/automation/private/LegacyAutomation.js +112 -112
  117. package/esm/automation/private/LegacyProtocol.d.ts +22 -22
  118. package/esm/automation/private/LegacyProtocol.js +38 -38
  119. package/esm/automation/private/LegacyProtocol.test.d.ts +1 -1
  120. package/esm/automation/private/LegacyProtocol.test.js +20 -20
  121. package/esm/automation/private/Protocol.d.ts +22 -22
  122. package/esm/automation/private/Protocol.js +38 -38
  123. package/esm/automation/private/Protocol.test.d.ts +1 -1
  124. package/esm/automation/private/Protocol.test.js +20 -20
  125. package/esm/automation/private/StrategiesAutomation.d.ts +35 -33
  126. package/esm/automation/private/StrategiesAutomation.js +192 -175
  127. package/esm/automation/private/StrategiesAutomation.test.d.ts +1 -1
  128. package/esm/automation/private/StrategiesAutomation.test.js +691 -666
  129. package/esm/automation/public/ArbitrumStrategies.d.ts +5 -5
  130. package/esm/automation/public/ArbitrumStrategies.js +7 -7
  131. package/esm/automation/public/BaseStrategies.d.ts +5 -5
  132. package/esm/automation/public/BaseStrategies.js +7 -7
  133. package/esm/automation/public/EthereumStrategies.d.ts +5 -5
  134. package/esm/automation/public/EthereumStrategies.js +7 -7
  135. package/esm/automation/public/OptimismStrategies.d.ts +5 -5
  136. package/esm/automation/public/OptimismStrategies.js +7 -7
  137. package/esm/automation/public/Strategies.test.d.ts +1 -1
  138. package/esm/automation/public/Strategies.test.js +56 -56
  139. package/esm/automation/public/legacy/LegacyAaveAutomation.d.ts +6 -6
  140. package/esm/automation/public/legacy/LegacyAaveAutomation.js +14 -14
  141. package/esm/automation/public/legacy/LegacyCompoundAutomation.d.ts +6 -6
  142. package/esm/automation/public/legacy/LegacyCompoundAutomation.js +14 -14
  143. package/esm/automation/public/legacy/LegacyMakerAutomation.d.ts +6 -6
  144. package/esm/automation/public/legacy/LegacyMakerAutomation.js +14 -14
  145. package/esm/configuration.d.ts +1 -1
  146. package/esm/configuration.js +7 -7
  147. package/esm/constants/index.d.ts +29 -28
  148. package/esm/constants/index.js +899 -528
  149. package/esm/index.d.ts +24 -23
  150. package/esm/index.js +23 -23
  151. package/esm/services/contractService.d.ts +12 -12
  152. package/esm/services/contractService.js +45 -45
  153. package/esm/services/ethereumService.d.ts +7 -7
  154. package/esm/services/ethereumService.js +48 -41
  155. package/esm/services/ethereumService.test.d.ts +1 -1
  156. package/esm/services/ethereumService.test.js +240 -237
  157. package/esm/services/strategiesService.d.ts +2 -2
  158. package/esm/services/strategiesService.js +1143 -831
  159. package/esm/services/strategiesService.test.d.ts +1 -1
  160. package/esm/services/strategiesService.test.js +109 -108
  161. package/esm/services/strategySubService.d.ts +129 -107
  162. package/esm/services/strategySubService.js +385 -271
  163. package/esm/services/strategySubService.test.d.ts +1 -1
  164. package/esm/services/strategySubService.test.js +1784 -908
  165. package/esm/services/subDataService.d.ts +527 -245
  166. package/esm/services/subDataService.js +1213 -630
  167. package/esm/services/subDataService.test.d.ts +1 -1
  168. package/esm/services/subDataService.test.js +2399 -1254
  169. package/esm/services/triggerService.d.ts +325 -226
  170. package/esm/services/triggerService.js +587 -404
  171. package/esm/services/triggerService.test.d.ts +1 -1
  172. package/esm/services/triggerService.test.js +1292 -901
  173. package/esm/services/utils.d.ts +30 -30
  174. package/esm/services/utils.js +139 -131
  175. package/esm/services/utils.test.d.ts +1 -1
  176. package/esm/services/utils.test.js +297 -348
  177. package/esm/types/contracts/generated/Erc20.d.ts +53 -53
  178. package/esm/types/contracts/generated/Erc20.js +4 -4
  179. package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
  180. package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.js +4 -4
  181. package/esm/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
  182. package/esm/types/contracts/generated/Legacy_AuthCheck.js +4 -4
  183. package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
  184. package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +4 -4
  185. package/esm/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
  186. package/esm/types/contracts/generated/Legacy_MakerSubscriptions.js +4 -4
  187. package/esm/types/contracts/generated/SubStorage.d.ts +114 -114
  188. package/esm/types/contracts/generated/SubStorage.js +4 -4
  189. package/esm/types/contracts/generated/UniMulticall.d.ts +55 -55
  190. package/esm/types/contracts/generated/UniMulticall.js +4 -4
  191. package/esm/types/contracts/generated/index.d.ts +7 -7
  192. package/esm/types/contracts/generated/index.js +1 -1
  193. package/esm/types/contracts/generated/types.d.ts +54 -54
  194. package/esm/types/contracts/generated/types.js +1 -1
  195. package/esm/types/enums.d.ts +302 -219
  196. package/esm/types/enums.js +325 -242
  197. package/esm/types/index.d.ts +306 -248
  198. package/esm/types/index.js +1 -1
  199. package/package.json +60 -61
  200. package/scripts/generateContractTypes.js +39 -39
  201. package/src/abis/Erc20.json +222 -222
  202. package/src/abis/SubStorage.json +21 -21
  203. package/src/abis/UniMulticall.json +17 -17
  204. package/src/abis/index.ts +28 -28
  205. package/src/abis/legacy_AaveV2Subscriptions.json +7 -7
  206. package/src/abis/legacy_AuthCheck.json +7 -7
  207. package/src/abis/legacy_CompoundV2Subscriptions.json +8 -8
  208. package/src/abis/legacy_MakerSubscriptions.json +8 -8
  209. package/src/automation/private/Automation.ts +44 -44
  210. package/src/automation/private/LegacyAutomation.ts +135 -135
  211. package/src/automation/private/LegacyProtocol.test.ts +23 -23
  212. package/src/automation/private/LegacyProtocol.ts +51 -51
  213. package/src/automation/private/Protocol.test.ts +23 -23
  214. package/src/automation/private/Protocol.ts +51 -51
  215. package/src/automation/private/StrategiesAutomation.test.ts +703 -663
  216. package/src/automation/private/StrategiesAutomation.ts +265 -242
  217. package/src/automation/public/ArbitrumStrategies.ts +10 -10
  218. package/src/automation/public/BaseStrategies.ts +10 -10
  219. package/src/automation/public/EthereumStrategies.ts +10 -10
  220. package/src/automation/public/OptimismStrategies.ts +10 -10
  221. package/src/automation/public/Strategies.test.ts +49 -49
  222. package/src/automation/public/legacy/LegacyAaveAutomation.ts +20 -20
  223. package/src/automation/public/legacy/LegacyCompoundAutomation.ts +20 -20
  224. package/src/automation/public/legacy/LegacyMakerAutomation.ts +20 -20
  225. package/src/configuration.ts +8 -8
  226. package/src/constants/index.ts +935 -563
  227. package/src/index.ts +41 -39
  228. package/src/services/contractService.ts +77 -77
  229. package/src/services/ethereumService.test.ts +260 -257
  230. package/src/services/ethereumService.ts +76 -69
  231. package/src/services/strategiesService.test.ts +106 -105
  232. package/src/services/strategiesService.ts +1473 -1111
  233. package/src/services/strategySubService.test.ts +2136 -1122
  234. package/src/services/strategySubService.ts +987 -617
  235. package/src/services/subDataService.test.ts +2630 -1387
  236. package/src/services/subDataService.ts +1631 -870
  237. package/src/services/triggerService.test.ts +1434 -1004
  238. package/src/services/triggerService.ts +819 -553
  239. package/src/services/utils.test.ts +371 -430
  240. package/src/services/utils.ts +173 -162
  241. package/src/types/enums.ts +322 -239
  242. package/src/types/index.ts +385 -312
  243. package/tsconfig.esm.json +8 -8
  244. package/tsconfig.json +22 -22
  245. package/umd/index.js +0 -34103
@@ -1,617 +1,987 @@
1
- import Dec from 'decimal.js';
2
- import { getAssetInfo } from '@defisaver/tokens';
3
-
4
- import type { OrderType } from '../types/enums';
5
- import {
6
- CloseStrategyType, CloseToAssetType,
7
- Bundles, ChainId, RatioState, Strategies,
8
- } from '../types/enums';
9
- import type { EthereumAddress, StrategyOrBundleIds } from '../types';
10
-
11
- import { STRATEGY_IDS } from '../constants';
12
-
13
- import * as subDataService from './subDataService';
14
- import * as triggerService from './triggerService';
15
- import {
16
- compareAddresses, getCloseStrategyType, requireAddress, requireAddresses,
17
- } from './utils';
18
-
19
- export const makerEncode = {
20
- repayFromSavings(
21
- bundleId: StrategyOrBundleIds,
22
- vaultId: number,
23
- triggerRepayRatio: number,
24
- targetRepayRatio: number,
25
- isBundle: boolean = true,
26
- chainId: ChainId = ChainId.Ethereum,
27
- daiAddr?: EthereumAddress,
28
- mcdCdpManagerAddr?: EthereumAddress,
29
- ) {
30
- const subData = subDataService.makerRepayFromSavingsSubData.encode(vaultId, targetRepayRatio, chainId, daiAddr, mcdCdpManagerAddr);
31
- const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRepayRatio, RatioState.UNDER);
32
-
33
- return [bundleId, isBundle, triggerData, subData];
34
- },
35
- closeOnPrice(
36
- vaultId: number,
37
- ratioState: RatioState,
38
- price: string,
39
- closeToAssetAddr: EthereumAddress,
40
- chainlinkCollAddress: EthereumAddress,
41
- chainId: ChainId = ChainId.Ethereum,
42
- daiAddr?: EthereumAddress,
43
- mcdCdpManagerAddr?: EthereumAddress,
44
- ) {
45
- requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
46
-
47
- const subData = subDataService.makerCloseSubData.encode(vaultId, closeToAssetAddr, chainId, daiAddr, mcdCdpManagerAddr);
48
- const triggerData = triggerService.chainlinkPriceTrigger.encode(chainlinkCollAddress, price, ratioState);
49
-
50
- const strategyOrBundleId = compareAddresses(closeToAssetAddr, getAssetInfo('DAI', chainId).address)
51
- ? Strategies.MainnetIds.MAKER_CLOSE_ON_PRICE_TO_DAI
52
- : Strategies.MainnetIds.MAKER_CLOSE_ON_PRICE_TO_COLL;
53
-
54
- const isBundle = false;
55
-
56
- return [strategyOrBundleId, isBundle, triggerData, subData];
57
- },
58
- trailingStop(
59
- vaultId: number,
60
- triggerPercentage: number,
61
- closeToAssetAddr: EthereumAddress,
62
- chainlinkCollAddress: EthereumAddress,
63
- roundId: number,
64
- chainId: ChainId = ChainId.Ethereum,
65
- daiAddr?: EthereumAddress,
66
- mcdCdpManagerAddr?: EthereumAddress,
67
- ) {
68
- requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
69
-
70
- const subData = subDataService.makerCloseSubData.encode(vaultId, closeToAssetAddr, chainId, daiAddr, mcdCdpManagerAddr);
71
- const triggerData = triggerService.trailingStopTrigger.encode(chainlinkCollAddress, triggerPercentage, roundId);
72
-
73
- const strategyOrBundleId = compareAddresses(closeToAssetAddr, getAssetInfo('DAI', chainId).address)
74
- ? Strategies.MainnetIds.MAKER_TRAILING_STOP_LOSS_TO_DAI
75
- : Strategies.MainnetIds.MAKER_TRAILING_STOP_LOSS_TO_COLL;
76
-
77
- const isBundle = false;
78
-
79
- return [strategyOrBundleId, isBundle, triggerData, subData];
80
- },
81
- leverageManagement(
82
- vaultId: number,
83
- triggerRepayRatio: string,
84
- triggerBoostRatio: string,
85
- targetBoostRatio: string,
86
- targetRepayRatio: string,
87
- boostEnabled: boolean,
88
- ) {
89
- return [
90
- vaultId,
91
- new Dec(triggerRepayRatio).mul(1e16).toString(),
92
- new Dec(triggerBoostRatio).mul(1e16).toString(),
93
- new Dec(targetBoostRatio).mul(1e16).toString(),
94
- new Dec(targetRepayRatio).mul(1e16).toString(),
95
- boostEnabled,
96
- ];
97
- },
98
- };
99
-
100
- export const liquityEncode = {
101
- closeOnPrice(
102
- priceOverOrUnder: RatioState,
103
- price: string,
104
- closeToAssetAddr: EthereumAddress,
105
- chainlinkCollAddress: EthereumAddress,
106
- chainId: ChainId = ChainId.Ethereum,
107
- collAddr?: EthereumAddress,
108
- debtAddr?: EthereumAddress,
109
- ) {
110
- requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
111
-
112
- const subData = subDataService.liquityCloseSubData.encode(closeToAssetAddr, chainId, collAddr, debtAddr);
113
- const triggerData = triggerService.chainlinkPriceTrigger.encode(chainlinkCollAddress, price, priceOverOrUnder);
114
-
115
- const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_CLOSE_ON_PRICE_TO_COLL;
116
-
117
- const isBundle = false;
118
-
119
- return [strategyOrBundleId, isBundle, triggerData, subData];
120
- },
121
- trailingStop(
122
- triggerPercentage: number,
123
- closeToAssetAddr: EthereumAddress,
124
- chainlinkCollAddress: EthereumAddress,
125
- roundId: number,
126
- chainId: ChainId = ChainId.Ethereum,
127
- collAddr?: EthereumAddress,
128
- debtAddr?: EthereumAddress,
129
- ) {
130
- requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
131
-
132
- const subData = subDataService.liquityCloseSubData.encode(closeToAssetAddr, chainId, collAddr, debtAddr);
133
- const triggerData = triggerService.trailingStopTrigger.encode(chainlinkCollAddress, triggerPercentage, roundId);
134
-
135
- const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_TRAILING_STOP_LOSS_TO_COLL;
136
-
137
- const isBundle = false;
138
-
139
- return [strategyOrBundleId, isBundle, triggerData, subData];
140
- },
141
- paybackFromChickenBondStrategySub(
142
- proxyAddress: EthereumAddress,
143
- ratio: number,
144
- sourceId: string,
145
- sourceType: number,
146
- ratioState: RatioState = RatioState.UNDER,
147
- ) {
148
- requireAddress(proxyAddress);
149
- const subData = subDataService.liquityPaybackUsingChickenBondSubData.encode(sourceId, sourceType);
150
- const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, ratio, ratioState);
151
-
152
- const strategyId = Bundles.MainnetIds.LIQUITY_PAYBACK_USING_CHICKEN_BOND;
153
-
154
- const isBundle = true;
155
-
156
- return [strategyId, isBundle, triggerData, subData];
157
- },
158
- leverageManagement(
159
- triggerRepayRatio:string,
160
- triggerBoostRatio:string,
161
- targetBoostRatio:string,
162
- targetRepayRatio:string,
163
- boostEnabled:boolean,
164
- ) {
165
- return [
166
- new Dec(triggerRepayRatio).mul(1e16).toString(),
167
- new Dec(triggerBoostRatio).mul(1e16).toString(),
168
- new Dec(targetBoostRatio).mul(1e16).toString(),
169
- new Dec(targetRepayRatio).mul(1e16).toString(),
170
- boostEnabled,
171
- ];
172
- },
173
- dsrPayback(
174
- proxyAddress: EthereumAddress,
175
- triggerRatio: number,
176
- targetRatio: number,
177
- ) {
178
- requireAddress(proxyAddress);
179
- const subData = subDataService.liquityDsrPaybackSubData.encode(targetRatio);
180
- const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, triggerRatio, RatioState.UNDER);
181
-
182
- const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DSR_PAYBACK;
183
-
184
- const isBundle = false;
185
-
186
- return [strategyOrBundleId, isBundle, triggerData, subData];
187
- },
188
- dsrSupply(
189
- proxyAddress: EthereumAddress,
190
- triggerRatio: number,
191
- targetRatio: number,
192
- ) {
193
- requireAddress(proxyAddress);
194
- const subData = subDataService.liquityDsrSupplySubData.encode(targetRatio);
195
- const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, triggerRatio, RatioState.UNDER);
196
-
197
- const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DSR_SUPPLY;
198
-
199
- const isBundle = false;
200
-
201
- return [strategyOrBundleId, isBundle, triggerData, subData];
202
- },
203
- debtInFrontRepay(
204
- proxyAddress: EthereumAddress,
205
- debtInFrontMin: string,
206
- targetRatioIncrease: number,
207
- ) {
208
- requireAddress(proxyAddress);
209
- const subData = subDataService.liquityDebtInFrontRepaySubData.encode(targetRatioIncrease);
210
- const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.encode(proxyAddress, debtInFrontMin);
211
-
212
- const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DEBT_IN_FRONT_REPAY;
213
-
214
- const isBundle = false;
215
-
216
- return [strategyOrBundleId, isBundle, triggerData, subData];
217
- },
218
- };
219
-
220
- export const chickenBondsEncode = {
221
- rebond(bondId: number) {
222
- return subDataService.cBondsRebondSubData.encode(bondId);
223
- },
224
- };
225
-
226
- export const aaveV2Encode = {
227
- leverageManagement(
228
- triggerRepayRatio: number,
229
- triggerBoostRatio: number,
230
- targetBoostRatio: number,
231
- targetRepayRatio: number,
232
- boostEnabled: boolean,
233
- ) {
234
- return subDataService.aaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
235
- },
236
- };
237
-
238
- export const aaveV3Encode = {
239
- leverageManagement(
240
- triggerRepayRatio: number,
241
- triggerBoostRatio: number,
242
- targetBoostRatio: number,
243
- targetRepayRatio: number,
244
- boostEnabled: boolean,
245
- ) {
246
- let subInput = '0x';
247
-
248
- subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
249
- .padStart(32, '0'));
250
- subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
251
- .padStart(32, '0'));
252
- subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
253
- .padStart(32, '0'));
254
- subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
255
- .padStart(32, '0'));
256
- subInput = subInput.concat(boostEnabled ? '01' : '00');
257
-
258
- return subInput;
259
- },
260
- closeToAsset(
261
- strategyOrBundleId: number,
262
- isBundle: boolean = true,
263
- triggerData: {
264
- baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, ratioState: RatioState
265
- },
266
- subData: {
267
- collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number,
268
- },
269
- ) {
270
- const {
271
- collAsset, collAssetId, debtAsset, debtAssetId,
272
- } = subData;
273
- const subDataEncoded = subDataService.aaveV3QuotePriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId);
274
-
275
- const {
276
- baseTokenAddress, quoteTokenAddress, price, ratioState,
277
- } = triggerData;
278
- const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, ratioState);
279
-
280
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
281
- },
282
- closeToAssetWithMaximumGasPrice(
283
- strategyOrBundleId: number,
284
- isBundle: boolean = true,
285
- triggerData: {
286
- baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, ratioState: RatioState, maximumGasPrice: number
287
- },
288
- subData: {
289
- collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number,
290
- },
291
- ) {
292
- const {
293
- collAsset, collAssetId, debtAsset, debtAssetId,
294
- } = subData;
295
- const subDataEncoded = subDataService.aaveV3QuotePriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId);
296
-
297
- const {
298
- baseTokenAddress, quoteTokenAddress, price, maximumGasPrice, ratioState,
299
- } = triggerData;
300
- const triggerDataEncoded = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, ratioState, maximumGasPrice);
301
-
302
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
303
- },
304
- leverageManagementOnPrice(
305
- strategyOrBundleId: number,
306
- isBundle: boolean = true,
307
- triggerData: {
308
- baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, state: RatioState.UNDER
309
- },
310
- subData: {
311
- collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number,
312
- },
313
- ) {
314
- const {
315
- collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio,
316
- } = subData;
317
- const subDataEncoded = subDataService.aaveV3LeverageManagementOnPriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio);
318
-
319
- const {
320
- baseTokenAddress, quoteTokenAddress, price, state,
321
- } = triggerData;
322
- const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, state);
323
-
324
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
325
- },
326
- };
327
-
328
- export const compoundV2Encode = {
329
- leverageManagement(
330
- triggerRepayRatio: number,
331
- triggerBoostRatio: number,
332
- targetBoostRatio: number,
333
- targetRepayRatio: number,
334
- boostEnabled: boolean,
335
- ) {
336
- return subDataService.compoundV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
337
- },
338
- };
339
-
340
- export const compoundV3Encode = {
341
- leverageManagement(
342
- market: EthereumAddress,
343
- baseToken: EthereumAddress,
344
- triggerRepayRatio: number,
345
- triggerBoostRatio: number,
346
- targetBoostRatio: number,
347
- targetRepayRatio: number,
348
- boostEnabled: boolean,
349
- isEOA: boolean,
350
- ) {
351
- return subDataService.compoundV3LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
352
- },
353
- };
354
-
355
- export const compoundV3L2Encode = {
356
- leverageManagement(
357
- market: EthereumAddress,
358
- baseToken: EthereumAddress,
359
- triggerRepayRatio: number,
360
- triggerBoostRatio: number,
361
- targetBoostRatio: number,
362
- targetRepayRatio: number,
363
- boostEnabled: boolean,
364
- ) {
365
- return subDataService.compoundV3L2LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
366
- },
367
- };
368
-
369
- export const morphoAaveV2Encode = {
370
- leverageManagement(
371
- triggerRepayRatio: number,
372
- triggerBoostRatio: number,
373
- targetBoostRatio: number,
374
- targetRepayRatio: number,
375
- boostEnabled: boolean,
376
- ) {
377
- return subDataService.morphoAaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
378
- },
379
- };
380
-
381
- export const exchangeEncode = {
382
- dca(
383
- fromToken: EthereumAddress,
384
- toToken: EthereumAddress,
385
- amount: string,
386
- timestamp: number,
387
- interval: number,
388
- network: ChainId,
389
- ) {
390
- requireAddresses([fromToken, toToken]);
391
- const subData = subDataService.exchangeDcaSubData.encode(fromToken, toToken, amount, interval);
392
- const triggerData = triggerService.exchangeTimestampTrigger.encode(timestamp, interval);
393
-
394
- const strategyId = STRATEGY_IDS[network].EXCHANGE_DCA;
395
-
396
- return [strategyId, false, triggerData, subData];
397
- },
398
- limitOrder(
399
- fromToken: EthereumAddress,
400
- toToken: EthereumAddress,
401
- amount: string,
402
- targetPrice: string,
403
- goodUntil: string | number,
404
- orderType: OrderType,
405
- ) {
406
- return subDataService.exchangeLimitOrderSubData.encode(fromToken, toToken, amount, targetPrice, goodUntil, orderType);
407
- },
408
- };
409
-
410
- export const sparkEncode = {
411
- leverageManagement(
412
- triggerRepayRatio: number,
413
- triggerBoostRatio: number,
414
- targetBoostRatio: number,
415
- targetRepayRatio: number,
416
- boostEnabled: boolean,
417
- ) {
418
- let subInput = '0x';
419
-
420
- subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
421
- .padStart(32, '0'));
422
- subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
423
- .padStart(32, '0'));
424
- subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
425
- .padStart(32, '0'));
426
- subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
427
- .padStart(32, '0'));
428
- subInput = subInput.concat(boostEnabled ? '01' : '00');
429
-
430
- return subInput;
431
- },
432
- closeToAsset(
433
- strategyOrBundleId: number,
434
- isBundle: boolean = true,
435
- triggerData: {
436
- baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, ratioState: RatioState
437
- },
438
- subData: {
439
- collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number,
440
- },
441
- ) {
442
- const {
443
- collAsset, collAssetId, debtAsset, debtAssetId,
444
- } = subData;
445
- const subDataEncoded = subDataService.sparkQuotePriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId);
446
-
447
- const {
448
- baseTokenAddress, quoteTokenAddress, price, ratioState,
449
- } = triggerData;
450
- const triggerDataEncoded = triggerService.sparkQuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, ratioState);
451
-
452
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
453
- },
454
- };
455
-
456
- export const crvUSDEncode = {
457
- leverageManagement(
458
- owner: EthereumAddress,
459
- controllerAddr: EthereumAddress,
460
- ratioState: RatioState,
461
- targetRatio: number,
462
- triggerRatio: number,
463
- collTokenAddr: EthereumAddress,
464
- crvUSDAddr: EthereumAddress,
465
- ) {
466
- const subData = subDataService.crvUSDLeverageManagementSubData.encode(controllerAddr, ratioState, targetRatio, collTokenAddr, crvUSDAddr);
467
- const triggerData = triggerService.crvUSDRatioTrigger.encode(owner, controllerAddr, triggerRatio, ratioState);
468
-
469
- // over is boost, under is repay
470
- const strategyOrBundleId = ratioState === RatioState.OVER ? Bundles.MainnetIds.CRVUSD_BOOST : Bundles.MainnetIds.CRVUSD_REPAY;
471
- const isBundle = true;
472
-
473
- return [strategyOrBundleId, isBundle, triggerData, subData];
474
- },
475
- payback(
476
- proxyAddress: EthereumAddress,
477
- addressToPullTokensFrom: EthereumAddress,
478
- positionOwner: EthereumAddress,
479
- paybackAmount: string,
480
- crvUSDAddr: EthereumAddress,
481
- controllerAddr: EthereumAddress,
482
- minHealthRatio: number,
483
- ) {
484
- const subData = subDataService.crvUSDPaybackSubData.encode(controllerAddr, addressToPullTokensFrom, positionOwner, paybackAmount, crvUSDAddr);
485
- const triggerData = triggerService.crvUsdHealthRatioTrigger.encode(proxyAddress, controllerAddr, minHealthRatio);
486
-
487
- const strategyId = Strategies.MainnetIds.CURVEUSD_PAYBACK;
488
- const isBundle = false;
489
-
490
- return [strategyId, isBundle, triggerData, subData];
491
- },
492
- };
493
-
494
- export const morphoBlueEncode = {
495
- leverageManagement(
496
- marketId: string,
497
- loanToken: EthereumAddress,
498
- collToken: EthereumAddress,
499
- oracle: EthereumAddress,
500
- irm: EthereumAddress,
501
- lltv: string,
502
- ratioState: RatioState,
503
- targetRatio: number,
504
- triggerRatio: number,
505
- user: EthereumAddress,
506
- isEOA: boolean,
507
- network: ChainId,
508
- ) {
509
- const subData = subDataService.morphoBlueLeverageManagementSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
510
-
511
- const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
512
-
513
- // over is boost, under is repay
514
- const isBoost = ratioState === RatioState.OVER;
515
- let strategyOrBundleId;
516
-
517
- if (network === ChainId.Base) {
518
- return [isBoost ? Bundles.BaseIds.MORPHO_BLUE_BOOST : Bundles.BaseIds.MORPHO_BLUE_REPAY, true, triggerData, subData];
519
- }
520
-
521
- if (isBoost) strategyOrBundleId = isEOA ? Bundles.MainnetIds.MORPHO_BLUE_EOA_BOOST : Bundles.MainnetIds.MORPHO_BLUE_BOOST;
522
- else strategyOrBundleId = isEOA ? Bundles.MainnetIds.MORPHO_BLUE_EOA_REPAY : Bundles.MainnetIds.MORPHO_BLUE_REPAY;
523
- const isBundle = true;
524
-
525
- return [strategyOrBundleId, isBundle, triggerData, subData];
526
- },
527
- leverageManagementOnPrice(
528
- strategyOrBundleId: number,
529
- isBundle: boolean = true,
530
- loanToken: EthereumAddress,
531
- collToken: EthereumAddress,
532
- oracle: EthereumAddress,
533
- irm: EthereumAddress,
534
- lltv: string,
535
- user: EthereumAddress,
536
- targetRatio: number,
537
- price: number,
538
- priceState: RatioState,
539
- ) {
540
- const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
541
- const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
542
- return [strategyOrBundleId, isBundle, triggerData, subData];
543
- },
544
- };
545
-
546
- export const liquityV2Encode = {
547
- leverageManagement(
548
- market: EthereumAddress,
549
- troveId: string,
550
- collToken: EthereumAddress,
551
- boldToken: EthereumAddress,
552
- ratioState: RatioState,
553
- targetRatio: number,
554
- triggerRatio: number,
555
- strategyOrBundleId: number,
556
- ) {
557
- const isBundle = true;
558
- const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
559
- const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
560
-
561
- return [strategyOrBundleId, isBundle, triggerData, subData];
562
- },
563
- closeOnPrice(
564
- strategyOrBundleId: number,
565
- market: EthereumAddress,
566
- troveId: string,
567
- collToken: EthereumAddress,
568
- boldToken: EthereumAddress,
569
- stopLossPrice: number = 0,
570
- stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
571
- takeProfitPrice: number = 0,
572
- takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
573
- ) {
574
- const isBundle = true;
575
- const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
576
-
577
- const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
578
- const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
579
-
580
- return [strategyOrBundleId, isBundle, triggerData, subData];
581
- },
582
- leverageManagementOnPrice(
583
- strategyOrBundleId: number,
584
- market: EthereumAddress,
585
- price: number,
586
- state: RatioState,
587
- troveId: string,
588
- collToken: EthereumAddress,
589
- boldToken: EthereumAddress,
590
- targetRatio: number,
591
- isRepayOnPrice: boolean,
592
- ) {
593
- const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(
594
- market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice,
595
- );
596
-
597
- const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
598
- const isBundle = true;
599
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
600
- },
601
- payback(
602
- market: EthereumAddress,
603
- troveId: string,
604
- boldToken: EthereumAddress,
605
- targetRatio: number,
606
- ratioState: RatioState,
607
- triggerRatio: number,
608
- ) {
609
- const strategyId = Strategies.MainnetIds.LIQUITY_V2_PAYBACK;
610
- const isBundle = false;
611
-
612
- const subData = subDataService.liquityV2PaybackSubData.encode(market, troveId, boldToken, targetRatio, ratioState);
613
- const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
614
-
615
- return [strategyId, isBundle, triggerData, subData];
616
- },
617
- };
1
+ import Dec from 'decimal.js';
2
+ import { getAssetInfo } from '@defisaver/tokens';
3
+
4
+ import type { OrderType } from '../types/enums';
5
+ import {
6
+ CloseToAssetType,
7
+ Bundles,
8
+ ChainId,
9
+ RatioState,
10
+ Strategies,
11
+ } from '../types/enums';
12
+ import type { EthereumAddress, StrategyOrBundleIds } from '../types';
13
+
14
+ import { STRATEGY_IDS } from '../constants';
15
+
16
+ import * as subDataService from './subDataService';
17
+ import * as triggerService from './triggerService';
18
+ import {
19
+ compareAddresses, getCloseStrategyType, requireAddress, requireAddresses,
20
+ } from './utils';
21
+
22
+ export const makerEncode = {
23
+ repayFromSavings(
24
+ bundleId: StrategyOrBundleIds,
25
+ vaultId: number,
26
+ triggerRepayRatio: number,
27
+ targetRepayRatio: number,
28
+ isBundle: boolean = true,
29
+ chainId: ChainId = ChainId.Ethereum,
30
+ daiAddr?: EthereumAddress,
31
+ mcdCdpManagerAddr?: EthereumAddress,
32
+ ) {
33
+ const subData = subDataService.makerRepayFromSavingsSubData.encode(vaultId, targetRepayRatio, chainId, daiAddr, mcdCdpManagerAddr);
34
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRepayRatio, RatioState.UNDER);
35
+
36
+ return [bundleId, isBundle, triggerData, subData];
37
+ },
38
+ closeOnPrice(
39
+ vaultId: number,
40
+ ratioState: RatioState,
41
+ price: string,
42
+ closeToAssetAddr: EthereumAddress,
43
+ chainlinkCollAddress: EthereumAddress,
44
+ chainId: ChainId = ChainId.Ethereum,
45
+ daiAddr?: EthereumAddress,
46
+ mcdCdpManagerAddr?: EthereumAddress,
47
+ ) {
48
+ requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
49
+
50
+ const subData = subDataService.makerCloseSubData.encode(vaultId, closeToAssetAddr, chainId, daiAddr, mcdCdpManagerAddr);
51
+ const triggerData = triggerService.chainlinkPriceTrigger.encode(chainlinkCollAddress, price, ratioState);
52
+
53
+ const strategyOrBundleId = compareAddresses(closeToAssetAddr, getAssetInfo('DAI', chainId).address)
54
+ ? Strategies.MainnetIds.MAKER_CLOSE_ON_PRICE_TO_DAI
55
+ : Strategies.MainnetIds.MAKER_CLOSE_ON_PRICE_TO_COLL;
56
+
57
+ const isBundle = false;
58
+
59
+ return [strategyOrBundleId, isBundle, triggerData, subData];
60
+ },
61
+ trailingStop(
62
+ vaultId: number,
63
+ triggerPercentage: number,
64
+ closeToAssetAddr: EthereumAddress,
65
+ chainlinkCollAddress: EthereumAddress,
66
+ roundId: number,
67
+ chainId: ChainId = ChainId.Ethereum,
68
+ daiAddr?: EthereumAddress,
69
+ mcdCdpManagerAddr?: EthereumAddress,
70
+ ) {
71
+ requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
72
+
73
+ const subData = subDataService.makerCloseSubData.encode(vaultId, closeToAssetAddr, chainId, daiAddr, mcdCdpManagerAddr);
74
+ const triggerData = triggerService.trailingStopTrigger.encode(chainlinkCollAddress, triggerPercentage, roundId);
75
+
76
+ const strategyOrBundleId = compareAddresses(closeToAssetAddr, getAssetInfo('DAI', chainId).address)
77
+ ? Strategies.MainnetIds.MAKER_TRAILING_STOP_LOSS_TO_DAI
78
+ : Strategies.MainnetIds.MAKER_TRAILING_STOP_LOSS_TO_COLL;
79
+
80
+ const isBundle = false;
81
+
82
+ return [strategyOrBundleId, isBundle, triggerData, subData];
83
+ },
84
+ leverageManagement(
85
+ vaultId: number,
86
+ triggerRepayRatio: string,
87
+ triggerBoostRatio: string,
88
+ targetBoostRatio: string,
89
+ targetRepayRatio: string,
90
+ boostEnabled: boolean,
91
+ ) {
92
+ return [
93
+ vaultId,
94
+ new Dec(triggerRepayRatio).mul(1e16).toString(),
95
+ new Dec(triggerBoostRatio).mul(1e16).toString(),
96
+ new Dec(targetBoostRatio).mul(1e16).toString(),
97
+ new Dec(targetRepayRatio).mul(1e16).toString(),
98
+ boostEnabled,
99
+ ];
100
+ },
101
+ leverageManagementWithoutSubProxy(
102
+ vaultId: number,
103
+ triggerRatio: number,
104
+ targetRatio: number,
105
+ ratioState: RatioState,
106
+ isBoost: boolean,
107
+ daiAddr?: EthereumAddress,
108
+ ) {
109
+ const bundleId = isBoost ? Bundles.MainnetIds.MAKER_BOOST : Bundles.MainnetIds.MAKER_REPAY;
110
+
111
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
112
+
113
+ const subData = subDataService.makerLeverageManagementWithoutSubProxy.encode(vaultId, targetRatio, daiAddr);
114
+
115
+ return [
116
+ bundleId,
117
+ true,
118
+ triggerData,
119
+ subData,
120
+ ];
121
+ },
122
+ };
123
+
124
+ export const liquityEncode = {
125
+ closeOnPrice(
126
+ priceOverOrUnder: RatioState,
127
+ price: string,
128
+ closeToAssetAddr: EthereumAddress,
129
+ chainlinkCollAddress: EthereumAddress,
130
+ chainId: ChainId = ChainId.Ethereum,
131
+ collAddr?: EthereumAddress,
132
+ debtAddr?: EthereumAddress,
133
+ ) {
134
+ requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
135
+
136
+ const subData = subDataService.liquityCloseSubData.encode(closeToAssetAddr, chainId, collAddr, debtAddr);
137
+ const triggerData = triggerService.chainlinkPriceTrigger.encode(chainlinkCollAddress, price, priceOverOrUnder);
138
+
139
+ const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_CLOSE_ON_PRICE_TO_COLL;
140
+
141
+ const isBundle = false;
142
+
143
+ return [strategyOrBundleId, isBundle, triggerData, subData];
144
+ },
145
+ trailingStop(
146
+ triggerPercentage: number,
147
+ closeToAssetAddr: EthereumAddress,
148
+ chainlinkCollAddress: EthereumAddress,
149
+ roundId: number,
150
+ chainId: ChainId = ChainId.Ethereum,
151
+ collAddr?: EthereumAddress,
152
+ debtAddr?: EthereumAddress,
153
+ ) {
154
+ requireAddresses([closeToAssetAddr, chainlinkCollAddress]);
155
+
156
+ const subData = subDataService.liquityCloseSubData.encode(closeToAssetAddr, chainId, collAddr, debtAddr);
157
+ const triggerData = triggerService.trailingStopTrigger.encode(chainlinkCollAddress, triggerPercentage, roundId);
158
+
159
+ const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_TRAILING_STOP_LOSS_TO_COLL;
160
+
161
+ const isBundle = false;
162
+
163
+ return [strategyOrBundleId, isBundle, triggerData, subData];
164
+ },
165
+ paybackFromChickenBondStrategySub(
166
+ proxyAddress: EthereumAddress,
167
+ ratio: number,
168
+ sourceId: string,
169
+ sourceType: number,
170
+ ratioState: RatioState = RatioState.UNDER,
171
+ ) {
172
+ requireAddress(proxyAddress);
173
+ const subData = subDataService.liquityPaybackUsingChickenBondSubData.encode(sourceId, sourceType);
174
+ const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, ratio, ratioState);
175
+
176
+ const strategyId = Bundles.MainnetIds.LIQUITY_PAYBACK_USING_CHICKEN_BOND;
177
+
178
+ const isBundle = true;
179
+
180
+ return [strategyId, isBundle, triggerData, subData];
181
+ },
182
+ leverageManagement(
183
+ triggerRepayRatio:string,
184
+ triggerBoostRatio:string,
185
+ targetBoostRatio:string,
186
+ targetRepayRatio:string,
187
+ boostEnabled:boolean,
188
+ ) {
189
+ return [
190
+ new Dec(triggerRepayRatio).mul(1e16).toString(),
191
+ new Dec(triggerBoostRatio).mul(1e16).toString(),
192
+ new Dec(targetBoostRatio).mul(1e16).toString(),
193
+ new Dec(targetRepayRatio).mul(1e16).toString(),
194
+ boostEnabled,
195
+ ];
196
+ },
197
+ dsrPayback(
198
+ proxyAddress: EthereumAddress,
199
+ triggerRatio: number,
200
+ targetRatio: number,
201
+ ) {
202
+ requireAddress(proxyAddress);
203
+ const subData = subDataService.liquityDsrPaybackSubData.encode(targetRatio);
204
+ const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, triggerRatio, RatioState.UNDER);
205
+
206
+ const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DSR_PAYBACK;
207
+
208
+ const isBundle = false;
209
+
210
+ return [strategyOrBundleId, isBundle, triggerData, subData];
211
+ },
212
+ dsrSupply(
213
+ proxyAddress: EthereumAddress,
214
+ triggerRatio: number,
215
+ targetRatio: number,
216
+ ) {
217
+ requireAddress(proxyAddress);
218
+ const subData = subDataService.liquityDsrSupplySubData.encode(targetRatio);
219
+ const triggerData = triggerService.liquityRatioTrigger.encode(proxyAddress, triggerRatio, RatioState.UNDER);
220
+
221
+ const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DSR_SUPPLY;
222
+
223
+ const isBundle = false;
224
+
225
+ return [strategyOrBundleId, isBundle, triggerData, subData];
226
+ },
227
+ debtInFrontRepay(
228
+ proxyAddress: EthereumAddress,
229
+ debtInFrontMin: string,
230
+ targetRatioIncrease: number,
231
+ ) {
232
+ requireAddress(proxyAddress);
233
+ const subData = subDataService.liquityDebtInFrontRepaySubData.encode(targetRatioIncrease);
234
+ const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.encode(proxyAddress, debtInFrontMin);
235
+
236
+ const strategyOrBundleId = Strategies.MainnetIds.LIQUITY_DEBT_IN_FRONT_REPAY;
237
+
238
+ const isBundle = false;
239
+
240
+ return [strategyOrBundleId, isBundle, triggerData, subData];
241
+ },
242
+ };
243
+
244
+ export const chickenBondsEncode = {
245
+ rebond(bondId: number) {
246
+ return subDataService.cBondsRebondSubData.encode(bondId);
247
+ },
248
+ };
249
+
250
+ export const aaveV2Encode = {
251
+ leverageManagement(
252
+ triggerRepayRatio: number,
253
+ triggerBoostRatio: number,
254
+ targetBoostRatio: number,
255
+ targetRepayRatio: number,
256
+ boostEnabled: boolean,
257
+ ) {
258
+ return subDataService.aaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
259
+ },
260
+ };
261
+
262
+ export const aaveV3Encode = {
263
+ leverageManagement(
264
+ triggerRepayRatio: number,
265
+ triggerBoostRatio: number,
266
+ targetBoostRatio: number,
267
+ targetRepayRatio: number,
268
+ boostEnabled: boolean,
269
+ ) {
270
+ let subInput = '0x';
271
+
272
+ subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
273
+ .padStart(32, '0'));
274
+ subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
275
+ .padStart(32, '0'));
276
+ subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
277
+ .padStart(32, '0'));
278
+ subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
279
+ .padStart(32, '0'));
280
+ subInput = subInput.concat(boostEnabled ? '01' : '00');
281
+
282
+ return subInput;
283
+ },
284
+ closeToAsset(
285
+ strategyOrBundleId: number,
286
+ isBundle: boolean = true,
287
+ triggerData: {
288
+ baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, ratioState: RatioState
289
+ },
290
+ subData: {
291
+ collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number,
292
+ },
293
+ ) {
294
+ const {
295
+ collAsset, collAssetId, debtAsset, debtAssetId,
296
+ } = subData;
297
+ const subDataEncoded = subDataService.aaveV3QuotePriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId);
298
+
299
+ const {
300
+ baseTokenAddress, quoteTokenAddress, price, ratioState,
301
+ } = triggerData;
302
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, ratioState);
303
+
304
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
305
+ },
306
+ closeToAssetWithMaximumGasPrice(
307
+ strategyOrBundleId: number,
308
+ isBundle: boolean = true,
309
+ triggerData: {
310
+ baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, ratioState: RatioState, maximumGasPrice: number
311
+ },
312
+ subData: {
313
+ collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number,
314
+ },
315
+ ) {
316
+ const {
317
+ collAsset, collAssetId, debtAsset, debtAssetId,
318
+ } = subData;
319
+ const subDataEncoded = subDataService.aaveV3QuotePriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId);
320
+
321
+ const {
322
+ baseTokenAddress, quoteTokenAddress, price, maximumGasPrice, ratioState,
323
+ } = triggerData;
324
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, ratioState, maximumGasPrice);
325
+
326
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
327
+ },
328
+ leverageManagementOnPrice(
329
+ strategyOrBundleId: number,
330
+ isBundle: boolean = true,
331
+ triggerData: {
332
+ baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, state: RatioState.UNDER
333
+ },
334
+ subData: {
335
+ collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number,
336
+ },
337
+ ) {
338
+ const {
339
+ collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio,
340
+ } = subData;
341
+ const subDataEncoded = subDataService.aaveV3LeverageManagementOnPriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio);
342
+
343
+ const {
344
+ baseTokenAddress, quoteTokenAddress, price, state,
345
+ } = triggerData;
346
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, state);
347
+
348
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
349
+ },
350
+ leverageManagementWithoutSubProxy(
351
+ strategyOrBundleId: number,
352
+ market: EthereumAddress,
353
+ user: EthereumAddress,
354
+ ratioState: RatioState,
355
+ targetRatio: number,
356
+ triggerRatio: number,
357
+ isGeneric: boolean = false, // added later, isGeneric should be `false` for old strategies (if some are using this). For EOA should be `TRUE` !!! In the future, if we switch new SW subs to generic strategies too, then all new strategies should go with `isGeneric = true`. Old ones should stay the same
358
+ ) {
359
+ const isBundle = true;
360
+
361
+ const subData = subDataService.aaveV3LeverageManagementSubDataWithoutSubProxy.encode(
362
+ targetRatio,
363
+ ratioState,
364
+ market,
365
+ user,
366
+ isGeneric,
367
+ );
368
+ const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
369
+
370
+ return [strategyOrBundleId, isBundle, triggerData, subData];
371
+ },
372
+
373
+ leverageManagementOnPriceGeneric(
374
+ strategyOrBundleId: number,
375
+ price: number,
376
+ ratioState: RatioState,
377
+ collAsset: EthereumAddress,
378
+ collAssetId: number,
379
+ debtAsset: EthereumAddress,
380
+ debtAssetId: number,
381
+ marketAddr: EthereumAddress,
382
+ targetRatio: number,
383
+ user: EthereumAddress,
384
+ ) {
385
+ const isBundle = true;
386
+ const subDataEncoded = subDataService.aaveV3LeverageManagementOnPriceGeneric.encode(
387
+ collAsset,
388
+ collAssetId,
389
+ debtAsset,
390
+ debtAssetId,
391
+ marketAddr,
392
+ targetRatio,
393
+ user,
394
+ );
395
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(collAsset, debtAsset, price, ratioState);
396
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
397
+ },
398
+
399
+ closeOnPriceGeneric(
400
+ strategyOrBundleId: number,
401
+ collAsset: EthereumAddress,
402
+ collAssetId: number,
403
+ debtAsset: EthereumAddress,
404
+ debtAssetId: number,
405
+ marketAddr: EthereumAddress,
406
+ user: EthereumAddress,
407
+ stopLossPrice: number = 0,
408
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
409
+ takeProfitPrice: number = 0,
410
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
411
+ ) {
412
+ const isBundle = true;
413
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
414
+
415
+ const subDataEncoded = subDataService.aaveV3CloseGenericSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, user);
416
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceRangeTrigger.encode(collAsset, debtAsset, stopLossPrice, takeProfitPrice);
417
+
418
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
419
+ },
420
+
421
+ collateralSwitch(
422
+ strategyOrBundleId: number,
423
+ fromAsset: EthereumAddress,
424
+ fromAssetId: number,
425
+ toAsset: EthereumAddress,
426
+ toAssetId: number,
427
+ marketAddr: EthereumAddress,
428
+ amountToSwitch: string,
429
+ baseTokenAddress: EthereumAddress,
430
+ quoteTokenAddress: EthereumAddress,
431
+ price: number,
432
+ state: RatioState,
433
+ ) {
434
+ const isBundle = false;
435
+
436
+ const subDataEncoded = subDataService.aaveV3CollateralSwitchSubData.encode(fromAsset, fromAssetId, toAsset, toAssetId, marketAddr, amountToSwitch);
437
+ const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, state);
438
+
439
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
440
+ },
441
+ };
442
+
443
+ export const compoundV2Encode = {
444
+ leverageManagement(
445
+ triggerRepayRatio: number,
446
+ triggerBoostRatio: number,
447
+ targetBoostRatio: number,
448
+ targetRepayRatio: number,
449
+ boostEnabled: boolean,
450
+ ) {
451
+ return subDataService.compoundV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
452
+ },
453
+ };
454
+
455
+ export const compoundV3Encode = {
456
+ leverageManagement(
457
+ market: EthereumAddress,
458
+ baseToken: EthereumAddress,
459
+ triggerRepayRatio: number,
460
+ triggerBoostRatio: number,
461
+ targetBoostRatio: number,
462
+ targetRepayRatio: number,
463
+ boostEnabled: boolean,
464
+ isEOA: boolean,
465
+ ) {
466
+ return subDataService.compoundV3LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
467
+ },
468
+ leverageManagementOnPrice(
469
+ strategyOrBundleId: number,
470
+ market: EthereumAddress,
471
+ collToken: EthereumAddress,
472
+ baseToken: EthereumAddress,
473
+ targetRatio: number,
474
+ price: number,
475
+ priceState: RatioState,
476
+ ratioState: RatioState, // REPAY for repay on price, BOOST for boost on price
477
+ user: EthereumAddress,
478
+ ) {
479
+ const isBundle = true;
480
+ const subDataEncoded = subDataService.compoundV3LeverageManagementOnPriceSubData.encode(market, collToken, baseToken, targetRatio, ratioState, user);
481
+ const triggerDataEncoded = triggerService.compoundV3PriceTrigger.encode(market, collToken, user, price, priceState);
482
+
483
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
484
+ },
485
+ closeOnPrice(
486
+ strategyOrBundleId: number,
487
+ market: EthereumAddress,
488
+ collToken: EthereumAddress,
489
+ baseToken: EthereumAddress,
490
+ stopLossPrice: number = 0,
491
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
492
+ takeProfitPrice: number = 0,
493
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
494
+ user: EthereumAddress,
495
+ ) {
496
+ const isBundle = true;
497
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
498
+
499
+ const subDataEncoded = subDataService.compoundV3CloseSubData.encode(market, collToken, baseToken, closeType, user);
500
+ const triggerDataEncoded = triggerService.compoundV3PriceRangeTrigger.encode(market, collToken, stopLossPrice, takeProfitPrice);
501
+
502
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
503
+ },
504
+ };
505
+
506
+ export const compoundV3L2Encode = {
507
+ leverageManagement(
508
+ market: EthereumAddress,
509
+ baseToken: EthereumAddress,
510
+ triggerRepayRatio: number,
511
+ triggerBoostRatio: number,
512
+ targetBoostRatio: number,
513
+ targetRepayRatio: number,
514
+ boostEnabled: boolean,
515
+ isEOA: boolean = false,
516
+ ) {
517
+ return subDataService.compoundV3L2LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
518
+ },
519
+ };
520
+
521
+ export const morphoAaveV2Encode = {
522
+ leverageManagement(
523
+ triggerRepayRatio: number,
524
+ triggerBoostRatio: number,
525
+ targetBoostRatio: number,
526
+ targetRepayRatio: number,
527
+ boostEnabled: boolean,
528
+ ) {
529
+ return subDataService.morphoAaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
530
+ },
531
+ };
532
+
533
+ export const exchangeEncode = {
534
+ dca(
535
+ fromToken: EthereumAddress,
536
+ toToken: EthereumAddress,
537
+ amount: string,
538
+ timestamp: number,
539
+ interval: number,
540
+ network: ChainId,
541
+ ) {
542
+ requireAddresses([fromToken, toToken]);
543
+ const subData = subDataService.exchangeDcaSubData.encode(fromToken, toToken, amount, interval);
544
+ const triggerData = triggerService.exchangeTimestampTrigger.encode(timestamp, interval);
545
+
546
+ const strategyId = STRATEGY_IDS[network].EXCHANGE_DCA;
547
+
548
+ return [strategyId, false, triggerData, subData];
549
+ },
550
+ limitOrder(
551
+ fromToken: EthereumAddress,
552
+ toToken: EthereumAddress,
553
+ amount: string,
554
+ targetPrice: string,
555
+ goodUntil: string | number,
556
+ orderType: OrderType,
557
+ ) {
558
+ return subDataService.exchangeLimitOrderSubData.encode(fromToken, toToken, amount, targetPrice, goodUntil, orderType);
559
+ },
560
+ };
561
+
562
+ export const sparkEncode = {
563
+ leverageManagement(
564
+ triggerRepayRatio: number,
565
+ triggerBoostRatio: number,
566
+ targetBoostRatio: number,
567
+ targetRepayRatio: number,
568
+ boostEnabled: boolean,
569
+ ) {
570
+ let subInput = '0x';
571
+
572
+ subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
573
+ .padStart(32, '0'));
574
+ subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
575
+ .padStart(32, '0'));
576
+ subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
577
+ .padStart(32, '0'));
578
+ subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
579
+ .padStart(32, '0'));
580
+ subInput = subInput.concat(boostEnabled ? '01' : '00');
581
+
582
+ return subInput;
583
+ },
584
+ leverageManagementOnPrice(
585
+ strategyOrBundleId: number,
586
+ isBundle: boolean = true,
587
+ triggerData: {
588
+ baseTokenAddr: EthereumAddress, quoteTokenAddr: EthereumAddress, price: number, ratioState: RatioState
589
+ },
590
+ subData: {
591
+ collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number,
592
+ },
593
+ ) {
594
+ const {
595
+ collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio,
596
+ } = subData;
597
+ const subDataEncoded = subDataService.sparkLeverageManagementOnPriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio);
598
+
599
+ const {
600
+ baseTokenAddr, quoteTokenAddr, price, ratioState,
601
+ } = triggerData;
602
+ const triggerDataEncoded = triggerService.sparkQuotePriceTrigger.encode(baseTokenAddr, quoteTokenAddr, price, ratioState);
603
+
604
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
605
+ },
606
+ closeOnPriceGeneric(
607
+ strategyOrBundleId: number,
608
+ collAsset: EthereumAddress,
609
+ collAssetId: number,
610
+ debtAsset: EthereumAddress,
611
+ debtAssetId: number,
612
+ marketAddr: EthereumAddress,
613
+ user: EthereumAddress,
614
+ stopLossPrice: number = 0,
615
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
616
+ takeProfitPrice: number = 0,
617
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
618
+ ) {
619
+ const isBundle = true;
620
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
621
+
622
+ const subDataEncoded = subDataService.sparkCloseGenericSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, user);
623
+ const triggerDataEncoded = triggerService.sparkQuotePriceRangeTrigger.encode(collAsset, debtAsset, stopLossPrice, takeProfitPrice);
624
+
625
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
626
+ },
627
+ leverageManagementWithoutSubProxy(
628
+ strategyOrBundleId: number,
629
+ market: EthereumAddress,
630
+ user: EthereumAddress,
631
+ ratioState: RatioState,
632
+ targetRatio: number,
633
+ triggerRatio: number,
634
+ ) {
635
+ const isBundle = true;
636
+
637
+ const subData = subDataService.sparkLeverageManagementSubDataWithoutSubProxy.encode(
638
+ targetRatio,
639
+ ratioState,
640
+ );
641
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
642
+
643
+ return [strategyOrBundleId, isBundle, triggerData, subData];
644
+ },
645
+ collateralSwitch(
646
+ strategyOrBundleId: number,
647
+ fromAsset: EthereumAddress,
648
+ fromAssetId: number,
649
+ toAsset: EthereumAddress,
650
+ toAssetId: number,
651
+ marketAddr: EthereumAddress,
652
+ amountToSwitch: string,
653
+ baseTokenAddress: EthereumAddress,
654
+ quoteTokenAddress: EthereumAddress,
655
+ price: number,
656
+ state: RatioState,
657
+ ) {
658
+ const isBundle = false;
659
+
660
+ const subDataEncoded = subDataService.sparkCollateralSwitchSubData.encode(fromAsset, fromAssetId, toAsset, toAssetId, marketAddr, amountToSwitch);
661
+ const triggerDataEncoded = triggerService.sparkQuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, state);
662
+
663
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
664
+ },
665
+
666
+ };
667
+
668
+ export const crvUSDEncode = {
669
+ leverageManagement(
670
+ owner: EthereumAddress,
671
+ controllerAddr: EthereumAddress,
672
+ ratioState: RatioState,
673
+ targetRatio: number,
674
+ triggerRatio: number,
675
+ collTokenAddr: EthereumAddress,
676
+ crvUSDAddr: EthereumAddress,
677
+ ) {
678
+ const subData = subDataService.crvUSDLeverageManagementSubData.encode(controllerAddr, ratioState, targetRatio, collTokenAddr, crvUSDAddr);
679
+ const triggerData = triggerService.crvUSDRatioTrigger.encode(owner, controllerAddr, triggerRatio, ratioState);
680
+
681
+ // over is boost, under is repay
682
+ const strategyOrBundleId = ratioState === RatioState.OVER ? Bundles.MainnetIds.CRVUSD_BOOST : Bundles.MainnetIds.CRVUSD_REPAY;
683
+ const isBundle = true;
684
+
685
+ return [strategyOrBundleId, isBundle, triggerData, subData];
686
+ },
687
+ payback(
688
+ proxyAddress: EthereumAddress,
689
+ addressToPullTokensFrom: EthereumAddress,
690
+ positionOwner: EthereumAddress,
691
+ paybackAmount: string,
692
+ crvUSDAddr: EthereumAddress,
693
+ controllerAddr: EthereumAddress,
694
+ minHealthRatio: number,
695
+ ) {
696
+ const subData = subDataService.crvUSDPaybackSubData.encode(controllerAddr, addressToPullTokensFrom, positionOwner, paybackAmount, crvUSDAddr);
697
+ const triggerData = triggerService.crvUsdHealthRatioTrigger.encode(proxyAddress, controllerAddr, minHealthRatio);
698
+
699
+ const strategyId = Strategies.MainnetIds.CURVEUSD_PAYBACK;
700
+ const isBundle = false;
701
+
702
+ return [strategyId, isBundle, triggerData, subData];
703
+ },
704
+ };
705
+
706
+ export const morphoBlueEncode = {
707
+ leverageManagement(
708
+ marketId: string,
709
+ loanToken: EthereumAddress,
710
+ collToken: EthereumAddress,
711
+ oracle: EthereumAddress,
712
+ irm: EthereumAddress,
713
+ lltv: string,
714
+ ratioState: RatioState,
715
+ targetRatio: number,
716
+ triggerRatio: number,
717
+ user: EthereumAddress,
718
+ isEOA: boolean,
719
+ network: ChainId,
720
+ ) {
721
+ const subData = subDataService.morphoBlueLeverageManagementSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
722
+
723
+ const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
724
+
725
+ // over is boost, under is repay
726
+ const isBoost = ratioState === RatioState.OVER;
727
+ let strategyOrBundleId;
728
+
729
+ if (network === ChainId.Base) {
730
+ return [isBoost ? Bundles.BaseIds.MORPHO_BLUE_BOOST : Bundles.BaseIds.MORPHO_BLUE_REPAY, true, triggerData, subData];
731
+ }
732
+
733
+ const bundlesIds = network === ChainId.Arbitrum ? Bundles.ArbitrumIds : Bundles.MainnetIds;
734
+
735
+ if (isBoost) strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST : bundlesIds.MORPHO_BLUE_BOOST;
736
+ else strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY : bundlesIds.MORPHO_BLUE_REPAY;
737
+ const isBundle = true;
738
+
739
+ return [strategyOrBundleId, isBundle, triggerData, subData];
740
+ },
741
+ leverageManagementOnPrice(
742
+ strategyOrBundleId: number,
743
+ isBundle: boolean = true,
744
+ loanToken: EthereumAddress,
745
+ collToken: EthereumAddress,
746
+ oracle: EthereumAddress,
747
+ irm: EthereumAddress,
748
+ lltv: string,
749
+ user: EthereumAddress,
750
+ targetRatio: number,
751
+ price: number,
752
+ priceState: RatioState,
753
+ ) {
754
+ const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
755
+ const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
756
+ return [strategyOrBundleId, isBundle, triggerData, subData];
757
+ },
758
+ closeOnPrice(
759
+ strategyOrBundleId: number,
760
+ loanToken: EthereumAddress,
761
+ collToken: EthereumAddress,
762
+ oracle: EthereumAddress,
763
+ irm: EthereumAddress,
764
+ lltv: string,
765
+ user: EthereumAddress,
766
+ stopLossPrice: number = 0,
767
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
768
+ takeProfitPrice: number = 0,
769
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
770
+ ) {
771
+ const isBundle = true;
772
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
773
+
774
+ const subDataEncoded = subDataService.morphoBlueCloseOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, user, closeType);
775
+ const triggerDataEncoded = triggerService.morphoBluePriceRangeTrigger.encode(oracle, collToken, loanToken, stopLossPrice, takeProfitPrice);
776
+
777
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
778
+ },
779
+ };
780
+
781
+ export const liquityV2Encode = {
782
+ leverageManagement(
783
+ market: EthereumAddress,
784
+ troveId: string,
785
+ collToken: EthereumAddress,
786
+ boldToken: EthereumAddress,
787
+ ratioState: RatioState,
788
+ targetRatio: number,
789
+ triggerRatio: number,
790
+ strategyOrBundleId: number,
791
+ ) {
792
+ const isBundle = true;
793
+ const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
794
+ const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
795
+
796
+ return [strategyOrBundleId, isBundle, triggerData, subData];
797
+ },
798
+ closeOnPrice(
799
+ strategyOrBundleId: number,
800
+ market: EthereumAddress,
801
+ troveId: string,
802
+ collToken: EthereumAddress,
803
+ boldToken: EthereumAddress,
804
+ stopLossPrice: number = 0,
805
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
806
+ takeProfitPrice: number = 0,
807
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
808
+ ) {
809
+ const isBundle = true;
810
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
811
+
812
+ const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
813
+ const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
814
+
815
+ return [strategyOrBundleId, isBundle, triggerData, subData];
816
+ },
817
+ leverageManagementOnPrice(
818
+ strategyOrBundleId: number,
819
+ market: EthereumAddress,
820
+ price: number,
821
+ state: RatioState,
822
+ troveId: string,
823
+ collToken: EthereumAddress,
824
+ boldToken: EthereumAddress,
825
+ targetRatio: number,
826
+ isRepayOnPrice: boolean,
827
+ ) {
828
+ const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(
829
+ market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice,
830
+ );
831
+
832
+ const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
833
+ const isBundle = true;
834
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
835
+ },
836
+ payback(
837
+ market: EthereumAddress,
838
+ troveId: string,
839
+ boldToken: EthereumAddress,
840
+ targetRatio: number,
841
+ ratioState: RatioState,
842
+ triggerRatio: number,
843
+ ) {
844
+ const strategyId = Strategies.MainnetIds.LIQUITY_V2_PAYBACK;
845
+ const isBundle = false;
846
+
847
+ const subData = subDataService.liquityV2PaybackSubData.encode(market, troveId, boldToken, targetRatio, ratioState);
848
+ const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
849
+
850
+ return [strategyId, isBundle, triggerData, subData];
851
+ },
852
+ };
853
+
854
+ export const fluidEncode = {
855
+ leverageManagement(
856
+ nftId: string,
857
+ vault: EthereumAddress,
858
+ ratioState: RatioState,
859
+ targetRatio: number,
860
+ triggerRatio: number,
861
+ strategyOrBundleId: number,
862
+ ) {
863
+ const isBundle = true;
864
+ const subData = subDataService.fluidLeverageManagementSubData.encode(nftId, vault, ratioState, targetRatio);
865
+ const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
866
+
867
+ return [strategyOrBundleId, isBundle, triggerData, subData];
868
+ },
869
+ };
870
+
871
+ export const aaveV4Encode = {
872
+ leverageManagement(
873
+ strategyOrBundleId: number,
874
+ owner: EthereumAddress,
875
+ spoke: EthereumAddress,
876
+ ratioState: RatioState,
877
+ targetRatio: number,
878
+ triggerRatio: number,
879
+ ) {
880
+ const isBundle = true;
881
+ const subData = subDataService.aaveV4LeverageManagementSubData.encode(spoke, owner, ratioState, targetRatio);
882
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
883
+
884
+ return [strategyOrBundleId, isBundle, triggerData, subData];
885
+ },
886
+ leverageManagementOnPrice(
887
+ strategyOrBundleId: number,
888
+ owner: EthereumAddress,
889
+ spoke: EthereumAddress,
890
+ collAsset: EthereumAddress,
891
+ collAssetId: number,
892
+ debtAsset: EthereumAddress,
893
+ debtAssetId: number,
894
+ targetRatio: number,
895
+ price: string,
896
+ priceState: RatioState,
897
+ ratioState: RatioState, // UNDER for repay, OVER for boost
898
+ ) {
899
+ const isBundle = true;
900
+ const subData = subDataService.aaveV4LeverageManagementOnPriceSubData.encode(
901
+ spoke,
902
+ owner,
903
+ collAsset,
904
+ collAssetId,
905
+ debtAsset,
906
+ debtAssetId,
907
+ ratioState,
908
+ targetRatio,
909
+ );
910
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.encode(
911
+ spoke,
912
+ collAssetId,
913
+ debtAssetId,
914
+ price,
915
+ priceState,
916
+ );
917
+
918
+ return [strategyOrBundleId, isBundle, triggerData, subData];
919
+ },
920
+ closeOnPrice(
921
+ strategyOrBundleId: number,
922
+ owner: EthereumAddress,
923
+ spoke: EthereumAddress,
924
+ collAsset: EthereumAddress,
925
+ collAssetId: number,
926
+ debtAsset: EthereumAddress,
927
+ debtAssetId: number,
928
+ stopLossPrice: string = '0',
929
+ stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
930
+ takeProfitPrice: string = '0',
931
+ takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
932
+ ) {
933
+ const isBundle = true;
934
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
935
+
936
+ const subData = subDataService.aaveV4CloseSubData.encode(
937
+ spoke,
938
+ owner,
939
+ collAsset,
940
+ collAssetId,
941
+ debtAsset,
942
+ debtAssetId,
943
+ closeType,
944
+ );
945
+ const triggerData = triggerService.aaveV4QuotePriceRangeTrigger.encode(
946
+ spoke,
947
+ collAssetId,
948
+ debtAssetId,
949
+ stopLossPrice,
950
+ takeProfitPrice,
951
+ );
952
+
953
+ return [strategyOrBundleId, isBundle, triggerData, subData];
954
+ },
955
+ collateralSwitch(
956
+ strategyOrBundleId: number,
957
+ owner: EthereumAddress,
958
+ spoke: EthereumAddress,
959
+ fromAsset: EthereumAddress,
960
+ fromAssetId: number,
961
+ toAsset: EthereumAddress,
962
+ toAssetId: number,
963
+ amountToSwitch: string,
964
+ price: string,
965
+ ratioState: RatioState,
966
+ ) {
967
+ const isBundle = false;
968
+ const subData = subDataService.aaveV4CollateralSwitchSubData.encode(
969
+ spoke,
970
+ owner,
971
+ fromAsset,
972
+ fromAssetId,
973
+ toAsset,
974
+ toAssetId,
975
+ amountToSwitch,
976
+ );
977
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.encode(
978
+ spoke,
979
+ fromAssetId, // baseTokenId
980
+ toAssetId, // quoteTokenId
981
+ price,
982
+ ratioState,
983
+ );
984
+
985
+ return [strategyOrBundleId, isBundle, triggerData, subData];
986
+ },
987
+ };