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

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