@defisaver/automation-sdk 3.1.1-dev-5 → 3.1.2

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