@defisaver/automation-sdk 3.2.5 → 3.3.1

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 (244) 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 +33 -33
  31. package/cjs/automation/private/StrategiesAutomation.js +189 -189
  32. package/cjs/automation/private/StrategiesAutomation.test.d.ts +1 -1
  33. package/cjs/automation/private/StrategiesAutomation.test.js +671 -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 +28 -28
  53. package/cjs/constants/index.js +674 -564
  54. package/cjs/index.d.ts +23 -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 +49 -49
  60. package/cjs/services/ethereumService.test.d.ts +1 -1
  61. package/cjs/services/ethereumService.test.js +242 -242
  62. package/cjs/services/strategiesService.d.ts +2 -2
  63. package/cjs/services/strategiesService.js +944 -898
  64. package/cjs/services/strategiesService.test.d.ts +1 -1
  65. package/cjs/services/strategiesService.test.js +110 -110
  66. package/cjs/services/strategySubService.d.ts +113 -111
  67. package/cjs/services/strategySubService.js +328 -314
  68. package/cjs/services/strategySubService.test.d.ts +1 -1
  69. package/cjs/services/strategySubService.test.js +1058 -936
  70. package/cjs/services/subDataService.d.ts +282 -261
  71. package/cjs/services/subDataService.js +740 -683
  72. package/cjs/services/subDataService.test.d.ts +1 -1
  73. package/cjs/services/subDataService.test.js +1458 -1282
  74. package/cjs/services/triggerService.d.ts +268 -249
  75. package/cjs/services/triggerService.js +509 -473
  76. package/cjs/services/triggerService.test.d.ts +1 -1
  77. package/cjs/services/triggerService.test.js +1139 -1045
  78. package/cjs/services/utils.d.ts +30 -30
  79. package/cjs/services/utils.js +182 -182
  80. package/cjs/services/utils.test.d.ts +1 -1
  81. package/cjs/services/utils.test.js +376 -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 +253 -226
  101. package/cjs/types/enums.js +279 -252
  102. package/cjs/types/index.d.ts +264 -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 +33 -33
  126. package/esm/automation/private/StrategiesAutomation.js +183 -183
  127. package/esm/automation/private/StrategiesAutomation.test.d.ts +1 -1
  128. package/esm/automation/private/StrategiesAutomation.test.js +666 -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 +28 -28
  148. package/esm/constants/index.js +668 -558
  149. package/esm/index.d.ts +23 -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 +41 -41
  155. package/esm/services/ethereumService.test.d.ts +1 -1
  156. package/esm/services/ethereumService.test.js +237 -237
  157. package/esm/services/strategiesService.d.ts +2 -2
  158. package/esm/services/strategiesService.js +914 -868
  159. package/esm/services/strategiesService.test.d.ts +1 -1
  160. package/esm/services/strategiesService.test.js +108 -108
  161. package/esm/services/strategySubService.d.ts +113 -111
  162. package/esm/services/strategySubService.js +299 -285
  163. package/esm/services/strategySubService.test.d.ts +1 -1
  164. package/esm/services/strategySubService.test.js +1030 -908
  165. package/esm/services/subDataService.d.ts +282 -261
  166. package/esm/services/subDataService.js +734 -677
  167. package/esm/services/subDataService.test.d.ts +1 -1
  168. package/esm/services/subDataService.test.js +1430 -1254
  169. package/esm/services/triggerService.d.ts +268 -249
  170. package/esm/services/triggerService.js +480 -444
  171. package/esm/services/triggerService.test.d.ts +1 -1
  172. package/esm/services/triggerService.test.js +1114 -1020
  173. package/esm/services/utils.d.ts +30 -30
  174. package/esm/services/utils.js +131 -131
  175. package/esm/services/utils.test.d.ts +1 -1
  176. package/esm/services/utils.test.js +348 -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 +253 -226
  196. package/esm/types/enums.js +276 -249
  197. package/esm/types/index.d.ts +264 -248
  198. package/esm/types/index.js +1 -1
  199. package/package.json +60 -60
  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 +663 -663
  216. package/src/automation/private/StrategiesAutomation.ts +254 -254
  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 +702 -593
  227. package/src/index.ts +39 -39
  228. package/src/services/contractService.ts +77 -77
  229. package/src/services/ethereumService.test.ts +257 -257
  230. package/src/services/ethereumService.ts +69 -69
  231. package/src/services/strategiesService.test.ts +105 -105
  232. package/src/services/strategiesService.ts +1216 -1158
  233. package/src/services/strategySubService.test.ts +1250 -1122
  234. package/src/services/strategySubService.ts +685 -648
  235. package/src/services/subDataService.test.ts +1546 -1387
  236. package/src/services/subDataService.ts +1024 -934
  237. package/src/services/triggerService.test.ts +1234 -1130
  238. package/src/services/triggerService.ts +659 -602
  239. package/src/services/utils.test.ts +430 -430
  240. package/src/services/utils.ts +162 -162
  241. package/src/types/enums.ts +273 -246
  242. package/src/types/index.ts +333 -312
  243. package/tsconfig.esm.json +8 -8
  244. package/tsconfig.json +22 -22
