@defisaver/automation-sdk 3.1.2 → 3.1.4-dev-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +509 -489
  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 +788 -723
  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 +104 -100
  67. package/cjs/services/strategySubService.js +289 -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 +211 -192
  71. package/cjs/services/subDataService.js +529 -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 +208 -191
  75. package/cjs/services/triggerService.js +399 -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 +213 -184
  101. package/cjs/types/enums.js +239 -206
  102. package/cjs/types/index.d.ts +233 -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 +503 -483
  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 +761 -696
  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 +104 -100
  162. package/esm/services/strategySubService.js +260 -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 +211 -192
  166. package/esm/services/subDataService.js +523 -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 +208 -191
  170. package/esm/services/triggerService.js +370 -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 +213 -184
  196. package/esm/types/enums.js +236 -203
  197. package/esm/types/index.d.ts +233 -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 +538 -507
  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 +1019 -934
  233. package/src/services/strategySubService.test.ts +1122 -1122
  234. package/src/services/strategySubService.ts +573 -524
  235. package/src/services/subDataService.test.ts +1387 -1387
  236. package/src/services/subDataService.ts +726 -645
  237. package/src/services/triggerService.test.ts +1004 -1004
  238. package/src/services/triggerService.ts +502 -449
  239. package/src/services/utils.test.ts +430 -430
  240. package/src/services/utils.ts +162 -103
  241. package/src/types/enums.ts +233 -200
  242. package/src/types/index.ts +291 -279
  243. package/tsconfig.esm.json +8 -8
  244. package/tsconfig.json +22 -22
  245. package/umd/index.js +34103 -0
