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

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