@@ -1,1158 +1,1216 @@
1
- import { getAssetInfoByAddress } from '@defisaver/tokens';
2
- import { cloneDeep } from 'lodash';
3
-
4
- import Web3 from 'web3';
5
- import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
6
- import type {
7
- Position, ParseData, StrategiesToProtocolVersionMapping, BundleOrStrategy, StrategyOrBundleIds,
8
- BundleInfoUnion, StrategyInfoUnion,
9
- } from '../types';
10
- import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
11
-
12
- import {
13
- getPositionId, getRatioStateInfoForAaveCloseStrategy, getStopLossAndTakeProfitTypeByCloseStrategyType, isRatioStateOver, wethToEthByAddress,
14
- } from './utils';
15
- import * as subDataService from './subDataService';
16
- import * as triggerService from './triggerService';
17
-
18
- const web3 = new Web3();
19
-
20
- const SPARK_MARKET_ADDRESSES = {
21
- [ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
22
- };
23
-
24
- const AAVE_V3_MARKET_ADDRESSES = {
25
- [ChainId.Ethereum]: '0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e',
26
- [ChainId.Optimism]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
27
- [ChainId.Arbitrum]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
28
- [ChainId.Base]: '0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D',
29
-
30
- };
31
-
32
- function parseMakerSavingsLiqProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
33
- const _position = cloneDeep(position);
34
-
35
- const { subStruct } = parseData.subscriptionEventData;
36
-
37
- const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
38
- const subData = subDataService.makerRepayFromSavingsSubData.decode(subStruct.subData);
39
-
40
- _position.strategyData.decoded.triggerData = triggerData;
41
- _position.strategyData.decoded.subData = subData;
42
-
43
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
44
-
45
- _position.specific = {
46
- triggerRepayRatio: Number(triggerData.ratio),
47
- targetRepayRatio: Number(subData.targetRatio),
48
- repayEnabled: true,
49
- boostEnabled: false,
50
- };
51
-
52
- return _position;
53
- }
54
-
55
- function parseMakerCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
56
- const _position = cloneDeep(position);
57
-
58
- const { subStruct } = parseData.subscriptionEventData;
59
-
60
- const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
61
- const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
62
-
63
- _position.strategyData.decoded.triggerData = triggerData;
64
- _position.strategyData.decoded.subData = subData;
65
-
66
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
67
-
68
- const isTakeProfit = isRatioStateOver(Number(triggerData.state));
69
-
70
- _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
71
-
72
- _position.specific = {
73
- price: triggerData.price,
74
- closeToAssetAddr: subData.closeToAssetAddr,
75
- };
76
-
77
- return _position;
78
- }
79
-
80
- function parseMakerTrailingStop(position: Position.Automated, parseData: ParseData): Position.Automated {
81
- const _position = cloneDeep(position);
82
-
83
- const { subStruct } = parseData.subscriptionEventData;
84
-
85
- const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
86
- const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
87
-
88
- _position.strategyData.decoded.triggerData = triggerData;
89
- _position.strategyData.decoded.subData = subData;
90
-
91
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
92
-
93
- _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
94
-
95
- _position.specific = {
96
- triggerPercentage: Number(triggerData.triggerPercentage),
97
- roundId: Number(triggerData.roundId),
98
- closeToAssetAddr: subData.closeToAssetAddr,
99
- };
100
-
101
- return _position;
102
- }
103
-
104
- function parseMakerLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
105
- const _position = cloneDeep(position);
106
-
107
- const { subStruct, subId } = parseData.subscriptionEventData;
108
- const { isEnabled } = parseData.strategiesSubsData;
109
-
110
- const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
111
- const subData = subDataService.makerLeverageManagementSubData.decode(subStruct.subData);
112
-
113
- _position.strategyData.decoded.triggerData = triggerData;
114
- _position.strategyData.decoded.subData = subData;
115
-
116
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
117
-
118
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
119
-
120
- if (isRepay) {
121
- _position.specific = {
122
- triggerRepayRatio: triggerData.ratio,
123
- targetRepayRatio: subData.targetRatio,
124
- repayEnabled: true,
125
- subId1: Number(subId),
126
- mergeWithId: Strategies.Identifiers.Boost,
127
- };
128
- } else {
129
- _position.specific = {
130
- triggerBoostRatio: triggerData.ratio,
131
- targetBoostRatio: subData.targetRatio,
132
- boostEnabled: isEnabled,
133
- subId2: Number(subId),
134
- mergeId: Strategies.Identifiers.Boost,
135
- };
136
- }
137
-
138
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
139
-
140
- return _position;
141
- }
142
-
143
- function parseLiquityCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
144
- const _position = cloneDeep(position);
145
-
146
- const { subStruct } = parseData.subscriptionEventData;
147
-
148
- const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
149
- const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
150
-
151
- _position.strategyData.decoded.triggerData = triggerData;
152
- _position.strategyData.decoded.subData = subData;
153
-
154
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
155
-
156
- const isTakeProfit = isRatioStateOver(Number(triggerData.state));
157
-
158
- _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
159
-
160
- _position.specific = {
161
- price: triggerData.price,
162
- closeToAssetAddr: subData.closeToAssetAddr,
163
- };
164
-
165
- return _position;
166
- }
167
-
168
- function parseLiquityTrailingStop(position: Position.Automated, parseData: ParseData): Position.Automated {
169
- const _position = cloneDeep(position);
170
-
171
- const { subStruct } = parseData.subscriptionEventData;
172
-
173
- const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
174
- const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
175
-
176
- _position.strategyData.decoded.triggerData = triggerData;
177
- _position.strategyData.decoded.subData = subData;
178
-
179
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
180
-
181
- _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
182
-
183
- _position.specific = {
184
- triggerPercentage: Number(triggerData.triggerPercentage),
185
- roundId: Number(triggerData.roundId),
186
- closeToAssetAddr: subData.closeToAssetAddr,
187
- };
188
-
189
- return _position;
190
- }
191
-
192
- function parseAaveV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
193
- const _position = cloneDeep(position);
194
-
195
- const { subStruct, subId } = parseData.subscriptionEventData;
196
- const { isEnabled } = parseData.strategiesSubsData;
197
-
198
- const triggerData = triggerService.aaveV2RatioTrigger.decode(subStruct.triggerData);
199
- const subData = subDataService.aaveV2LeverageManagementSubData.decode(subStruct.subData);
200
-
201
- _position.strategyData.decoded.triggerData = triggerData;
202
- _position.strategyData.decoded.subData = subData;
203
-
204
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
205
-
206
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
207
-
208
- if (isRepay) {
209
- _position.specific = {
210
- triggerRepayRatio: triggerData.ratio,
211
- targetRepayRatio: subData.targetRatio,
212
- repayEnabled: true,
213
- subId1: Number(subId),
214
- mergeWithId: Strategies.Identifiers.Boost,
215
- };
216
- } else {
217
- _position.specific = {
218
- triggerBoostRatio: triggerData.ratio,
219
- targetBoostRatio: subData.targetRatio,
220
- boostEnabled: isEnabled,
221
- subId2: Number(subId),
222
- mergeId: Strategies.Identifiers.Boost,
223
- };
224
- }
225
-
226
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
227
-
228
- return _position;
229
- }
230
-
231
- function parseAaveV3LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
232
- const _position = cloneDeep(position);
233
-
234
- const { subStruct, subId } = parseData.subscriptionEventData;
235
- const { isEnabled } = parseData.strategiesSubsData;
236
-
237
- const triggerData = triggerService.aaveV3RatioTrigger.decode(subStruct.triggerData);
238
- const subData = subDataService.aaveV3LeverageManagementSubData.decode(subStruct.subData);
239
-
240
- _position.strategyData.decoded.triggerData = triggerData;
241
- _position.strategyData.decoded.subData = subData;
242
-
243
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
244
-
245
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
246
-
247
- if (isRepay) {
248
- _position.specific = {
249
- triggerRepayRatio: triggerData.ratio,
250
- targetRepayRatio: subData.targetRatio,
251
- repayEnabled: true,
252
- subId1: Number(subId),
253
- mergeWithId: Strategies.Identifiers.Boost,
254
- };
255
- } else {
256
- _position.specific = {
257
- triggerBoostRatio: triggerData.ratio,
258
- targetBoostRatio: subData.targetRatio,
259
- boostEnabled: isEnabled,
260
- subId2: Number(subId),
261
- mergeId: Strategies.Identifiers.Boost,
262
- };
263
- }
264
-
265
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
266
-
267
- return _position;
268
- }
269
-
270
- function parseMorphoAaveV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
271
- const _position = cloneDeep(position);
272
-
273
- const { subStruct, subId } = parseData.subscriptionEventData;
274
- const { isEnabled } = parseData.strategiesSubsData;
275
-
276
- const triggerData = triggerService.morphoAaveV2RatioTrigger.decode(subStruct.triggerData);
277
- const subData = subDataService.morphoAaveV2LeverageManagementSubData.decode(subStruct.subData);
278
-
279
- _position.strategyData.decoded.triggerData = triggerData;
280
- _position.strategyData.decoded.subData = subData;
281
-
282
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
283
-
284
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
285
-
286
- if (isRepay) {
287
- _position.specific = {
288
- triggerRepayRatio: triggerData.ratio,
289
- targetRepayRatio: subData.targetRatio,
290
- repayEnabled: true,
291
- subId1: Number(subId),
292
- mergeWithId: Strategies.Identifiers.Boost,
293
- };
294
- } else {
295
- _position.specific = {
296
- triggerBoostRatio: triggerData.ratio,
297
- targetBoostRatio: subData.targetRatio,
298
- boostEnabled: isEnabled,
299
- subId2: Number(subId),
300
- mergeId: Strategies.Identifiers.Boost,
301
- };
302
- }
303
-
304
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
305
-
306
- return _position;
307
- }
308
-
309
- function parseAaveV3CloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
310
- const _position = cloneDeep(position);
311
-
312
- const { subStruct } = parseData.subscriptionEventData;
313
-
314
- const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
315
- const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
316
-
317
- _position.strategyData.decoded.triggerData = triggerData;
318
- _position.strategyData.decoded.subData = subData;
319
-
320
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
321
-
322
- _position.specific = {
323
- collAsset: subData.collAsset,
324
- collAssetId: subData.collAssetId,
325
- debtAsset: subData.debtAsset,
326
- debtAssetId: subData.debtAssetId,
327
- baseToken: triggerData.baseTokenAddress,
328
- quoteToken: triggerData.quoteTokenAddress,
329
- price: triggerData.price,
330
- ratioState: triggerData.ratioState,
331
- };
332
-
333
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
334
- _position.specific.ratioState,
335
- wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
336
- wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
337
- parseData.chainId,
338
- );
339
-
340
- _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
341
-
342
- return _position;
343
- }
344
-
345
- function parseAaveV3CloseOnPriceWithMaximumGasPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
346
- const _position = cloneDeep(position);
347
-
348
- const { subStruct } = parseData.subscriptionEventData;
349
-
350
- const triggerData = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.decode(subStruct.triggerData);
351
- const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
352
-
353
- _position.strategyData.decoded.triggerData = triggerData;
354
- _position.strategyData.decoded.subData = subData;
355
-
356
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
357
-
358
- _position.specific = {
359
- collAsset: subData.collAsset,
360
- collAssetId: subData.collAssetId,
361
- debtAsset: subData.debtAsset,
362
- debtAssetId: subData.debtAssetId,
363
- baseToken: triggerData.baseTokenAddress,
364
- quoteToken: triggerData.quoteTokenAddress,
365
- price: triggerData.price,
366
- maximumGasPrice: triggerData.maximumGasPrice,
367
- ratioState: triggerData.ratioState,
368
- };
369
-
370
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
371
- _position.specific.ratioState,
372
- wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
373
- wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
374
- parseData.chainId,
375
- );
376
-
377
- _position.strategy.strategyId = isRatioStateOver(ratioState)
378
- ? Strategies.IdOverrides.TakeProfitWithGasPrice
379
- : Strategies.IdOverrides.StopLossWithGasPrice;
380
-
381
- return _position;
382
- }
383
-
384
- function parseCompoundV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
385
- const _position = cloneDeep(position);
386
-
387
- const { subStruct, subId } = parseData.subscriptionEventData;
388
- const { isEnabled } = parseData.strategiesSubsData;
389
-
390
- const triggerData = triggerService.compoundV2RatioTrigger.decode(subStruct.triggerData);
391
- const subData = subDataService.compoundV2LeverageManagementSubData.decode(subStruct.subData);
392
-
393
- _position.strategyData.decoded.triggerData = triggerData;
394
- _position.strategyData.decoded.subData = subData;
395
- _position.owner = triggerData.owner.toLowerCase();
396
-
397
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
398
-
399
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
400
-
401
- if (isRepay) {
402
- _position.specific = {
403
- triggerRepayRatio: triggerData.ratio,
404
- targetRepayRatio: subData.targetRatio,
405
- repayEnabled: true,
406
- subId1: Number(subId),
407
- mergeWithId: Strategies.Identifiers.Boost,
408
- };
409
- } else {
410
- _position.specific = {
411
- triggerBoostRatio: triggerData.ratio,
412
- targetBoostRatio: subData.targetRatio,
413
- boostEnabled: isEnabled,
414
- subId2: Number(subId),
415
- mergeId: Strategies.Identifiers.Boost,
416
- };
417
- }
418
-
419
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
420
-
421
- return _position;
422
- }
423
-
424
- function parseCompoundV3LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
425
- const _position = cloneDeep(position);
426
-
427
- const { subStruct, subId } = parseData.subscriptionEventData;
428
- const { isEnabled } = parseData.strategiesSubsData;
429
-
430
- const subDataDecoder = position.chainId !== 1
431
- ? subDataService.compoundV3L2LeverageManagementSubData
432
- : subDataService.compoundV3LeverageManagementSubData;
433
-
434
- const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
435
- const subData = subDataDecoder.decode(subStruct.subData);
436
-
437
- _position.strategyData.decoded.triggerData = triggerData;
438
- _position.strategyData.decoded.subData = subData;
439
-
440
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
441
-
442
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
443
-
444
- if (isRepay) {
445
- _position.specific = {
446
- triggerRepayRatio: triggerData.ratio,
447
- targetRepayRatio: subData.targetRatio,
448
- repayEnabled: true,
449
- subId1: Number(subId),
450
- mergeWithId: Strategies.Identifiers.Boost,
451
- };
452
- } else {
453
- _position.specific = {
454
- triggerBoostRatio: triggerData.ratio,
455
- targetBoostRatio: subData.targetRatio,
456
- boostEnabled: isEnabled,
457
- subId2: Number(subId),
458
- mergeId: Strategies.Identifiers.Boost,
459
- };
460
- }
461
-
462
- const isEOA = _position.strategy.strategyId.includes('eoa');
463
- _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
464
-
465
-
466
- return _position;
467
- }
468
-
469
- function parseChickenBondsRebond(position: Position.Automated, parseData: ParseData): Position.Automated {
470
- const _position = cloneDeep(position);
471
-
472
- const { subStruct } = parseData.subscriptionEventData;
473
-
474
- _position.strategyData.decoded.triggerData = triggerService.cBondsRebondTrigger.decode(subStruct.triggerData);
475
- _position.strategyData.decoded.subData = subDataService.cBondsRebondSubData.decode(subStruct.subData);
476
-
477
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.strategyData.decoded.triggerData.bondId);
478
-
479
- return _position;
480
- }
481
-
482
- function parseLiquityBondProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
483
- const _position = cloneDeep(position);
484
-
485
- const { subStruct } = parseData.subscriptionEventData;
486
-
487
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
488
-
489
- _position.strategyData.decoded.triggerData = triggerData;
490
- _position.strategyData.decoded.subData = subDataService.liquityPaybackUsingChickenBondSubData.decode(subStruct.subData);
491
-
492
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
493
-
494
- _position.specific = {
495
- triggerRepayRatio: Number(triggerData.ratio),
496
- targetRepayRatio: Infinity, // Unknown targetRepayRatio, uses all assets from chicken bond until trove min debt (2000LUSD)
497
- repayEnabled: true,
498
- };
499
- return _position;
500
- }
501
-
502
- function parseExchangeDca(position: Position.Automated, parseData: ParseData, chainId: ChainId): Position.Automated {
503
- const _position = cloneDeep(position);
504
-
505
- const { subStruct } = parseData.subscriptionEventData;
506
-
507
- _position.strategyData.decoded.triggerData = triggerService.exchangeTimestampTrigger.decode(subStruct.triggerData);
508
- _position.strategyData.decoded.subData = subDataService.exchangeDcaSubData.decode(subStruct.subData, chainId);
509
-
510
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
511
-
512
- return _position;
513
- }
514
-
515
- function parseExchangeLimitOrder(position: Position.Automated, parseData: ParseData, chainId: ChainId): Position.Automated {
516
- const _position = cloneDeep(position);
517
-
518
- const { subStruct } = parseData.subscriptionEventData;
519
-
520
- _position.strategyData.decoded.subData = subDataService.exchangeLimitOrderSubData.decode(subStruct.subData, chainId);
521
- const fromTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.fromToken, chainId).decimals;
522
- const toTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.toToken, chainId).decimals;
523
- _position.strategyData.decoded.triggerData = triggerService.exchangeOffchainPriceTrigger.decode(subStruct.triggerData, fromTokenDecimals, toTokenDecimals);
524
-
525
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
526
-
527
- return _position;
528
- }
529
-
530
- function parseLiquityLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
531
- const _position = cloneDeep(position);
532
-
533
- const { subStruct, subId } = parseData.subscriptionEventData;
534
- const { isEnabled } = parseData.strategiesSubsData;
535
-
536
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
537
- const subData = subDataService.liquityLeverageManagementSubData.decode(subStruct.subData);
538
-
539
- _position.strategyData.decoded.triggerData = triggerData;
540
- _position.strategyData.decoded.subData = subData;
541
-
542
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
543
-
544
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
545
-
546
- if (isRepay) {
547
- _position.specific = {
548
- triggerRepayRatio: triggerData.ratio,
549
- targetRepayRatio: subData.targetRatio,
550
- repayEnabled: true,
551
- subId1: Number(subId),
552
- mergeWithId: Strategies.Identifiers.Boost,
553
- };
554
- } else {
555
- _position.specific = {
556
- triggerBoostRatio: triggerData.ratio,
557
- targetBoostRatio: subData.targetRatio,
558
- boostEnabled: isEnabled,
559
- subId2: Number(subId),
560
- mergeId: Strategies.Identifiers.Boost,
561
- };
562
- }
563
-
564
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
565
-
566
- return _position;
567
- }
568
-
569
- function parseLiquityV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
570
- const _position = cloneDeep(position);
571
-
572
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
573
- const { isEnabled } = parseData.strategiesSubsData;
574
-
575
- const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
576
- const subData = subDataService.liquityV2LeverageManagementSubData.decode(subStruct.subData);
577
-
578
- _position.strategyData.decoded.triggerData = triggerData;
579
- _position.strategyData.decoded.subData = subData;
580
-
581
- _position.positionId = getPositionId(
582
- _position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market,
583
- );
584
-
585
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
586
-
587
- if (isRepay) {
588
- _position.specific = {
589
- triggerRepayRatio: triggerData.ratio,
590
- targetRepayRatio: subData.targetRatio,
591
- repayEnabled: isEnabled,
592
- subId1: Number(subId),
593
- subHashRepay: subHash,
594
- mergeWithId: Strategies.Identifiers.Boost,
595
- };
596
- } else {
597
- _position.specific = {
598
- triggerBoostRatio: triggerData.ratio,
599
- targetBoostRatio: subData.targetRatio,
600
- boostEnabled: isEnabled,
601
- subId2: Number(subId),
602
- subHashBoost: subHash,
603
- mergeId: Strategies.Identifiers.Boost,
604
- };
605
- }
606
-
607
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
608
-
609
- return _position;
610
- }
611
-
612
- function parseSparkLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
613
- const _position = cloneDeep(position);
614
-
615
- const { subStruct, subId } = parseData.subscriptionEventData;
616
- const { isEnabled } = parseData.strategiesSubsData;
617
-
618
- const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
619
- const subData = subDataService.sparkLeverageManagementSubData.decode(subStruct.subData);
620
-
621
- _position.strategyData.decoded.triggerData = triggerData;
622
- _position.strategyData.decoded.subData = subData;
623
-
624
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
625
-
626
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
627
-
628
- if (isRepay) {
629
- _position.specific = {
630
- triggerRepayRatio: triggerData.ratio,
631
- targetRepayRatio: subData.targetRatio,
632
- repayEnabled: true,
633
- subId1: Number(subId),
634
- mergeWithId: Strategies.Identifiers.Boost,
635
- };
636
- } else {
637
- _position.specific = {
638
- triggerBoostRatio: triggerData.ratio,
639
- targetBoostRatio: subData.targetRatio,
640
- boostEnabled: isEnabled,
641
- subId2: Number(subId),
642
- mergeId: Strategies.Identifiers.Boost,
643
- };
644
- }
645
-
646
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
647
-
648
- return _position;
649
- }
650
-
651
- function parseSparkCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
652
- const _position = cloneDeep(position);
653
-
654
- const { subStruct } = parseData.subscriptionEventData;
655
-
656
- const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
657
- const subData = subDataService.sparkQuotePriceSubData.decode(subStruct.subData);
658
-
659
- _position.strategyData.decoded.triggerData = triggerData;
660
- _position.strategyData.decoded.subData = subData;
661
-
662
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, SPARK_MARKET_ADDRESSES[_position.chainId as ChainId.Ethereum]);
663
-
664
- _position.specific = {
665
- collAsset: subData.collAsset,
666
- collAssetId: subData.collAssetId,
667
- debtAsset: subData.debtAsset,
668
- debtAssetId: subData.debtAssetId,
669
- baseToken: triggerData.baseTokenAddress,
670
- quoteToken: triggerData.quoteTokenAddress,
671
- price: triggerData.price,
672
- ratioState: triggerData.ratioState,
673
- };
674
-
675
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
676
- _position.specific.ratioState,
677
- wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
678
- wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
679
- parseData.chainId,
680
- );
681
-
682
- _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
683
-
684
- return _position;
685
- }
686
-
687
- function parseLiquitySavingsLiqProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
688
- const _position = cloneDeep(position);
689
-
690
- const { subStruct } = parseData.subscriptionEventData;
691
-
692
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
693
- const subData = subDataService.liquityRepayFromSavingsSubData.decode(subStruct.subData);
694
-
695
- _position.strategyData.decoded.triggerData = triggerData;
696
- _position.strategyData.decoded.subData = subData;
697
-
698
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
699
-
700
- _position.specific = {
701
- triggerRepayRatio: triggerData.ratio,
702
- targetRepayRatio: subData.targetRatio,
703
- repayEnabled: true,
704
- boostEnabled: false,
705
- };
706
-
707
- return _position;
708
- }
709
-
710
- function parseLiquityDebtInFrontRepay(position: Position.Automated, parseData: ParseData): Position.Automated {
711
- const _position = cloneDeep(position);
712
-
713
- const { subStruct } = parseData.subscriptionEventData;
714
-
715
- const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.decode(subStruct.triggerData);
716
- const subData = subDataService.liquityDebtInFrontRepaySubData.decode(subStruct.subData);
717
-
718
- _position.strategyData.decoded.triggerData = triggerData;
719
- _position.strategyData.decoded.subData = subData;
720
-
721
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
722
-
723
- _position.specific = {
724
- debtInFrontMin: triggerData.debtInFrontMin,
725
- targetRepayRatioIncrease: subData.targetRatioIncrease,
726
- };
727
-
728
- return _position;
729
- }
730
-
731
- function parseCrvUSDLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
732
- const _position = cloneDeep(position);
733
-
734
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
735
- const { isEnabled } = parseData.strategiesSubsData;
736
- const triggerData = triggerService.crvUSDRatioTrigger.decode(subStruct.triggerData);
737
- const subData = subDataService.crvUSDLeverageManagementSubData.decode(subStruct.subData);
738
-
739
- _position.strategyData.decoded.triggerData = triggerData;
740
- _position.strategyData.decoded.subData = subData;
741
-
742
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller);
743
-
744
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
745
-
746
- if (isRepay) {
747
- _position.specific = {
748
- triggerRepayRatio: triggerData.ratio,
749
- targetRepayRatio: subData.targetRatio,
750
- repayEnabled: isEnabled,
751
- subId1: Number(subId),
752
- subHashRepay: subHash,
753
- mergeWithId: Strategies.Identifiers.Boost,
754
- };
755
- } else {
756
- _position.specific = {
757
- triggerBoostRatio: triggerData.ratio,
758
- targetBoostRatio: subData.targetRatio,
759
- boostEnabled: isEnabled,
760
- subId2: Number(subId),
761
- subHashBoost: subHash,
762
- mergeId: Strategies.Identifiers.Boost,
763
- };
764
- }
765
-
766
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
767
-
768
- return _position;
769
- }
770
-
771
- function parseCrvUSDPayback(position: Position.Automated, parseData: ParseData): Position.Automated {
772
- const _position = cloneDeep(position);
773
-
774
- const { subStruct } = parseData.subscriptionEventData;
775
- const triggerData = triggerService.crvUsdHealthRatioTrigger.decode(subStruct.triggerData);
776
- const subData = subDataService.crvUSDPaybackSubData.decode(subStruct.subData);
777
-
778
- _position.strategyData.decoded.triggerData = triggerData;
779
- _position.strategyData.decoded.subData = subData;
780
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller, Math.random());
781
- _position.strategy.strategyId = Strategies.Identifiers.Payback;
782
-
783
- return _position;
784
- }
785
-
786
- function parseMorphoBlueLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
787
- const _position = cloneDeep(position);
788
-
789
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
790
- const { isEnabled } = parseData.strategiesSubsData;
791
- const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
792
- const subData = subDataService.morphoBlueLeverageManagementSubData.decode(subStruct.subData);
793
-
794
- _position.strategyData.decoded.triggerData = triggerData;
795
- _position.strategyData.decoded.subData = subData;
796
-
797
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
798
-
799
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
800
-
801
- if (isRepay) {
802
- _position.specific = {
803
- triggerRepayRatio: triggerData.ratio,
804
- targetRepayRatio: subData.targetRatio,
805
- repayEnabled: isEnabled,
806
- subId1: Number(subId),
807
- subHashRepay: subHash,
808
- mergeWithId: Strategies.Identifiers.Boost,
809
- };
810
- } else {
811
- _position.specific = {
812
- triggerBoostRatio: triggerData.ratio,
813
- targetBoostRatio: subData.targetRatio,
814
- boostEnabled: isEnabled,
815
- subId2: Number(subId),
816
- subHashBoost: subHash,
817
- mergeId: Strategies.Identifiers.Boost,
818
- };
819
- }
820
-
821
- const isEOA = _position.strategy.strategyId.includes('eoa');
822
- _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
823
-
824
-
825
- return _position;
826
- }
827
-
828
- function parseMorphoBlueLeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
829
- const _position = cloneDeep(position);
830
-
831
- const { subStruct } = parseData.subscriptionEventData;
832
- const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
833
- const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
834
-
835
- _position.strategyData.decoded.triggerData = triggerData;
836
- _position.strategyData.decoded.subData = subData;
837
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
838
-
839
- const marketIdEncodedData = web3.eth.abi.encodeParameters(
840
- ['address', 'address', 'address', 'address', 'uint256'],
841
- [
842
- subData.loanToken,
843
- subData.collToken,
844
- subData.oracle,
845
- subData.irm,
846
- subData.lltv,
847
- ],
848
- );
849
-
850
- const marketId = web3.utils.keccak256(marketIdEncodedData);
851
-
852
- _position.specific = {
853
- subHash: _position.subHash,
854
- marketId,
855
- collAsset: subData.collToken,
856
- debtAsset: subData.loanToken,
857
- price: triggerData.price,
858
- ratio: subData.targetRatio,
859
- };
860
-
861
- return _position;
862
- }
863
-
864
- function parseAaveV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
865
- const _position = cloneDeep(position);
866
-
867
- const { subStruct } = parseData.subscriptionEventData;
868
-
869
- const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
870
- const subData = subDataService.aaveV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
871
-
872
- _position.strategyData.decoded.triggerData = triggerData;
873
- _position.strategyData.decoded.subData = subData;
874
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
875
-
876
- _position.specific = {
877
- collAsset: subData.collAsset,
878
- debtAsset: subData.debtAsset,
879
- baseToken: triggerData.baseTokenAddress,
880
- quoteToken: triggerData.quoteTokenAddress,
881
- price: triggerData.price,
882
- ratioState: triggerData.ratioState,
883
- debtAssetId: subData.debtAssetId,
884
- collAssetId: subData.collAssetId,
885
- ratio: subData.targetRatio,
886
- };
887
-
888
- return _position;
889
- }
890
-
891
- function parseLiquityV2CloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
892
- const _position = cloneDeep(position);
893
-
894
- const { subStruct } = parseData.subscriptionEventData;
895
-
896
- const triggerData = triggerService.closePriceTrigger.decode(subStruct.triggerData);
897
- const subData = subDataService.liquityV2CloseSubData.decode(subStruct.subData);
898
-
899
- _position.strategyData.decoded.triggerData = triggerData;
900
- _position.strategyData.decoded.subData = subData;
901
-
902
- _position.positionId = getPositionId(
903
- _position.chainId, _position.protocol.id, _position.owner, subData.troveId, subData.market,
904
- );
905
-
906
- const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
907
-
908
- // User can have:
909
- // - Only TakeProfit
910
- // - Only StopLoss
911
- // - Both
912
- // TODO: see on frontend what specific data we need here because stop-loss and take-profit is one bundle now
913
- _position.strategy.strategyId = Strategies.Identifiers.CloseOnPrice;
914
- _position.specific = {
915
- market: subData.market,
916
- troveId: subData.troveId,
917
- stopLossPrice: triggerData.lowerPrice,
918
- takeProfitPrice: triggerData.upperPrice,
919
- closeToAssetAddr: triggerData.tokenAddr,
920
- takeProfitType,
921
- stopLossType,
922
- };
923
-
924
- return _position;
925
- }
926
-
927
- function parseLiquityV2LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
928
- const _position = cloneDeep(position);
929
-
930
- const { subStruct } = parseData.subscriptionEventData;
931
-
932
- const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
933
- const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
934
-
935
- _position.strategyData.decoded.triggerData = triggerData;
936
- _position.strategyData.decoded.subData = subData;
937
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
938
-
939
- _position.specific = {
940
- subHash: _position.subHash,
941
- market: subData.market,
942
- troveId: subData.troveId,
943
- collAsset: subData.collToken,
944
- debtAsset: subData.boldToken,
945
- price: triggerData.price,
946
- ratio: subData.targetRatio,
947
- ratioState: triggerData.ratioState,
948
- };
949
-
950
- return _position;
951
- }
952
-
953
- function parseLiquityV2Payback(position: Position.Automated, parseData: ParseData): Position.Automated {
954
- const _position = cloneDeep(position);
955
-
956
- const { subStruct } = parseData.subscriptionEventData;
957
- const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
958
- const subData = subDataService.liquityV2PaybackSubData.decode(subStruct.subData);
959
-
960
- _position.strategyData.decoded.triggerData = triggerData;
961
- _position.strategyData.decoded.subData = subData;
962
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
963
- _position.strategy.strategyId = Strategies.Identifiers.Payback;
964
-
965
- _position.specific = {
966
- subHash: _position.subHash,
967
- market: subData.market,
968
- troveId: subData.troveId,
969
- targetRatio: subData.targetRatio,
970
- triggerRatio: triggerData.ratio,
971
- };
972
-
973
- return _position;
974
- }
975
-
976
- function parseFluidT1LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
977
- const _position = cloneDeep(position);
978
-
979
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
980
- const { isEnabled } = parseData.strategiesSubsData;
981
-
982
- const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
983
- const subData = subDataService.fluidLeverageManagementSubData.decode(subStruct.subData);
984
-
985
- _position.strategyData.decoded.triggerData = triggerData;
986
- _position.strategyData.decoded.subData = subData;
987
-
988
- _position.positionId = getPositionId(
989
- _position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault,
990
- );
991
-
992
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
993
-
994
- if (isRepay) {
995
- _position.specific = {
996
- triggerRepayRatio: triggerData.ratio,
997
- targetRepayRatio: subData.targetRatio,
998
- repayEnabled: isEnabled,
999
- subId1: Number(subId),
1000
- subHashRepay: subHash,
1001
- mergeWithId: Strategies.Identifiers.Boost,
1002
- };
1003
- } else {
1004
- _position.specific = {
1005
- triggerBoostRatio: triggerData.ratio,
1006
- targetBoostRatio: subData.targetRatio,
1007
- boostEnabled: isEnabled,
1008
- subId2: Number(subId),
1009
- subHashBoost: subHash,
1010
- mergeId: Strategies.Identifiers.Boost,
1011
- };
1012
- }
1013
-
1014
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
1015
-
1016
- return _position;
1017
- }
1018
-
1019
- const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1020
- [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
1021
- [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
1022
- [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
1023
- [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
1024
- [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
1025
- [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
1026
- [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
1027
- [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
1028
- },
1029
- [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
1030
- [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
1031
- [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
1032
- [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
1033
- [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
1034
- [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
1035
- [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
1036
- [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
1037
- [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
1038
- },
1039
- [ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
1040
- [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
1041
- [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
1042
- [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
1043
- [Strategies.Identifiers.BoostOnPrice]: parseLiquityV2LeverageManagementOnPrice,
1044
- [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
1045
- [Strategies.Identifiers.Payback]: parseLiquityV2Payback,
1046
- },
1047
- [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
1048
- [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
1049
- [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
1050
- },
1051
- [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
1052
- [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
1053
- [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
1054
- [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
1055
- [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
1056
- [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
1057
- [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
1058
- [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3LeverageManagementOnPrice,
1059
- [Strategies.Identifiers.RepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
1060
- },
1061
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
1062
- [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
1063
- [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
1064
- },
1065
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
1066
- [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
1067
- [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
1068
- [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
1069
- [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
1070
- },
1071
- [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
1072
- [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
1073
- },
1074
- [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
1075
- [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
1076
- [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
1077
- },
1078
- [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
1079
- [Strategies.Identifiers.Dca]: parseExchangeDca,
1080
- [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
1081
- },
1082
- [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
1083
- [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
1084
- [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
1085
- [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
1086
- [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
1087
- },
1088
- [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
1089
- [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
1090
- [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
1091
- [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
1092
- },
1093
- [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
1094
- [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
1095
- [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
1096
- [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
1097
- [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
1098
- [Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
1099
- },
1100
- [ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
1101
- [Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
1102
- [Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
1103
- },
1104
- };
1105
-
1106
- function getParsingMethod(id: ProtocolIdentifiers.StrategiesAutomation, strategy: BundleOrStrategy) {
1107
- return parsingMethodsMapping[id][strategy.strategyId];
1108
- }
1109
-
1110
- export function parseStrategiesAutomatedPosition(parseData: ParseData): Position.Automated | null {
1111
- const {
1112
- chainId, blockNumber, subscriptionEventData, strategiesSubsData,
1113
- } = parseData;
1114
- const {
1115
- subStruct, proxy, subId, subHash,
1116
- } = subscriptionEventData;
1117
- const { isEnabled } = strategiesSubsData;
1118
-
1119
- const id = subStruct.strategyOrBundleId as unknown as StrategyOrBundleIds;
1120
-
1121
- const strategyOrBundleInfo = (
1122
- subStruct.isBundle
1123
- ? BUNDLES_INFO[chainId][id as keyof BundleInfoUnion]
1124
- : STRATEGIES_INFO[chainId][id as keyof StrategyInfoUnion]
1125
- ) as BundleOrStrategy;
1126
-
1127
- if (!strategyOrBundleInfo) return null;
1128
-
1129
- const position: Position.Automated = {
1130
- isEnabled,
1131
- chainId,
1132
- subHash,
1133
- blockNumber,
1134
- positionId: 'positionId parsing not implemented.',
1135
- subId: Number(subId),
1136
- owner: proxy.toLowerCase(),
1137
- protocol: {
1138
- ...strategyOrBundleInfo.protocol,
1139
- },
1140
- strategy: {
1141
- isBundle: subStruct.isBundle,
1142
- ...strategyOrBundleInfo,
1143
- },
1144
- strategyData: {
1145
- encoded: {
1146
- triggerData: subStruct.triggerData,
1147
- subData: subStruct.subData,
1148
- },
1149
- decoded: {
1150
- triggerData: null,
1151
- subData: null,
1152
- },
1153
- },
1154
- specific: {},
1155
- };
1156
-
1157
- return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
1158
- }
1
+ import { getAssetInfoByAddress } from '@defisaver/tokens';
2
+ import { cloneDeep } from 'lodash';
3
+
4
+ import Web3 from 'web3';
5
+ import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
6
+ import type {
7
+ Position, ParseData, StrategiesToProtocolVersionMapping, BundleOrStrategy, StrategyOrBundleIds,
8
+ BundleInfoUnion, StrategyInfoUnion,
9
+ } from '../types';
10
+ import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
11
+
12
+ import {
13
+ getPositionId, getRatioStateInfoForAaveCloseStrategy, getStopLossAndTakeProfitTypeByCloseStrategyType, isRatioStateOver, wethToEthByAddress,
14
+ } from './utils';
15
+ import * as subDataService from './subDataService';
16
+ import * as triggerService from './triggerService';
17
+
18
+ const web3 = new Web3();
19
+
20
+ const SPARK_MARKET_ADDRESSES = {
21
+ [ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
22
+ };
23
+
24
+ const AAVE_V3_MARKET_ADDRESSES = {
25
+ [ChainId.Ethereum]: '0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e',
26
+ [ChainId.Optimism]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
27
+ [ChainId.Arbitrum]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
28
+ [ChainId.Base]: '0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D',
29
+
30
+ };
31
+
32
+ function parseMakerSavingsLiqProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
33
+ const _position = cloneDeep(position);
34
+
35
+ const { subStruct } = parseData.subscriptionEventData;
36
+
37
+ const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
38
+ const subData = subDataService.makerRepayFromSavingsSubData.decode(subStruct.subData);
39
+
40
+ _position.strategyData.decoded.triggerData = triggerData;
41
+ _position.strategyData.decoded.subData = subData;
42
+
43
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
44
+
45
+ _position.specific = {
46
+ triggerRepayRatio: Number(triggerData.ratio),
47
+ targetRepayRatio: Number(subData.targetRatio),
48
+ repayEnabled: true,
49
+ boostEnabled: false,
50
+ };
51
+
52
+ return _position;
53
+ }
54
+
55
+ function parseMakerCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
56
+ const _position = cloneDeep(position);
57
+
58
+ const { subStruct } = parseData.subscriptionEventData;
59
+
60
+ const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
61
+ const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
62
+
63
+ _position.strategyData.decoded.triggerData = triggerData;
64
+ _position.strategyData.decoded.subData = subData;
65
+
66
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
67
+
68
+ const isTakeProfit = isRatioStateOver(Number(triggerData.state));
69
+
70
+ _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
71
+
72
+ _position.specific = {
73
+ price: triggerData.price,
74
+ closeToAssetAddr: subData.closeToAssetAddr,
75
+ };
76
+
77
+ return _position;
78
+ }
79
+
80
+ function parseMakerTrailingStop(position: Position.Automated, parseData: ParseData): Position.Automated {
81
+ const _position = cloneDeep(position);
82
+
83
+ const { subStruct } = parseData.subscriptionEventData;
84
+
85
+ const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
86
+ const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
87
+
88
+ _position.strategyData.decoded.triggerData = triggerData;
89
+ _position.strategyData.decoded.subData = subData;
90
+
91
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
92
+
93
+ _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
94
+
95
+ _position.specific = {
96
+ triggerPercentage: Number(triggerData.triggerPercentage),
97
+ roundId: Number(triggerData.roundId),
98
+ closeToAssetAddr: subData.closeToAssetAddr,
99
+ };
100
+
101
+ return _position;
102
+ }
103
+
104
+ function parseMakerLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
105
+ const _position = cloneDeep(position);
106
+
107
+ const { subStruct, subId } = parseData.subscriptionEventData;
108
+ const { isEnabled } = parseData.strategiesSubsData;
109
+
110
+ const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
111
+ const subData = subDataService.makerLeverageManagementSubData.decode(subStruct.subData);
112
+
113
+ _position.strategyData.decoded.triggerData = triggerData;
114
+ _position.strategyData.decoded.subData = subData;
115
+
116
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
117
+
118
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
119
+
120
+ if (isRepay) {
121
+ _position.specific = {
122
+ triggerRepayRatio: triggerData.ratio,
123
+ targetRepayRatio: subData.targetRatio,
124
+ repayEnabled: true,
125
+ subId1: Number(subId),
126
+ mergeWithId: Strategies.Identifiers.Boost,
127
+ };
128
+ } else {
129
+ _position.specific = {
130
+ triggerBoostRatio: triggerData.ratio,
131
+ targetBoostRatio: subData.targetRatio,
132
+ boostEnabled: isEnabled,
133
+ subId2: Number(subId),
134
+ mergeId: Strategies.Identifiers.Boost,
135
+ };
136
+ }
137
+
138
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
139
+
140
+ return _position;
141
+ }
142
+
143
+ function parseLiquityCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
144
+ const _position = cloneDeep(position);
145
+
146
+ const { subStruct } = parseData.subscriptionEventData;
147
+
148
+ const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
149
+ const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
150
+
151
+ _position.strategyData.decoded.triggerData = triggerData;
152
+ _position.strategyData.decoded.subData = subData;
153
+
154
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
155
+
156
+ const isTakeProfit = isRatioStateOver(Number(triggerData.state));
157
+
158
+ _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
159
+
160
+ _position.specific = {
161
+ price: triggerData.price,
162
+ closeToAssetAddr: subData.closeToAssetAddr,
163
+ };
164
+
165
+ return _position;
166
+ }
167
+
168
+ function parseLiquityTrailingStop(position: Position.Automated, parseData: ParseData): Position.Automated {
169
+ const _position = cloneDeep(position);
170
+
171
+ const { subStruct } = parseData.subscriptionEventData;
172
+
173
+ const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
174
+ const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
175
+
176
+ _position.strategyData.decoded.triggerData = triggerData;
177
+ _position.strategyData.decoded.subData = subData;
178
+
179
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
180
+
181
+ _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
182
+
183
+ _position.specific = {
184
+ triggerPercentage: Number(triggerData.triggerPercentage),
185
+ roundId: Number(triggerData.roundId),
186
+ closeToAssetAddr: subData.closeToAssetAddr,
187
+ };
188
+
189
+ return _position;
190
+ }
191
+
192
+ function parseAaveV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
193
+ const _position = cloneDeep(position);
194
+
195
+ const { subStruct, subId } = parseData.subscriptionEventData;
196
+ const { isEnabled } = parseData.strategiesSubsData;
197
+
198
+ const triggerData = triggerService.aaveV2RatioTrigger.decode(subStruct.triggerData);
199
+ const subData = subDataService.aaveV2LeverageManagementSubData.decode(subStruct.subData);
200
+
201
+ _position.strategyData.decoded.triggerData = triggerData;
202
+ _position.strategyData.decoded.subData = subData;
203
+
204
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
205
+
206
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
207
+
208
+ if (isRepay) {
209
+ _position.specific = {
210
+ triggerRepayRatio: triggerData.ratio,
211
+ targetRepayRatio: subData.targetRatio,
212
+ repayEnabled: true,
213
+ subId1: Number(subId),
214
+ mergeWithId: Strategies.Identifiers.Boost,
215
+ };
216
+ } else {
217
+ _position.specific = {
218
+ triggerBoostRatio: triggerData.ratio,
219
+ targetBoostRatio: subData.targetRatio,
220
+ boostEnabled: isEnabled,
221
+ subId2: Number(subId),
222
+ mergeId: Strategies.Identifiers.Boost,
223
+ };
224
+ }
225
+
226
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
227
+
228
+ return _position;
229
+ }
230
+
231
+ function parseAaveV3LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
232
+ const _position = cloneDeep(position);
233
+
234
+ const { subStruct, subId } = parseData.subscriptionEventData;
235
+ const { isEnabled } = parseData.strategiesSubsData;
236
+
237
+ const triggerData = triggerService.aaveV3RatioTrigger.decode(subStruct.triggerData);
238
+ const subData = subDataService.aaveV3LeverageManagementSubData.decode(subStruct.subData);
239
+
240
+ _position.strategyData.decoded.triggerData = triggerData;
241
+ _position.strategyData.decoded.subData = subData;
242
+
243
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
244
+
245
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
246
+
247
+ if (isRepay) {
248
+ _position.specific = {
249
+ triggerRepayRatio: triggerData.ratio,
250
+ targetRepayRatio: subData.targetRatio,
251
+ repayEnabled: true,
252
+ subId1: Number(subId),
253
+ mergeWithId: Strategies.Identifiers.Boost,
254
+ };
255
+ } else {
256
+ _position.specific = {
257
+ triggerBoostRatio: triggerData.ratio,
258
+ targetBoostRatio: subData.targetRatio,
259
+ boostEnabled: isEnabled,
260
+ subId2: Number(subId),
261
+ mergeId: Strategies.Identifiers.Boost,
262
+ };
263
+ }
264
+
265
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
266
+
267
+ return _position;
268
+ }
269
+
270
+ function parseMorphoAaveV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
271
+ const _position = cloneDeep(position);
272
+
273
+ const { subStruct, subId } = parseData.subscriptionEventData;
274
+ const { isEnabled } = parseData.strategiesSubsData;
275
+
276
+ const triggerData = triggerService.morphoAaveV2RatioTrigger.decode(subStruct.triggerData);
277
+ const subData = subDataService.morphoAaveV2LeverageManagementSubData.decode(subStruct.subData);
278
+
279
+ _position.strategyData.decoded.triggerData = triggerData;
280
+ _position.strategyData.decoded.subData = subData;
281
+
282
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
283
+
284
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
285
+
286
+ if (isRepay) {
287
+ _position.specific = {
288
+ triggerRepayRatio: triggerData.ratio,
289
+ targetRepayRatio: subData.targetRatio,
290
+ repayEnabled: true,
291
+ subId1: Number(subId),
292
+ mergeWithId: Strategies.Identifiers.Boost,
293
+ };
294
+ } else {
295
+ _position.specific = {
296
+ triggerBoostRatio: triggerData.ratio,
297
+ targetBoostRatio: subData.targetRatio,
298
+ boostEnabled: isEnabled,
299
+ subId2: Number(subId),
300
+ mergeId: Strategies.Identifiers.Boost,
301
+ };
302
+ }
303
+
304
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
305
+
306
+ return _position;
307
+ }
308
+
309
+ function parseAaveV3CloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
310
+ const _position = cloneDeep(position);
311
+
312
+ const { subStruct } = parseData.subscriptionEventData;
313
+
314
+ const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
315
+ const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
316
+
317
+ _position.strategyData.decoded.triggerData = triggerData;
318
+ _position.strategyData.decoded.subData = subData;
319
+
320
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
321
+
322
+ _position.specific = {
323
+ collAsset: subData.collAsset,
324
+ collAssetId: subData.collAssetId,
325
+ debtAsset: subData.debtAsset,
326
+ debtAssetId: subData.debtAssetId,
327
+ baseToken: triggerData.baseTokenAddress,
328
+ quoteToken: triggerData.quoteTokenAddress,
329
+ price: triggerData.price,
330
+ ratioState: triggerData.ratioState,
331
+ };
332
+
333
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
334
+ _position.specific.ratioState,
335
+ wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
336
+ wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
337
+ parseData.chainId,
338
+ );
339
+
340
+ _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
341
+
342
+ return _position;
343
+ }
344
+
345
+ function parseAaveV3CloseOnPriceWithMaximumGasPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
346
+ const _position = cloneDeep(position);
347
+
348
+ const { subStruct } = parseData.subscriptionEventData;
349
+
350
+ const triggerData = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.decode(subStruct.triggerData);
351
+ const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
352
+
353
+ _position.strategyData.decoded.triggerData = triggerData;
354
+ _position.strategyData.decoded.subData = subData;
355
+
356
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
357
+
358
+ _position.specific = {
359
+ collAsset: subData.collAsset,
360
+ collAssetId: subData.collAssetId,
361
+ debtAsset: subData.debtAsset,
362
+ debtAssetId: subData.debtAssetId,
363
+ baseToken: triggerData.baseTokenAddress,
364
+ quoteToken: triggerData.quoteTokenAddress,
365
+ price: triggerData.price,
366
+ maximumGasPrice: triggerData.maximumGasPrice,
367
+ ratioState: triggerData.ratioState,
368
+ };
369
+
370
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
371
+ _position.specific.ratioState,
372
+ wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
373
+ wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
374
+ parseData.chainId,
375
+ );
376
+
377
+ _position.strategy.strategyId = isRatioStateOver(ratioState)
378
+ ? Strategies.IdOverrides.TakeProfitWithGasPrice
379
+ : Strategies.IdOverrides.StopLossWithGasPrice;
380
+
381
+ return _position;
382
+ }
383
+
384
+ function parseCompoundV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
385
+ const _position = cloneDeep(position);
386
+
387
+ const { subStruct, subId } = parseData.subscriptionEventData;
388
+ const { isEnabled } = parseData.strategiesSubsData;
389
+
390
+ const triggerData = triggerService.compoundV2RatioTrigger.decode(subStruct.triggerData);
391
+ const subData = subDataService.compoundV2LeverageManagementSubData.decode(subStruct.subData);
392
+
393
+ _position.strategyData.decoded.triggerData = triggerData;
394
+ _position.strategyData.decoded.subData = subData;
395
+ _position.owner = triggerData.owner.toLowerCase();
396
+
397
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
398
+
399
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
400
+
401
+ if (isRepay) {
402
+ _position.specific = {
403
+ triggerRepayRatio: triggerData.ratio,
404
+ targetRepayRatio: subData.targetRatio,
405
+ repayEnabled: true,
406
+ subId1: Number(subId),
407
+ mergeWithId: Strategies.Identifiers.Boost,
408
+ };
409
+ } else {
410
+ _position.specific = {
411
+ triggerBoostRatio: triggerData.ratio,
412
+ targetBoostRatio: subData.targetRatio,
413
+ boostEnabled: isEnabled,
414
+ subId2: Number(subId),
415
+ mergeId: Strategies.Identifiers.Boost,
416
+ };
417
+ }
418
+
419
+ const isEOA = _position.strategy.strategyId.includes('eoa');
420
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
421
+
422
+ return _position;
423
+ }
424
+
425
+ function parseCompoundV3LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
426
+ const _position = cloneDeep(position);
427
+
428
+ const { subStruct, subId } = parseData.subscriptionEventData;
429
+ const { isEnabled } = parseData.strategiesSubsData;
430
+
431
+ const subDataDecoder = position.chainId !== 1
432
+ ? subDataService.compoundV3L2LeverageManagementSubData
433
+ : subDataService.compoundV3LeverageManagementSubData;
434
+
435
+ const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
436
+ const subData = subDataDecoder.decode(subStruct.subData);
437
+
438
+ _position.strategyData.decoded.triggerData = triggerData;
439
+ _position.strategyData.decoded.subData = subData;
440
+
441
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
442
+
443
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
444
+
445
+ if (isRepay) {
446
+ _position.specific = {
447
+ triggerRepayRatio: triggerData.ratio,
448
+ targetRepayRatio: subData.targetRatio,
449
+ repayEnabled: true,
450
+ subId1: Number(subId),
451
+ mergeWithId: Strategies.Identifiers.Boost,
452
+ };
453
+ } else {
454
+ _position.specific = {
455
+ triggerBoostRatio: triggerData.ratio,
456
+ targetBoostRatio: subData.targetRatio,
457
+ boostEnabled: isEnabled,
458
+ subId2: Number(subId),
459
+ mergeId: Strategies.Identifiers.Boost,
460
+ };
461
+ }
462
+
463
+ const isEOA = _position.strategy.strategyId.includes('eoa');
464
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
465
+
466
+ return _position;
467
+ }
468
+
469
+ function parseCompoundV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
470
+ const _position = cloneDeep(position);
471
+
472
+ const { subStruct } = parseData.subscriptionEventData;
473
+
474
+ const triggerData = triggerService.compoundV3PriceTrigger.decode(subStruct.triggerData);
475
+ const subData = subDataService.compoundV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
476
+
477
+ _position.strategyData.decoded.triggerData = triggerData;
478
+ _position.strategyData.decoded.subData = subData;
479
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.market, triggerData.user, Math.random());
480
+
481
+ _position.specific = {
482
+ market: subData.market,
483
+ collToken: subData.collToken,
484
+ baseToken: subData.baseToken,
485
+ ratio: subData.targetRatio,
486
+ price: triggerData.price,
487
+ priceState: triggerData.priceState,
488
+ };
489
+
490
+ return _position;
491
+ }
492
+
493
+ function parseCompoundV3CloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
494
+ const _position = cloneDeep(position);
495
+
496
+ const { subStruct } = parseData.subscriptionEventData;
497
+
498
+ const triggerData = triggerService.compoundV3PriceRangeTrigger.decode(subStruct.triggerData);
499
+ const subData = subDataService.compoundV3CloseSubData.decode(subStruct.subData);
500
+
501
+ _position.strategyData.decoded.triggerData = triggerData;
502
+ _position.strategyData.decoded.subData = subData;
503
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.market, Math.random());
504
+
505
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
506
+ const isEOA = _position.strategy.strategyId.includes('eoa');
507
+ _position.strategy.strategyId = isEOA ? Strategies.Identifiers.EoaCloseOnPrice : Strategies.Identifiers.CloseOnPrice;
508
+
509
+ _position.specific = {
510
+ market: subData.market,
511
+ collToken: subData.collToken,
512
+ baseToken: subData.baseToken,
513
+ stopLossPrice: triggerData.lowerPrice,
514
+ takeProfitPrice: triggerData.upperPrice,
515
+ takeProfitType,
516
+ stopLossType,
517
+ };
518
+
519
+ return _position;
520
+ }
521
+
522
+ function parseChickenBondsRebond(position: Position.Automated, parseData: ParseData): Position.Automated {
523
+ const _position = cloneDeep(position);
524
+
525
+ const { subStruct } = parseData.subscriptionEventData;
526
+
527
+ _position.strategyData.decoded.triggerData = triggerService.cBondsRebondTrigger.decode(subStruct.triggerData);
528
+ _position.strategyData.decoded.subData = subDataService.cBondsRebondSubData.decode(subStruct.subData);
529
+
530
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.strategyData.decoded.triggerData.bondId);
531
+
532
+ return _position;
533
+ }
534
+
535
+ function parseLiquityBondProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
536
+ const _position = cloneDeep(position);
537
+
538
+ const { subStruct } = parseData.subscriptionEventData;
539
+
540
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
541
+
542
+ _position.strategyData.decoded.triggerData = triggerData;
543
+ _position.strategyData.decoded.subData = subDataService.liquityPaybackUsingChickenBondSubData.decode(subStruct.subData);
544
+
545
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
546
+
547
+ _position.specific = {
548
+ triggerRepayRatio: Number(triggerData.ratio),
549
+ targetRepayRatio: Infinity, // Unknown targetRepayRatio, uses all assets from chicken bond until trove min debt (2000LUSD)
550
+ repayEnabled: true,
551
+ };
552
+ return _position;
553
+ }
554
+
555
+ function parseExchangeDca(position: Position.Automated, parseData: ParseData, chainId: ChainId): Position.Automated {
556
+ const _position = cloneDeep(position);
557
+
558
+ const { subStruct } = parseData.subscriptionEventData;
559
+
560
+ _position.strategyData.decoded.triggerData = triggerService.exchangeTimestampTrigger.decode(subStruct.triggerData);
561
+ _position.strategyData.decoded.subData = subDataService.exchangeDcaSubData.decode(subStruct.subData, chainId);
562
+
563
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
564
+
565
+ return _position;
566
+ }
567
+
568
+ function parseExchangeLimitOrder(position: Position.Automated, parseData: ParseData, chainId: ChainId): Position.Automated {
569
+ const _position = cloneDeep(position);
570
+
571
+ const { subStruct } = parseData.subscriptionEventData;
572
+
573
+ _position.strategyData.decoded.subData = subDataService.exchangeLimitOrderSubData.decode(subStruct.subData, chainId);
574
+ const fromTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.fromToken, chainId).decimals;
575
+ const toTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.toToken, chainId).decimals;
576
+ _position.strategyData.decoded.triggerData = triggerService.exchangeOffchainPriceTrigger.decode(subStruct.triggerData, fromTokenDecimals, toTokenDecimals);
577
+
578
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
579
+
580
+ return _position;
581
+ }
582
+
583
+ function parseLiquityLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
584
+ const _position = cloneDeep(position);
585
+
586
+ const { subStruct, subId } = parseData.subscriptionEventData;
587
+ const { isEnabled } = parseData.strategiesSubsData;
588
+
589
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
590
+ const subData = subDataService.liquityLeverageManagementSubData.decode(subStruct.subData);
591
+
592
+ _position.strategyData.decoded.triggerData = triggerData;
593
+ _position.strategyData.decoded.subData = subData;
594
+
595
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
596
+
597
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
598
+
599
+ if (isRepay) {
600
+ _position.specific = {
601
+ triggerRepayRatio: triggerData.ratio,
602
+ targetRepayRatio: subData.targetRatio,
603
+ repayEnabled: true,
604
+ subId1: Number(subId),
605
+ mergeWithId: Strategies.Identifiers.Boost,
606
+ };
607
+ } else {
608
+ _position.specific = {
609
+ triggerBoostRatio: triggerData.ratio,
610
+ targetBoostRatio: subData.targetRatio,
611
+ boostEnabled: isEnabled,
612
+ subId2: Number(subId),
613
+ mergeId: Strategies.Identifiers.Boost,
614
+ };
615
+ }
616
+
617
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
618
+
619
+ return _position;
620
+ }
621
+
622
+ function parseLiquityV2LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
623
+ const _position = cloneDeep(position);
624
+
625
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
626
+ const { isEnabled } = parseData.strategiesSubsData;
627
+
628
+ const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
629
+ const subData = subDataService.liquityV2LeverageManagementSubData.decode(subStruct.subData);
630
+
631
+ _position.strategyData.decoded.triggerData = triggerData;
632
+ _position.strategyData.decoded.subData = subData;
633
+
634
+ _position.positionId = getPositionId(
635
+ _position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market,
636
+ );
637
+
638
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
639
+
640
+ if (isRepay) {
641
+ _position.specific = {
642
+ triggerRepayRatio: triggerData.ratio,
643
+ targetRepayRatio: subData.targetRatio,
644
+ repayEnabled: isEnabled,
645
+ subId1: Number(subId),
646
+ subHashRepay: subHash,
647
+ mergeWithId: Strategies.Identifiers.Boost,
648
+ };
649
+ } else {
650
+ _position.specific = {
651
+ triggerBoostRatio: triggerData.ratio,
652
+ targetBoostRatio: subData.targetRatio,
653
+ boostEnabled: isEnabled,
654
+ subId2: Number(subId),
655
+ subHashBoost: subHash,
656
+ mergeId: Strategies.Identifiers.Boost,
657
+ };
658
+ }
659
+
660
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
661
+
662
+ return _position;
663
+ }
664
+
665
+ function parseSparkLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
666
+ const _position = cloneDeep(position);
667
+
668
+ const { subStruct, subId } = parseData.subscriptionEventData;
669
+ const { isEnabled } = parseData.strategiesSubsData;
670
+
671
+ const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
672
+ const subData = subDataService.sparkLeverageManagementSubData.decode(subStruct.subData);
673
+
674
+ _position.strategyData.decoded.triggerData = triggerData;
675
+ _position.strategyData.decoded.subData = subData;
676
+
677
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
678
+
679
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
680
+
681
+ if (isRepay) {
682
+ _position.specific = {
683
+ triggerRepayRatio: triggerData.ratio,
684
+ targetRepayRatio: subData.targetRatio,
685
+ repayEnabled: true,
686
+ subId1: Number(subId),
687
+ mergeWithId: Strategies.Identifiers.Boost,
688
+ };
689
+ } else {
690
+ _position.specific = {
691
+ triggerBoostRatio: triggerData.ratio,
692
+ targetBoostRatio: subData.targetRatio,
693
+ boostEnabled: isEnabled,
694
+ subId2: Number(subId),
695
+ mergeId: Strategies.Identifiers.Boost,
696
+ };
697
+ }
698
+
699
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
700
+
701
+ return _position;
702
+ }
703
+
704
+ function parseSparkCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
705
+ const _position = cloneDeep(position);
706
+
707
+ const { subStruct } = parseData.subscriptionEventData;
708
+
709
+ const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
710
+ const subData = subDataService.sparkQuotePriceSubData.decode(subStruct.subData);
711
+
712
+ _position.strategyData.decoded.triggerData = triggerData;
713
+ _position.strategyData.decoded.subData = subData;
714
+
715
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, SPARK_MARKET_ADDRESSES[_position.chainId as ChainId.Ethereum]);
716
+
717
+ _position.specific = {
718
+ collAsset: subData.collAsset,
719
+ collAssetId: subData.collAssetId,
720
+ debtAsset: subData.debtAsset,
721
+ debtAssetId: subData.debtAssetId,
722
+ baseToken: triggerData.baseTokenAddress,
723
+ quoteToken: triggerData.quoteTokenAddress,
724
+ price: triggerData.price,
725
+ ratioState: triggerData.ratioState,
726
+ };
727
+
728
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(
729
+ _position.specific.ratioState,
730
+ wethToEthByAddress(_position.specific.collAsset, parseData.chainId),
731
+ wethToEthByAddress(_position.specific.debtAsset, parseData.chainId),
732
+ parseData.chainId,
733
+ );
734
+
735
+ _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
736
+
737
+ return _position;
738
+ }
739
+
740
+ function parseLiquitySavingsLiqProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
741
+ const _position = cloneDeep(position);
742
+
743
+ const { subStruct } = parseData.subscriptionEventData;
744
+
745
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
746
+ const subData = subDataService.liquityRepayFromSavingsSubData.decode(subStruct.subData);
747
+
748
+ _position.strategyData.decoded.triggerData = triggerData;
749
+ _position.strategyData.decoded.subData = subData;
750
+
751
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
752
+
753
+ _position.specific = {
754
+ triggerRepayRatio: triggerData.ratio,
755
+ targetRepayRatio: subData.targetRatio,
756
+ repayEnabled: true,
757
+ boostEnabled: false,
758
+ };
759
+
760
+ return _position;
761
+ }
762
+
763
+ function parseLiquityDebtInFrontRepay(position: Position.Automated, parseData: ParseData): Position.Automated {
764
+ const _position = cloneDeep(position);
765
+
766
+ const { subStruct } = parseData.subscriptionEventData;
767
+
768
+ const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.decode(subStruct.triggerData);
769
+ const subData = subDataService.liquityDebtInFrontRepaySubData.decode(subStruct.subData);
770
+
771
+ _position.strategyData.decoded.triggerData = triggerData;
772
+ _position.strategyData.decoded.subData = subData;
773
+
774
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
775
+
776
+ _position.specific = {
777
+ debtInFrontMin: triggerData.debtInFrontMin,
778
+ targetRepayRatioIncrease: subData.targetRatioIncrease,
779
+ };
780
+
781
+ return _position;
782
+ }
783
+
784
+ function parseCrvUSDLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
785
+ const _position = cloneDeep(position);
786
+
787
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
788
+ const { isEnabled } = parseData.strategiesSubsData;
789
+ const triggerData = triggerService.crvUSDRatioTrigger.decode(subStruct.triggerData);
790
+ const subData = subDataService.crvUSDLeverageManagementSubData.decode(subStruct.subData);
791
+
792
+ _position.strategyData.decoded.triggerData = triggerData;
793
+ _position.strategyData.decoded.subData = subData;
794
+
795
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller);
796
+
797
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
798
+
799
+ if (isRepay) {
800
+ _position.specific = {
801
+ triggerRepayRatio: triggerData.ratio,
802
+ targetRepayRatio: subData.targetRatio,
803
+ repayEnabled: isEnabled,
804
+ subId1: Number(subId),
805
+ subHashRepay: subHash,
806
+ mergeWithId: Strategies.Identifiers.Boost,
807
+ };
808
+ } else {
809
+ _position.specific = {
810
+ triggerBoostRatio: triggerData.ratio,
811
+ targetBoostRatio: subData.targetRatio,
812
+ boostEnabled: isEnabled,
813
+ subId2: Number(subId),
814
+ subHashBoost: subHash,
815
+ mergeId: Strategies.Identifiers.Boost,
816
+ };
817
+ }
818
+
819
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
820
+
821
+ return _position;
822
+ }
823
+
824
+ function parseCrvUSDPayback(position: Position.Automated, parseData: ParseData): Position.Automated {
825
+ const _position = cloneDeep(position);
826
+
827
+ const { subStruct } = parseData.subscriptionEventData;
828
+ const triggerData = triggerService.crvUsdHealthRatioTrigger.decode(subStruct.triggerData);
829
+ const subData = subDataService.crvUSDPaybackSubData.decode(subStruct.subData);
830
+
831
+ _position.strategyData.decoded.triggerData = triggerData;
832
+ _position.strategyData.decoded.subData = subData;
833
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller, Math.random());
834
+ _position.strategy.strategyId = Strategies.Identifiers.Payback;
835
+
836
+ return _position;
837
+ }
838
+
839
+ function parseMorphoBlueLeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
840
+ const _position = cloneDeep(position);
841
+
842
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
843
+ const { isEnabled } = parseData.strategiesSubsData;
844
+ const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
845
+ const subData = subDataService.morphoBlueLeverageManagementSubData.decode(subStruct.subData);
846
+
847
+ _position.strategyData.decoded.triggerData = triggerData;
848
+ _position.strategyData.decoded.subData = subData;
849
+
850
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
851
+
852
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
853
+
854
+ if (isRepay) {
855
+ _position.specific = {
856
+ triggerRepayRatio: triggerData.ratio,
857
+ targetRepayRatio: subData.targetRatio,
858
+ repayEnabled: isEnabled,
859
+ subId1: Number(subId),
860
+ subHashRepay: subHash,
861
+ mergeWithId: Strategies.Identifiers.Boost,
862
+ };
863
+ } else {
864
+ _position.specific = {
865
+ triggerBoostRatio: triggerData.ratio,
866
+ targetBoostRatio: subData.targetRatio,
867
+ boostEnabled: isEnabled,
868
+ subId2: Number(subId),
869
+ subHashBoost: subHash,
870
+ mergeId: Strategies.Identifiers.Boost,
871
+ };
872
+ }
873
+
874
+ const isEOA = _position.strategy.strategyId.includes('eoa');
875
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
876
+
877
+
878
+ return _position;
879
+ }
880
+
881
+ function parseMorphoBlueLeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
882
+ const _position = cloneDeep(position);
883
+
884
+ const { subStruct } = parseData.subscriptionEventData;
885
+ const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
886
+ const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
887
+
888
+ _position.strategyData.decoded.triggerData = triggerData;
889
+ _position.strategyData.decoded.subData = subData;
890
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
891
+
892
+ const marketIdEncodedData = web3.eth.abi.encodeParameters(
893
+ ['address', 'address', 'address', 'address', 'uint256'],
894
+ [
895
+ subData.loanToken,
896
+ subData.collToken,
897
+ subData.oracle,
898
+ subData.irm,
899
+ subData.lltv,
900
+ ],
901
+ );
902
+
903
+ const marketId = web3.utils.keccak256(marketIdEncodedData);
904
+
905
+ _position.specific = {
906
+ subHash: _position.subHash,
907
+ marketId,
908
+ collAsset: subData.collToken,
909
+ debtAsset: subData.loanToken,
910
+ price: triggerData.price,
911
+ ratio: subData.targetRatio,
912
+ };
913
+
914
+ return _position;
915
+ }
916
+
917
+ function parseAaveV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
918
+ const _position = cloneDeep(position);
919
+
920
+ const { subStruct } = parseData.subscriptionEventData;
921
+
922
+ const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
923
+ const subData = subDataService.aaveV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
924
+
925
+ _position.strategyData.decoded.triggerData = triggerData;
926
+ _position.strategyData.decoded.subData = subData;
927
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
928
+
929
+ _position.specific = {
930
+ collAsset: subData.collAsset,
931
+ debtAsset: subData.debtAsset,
932
+ baseToken: triggerData.baseTokenAddress,
933
+ quoteToken: triggerData.quoteTokenAddress,
934
+ price: triggerData.price,
935
+ ratioState: triggerData.ratioState,
936
+ debtAssetId: subData.debtAssetId,
937
+ collAssetId: subData.collAssetId,
938
+ ratio: subData.targetRatio,
939
+ };
940
+
941
+ return _position;
942
+ }
943
+
944
+ function parseLiquityV2CloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
945
+ const _position = cloneDeep(position);
946
+
947
+ const { subStruct } = parseData.subscriptionEventData;
948
+
949
+ const triggerData = triggerService.closePriceTrigger.decode(subStruct.triggerData);
950
+ const subData = subDataService.liquityV2CloseSubData.decode(subStruct.subData);
951
+
952
+ _position.strategyData.decoded.triggerData = triggerData;
953
+ _position.strategyData.decoded.subData = subData;
954
+
955
+ _position.positionId = getPositionId(
956
+ _position.chainId, _position.protocol.id, _position.owner, subData.troveId, subData.market,
957
+ );
958
+
959
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
960
+
961
+ // User can have:
962
+ // - Only TakeProfit
963
+ // - Only StopLoss
964
+ // - Both
965
+ _position.strategy.strategyId = Strategies.Identifiers.CloseOnPrice;
966
+ _position.specific = {
967
+ market: subData.market,
968
+ troveId: subData.troveId,
969
+ stopLossPrice: triggerData.lowerPrice,
970
+ takeProfitPrice: triggerData.upperPrice,
971
+ closeToAssetAddr: triggerData.tokenAddr,
972
+ takeProfitType,
973
+ stopLossType,
974
+ };
975
+
976
+ return _position;
977
+ }
978
+
979
+ function parseLiquityV2LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
980
+ const _position = cloneDeep(position);
981
+
982
+ const { subStruct } = parseData.subscriptionEventData;
983
+
984
+ const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
985
+ const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
986
+
987
+ _position.strategyData.decoded.triggerData = triggerData;
988
+ _position.strategyData.decoded.subData = subData;
989
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
990
+
991
+ _position.specific = {
992
+ subHash: _position.subHash,
993
+ market: subData.market,
994
+ troveId: subData.troveId,
995
+ collAsset: subData.collToken,
996
+ debtAsset: subData.boldToken,
997
+ price: triggerData.price,
998
+ ratio: subData.targetRatio,
999
+ ratioState: triggerData.ratioState,
1000
+ };
1001
+
1002
+ return _position;
1003
+ }
1004
+
1005
+ function parseLiquityV2Payback(position: Position.Automated, parseData: ParseData): Position.Automated {
1006
+ const _position = cloneDeep(position);
1007
+
1008
+ const { subStruct } = parseData.subscriptionEventData;
1009
+ const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
1010
+ const subData = subDataService.liquityV2PaybackSubData.decode(subStruct.subData);
1011
+
1012
+ _position.strategyData.decoded.triggerData = triggerData;
1013
+ _position.strategyData.decoded.subData = subData;
1014
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
1015
+ _position.strategy.strategyId = Strategies.Identifiers.Payback;
1016
+
1017
+ _position.specific = {
1018
+ subHash: _position.subHash,
1019
+ market: subData.market,
1020
+ troveId: subData.troveId,
1021
+ targetRatio: subData.targetRatio,
1022
+ triggerRatio: triggerData.ratio,
1023
+ };
1024
+
1025
+ return _position;
1026
+ }
1027
+
1028
+ function parseFluidT1LeverageManagement(position: Position.Automated, parseData: ParseData): Position.Automated {
1029
+ const _position = cloneDeep(position);
1030
+
1031
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
1032
+ const { isEnabled } = parseData.strategiesSubsData;
1033
+
1034
+ const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
1035
+ const subData = subDataService.fluidLeverageManagementSubData.decode(subStruct.subData);
1036
+
1037
+ _position.strategyData.decoded.triggerData = triggerData;
1038
+ _position.strategyData.decoded.subData = subData;
1039
+
1040
+ _position.positionId = getPositionId(
1041
+ _position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault,
1042
+ );
1043
+
1044
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
1045
+
1046
+ if (isRepay) {
1047
+ _position.specific = {
1048
+ triggerRepayRatio: triggerData.ratio,
1049
+ targetRepayRatio: subData.targetRatio,
1050
+ repayEnabled: isEnabled,
1051
+ subId1: Number(subId),
1052
+ subHashRepay: subHash,
1053
+ mergeWithId: Strategies.Identifiers.Boost,
1054
+ };
1055
+ } else {
1056
+ _position.specific = {
1057
+ triggerBoostRatio: triggerData.ratio,
1058
+ targetBoostRatio: subData.targetRatio,
1059
+ boostEnabled: isEnabled,
1060
+ subId2: Number(subId),
1061
+ subHashBoost: subHash,
1062
+ mergeId: Strategies.Identifiers.Boost,
1063
+ };
1064
+ }
1065
+
1066
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
1067
+
1068
+ return _position;
1069
+ }
1070
+
1071
+ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1072
+ [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
1073
+ [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
1074
+ [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
1075
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
1076
+ [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
1077
+ [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
1078
+ [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
1079
+ [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
1080
+ },
1081
+ [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
1082
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
1083
+ [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
1084
+ [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
1085
+ [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
1086
+ [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
1087
+ [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
1088
+ [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
1089
+ [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
1090
+ },
1091
+ [ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
1092
+ [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
1093
+ [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
1094
+ [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
1095
+ [Strategies.Identifiers.BoostOnPrice]: parseLiquityV2LeverageManagementOnPrice,
1096
+ [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
1097
+ [Strategies.Identifiers.Payback]: parseLiquityV2Payback,
1098
+ },
1099
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
1100
+ [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
1101
+ [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
1102
+ },
1103
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
1104
+ [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
1105
+ [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
1106
+ [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
1107
+ [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
1108
+ [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
1109
+ [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
1110
+ [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3LeverageManagementOnPrice,
1111
+ [Strategies.Identifiers.RepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
1112
+ },
1113
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
1114
+ [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
1115
+ [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
1116
+ },
1117
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
1118
+ [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
1119
+ [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
1120
+ [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
1121
+ [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
1122
+ [Strategies.Identifiers.RepayOnPrice]: parseCompoundV3LeverageManagementOnPrice,
1123
+ [Strategies.Identifiers.BoostOnPrice]: parseCompoundV3LeverageManagementOnPrice,
1124
+ [Strategies.Identifiers.EoaRepayOnPrice]: parseCompoundV3LeverageManagementOnPrice,
1125
+ [Strategies.Identifiers.EoaBoostOnPrice]: parseCompoundV3LeverageManagementOnPrice,
1126
+ [Strategies.Identifiers.CloseOnPrice]: parseCompoundV3CloseOnPrice,
1127
+ [Strategies.Identifiers.EoaCloseOnPrice]: parseCompoundV3CloseOnPrice,
1128
+ },
1129
+ [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
1130
+ [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
1131
+ },
1132
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
1133
+ [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
1134
+ [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
1135
+ },
1136
+ [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
1137
+ [Strategies.Identifiers.Dca]: parseExchangeDca,
1138
+ [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
1139
+ },
1140
+ [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
1141
+ [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
1142
+ [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
1143
+ [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
1144
+ [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
1145
+ },
1146
+ [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
1147
+ [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
1148
+ [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
1149
+ [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
1150
+ },
1151
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
1152
+ [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
1153
+ [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
1154
+ [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
1155
+ [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
1156
+ [Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
1157
+ },
1158
+ [ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
1159
+ [Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
1160
+ [Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
1161
+ },
1162
+ };
1163
+
1164
+ function getParsingMethod(id: ProtocolIdentifiers.StrategiesAutomation, strategy: BundleOrStrategy) {
1165
+ return parsingMethodsMapping[id][strategy.strategyId];
1166
+ }
1167
+
1168
+ export function parseStrategiesAutomatedPosition(parseData: ParseData): Position.Automated | null {
1169
+ const {
1170
+ chainId, blockNumber, subscriptionEventData, strategiesSubsData,
1171
+ } = parseData;
1172
+ const {
1173
+ subStruct, proxy, subId, subHash,
1174
+ } = subscriptionEventData;
1175
+ const { isEnabled } = strategiesSubsData;
1176
+
1177
+ const id = subStruct.strategyOrBundleId as unknown as StrategyOrBundleIds;
1178
+
1179
+ const strategyOrBundleInfo = (
1180
+ subStruct.isBundle
1181
+ ? BUNDLES_INFO[chainId][id as keyof BundleInfoUnion]
1182
+ : STRATEGIES_INFO[chainId][id as keyof StrategyInfoUnion]
1183
+ ) as BundleOrStrategy;
1184
+
1185
+ if (!strategyOrBundleInfo) return null;
1186
+
1187
+ const position: Position.Automated = {
1188
+ isEnabled,
1189
+ chainId,
1190
+ subHash,
1191
+ blockNumber,
1192
+ positionId: 'positionId parsing not implemented.',
1193
+ subId: Number(subId),
1194
+ owner: proxy.toLowerCase(),
1195
+ protocol: {
1196
+ ...strategyOrBundleInfo.protocol,
1197
+ },
1198
+ strategy: {
1199
+ isBundle: subStruct.isBundle,
1200
+ ...strategyOrBundleInfo,
1201
+ },
1202
+ strategyData: {
1203
+ encoded: {
1204
+ triggerData: subStruct.triggerData,
1205
+ subData: subStruct.subData,
1206
+ },
1207
+ decoded: {
1208
+ triggerData: null,
1209
+ subData: null,
1210
+ },
1211
+ },
1212
+ specific: {},
1213
+ };
1214
+
1215
+ return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
1216
+ }