@@ -1,696 +1,761 @@
1
- import { getAssetInfoByAddress } from '@defisaver/tokens';
2
- import { cloneDeep } from 'lodash';
3
- import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
4
- import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
5
- import { getPositionId, getRatioStateInfoForAaveCloseStrategy, isRatioStateOver, wethToEthByAddress, } from './utils';
6
- import * as subDataService from './subDataService';
7
- import * as triggerService from './triggerService';
8
- const SPARK_MARKET_ADDRESSES = {
9
- [ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
10
- };
11
- const AAVE_V3_MARKET_ADDRESSES = {
12
- [ChainId.Ethereum]: '0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e',
13
- [ChainId.Optimism]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
14
- [ChainId.Arbitrum]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
15
- [ChainId.Base]: '0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D',
16
- };
17
- function parseMakerSavingsLiqProtection(position, parseData) {
18
- const _position = cloneDeep(position);
19
- const { subStruct } = parseData.subscriptionEventData;
20
- const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
21
- const subData = subDataService.makerRepayFromSavingsSubData.decode(subStruct.subData);
22
- _position.strategyData.decoded.triggerData = triggerData;
23
- _position.strategyData.decoded.subData = subData;
24
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
25
- _position.specific = {
26
- triggerRepayRatio: Number(triggerData.ratio),
27
- targetRepayRatio: Number(subData.targetRatio),
28
- repayEnabled: true,
29
- boostEnabled: false,
30
- };
31
- return _position;
32
- }
33
- function parseMakerCloseOnPrice(position, parseData) {
34
- const _position = cloneDeep(position);
35
- const { subStruct } = parseData.subscriptionEventData;
36
- const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
37
- const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
38
- _position.strategyData.decoded.triggerData = triggerData;
39
- _position.strategyData.decoded.subData = subData;
40
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
41
- const isTakeProfit = isRatioStateOver(Number(triggerData.state));
42
- _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
43
- _position.specific = {
44
- price: triggerData.price,
45
- closeToAssetAddr: subData.closeToAssetAddr,
46
- };
47
- return _position;
48
- }
49
- function parseMakerTrailingStop(position, parseData) {
50
- const _position = cloneDeep(position);
51
- const { subStruct } = parseData.subscriptionEventData;
52
- const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
53
- const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
54
- _position.strategyData.decoded.triggerData = triggerData;
55
- _position.strategyData.decoded.subData = subData;
56
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
57
- _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
58
- _position.specific = {
59
- triggerPercentage: Number(triggerData.triggerPercentage),
60
- roundId: Number(triggerData.roundId),
61
- closeToAssetAddr: subData.closeToAssetAddr,
62
- };
63
- return _position;
64
- }
65
- function parseMakerLeverageManagement(position, parseData) {
66
- const _position = cloneDeep(position);
67
- const { subStruct, subId } = parseData.subscriptionEventData;
68
- const { isEnabled } = parseData.strategiesSubsData;
69
- const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
70
- const subData = subDataService.makerLeverageManagementSubData.decode(subStruct.subData);
71
- _position.strategyData.decoded.triggerData = triggerData;
72
- _position.strategyData.decoded.subData = subData;
73
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
74
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
75
- if (isRepay) {
76
- _position.specific = {
77
- triggerRepayRatio: triggerData.ratio,
78
- targetRepayRatio: subData.targetRatio,
79
- repayEnabled: true,
80
- subId1: Number(subId),
81
- mergeWithId: Strategies.Identifiers.Boost,
82
- };
83
- }
84
- else {
85
- _position.specific = {
86
- triggerBoostRatio: triggerData.ratio,
87
- targetBoostRatio: subData.targetRatio,
88
- boostEnabled: isEnabled,
89
- subId2: Number(subId),
90
- mergeId: Strategies.Identifiers.Boost,
91
- };
92
- }
93
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
94
- return _position;
95
- }
96
- function parseLiquityCloseOnPrice(position, parseData) {
97
- const _position = cloneDeep(position);
98
- const { subStruct } = parseData.subscriptionEventData;
99
- const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
100
- const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
101
- _position.strategyData.decoded.triggerData = triggerData;
102
- _position.strategyData.decoded.subData = subData;
103
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
104
- const isTakeProfit = isRatioStateOver(Number(triggerData.state));
105
- _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
106
- _position.specific = {
107
- price: triggerData.price,
108
- closeToAssetAddr: subData.closeToAssetAddr,
109
- };
110
- return _position;
111
- }
112
- function parseLiquityTrailingStop(position, parseData) {
113
- const _position = cloneDeep(position);
114
- const { subStruct } = parseData.subscriptionEventData;
115
- const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
116
- const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
117
- _position.strategyData.decoded.triggerData = triggerData;
118
- _position.strategyData.decoded.subData = subData;
119
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
120
- _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
121
- _position.specific = {
122
- triggerPercentage: Number(triggerData.triggerPercentage),
123
- roundId: Number(triggerData.roundId),
124
- closeToAssetAddr: subData.closeToAssetAddr,
125
- };
126
- return _position;
127
- }
128
- function parseAaveV2LeverageManagement(position, parseData) {
129
- const _position = cloneDeep(position);
130
- const { subStruct, subId } = parseData.subscriptionEventData;
131
- const { isEnabled } = parseData.strategiesSubsData;
132
- const triggerData = triggerService.aaveV2RatioTrigger.decode(subStruct.triggerData);
133
- const subData = subDataService.aaveV2LeverageManagementSubData.decode(subStruct.subData);
134
- _position.strategyData.decoded.triggerData = triggerData;
135
- _position.strategyData.decoded.subData = subData;
136
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
137
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
138
- if (isRepay) {
139
- _position.specific = {
140
- triggerRepayRatio: triggerData.ratio,
141
- targetRepayRatio: subData.targetRatio,
142
- repayEnabled: true,
143
- subId1: Number(subId),
144
- mergeWithId: Strategies.Identifiers.Boost,
145
- };
146
- }
147
- else {
148
- _position.specific = {
149
- triggerBoostRatio: triggerData.ratio,
150
- targetBoostRatio: subData.targetRatio,
151
- boostEnabled: isEnabled,
152
- subId2: Number(subId),
153
- mergeId: Strategies.Identifiers.Boost,
154
- };
155
- }
156
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
157
- return _position;
158
- }
159
- function parseAaveV3LeverageManagement(position, parseData) {
160
- const _position = cloneDeep(position);
161
- const { subStruct, subId } = parseData.subscriptionEventData;
162
- const { isEnabled } = parseData.strategiesSubsData;
163
- const triggerData = triggerService.aaveV3RatioTrigger.decode(subStruct.triggerData);
164
- const subData = subDataService.aaveV3LeverageManagementSubData.decode(subStruct.subData);
165
- _position.strategyData.decoded.triggerData = triggerData;
166
- _position.strategyData.decoded.subData = subData;
167
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
168
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
169
- if (isRepay) {
170
- _position.specific = {
171
- triggerRepayRatio: triggerData.ratio,
172
- targetRepayRatio: subData.targetRatio,
173
- repayEnabled: true,
174
- subId1: Number(subId),
175
- mergeWithId: Strategies.Identifiers.Boost,
176
- };
177
- }
178
- else {
179
- _position.specific = {
180
- triggerBoostRatio: triggerData.ratio,
181
- targetBoostRatio: subData.targetRatio,
182
- boostEnabled: isEnabled,
183
- subId2: Number(subId),
184
- mergeId: Strategies.Identifiers.Boost,
185
- };
186
- }
187
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
188
- return _position;
189
- }
190
- function parseMorphoAaveV2LeverageManagement(position, parseData) {
191
- const _position = cloneDeep(position);
192
- const { subStruct, subId } = parseData.subscriptionEventData;
193
- const { isEnabled } = parseData.strategiesSubsData;
194
- const triggerData = triggerService.morphoAaveV2RatioTrigger.decode(subStruct.triggerData);
195
- const subData = subDataService.morphoAaveV2LeverageManagementSubData.decode(subStruct.subData);
196
- _position.strategyData.decoded.triggerData = triggerData;
197
- _position.strategyData.decoded.subData = subData;
198
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
199
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
200
- if (isRepay) {
201
- _position.specific = {
202
- triggerRepayRatio: triggerData.ratio,
203
- targetRepayRatio: subData.targetRatio,
204
- repayEnabled: true,
205
- subId1: Number(subId),
206
- mergeWithId: Strategies.Identifiers.Boost,
207
- };
208
- }
209
- else {
210
- _position.specific = {
211
- triggerBoostRatio: triggerData.ratio,
212
- targetBoostRatio: subData.targetRatio,
213
- boostEnabled: isEnabled,
214
- subId2: Number(subId),
215
- mergeId: Strategies.Identifiers.Boost,
216
- };
217
- }
218
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
219
- return _position;
220
- }
221
- function parseAaveV3CloseOnPrice(position, parseData) {
222
- const _position = cloneDeep(position);
223
- const { subStruct } = parseData.subscriptionEventData;
224
- const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
225
- const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
226
- _position.strategyData.decoded.triggerData = triggerData;
227
- _position.strategyData.decoded.subData = subData;
228
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
229
- _position.specific = {
230
- collAsset: subData.collAsset,
231
- collAssetId: subData.collAssetId,
232
- debtAsset: subData.debtAsset,
233
- debtAssetId: subData.debtAssetId,
234
- baseToken: triggerData.baseTokenAddress,
235
- quoteToken: triggerData.quoteTokenAddress,
236
- price: triggerData.price,
237
- ratioState: triggerData.ratioState,
238
- };
239
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
240
- _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
241
- return _position;
242
- }
243
- function parseAaveV3CloseOnPriceWithMaximumGasPrice(position, parseData) {
244
- const _position = cloneDeep(position);
245
- const { subStruct } = parseData.subscriptionEventData;
246
- const triggerData = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.decode(subStruct.triggerData);
247
- const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
248
- _position.strategyData.decoded.triggerData = triggerData;
249
- _position.strategyData.decoded.subData = subData;
250
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
251
- _position.specific = {
252
- collAsset: subData.collAsset,
253
- collAssetId: subData.collAssetId,
254
- debtAsset: subData.debtAsset,
255
- debtAssetId: subData.debtAssetId,
256
- baseToken: triggerData.baseTokenAddress,
257
- quoteToken: triggerData.quoteTokenAddress,
258
- price: triggerData.price,
259
- maximumGasPrice: triggerData.maximumGasPrice,
260
- ratioState: triggerData.ratioState,
261
- };
262
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
263
- _position.strategy.strategyId = isRatioStateOver(ratioState)
264
- ? Strategies.IdOverrides.TakeProfitWithGasPrice
265
- : Strategies.IdOverrides.StopLossWithGasPrice;
266
- return _position;
267
- }
268
- function parseCompoundV2LeverageManagement(position, parseData) {
269
- const _position = cloneDeep(position);
270
- const { subStruct, subId } = parseData.subscriptionEventData;
271
- const { isEnabled } = parseData.strategiesSubsData;
272
- const triggerData = triggerService.compoundV2RatioTrigger.decode(subStruct.triggerData);
273
- const subData = subDataService.compoundV2LeverageManagementSubData.decode(subStruct.subData);
274
- _position.strategyData.decoded.triggerData = triggerData;
275
- _position.strategyData.decoded.subData = subData;
276
- _position.owner = triggerData.owner.toLowerCase();
277
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
278
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
279
- if (isRepay) {
280
- _position.specific = {
281
- triggerRepayRatio: triggerData.ratio,
282
- targetRepayRatio: subData.targetRatio,
283
- repayEnabled: true,
284
- subId1: Number(subId),
285
- mergeWithId: Strategies.Identifiers.Boost,
286
- };
287
- }
288
- else {
289
- _position.specific = {
290
- triggerBoostRatio: triggerData.ratio,
291
- targetBoostRatio: subData.targetRatio,
292
- boostEnabled: isEnabled,
293
- subId2: Number(subId),
294
- mergeId: Strategies.Identifiers.Boost,
295
- };
296
- }
297
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
298
- return _position;
299
- }
300
- function parseCompoundV3LeverageManagement(position, parseData) {
301
- const _position = cloneDeep(position);
302
- const { subStruct, subId } = parseData.subscriptionEventData;
303
- const { isEnabled } = parseData.strategiesSubsData;
304
- const subDataDecoder = position.chainId !== 1
305
- ? subDataService.compoundV3L2LeverageManagementSubData
306
- : subDataService.compoundV3LeverageManagementSubData;
307
- const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
308
- const subData = subDataDecoder.decode(subStruct.subData);
309
- _position.strategyData.decoded.triggerData = triggerData;
310
- _position.strategyData.decoded.subData = subData;
311
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
312
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
313
- if (isRepay) {
314
- _position.specific = {
315
- triggerRepayRatio: triggerData.ratio,
316
- targetRepayRatio: subData.targetRatio,
317
- repayEnabled: true,
318
- subId1: Number(subId),
319
- mergeWithId: Strategies.Identifiers.Boost,
320
- };
321
- }
322
- else {
323
- _position.specific = {
324
- triggerBoostRatio: triggerData.ratio,
325
- targetBoostRatio: subData.targetRatio,
326
- boostEnabled: isEnabled,
327
- subId2: Number(subId),
328
- mergeId: Strategies.Identifiers.Boost,
329
- };
330
- }
331
- const isEOA = _position.strategy.strategyId.includes('eoa');
332
- _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
333
- return _position;
334
- }
335
- function parseChickenBondsRebond(position, parseData) {
336
- const _position = cloneDeep(position);
337
- const { subStruct } = parseData.subscriptionEventData;
338
- _position.strategyData.decoded.triggerData = triggerService.cBondsRebondTrigger.decode(subStruct.triggerData);
339
- _position.strategyData.decoded.subData = subDataService.cBondsRebondSubData.decode(subStruct.subData);
340
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.strategyData.decoded.triggerData.bondId);
341
- return _position;
342
- }
343
- function parseLiquityBondProtection(position, parseData) {
344
- const _position = cloneDeep(position);
345
- const { subStruct } = parseData.subscriptionEventData;
346
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
347
- _position.strategyData.decoded.triggerData = triggerData;
348
- _position.strategyData.decoded.subData = subDataService.liquityPaybackUsingChickenBondSubData.decode(subStruct.subData);
349
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
350
- _position.specific = {
351
- triggerRepayRatio: Number(triggerData.ratio),
352
- targetRepayRatio: Infinity,
353
- repayEnabled: true,
354
- };
355
- return _position;
356
- }
357
- function parseExchangeDca(position, parseData, chainId) {
358
- const _position = cloneDeep(position);
359
- const { subStruct } = parseData.subscriptionEventData;
360
- _position.strategyData.decoded.triggerData = triggerService.exchangeTimestampTrigger.decode(subStruct.triggerData);
361
- _position.strategyData.decoded.subData = subDataService.exchangeDcaSubData.decode(subStruct.subData, chainId);
362
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
363
- return _position;
364
- }
365
- function parseExchangeLimitOrder(position, parseData, chainId) {
366
- const _position = cloneDeep(position);
367
- const { subStruct } = parseData.subscriptionEventData;
368
- _position.strategyData.decoded.subData = subDataService.exchangeLimitOrderSubData.decode(subStruct.subData, chainId);
369
- const fromTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.fromToken, chainId).decimals;
370
- const toTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.toToken, chainId).decimals;
371
- _position.strategyData.decoded.triggerData = triggerService.exchangeOffchainPriceTrigger.decode(subStruct.triggerData, fromTokenDecimals, toTokenDecimals);
372
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
373
- return _position;
374
- }
375
- function parseLiquityLeverageManagement(position, parseData) {
376
- const _position = cloneDeep(position);
377
- const { subStruct, subId } = parseData.subscriptionEventData;
378
- const { isEnabled } = parseData.strategiesSubsData;
379
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
380
- const subData = subDataService.liquityLeverageManagementSubData.decode(subStruct.subData);
381
- _position.strategyData.decoded.triggerData = triggerData;
382
- _position.strategyData.decoded.subData = subData;
383
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
384
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
385
- if (isRepay) {
386
- _position.specific = {
387
- triggerRepayRatio: triggerData.ratio,
388
- targetRepayRatio: subData.targetRatio,
389
- repayEnabled: true,
390
- subId1: Number(subId),
391
- mergeWithId: Strategies.Identifiers.Boost,
392
- };
393
- }
394
- else {
395
- _position.specific = {
396
- triggerBoostRatio: triggerData.ratio,
397
- targetBoostRatio: subData.targetRatio,
398
- boostEnabled: isEnabled,
399
- subId2: Number(subId),
400
- mergeId: Strategies.Identifiers.Boost,
401
- };
402
- }
403
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
404
- return _position;
405
- }
406
- function parseSparkLeverageManagement(position, parseData) {
407
- const _position = cloneDeep(position);
408
- const { subStruct, subId } = parseData.subscriptionEventData;
409
- const { isEnabled } = parseData.strategiesSubsData;
410
- const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
411
- const subData = subDataService.sparkLeverageManagementSubData.decode(subStruct.subData);
412
- _position.strategyData.decoded.triggerData = triggerData;
413
- _position.strategyData.decoded.subData = subData;
414
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
415
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
416
- if (isRepay) {
417
- _position.specific = {
418
- triggerRepayRatio: triggerData.ratio,
419
- targetRepayRatio: subData.targetRatio,
420
- repayEnabled: true,
421
- subId1: Number(subId),
422
- mergeWithId: Strategies.Identifiers.Boost,
423
- };
424
- }
425
- else {
426
- _position.specific = {
427
- triggerBoostRatio: triggerData.ratio,
428
- targetBoostRatio: subData.targetRatio,
429
- boostEnabled: isEnabled,
430
- subId2: Number(subId),
431
- mergeId: Strategies.Identifiers.Boost,
432
- };
433
- }
434
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
435
- return _position;
436
- }
437
- function parseSparkCloseOnPrice(position, parseData) {
438
- const _position = cloneDeep(position);
439
- const { subStruct } = parseData.subscriptionEventData;
440
- const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
441
- const subData = subDataService.sparkQuotePriceSubData.decode(subStruct.subData);
442
- _position.strategyData.decoded.triggerData = triggerData;
443
- _position.strategyData.decoded.subData = subData;
444
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, SPARK_MARKET_ADDRESSES[_position.chainId]);
445
- _position.specific = {
446
- collAsset: subData.collAsset,
447
- collAssetId: subData.collAssetId,
448
- debtAsset: subData.debtAsset,
449
- debtAssetId: subData.debtAssetId,
450
- baseToken: triggerData.baseTokenAddress,
451
- quoteToken: triggerData.quoteTokenAddress,
452
- price: triggerData.price,
453
- ratioState: triggerData.ratioState,
454
- };
455
- const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
456
- _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
457
- return _position;
458
- }
459
- function parseLiquitySavingsLiqProtection(position, parseData) {
460
- const _position = cloneDeep(position);
461
- const { subStruct } = parseData.subscriptionEventData;
462
- const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
463
- const subData = subDataService.liquityRepayFromSavingsSubData.decode(subStruct.subData);
464
- _position.strategyData.decoded.triggerData = triggerData;
465
- _position.strategyData.decoded.subData = subData;
466
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
467
- _position.specific = {
468
- triggerRepayRatio: triggerData.ratio,
469
- targetRepayRatio: subData.targetRatio,
470
- repayEnabled: true,
471
- boostEnabled: false,
472
- };
473
- return _position;
474
- }
475
- function parseLiquityDebtInFrontRepay(position, parseData) {
476
- const _position = cloneDeep(position);
477
- const { subStruct } = parseData.subscriptionEventData;
478
- const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.decode(subStruct.triggerData);
479
- const subData = subDataService.liquityDebtInFrontRepaySubData.decode(subStruct.subData);
480
- _position.strategyData.decoded.triggerData = triggerData;
481
- _position.strategyData.decoded.subData = subData;
482
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
483
- _position.specific = {
484
- debtInFrontMin: triggerData.debtInFrontMin,
485
- targetRepayRatioIncrease: subData.targetRatioIncrease,
486
- };
487
- return _position;
488
- }
489
- function parseCrvUSDLeverageManagement(position, parseData) {
490
- const _position = cloneDeep(position);
491
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
492
- const { isEnabled } = parseData.strategiesSubsData;
493
- const triggerData = triggerService.crvUSDRatioTrigger.decode(subStruct.triggerData);
494
- const subData = subDataService.crvUSDLeverageManagementSubData.decode(subStruct.subData);
495
- _position.strategyData.decoded.triggerData = triggerData;
496
- _position.strategyData.decoded.subData = subData;
497
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller);
498
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
499
- if (isRepay) {
500
- _position.specific = {
501
- triggerRepayRatio: triggerData.ratio,
502
- targetRepayRatio: subData.targetRatio,
503
- repayEnabled: isEnabled,
504
- subId1: Number(subId),
505
- subHashRepay: subHash,
506
- mergeWithId: Strategies.Identifiers.Boost,
507
- };
508
- }
509
- else {
510
- _position.specific = {
511
- triggerBoostRatio: triggerData.ratio,
512
- targetBoostRatio: subData.targetRatio,
513
- boostEnabled: isEnabled,
514
- subId2: Number(subId),
515
- subHashBoost: subHash,
516
- mergeId: Strategies.Identifiers.Boost,
517
- };
518
- }
519
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
520
- return _position;
521
- }
522
- function parseCrvUSDPayback(position, parseData) {
523
- const _position = cloneDeep(position);
524
- const { subStruct } = parseData.subscriptionEventData;
525
- const triggerData = triggerService.crvUsdHealthRatioTrigger.decode(subStruct.triggerData);
526
- const subData = subDataService.crvUSDPaybackSubData.decode(subStruct.subData);
527
- _position.strategyData.decoded.triggerData = triggerData;
528
- _position.strategyData.decoded.subData = subData;
529
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller, Math.random());
530
- _position.strategy.strategyId = Strategies.Identifiers.Payback;
531
- return _position;
532
- }
533
- function parseMorphoBlueLeverageManagement(position, parseData) {
534
- const _position = cloneDeep(position);
535
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
536
- const { isEnabled } = parseData.strategiesSubsData;
537
- const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
538
- const subData = subDataService.morphoBlueLeverageManagementSubData.decode(subStruct.subData);
539
- _position.strategyData.decoded.triggerData = triggerData;
540
- _position.strategyData.decoded.subData = subData;
541
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
542
- const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
543
- if (isRepay) {
544
- _position.specific = {
545
- triggerRepayRatio: triggerData.ratio,
546
- targetRepayRatio: subData.targetRatio,
547
- repayEnabled: isEnabled,
548
- subId1: Number(subId),
549
- subHashRepay: subHash,
550
- mergeWithId: Strategies.Identifiers.Boost,
551
- };
552
- }
553
- else {
554
- _position.specific = {
555
- triggerBoostRatio: triggerData.ratio,
556
- targetBoostRatio: subData.targetRatio,
557
- boostEnabled: isEnabled,
558
- subId2: Number(subId),
559
- subHashBoost: subHash,
560
- mergeId: Strategies.Identifiers.Boost,
561
- };
562
- }
563
- const isEOA = _position.strategy.strategyId.includes('eoa');
564
- _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
565
- return _position;
566
- }
567
- function parseAaveV3OpenOrderFromCollateral(position, parseData) {
568
- const _position = cloneDeep(position);
569
- const { subStruct } = parseData.subscriptionEventData;
570
- const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
571
- const subData = subDataService.aaveV3OpenOrderSubData.decode(subStruct.subData);
572
- _position.strategyData.decoded.triggerData = triggerData;
573
- _position.strategyData.decoded.subData = subData;
574
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
575
- _position.specific = {
576
- collAsset: subData.collAsset,
577
- debtAsset: subData.debtAsset,
578
- baseToken: triggerData.baseTokenAddress,
579
- quoteToken: triggerData.quoteTokenAddress,
580
- price: triggerData.price,
581
- ratioState: triggerData.ratioState,
582
- debtAssetId: subData.debtAssetId,
583
- collAssetId: subData.collAssetId,
584
- ratio: subData.targetRatio,
585
- };
586
- return _position;
587
- }
588
- const parsingMethodsMapping = {
589
- [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
590
- [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
591
- [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
592
- [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
593
- [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
594
- [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
595
- [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
596
- [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
597
- },
598
- [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
599
- [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
600
- [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
601
- [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
602
- [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
603
- [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
604
- [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
605
- [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
606
- [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
607
- },
608
- [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
609
- [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
610
- [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
611
- },
612
- [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
613
- [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
614
- [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
615
- [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
616
- [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
617
- [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
618
- [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
619
- [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3OpenOrderFromCollateral,
620
- },
621
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
622
- [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
623
- [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
624
- },
625
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
626
- [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
627
- [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
628
- [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
629
- [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
630
- },
631
- [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
632
- [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
633
- },
634
- [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
635
- [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
636
- [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
637
- },
638
- [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
639
- [Strategies.Identifiers.Dca]: parseExchangeDca,
640
- [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
641
- },
642
- [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
643
- [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
644
- [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
645
- [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
646
- [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
647
- },
648
- [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
649
- [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
650
- [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
651
- [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
652
- },
653
- [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
654
- [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
655
- [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
656
- [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
657
- [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
658
- },
659
- };
660
- function getParsingMethod(id, strategy) {
661
- return parsingMethodsMapping[id][strategy.strategyId];
662
- }
663
- export function parseStrategiesAutomatedPosition(parseData) {
664
- const { chainId, blockNumber, subscriptionEventData, strategiesSubsData, } = parseData;
665
- const { subStruct, proxy, subId, subHash, } = subscriptionEventData;
666
- const { isEnabled } = strategiesSubsData;
667
- const id = subStruct.strategyOrBundleId;
668
- const strategyOrBundleInfo = (subStruct.isBundle
669
- ? BUNDLES_INFO[chainId][id]
670
- : STRATEGIES_INFO[chainId][id]);
671
- if (!strategyOrBundleInfo)
672
- return null;
673
- const position = {
674
- isEnabled,
675
- chainId,
676
- subHash,
677
- blockNumber,
678
- positionId: 'positionId parsing not implemented.',
679
- subId: Number(subId),
680
- owner: proxy.toLowerCase(),
681
- protocol: Object.assign({}, strategyOrBundleInfo.protocol),
682
- strategy: Object.assign({ isBundle: subStruct.isBundle }, strategyOrBundleInfo),
683
- strategyData: {
684
- encoded: {
685
- triggerData: subStruct.triggerData,
686
- subData: subStruct.subData,
687
- },
688
- decoded: {
689
- triggerData: null,
690
- subData: null,
691
- },
692
- },
693
- specific: {},
694
- };
695
- return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
696
- }
1
+ import { getAssetInfoByAddress } from '@defisaver/tokens';
2
+ import { cloneDeep } from 'lodash';
3
+ import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
4
+ import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
5
+ import { getPositionId, getRatioStateInfoForAaveCloseStrategy, getStopLossAndTakeProfitTypeByCloseStrategyType, isRatioStateOver, wethToEthByAddress, } from './utils';
6
+ import * as subDataService from './subDataService';
7
+ import * as triggerService from './triggerService';
8
+ const SPARK_MARKET_ADDRESSES = {
9
+ [ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
10
+ };
11
+ const AAVE_V3_MARKET_ADDRESSES = {
12
+ [ChainId.Ethereum]: '0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e',
13
+ [ChainId.Optimism]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
14
+ [ChainId.Arbitrum]: '0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb',
15
+ [ChainId.Base]: '0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D',
16
+ };
17
+ function parseMakerSavingsLiqProtection(position, parseData) {
18
+ const _position = cloneDeep(position);
19
+ const { subStruct } = parseData.subscriptionEventData;
20
+ const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
21
+ const subData = subDataService.makerRepayFromSavingsSubData.decode(subStruct.subData);
22
+ _position.strategyData.decoded.triggerData = triggerData;
23
+ _position.strategyData.decoded.subData = subData;
24
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
25
+ _position.specific = {
26
+ triggerRepayRatio: Number(triggerData.ratio),
27
+ targetRepayRatio: Number(subData.targetRatio),
28
+ repayEnabled: true,
29
+ boostEnabled: false,
30
+ };
31
+ return _position;
32
+ }
33
+ function parseMakerCloseOnPrice(position, parseData) {
34
+ const _position = cloneDeep(position);
35
+ const { subStruct } = parseData.subscriptionEventData;
36
+ const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
37
+ const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
38
+ _position.strategyData.decoded.triggerData = triggerData;
39
+ _position.strategyData.decoded.subData = subData;
40
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
41
+ const isTakeProfit = isRatioStateOver(Number(triggerData.state));
42
+ _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
43
+ _position.specific = {
44
+ price: triggerData.price,
45
+ closeToAssetAddr: subData.closeToAssetAddr,
46
+ };
47
+ return _position;
48
+ }
49
+ function parseMakerTrailingStop(position, parseData) {
50
+ const _position = cloneDeep(position);
51
+ const { subStruct } = parseData.subscriptionEventData;
52
+ const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
53
+ const subData = subDataService.makerCloseSubData.decode(subStruct.subData);
54
+ _position.strategyData.decoded.triggerData = triggerData;
55
+ _position.strategyData.decoded.subData = subData;
56
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
57
+ _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
58
+ _position.specific = {
59
+ triggerPercentage: Number(triggerData.triggerPercentage),
60
+ roundId: Number(triggerData.roundId),
61
+ closeToAssetAddr: subData.closeToAssetAddr,
62
+ };
63
+ return _position;
64
+ }
65
+ function parseMakerLeverageManagement(position, parseData) {
66
+ const _position = cloneDeep(position);
67
+ const { subStruct, subId } = parseData.subscriptionEventData;
68
+ const { isEnabled } = parseData.strategiesSubsData;
69
+ const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
70
+ const subData = subDataService.makerLeverageManagementSubData.decode(subStruct.subData);
71
+ _position.strategyData.decoded.triggerData = triggerData;
72
+ _position.strategyData.decoded.subData = subData;
73
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
74
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
75
+ if (isRepay) {
76
+ _position.specific = {
77
+ triggerRepayRatio: triggerData.ratio,
78
+ targetRepayRatio: subData.targetRatio,
79
+ repayEnabled: true,
80
+ subId1: Number(subId),
81
+ mergeWithId: Strategies.Identifiers.Boost,
82
+ };
83
+ }
84
+ else {
85
+ _position.specific = {
86
+ triggerBoostRatio: triggerData.ratio,
87
+ targetBoostRatio: subData.targetRatio,
88
+ boostEnabled: isEnabled,
89
+ subId2: Number(subId),
90
+ mergeId: Strategies.Identifiers.Boost,
91
+ };
92
+ }
93
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
94
+ return _position;
95
+ }
96
+ function parseLiquityCloseOnPrice(position, parseData) {
97
+ const _position = cloneDeep(position);
98
+ const { subStruct } = parseData.subscriptionEventData;
99
+ const triggerData = triggerService.chainlinkPriceTrigger.decode(subStruct.triggerData);
100
+ const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
101
+ _position.strategyData.decoded.triggerData = triggerData;
102
+ _position.strategyData.decoded.subData = subData;
103
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
104
+ const isTakeProfit = isRatioStateOver(Number(triggerData.state));
105
+ _position.strategy.strategyId = isTakeProfit ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
106
+ _position.specific = {
107
+ price: triggerData.price,
108
+ closeToAssetAddr: subData.closeToAssetAddr,
109
+ };
110
+ return _position;
111
+ }
112
+ function parseLiquityTrailingStop(position, parseData) {
113
+ const _position = cloneDeep(position);
114
+ const { subStruct } = parseData.subscriptionEventData;
115
+ const triggerData = triggerService.trailingStopTrigger.decode(subStruct.triggerData);
116
+ const subData = subDataService.liquityCloseSubData.decode(subStruct.subData);
117
+ _position.strategyData.decoded.triggerData = triggerData;
118
+ _position.strategyData.decoded.subData = subData;
119
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
120
+ _position.strategy.strategyId = Strategies.IdOverrides.TrailingStop;
121
+ _position.specific = {
122
+ triggerPercentage: Number(triggerData.triggerPercentage),
123
+ roundId: Number(triggerData.roundId),
124
+ closeToAssetAddr: subData.closeToAssetAddr,
125
+ };
126
+ return _position;
127
+ }
128
+ function parseAaveV2LeverageManagement(position, parseData) {
129
+ const _position = cloneDeep(position);
130
+ const { subStruct, subId } = parseData.subscriptionEventData;
131
+ const { isEnabled } = parseData.strategiesSubsData;
132
+ const triggerData = triggerService.aaveV2RatioTrigger.decode(subStruct.triggerData);
133
+ const subData = subDataService.aaveV2LeverageManagementSubData.decode(subStruct.subData);
134
+ _position.strategyData.decoded.triggerData = triggerData;
135
+ _position.strategyData.decoded.subData = subData;
136
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
137
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
138
+ if (isRepay) {
139
+ _position.specific = {
140
+ triggerRepayRatio: triggerData.ratio,
141
+ targetRepayRatio: subData.targetRatio,
142
+ repayEnabled: true,
143
+ subId1: Number(subId),
144
+ mergeWithId: Strategies.Identifiers.Boost,
145
+ };
146
+ }
147
+ else {
148
+ _position.specific = {
149
+ triggerBoostRatio: triggerData.ratio,
150
+ targetBoostRatio: subData.targetRatio,
151
+ boostEnabled: isEnabled,
152
+ subId2: Number(subId),
153
+ mergeId: Strategies.Identifiers.Boost,
154
+ };
155
+ }
156
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
157
+ return _position;
158
+ }
159
+ function parseAaveV3LeverageManagement(position, parseData) {
160
+ const _position = cloneDeep(position);
161
+ const { subStruct, subId } = parseData.subscriptionEventData;
162
+ const { isEnabled } = parseData.strategiesSubsData;
163
+ const triggerData = triggerService.aaveV3RatioTrigger.decode(subStruct.triggerData);
164
+ const subData = subDataService.aaveV3LeverageManagementSubData.decode(subStruct.subData);
165
+ _position.strategyData.decoded.triggerData = triggerData;
166
+ _position.strategyData.decoded.subData = subData;
167
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
168
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
169
+ if (isRepay) {
170
+ _position.specific = {
171
+ triggerRepayRatio: triggerData.ratio,
172
+ targetRepayRatio: subData.targetRatio,
173
+ repayEnabled: true,
174
+ subId1: Number(subId),
175
+ mergeWithId: Strategies.Identifiers.Boost,
176
+ };
177
+ }
178
+ else {
179
+ _position.specific = {
180
+ triggerBoostRatio: triggerData.ratio,
181
+ targetBoostRatio: subData.targetRatio,
182
+ boostEnabled: isEnabled,
183
+ subId2: Number(subId),
184
+ mergeId: Strategies.Identifiers.Boost,
185
+ };
186
+ }
187
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
188
+ return _position;
189
+ }
190
+ function parseMorphoAaveV2LeverageManagement(position, parseData) {
191
+ const _position = cloneDeep(position);
192
+ const { subStruct, subId } = parseData.subscriptionEventData;
193
+ const { isEnabled } = parseData.strategiesSubsData;
194
+ const triggerData = triggerService.morphoAaveV2RatioTrigger.decode(subStruct.triggerData);
195
+ const subData = subDataService.morphoAaveV2LeverageManagementSubData.decode(subStruct.subData);
196
+ _position.strategyData.decoded.triggerData = triggerData;
197
+ _position.strategyData.decoded.subData = subData;
198
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
199
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
200
+ if (isRepay) {
201
+ _position.specific = {
202
+ triggerRepayRatio: triggerData.ratio,
203
+ targetRepayRatio: subData.targetRatio,
204
+ repayEnabled: true,
205
+ subId1: Number(subId),
206
+ mergeWithId: Strategies.Identifiers.Boost,
207
+ };
208
+ }
209
+ else {
210
+ _position.specific = {
211
+ triggerBoostRatio: triggerData.ratio,
212
+ targetBoostRatio: subData.targetRatio,
213
+ boostEnabled: isEnabled,
214
+ subId2: Number(subId),
215
+ mergeId: Strategies.Identifiers.Boost,
216
+ };
217
+ }
218
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
219
+ return _position;
220
+ }
221
+ function parseAaveV3CloseOnPrice(position, parseData) {
222
+ const _position = cloneDeep(position);
223
+ const { subStruct } = parseData.subscriptionEventData;
224
+ const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
225
+ const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
226
+ _position.strategyData.decoded.triggerData = triggerData;
227
+ _position.strategyData.decoded.subData = subData;
228
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
229
+ _position.specific = {
230
+ collAsset: subData.collAsset,
231
+ collAssetId: subData.collAssetId,
232
+ debtAsset: subData.debtAsset,
233
+ debtAssetId: subData.debtAssetId,
234
+ baseToken: triggerData.baseTokenAddress,
235
+ quoteToken: triggerData.quoteTokenAddress,
236
+ price: triggerData.price,
237
+ ratioState: triggerData.ratioState,
238
+ };
239
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
240
+ _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
241
+ return _position;
242
+ }
243
+ function parseAaveV3CloseOnPriceWithMaximumGasPrice(position, parseData) {
244
+ const _position = cloneDeep(position);
245
+ const { subStruct } = parseData.subscriptionEventData;
246
+ const triggerData = triggerService.aaveV3QuotePriceWithMaximumGasPriceTrigger.decode(subStruct.triggerData);
247
+ const subData = subDataService.aaveV3QuotePriceSubData.decode(subStruct.subData);
248
+ _position.strategyData.decoded.triggerData = triggerData;
249
+ _position.strategyData.decoded.subData = subData;
250
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
251
+ _position.specific = {
252
+ collAsset: subData.collAsset,
253
+ collAssetId: subData.collAssetId,
254
+ debtAsset: subData.debtAsset,
255
+ debtAssetId: subData.debtAssetId,
256
+ baseToken: triggerData.baseTokenAddress,
257
+ quoteToken: triggerData.quoteTokenAddress,
258
+ price: triggerData.price,
259
+ maximumGasPrice: triggerData.maximumGasPrice,
260
+ ratioState: triggerData.ratioState,
261
+ };
262
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
263
+ _position.strategy.strategyId = isRatioStateOver(ratioState)
264
+ ? Strategies.IdOverrides.TakeProfitWithGasPrice
265
+ : Strategies.IdOverrides.StopLossWithGasPrice;
266
+ return _position;
267
+ }
268
+ function parseCompoundV2LeverageManagement(position, parseData) {
269
+ const _position = cloneDeep(position);
270
+ const { subStruct, subId } = parseData.subscriptionEventData;
271
+ const { isEnabled } = parseData.strategiesSubsData;
272
+ const triggerData = triggerService.compoundV2RatioTrigger.decode(subStruct.triggerData);
273
+ const subData = subDataService.compoundV2LeverageManagementSubData.decode(subStruct.subData);
274
+ _position.strategyData.decoded.triggerData = triggerData;
275
+ _position.strategyData.decoded.subData = subData;
276
+ _position.owner = triggerData.owner.toLowerCase();
277
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
278
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
279
+ if (isRepay) {
280
+ _position.specific = {
281
+ triggerRepayRatio: triggerData.ratio,
282
+ targetRepayRatio: subData.targetRatio,
283
+ repayEnabled: true,
284
+ subId1: Number(subId),
285
+ mergeWithId: Strategies.Identifiers.Boost,
286
+ };
287
+ }
288
+ else {
289
+ _position.specific = {
290
+ triggerBoostRatio: triggerData.ratio,
291
+ targetBoostRatio: subData.targetRatio,
292
+ boostEnabled: isEnabled,
293
+ subId2: Number(subId),
294
+ mergeId: Strategies.Identifiers.Boost,
295
+ };
296
+ }
297
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
298
+ return _position;
299
+ }
300
+ function parseCompoundV3LeverageManagement(position, parseData) {
301
+ const _position = cloneDeep(position);
302
+ const { subStruct, subId } = parseData.subscriptionEventData;
303
+ const { isEnabled } = parseData.strategiesSubsData;
304
+ const subDataDecoder = position.chainId !== 1
305
+ ? subDataService.compoundV3L2LeverageManagementSubData
306
+ : subDataService.compoundV3LeverageManagementSubData;
307
+ const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
308
+ const subData = subDataDecoder.decode(subStruct.subData);
309
+ _position.strategyData.decoded.triggerData = triggerData;
310
+ _position.strategyData.decoded.subData = subData;
311
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
312
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
313
+ if (isRepay) {
314
+ _position.specific = {
315
+ triggerRepayRatio: triggerData.ratio,
316
+ targetRepayRatio: subData.targetRatio,
317
+ repayEnabled: true,
318
+ subId1: Number(subId),
319
+ mergeWithId: Strategies.Identifiers.Boost,
320
+ };
321
+ }
322
+ else {
323
+ _position.specific = {
324
+ triggerBoostRatio: triggerData.ratio,
325
+ targetBoostRatio: subData.targetRatio,
326
+ boostEnabled: isEnabled,
327
+ subId2: Number(subId),
328
+ mergeId: Strategies.Identifiers.Boost,
329
+ };
330
+ }
331
+ const isEOA = _position.strategy.strategyId.includes('eoa');
332
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
333
+ return _position;
334
+ }
335
+ function parseChickenBondsRebond(position, parseData) {
336
+ const _position = cloneDeep(position);
337
+ const { subStruct } = parseData.subscriptionEventData;
338
+ _position.strategyData.decoded.triggerData = triggerService.cBondsRebondTrigger.decode(subStruct.triggerData);
339
+ _position.strategyData.decoded.subData = subDataService.cBondsRebondSubData.decode(subStruct.subData);
340
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.strategyData.decoded.triggerData.bondId);
341
+ return _position;
342
+ }
343
+ function parseLiquityBondProtection(position, parseData) {
344
+ const _position = cloneDeep(position);
345
+ const { subStruct } = parseData.subscriptionEventData;
346
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
347
+ _position.strategyData.decoded.triggerData = triggerData;
348
+ _position.strategyData.decoded.subData = subDataService.liquityPaybackUsingChickenBondSubData.decode(subStruct.subData);
349
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
350
+ _position.specific = {
351
+ triggerRepayRatio: Number(triggerData.ratio),
352
+ targetRepayRatio: Infinity,
353
+ repayEnabled: true,
354
+ };
355
+ return _position;
356
+ }
357
+ function parseExchangeDca(position, parseData, chainId) {
358
+ const _position = cloneDeep(position);
359
+ const { subStruct } = parseData.subscriptionEventData;
360
+ _position.strategyData.decoded.triggerData = triggerService.exchangeTimestampTrigger.decode(subStruct.triggerData);
361
+ _position.strategyData.decoded.subData = subDataService.exchangeDcaSubData.decode(subStruct.subData, chainId);
362
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
363
+ return _position;
364
+ }
365
+ function parseExchangeLimitOrder(position, parseData, chainId) {
366
+ const _position = cloneDeep(position);
367
+ const { subStruct } = parseData.subscriptionEventData;
368
+ _position.strategyData.decoded.subData = subDataService.exchangeLimitOrderSubData.decode(subStruct.subData, chainId);
369
+ const fromTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.fromToken, chainId).decimals;
370
+ const toTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.toToken, chainId).decimals;
371
+ _position.strategyData.decoded.triggerData = triggerService.exchangeOffchainPriceTrigger.decode(subStruct.triggerData, fromTokenDecimals, toTokenDecimals);
372
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
373
+ return _position;
374
+ }
375
+ function parseLiquityLeverageManagement(position, parseData) {
376
+ const _position = cloneDeep(position);
377
+ const { subStruct, subId } = parseData.subscriptionEventData;
378
+ const { isEnabled } = parseData.strategiesSubsData;
379
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
380
+ const subData = subDataService.liquityLeverageManagementSubData.decode(subStruct.subData);
381
+ _position.strategyData.decoded.triggerData = triggerData;
382
+ _position.strategyData.decoded.subData = subData;
383
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
384
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
385
+ if (isRepay) {
386
+ _position.specific = {
387
+ triggerRepayRatio: triggerData.ratio,
388
+ targetRepayRatio: subData.targetRatio,
389
+ repayEnabled: true,
390
+ subId1: Number(subId),
391
+ mergeWithId: Strategies.Identifiers.Boost,
392
+ };
393
+ }
394
+ else {
395
+ _position.specific = {
396
+ triggerBoostRatio: triggerData.ratio,
397
+ targetBoostRatio: subData.targetRatio,
398
+ boostEnabled: isEnabled,
399
+ subId2: Number(subId),
400
+ mergeId: Strategies.Identifiers.Boost,
401
+ };
402
+ }
403
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
404
+ return _position;
405
+ }
406
+ function parseLiquityV2LeverageManagement(position, parseData) {
407
+ const _position = cloneDeep(position);
408
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
409
+ const { isEnabled } = parseData.strategiesSubsData;
410
+ const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
411
+ const subData = subDataService.liquityV2LeverageManagementSubData.decode(subStruct.subData);
412
+ _position.strategyData.decoded.triggerData = triggerData;
413
+ _position.strategyData.decoded.subData = subData;
414
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
415
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
416
+ if (isRepay) {
417
+ _position.specific = {
418
+ triggerRepayRatio: triggerData.ratio,
419
+ targetRepayRatio: subData.targetRatio,
420
+ repayEnabled: isEnabled,
421
+ subId1: Number(subId),
422
+ subHashRepay: subHash,
423
+ mergeWithId: Strategies.Identifiers.Boost,
424
+ };
425
+ }
426
+ else {
427
+ _position.specific = {
428
+ triggerBoostRatio: triggerData.ratio,
429
+ targetBoostRatio: subData.targetRatio,
430
+ boostEnabled: isEnabled,
431
+ subId2: Number(subId),
432
+ subHashBoost: subHash,
433
+ mergeId: Strategies.Identifiers.Boost,
434
+ };
435
+ }
436
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
437
+ return _position;
438
+ }
439
+ function parseSparkLeverageManagement(position, parseData) {
440
+ const _position = cloneDeep(position);
441
+ const { subStruct, subId } = parseData.subscriptionEventData;
442
+ const { isEnabled } = parseData.strategiesSubsData;
443
+ const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
444
+ const subData = subDataService.sparkLeverageManagementSubData.decode(subStruct.subData);
445
+ _position.strategyData.decoded.triggerData = triggerData;
446
+ _position.strategyData.decoded.subData = subData;
447
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
448
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
449
+ if (isRepay) {
450
+ _position.specific = {
451
+ triggerRepayRatio: triggerData.ratio,
452
+ targetRepayRatio: subData.targetRatio,
453
+ repayEnabled: true,
454
+ subId1: Number(subId),
455
+ mergeWithId: Strategies.Identifiers.Boost,
456
+ };
457
+ }
458
+ else {
459
+ _position.specific = {
460
+ triggerBoostRatio: triggerData.ratio,
461
+ targetBoostRatio: subData.targetRatio,
462
+ boostEnabled: isEnabled,
463
+ subId2: Number(subId),
464
+ mergeId: Strategies.Identifiers.Boost,
465
+ };
466
+ }
467
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
468
+ return _position;
469
+ }
470
+ function parseSparkCloseOnPrice(position, parseData) {
471
+ const _position = cloneDeep(position);
472
+ const { subStruct } = parseData.subscriptionEventData;
473
+ const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
474
+ const subData = subDataService.sparkQuotePriceSubData.decode(subStruct.subData);
475
+ _position.strategyData.decoded.triggerData = triggerData;
476
+ _position.strategyData.decoded.subData = subData;
477
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, SPARK_MARKET_ADDRESSES[_position.chainId]);
478
+ _position.specific = {
479
+ collAsset: subData.collAsset,
480
+ collAssetId: subData.collAssetId,
481
+ debtAsset: subData.debtAsset,
482
+ debtAssetId: subData.debtAssetId,
483
+ baseToken: triggerData.baseTokenAddress,
484
+ quoteToken: triggerData.quoteTokenAddress,
485
+ price: triggerData.price,
486
+ ratioState: triggerData.ratioState,
487
+ };
488
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
489
+ _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
490
+ return _position;
491
+ }
492
+ function parseLiquitySavingsLiqProtection(position, parseData) {
493
+ const _position = cloneDeep(position);
494
+ const { subStruct } = parseData.subscriptionEventData;
495
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
496
+ const subData = subDataService.liquityRepayFromSavingsSubData.decode(subStruct.subData);
497
+ _position.strategyData.decoded.triggerData = triggerData;
498
+ _position.strategyData.decoded.subData = subData;
499
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
500
+ _position.specific = {
501
+ triggerRepayRatio: triggerData.ratio,
502
+ targetRepayRatio: subData.targetRatio,
503
+ repayEnabled: true,
504
+ boostEnabled: false,
505
+ };
506
+ return _position;
507
+ }
508
+ function parseLiquityDebtInFrontRepay(position, parseData) {
509
+ const _position = cloneDeep(position);
510
+ const { subStruct } = parseData.subscriptionEventData;
511
+ const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.decode(subStruct.triggerData);
512
+ const subData = subDataService.liquityDebtInFrontRepaySubData.decode(subStruct.subData);
513
+ _position.strategyData.decoded.triggerData = triggerData;
514
+ _position.strategyData.decoded.subData = subData;
515
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
516
+ _position.specific = {
517
+ debtInFrontMin: triggerData.debtInFrontMin,
518
+ targetRepayRatioIncrease: subData.targetRatioIncrease,
519
+ };
520
+ return _position;
521
+ }
522
+ function parseCrvUSDLeverageManagement(position, parseData) {
523
+ const _position = cloneDeep(position);
524
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
525
+ const { isEnabled } = parseData.strategiesSubsData;
526
+ const triggerData = triggerService.crvUSDRatioTrigger.decode(subStruct.triggerData);
527
+ const subData = subDataService.crvUSDLeverageManagementSubData.decode(subStruct.subData);
528
+ _position.strategyData.decoded.triggerData = triggerData;
529
+ _position.strategyData.decoded.subData = subData;
530
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller);
531
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
532
+ if (isRepay) {
533
+ _position.specific = {
534
+ triggerRepayRatio: triggerData.ratio,
535
+ targetRepayRatio: subData.targetRatio,
536
+ repayEnabled: isEnabled,
537
+ subId1: Number(subId),
538
+ subHashRepay: subHash,
539
+ mergeWithId: Strategies.Identifiers.Boost,
540
+ };
541
+ }
542
+ else {
543
+ _position.specific = {
544
+ triggerBoostRatio: triggerData.ratio,
545
+ targetBoostRatio: subData.targetRatio,
546
+ boostEnabled: isEnabled,
547
+ subId2: Number(subId),
548
+ subHashBoost: subHash,
549
+ mergeId: Strategies.Identifiers.Boost,
550
+ };
551
+ }
552
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
553
+ return _position;
554
+ }
555
+ function parseCrvUSDPayback(position, parseData) {
556
+ const _position = cloneDeep(position);
557
+ const { subStruct } = parseData.subscriptionEventData;
558
+ const triggerData = triggerService.crvUsdHealthRatioTrigger.decode(subStruct.triggerData);
559
+ const subData = subDataService.crvUSDPaybackSubData.decode(subStruct.subData);
560
+ _position.strategyData.decoded.triggerData = triggerData;
561
+ _position.strategyData.decoded.subData = subData;
562
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller, Math.random());
563
+ _position.strategy.strategyId = Strategies.Identifiers.Payback;
564
+ return _position;
565
+ }
566
+ function parseMorphoBlueLeverageManagement(position, parseData) {
567
+ const _position = cloneDeep(position);
568
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
569
+ const { isEnabled } = parseData.strategiesSubsData;
570
+ const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
571
+ const subData = subDataService.morphoBlueLeverageManagementSubData.decode(subStruct.subData);
572
+ _position.strategyData.decoded.triggerData = triggerData;
573
+ _position.strategyData.decoded.subData = subData;
574
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
575
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
576
+ if (isRepay) {
577
+ _position.specific = {
578
+ triggerRepayRatio: triggerData.ratio,
579
+ targetRepayRatio: subData.targetRatio,
580
+ repayEnabled: isEnabled,
581
+ subId1: Number(subId),
582
+ subHashRepay: subHash,
583
+ mergeWithId: Strategies.Identifiers.Boost,
584
+ };
585
+ }
586
+ else {
587
+ _position.specific = {
588
+ triggerBoostRatio: triggerData.ratio,
589
+ targetBoostRatio: subData.targetRatio,
590
+ boostEnabled: isEnabled,
591
+ subId2: Number(subId),
592
+ subHashBoost: subHash,
593
+ mergeId: Strategies.Identifiers.Boost,
594
+ };
595
+ }
596
+ const isEOA = _position.strategy.strategyId.includes('eoa');
597
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
598
+ return _position;
599
+ }
600
+ function parseAaveV3LeverageManagementOnPrice(position, parseData) {
601
+ const _position = cloneDeep(position);
602
+ const { subStruct } = parseData.subscriptionEventData;
603
+ const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
604
+ const subData = subDataService.aaveV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
605
+ _position.strategyData.decoded.triggerData = triggerData;
606
+ _position.strategyData.decoded.subData = subData;
607
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
608
+ _position.specific = {
609
+ collAsset: subData.collAsset,
610
+ debtAsset: subData.debtAsset,
611
+ baseToken: triggerData.baseTokenAddress,
612
+ quoteToken: triggerData.quoteTokenAddress,
613
+ price: triggerData.price,
614
+ ratioState: triggerData.ratioState,
615
+ debtAssetId: subData.debtAssetId,
616
+ collAssetId: subData.collAssetId,
617
+ ratio: subData.targetRatio,
618
+ };
619
+ return _position;
620
+ }
621
+ function parseLiquityV2CloseOnPrice(position, parseData) {
622
+ const _position = cloneDeep(position);
623
+ const { subStruct } = parseData.subscriptionEventData;
624
+ const triggerData = triggerService.closePriceTrigger.decode(subStruct.triggerData);
625
+ const subData = subDataService.liquityV2CloseSubData.decode(subStruct.subData);
626
+ _position.strategyData.decoded.triggerData = triggerData;
627
+ _position.strategyData.decoded.subData = subData;
628
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, subData.troveId, subData.market);
629
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
630
+ // User can have:
631
+ // - Only TakeProfit
632
+ // - Only StopLoss
633
+ // - Both
634
+ // TODO: see on frontend what specific data we need here because stop-loss and take-profit is one bundle now
635
+ _position.strategy.strategyId = Strategies.Identifiers.CloseOnPrice;
636
+ _position.specific = {
637
+ market: subData.market,
638
+ troveId: subData.troveId,
639
+ stopLossPrice: triggerData.lowerPrice,
640
+ takeProfitPrice: triggerData.upperPrice,
641
+ closeToAssetAddr: triggerData.tokenAddr,
642
+ takeProfitType,
643
+ stopLossType,
644
+ };
645
+ return _position;
646
+ }
647
+ const parsingMethodsMapping = {
648
+ [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
649
+ [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
650
+ [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
651
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
652
+ [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
653
+ [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
654
+ [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
655
+ [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
656
+ },
657
+ [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
658
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
659
+ [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
660
+ [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
661
+ [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
662
+ [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
663
+ [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
664
+ [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
665
+ [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
666
+ },
667
+ [ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
668
+ [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
669
+ [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
670
+ [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
671
+ },
672
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
673
+ [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
674
+ [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
675
+ },
676
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
677
+ [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
678
+ [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
679
+ [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
680
+ [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
681
+ [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
682
+ [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
683
+ [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3LeverageManagementOnPrice,
684
+ [Strategies.Identifiers.RepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
685
+ },
686
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
687
+ [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
688
+ [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
689
+ },
690
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
691
+ [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
692
+ [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
693
+ [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
694
+ [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
695
+ },
696
+ [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
697
+ [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
698
+ },
699
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
700
+ [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
701
+ [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
702
+ },
703
+ [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
704
+ [Strategies.Identifiers.Dca]: parseExchangeDca,
705
+ [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
706
+ },
707
+ [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
708
+ [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
709
+ [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
710
+ [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
711
+ [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
712
+ },
713
+ [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
714
+ [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
715
+ [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
716
+ [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
717
+ },
718
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
719
+ [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
720
+ [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
721
+ [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
722
+ [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
723
+ },
724
+ };
725
+ function getParsingMethod(id, strategy) {
726
+ return parsingMethodsMapping[id][strategy.strategyId];
727
+ }
728
+ export function parseStrategiesAutomatedPosition(parseData) {
729
+ const { chainId, blockNumber, subscriptionEventData, strategiesSubsData, } = parseData;
730
+ const { subStruct, proxy, subId, subHash, } = subscriptionEventData;
731
+ const { isEnabled } = strategiesSubsData;
732
+ const id = subStruct.strategyOrBundleId;
733
+ const strategyOrBundleInfo = (subStruct.isBundle
734
+ ? BUNDLES_INFO[chainId][id]
735
+ : STRATEGIES_INFO[chainId][id]);
736
+ if (!strategyOrBundleInfo)
737
+ return null;
738
+ const position = {
739
+ isEnabled,
740
+ chainId,
741
+ subHash,
742
+ blockNumber,
743
+ positionId: 'positionId parsing not implemented.',
744
+ subId: Number(subId),
745
+ owner: proxy.toLowerCase(),
746
+ protocol: Object.assign({}, strategyOrBundleInfo.protocol),
747
+ strategy: Object.assign({ isBundle: subStruct.isBundle }, strategyOrBundleInfo),
748
+ strategyData: {
749
+ encoded: {
750
+ triggerData: subStruct.triggerData,
751
+ subData: subStruct.subData,
752
+ },
753
+ decoded: {
754
+ triggerData: null,
755
+ subData: null,
756
+ },
757
+ },
758
+ specific: {},
759
+ };
760
+ return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
761
+ }