@defisaver/automation-sdk 3.1.4 → 3.1.6

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