@defisaver/automation-sdk 3.2.5 → 3.3.0

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 (244) hide show
  1. package/.babelrc +3 -3
  2. package/.editorconfig +9 -9
  3. package/.env.dev +4 -4
  4. package/.eslintignore +6 -6
  5. package/.eslintrc.js +39 -39
  6. package/.mocharc.json +4 -4
  7. package/.nvmrc +1 -1
  8. package/README.md +46 -46
  9. package/cjs/abis/Erc20.json +223 -223
  10. package/cjs/abis/SubStorage.json +21 -21
  11. package/cjs/abis/UniMulticall.json +17 -17
  12. package/cjs/abis/index.d.ts +9 -9
  13. package/cjs/abis/index.js +30 -30
  14. package/cjs/abis/legacy_AaveV2Subscriptions.json +8 -8
  15. package/cjs/abis/legacy_AuthCheck.json +8 -8
  16. package/cjs/abis/legacy_CompoundV2Subscriptions.json +9 -9
  17. package/cjs/abis/legacy_MakerSubscriptions.json +9 -9
  18. package/cjs/automation/private/Automation.d.ts +12 -12
  19. package/cjs/automation/private/Automation.js +42 -42
  20. package/cjs/automation/private/LegacyAutomation.d.ts +25 -25
  21. package/cjs/automation/private/LegacyAutomation.js +118 -118
  22. package/cjs/automation/private/LegacyProtocol.d.ts +22 -22
  23. package/cjs/automation/private/LegacyProtocol.js +41 -41
  24. package/cjs/automation/private/LegacyProtocol.test.d.ts +1 -1
  25. package/cjs/automation/private/LegacyProtocol.test.js +25 -25
  26. package/cjs/automation/private/Protocol.d.ts +22 -22
  27. package/cjs/automation/private/Protocol.js +41 -41
  28. package/cjs/automation/private/Protocol.test.d.ts +1 -1
  29. package/cjs/automation/private/Protocol.test.js +25 -25
  30. package/cjs/automation/private/StrategiesAutomation.d.ts +33 -33
  31. package/cjs/automation/private/StrategiesAutomation.js +189 -189
  32. package/cjs/automation/private/StrategiesAutomation.test.d.ts +1 -1
  33. package/cjs/automation/private/StrategiesAutomation.test.js +671 -671
  34. package/cjs/automation/public/ArbitrumStrategies.d.ts +5 -5
  35. package/cjs/automation/public/ArbitrumStrategies.js +13 -13
  36. package/cjs/automation/public/BaseStrategies.d.ts +5 -5
  37. package/cjs/automation/public/BaseStrategies.js +13 -13
  38. package/cjs/automation/public/EthereumStrategies.d.ts +5 -5
  39. package/cjs/automation/public/EthereumStrategies.js +13 -13
  40. package/cjs/automation/public/OptimismStrategies.d.ts +5 -5
  41. package/cjs/automation/public/OptimismStrategies.js +13 -13
  42. package/cjs/automation/public/Strategies.test.d.ts +1 -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 +28 -28
  53. package/cjs/constants/index.js +674 -564
  54. package/cjs/index.d.ts +23 -23
  55. package/cjs/index.js +65 -65
  56. package/cjs/services/contractService.d.ts +12 -12
  57. package/cjs/services/contractService.js +54 -54
  58. package/cjs/services/ethereumService.d.ts +7 -7
  59. package/cjs/services/ethereumService.js +49 -49
  60. package/cjs/services/ethereumService.test.d.ts +1 -1
  61. package/cjs/services/ethereumService.test.js +242 -242
  62. package/cjs/services/strategiesService.d.ts +2 -2
  63. package/cjs/services/strategiesService.js +946 -898
  64. package/cjs/services/strategiesService.test.d.ts +1 -1
  65. package/cjs/services/strategiesService.test.js +110 -110
  66. package/cjs/services/strategySubService.d.ts +113 -111
  67. package/cjs/services/strategySubService.js +328 -314
  68. package/cjs/services/strategySubService.test.d.ts +1 -1
  69. package/cjs/services/strategySubService.test.js +1058 -936
  70. package/cjs/services/subDataService.d.ts +282 -261
  71. package/cjs/services/subDataService.js +740 -683
  72. package/cjs/services/subDataService.test.d.ts +1 -1
  73. package/cjs/services/subDataService.test.js +1458 -1282
  74. package/cjs/services/triggerService.d.ts +268 -249
  75. package/cjs/services/triggerService.js +509 -473
  76. package/cjs/services/triggerService.test.d.ts +1 -1
  77. package/cjs/services/triggerService.test.js +1139 -1045
  78. package/cjs/services/utils.d.ts +30 -30
  79. package/cjs/services/utils.js +182 -182
  80. package/cjs/services/utils.test.d.ts +1 -1
  81. package/cjs/services/utils.test.js +376 -376
  82. package/cjs/types/contracts/generated/Erc20.d.ts +53 -53
  83. package/cjs/types/contracts/generated/Erc20.js +5 -5
  84. package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
  85. package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.js +5 -5
  86. package/cjs/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
  87. package/cjs/types/contracts/generated/Legacy_AuthCheck.js +5 -5
  88. package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
  89. package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +5 -5
  90. package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
  91. package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.js +5 -5
  92. package/cjs/types/contracts/generated/SubStorage.d.ts +114 -114
  93. package/cjs/types/contracts/generated/SubStorage.js +5 -5
  94. package/cjs/types/contracts/generated/UniMulticall.d.ts +55 -55
  95. package/cjs/types/contracts/generated/UniMulticall.js +5 -5
  96. package/cjs/types/contracts/generated/index.d.ts +7 -7
  97. package/cjs/types/contracts/generated/index.js +2 -2
  98. package/cjs/types/contracts/generated/types.d.ts +54 -54
  99. package/cjs/types/contracts/generated/types.js +2 -2
  100. package/cjs/types/enums.d.ts +253 -226
  101. package/cjs/types/enums.js +279 -252
  102. package/cjs/types/index.d.ts +264 -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 +33 -33
  126. package/esm/automation/private/StrategiesAutomation.js +183 -183
  127. package/esm/automation/private/StrategiesAutomation.test.d.ts +1 -1
  128. package/esm/automation/private/StrategiesAutomation.test.js +666 -666
  129. package/esm/automation/public/ArbitrumStrategies.d.ts +5 -5
  130. package/esm/automation/public/ArbitrumStrategies.js +7 -7
  131. package/esm/automation/public/BaseStrategies.d.ts +5 -5
  132. package/esm/automation/public/BaseStrategies.js +7 -7
  133. package/esm/automation/public/EthereumStrategies.d.ts +5 -5
  134. package/esm/automation/public/EthereumStrategies.js +7 -7
  135. package/esm/automation/public/OptimismStrategies.d.ts +5 -5
  136. package/esm/automation/public/OptimismStrategies.js +7 -7
  137. package/esm/automation/public/Strategies.test.d.ts +1 -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 +28 -28
  148. package/esm/constants/index.js +668 -558
  149. package/esm/index.d.ts +23 -23
  150. package/esm/index.js +23 -23
  151. package/esm/services/contractService.d.ts +12 -12
  152. package/esm/services/contractService.js +45 -45
  153. package/esm/services/ethereumService.d.ts +7 -7
  154. package/esm/services/ethereumService.js +41 -41
  155. package/esm/services/ethereumService.test.d.ts +1 -1
  156. package/esm/services/ethereumService.test.js +237 -237
  157. package/esm/services/strategiesService.d.ts +2 -2
  158. package/esm/services/strategiesService.js +916 -868
  159. package/esm/services/strategiesService.test.d.ts +1 -1
  160. package/esm/services/strategiesService.test.js +108 -108
  161. package/esm/services/strategySubService.d.ts +113 -111
  162. package/esm/services/strategySubService.js +299 -285
  163. package/esm/services/strategySubService.test.d.ts +1 -1
  164. package/esm/services/strategySubService.test.js +1030 -908
  165. package/esm/services/subDataService.d.ts +282 -261
  166. package/esm/services/subDataService.js +734 -677
  167. package/esm/services/subDataService.test.d.ts +1 -1
  168. package/esm/services/subDataService.test.js +1430 -1254
  169. package/esm/services/triggerService.d.ts +268 -249
  170. package/esm/services/triggerService.js +480 -444
  171. package/esm/services/triggerService.test.d.ts +1 -1
  172. package/esm/services/triggerService.test.js +1114 -1020
  173. package/esm/services/utils.d.ts +30 -30
  174. package/esm/services/utils.js +131 -131
  175. package/esm/services/utils.test.d.ts +1 -1
  176. package/esm/services/utils.test.js +348 -348
  177. package/esm/types/contracts/generated/Erc20.d.ts +53 -53
  178. package/esm/types/contracts/generated/Erc20.js +4 -4
  179. package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
  180. package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.js +4 -4
  181. package/esm/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
  182. package/esm/types/contracts/generated/Legacy_AuthCheck.js +4 -4
  183. package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
  184. package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +4 -4
  185. package/esm/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
  186. package/esm/types/contracts/generated/Legacy_MakerSubscriptions.js +4 -4
  187. package/esm/types/contracts/generated/SubStorage.d.ts +114 -114
  188. package/esm/types/contracts/generated/SubStorage.js +4 -4
  189. package/esm/types/contracts/generated/UniMulticall.d.ts +55 -55
  190. package/esm/types/contracts/generated/UniMulticall.js +4 -4
  191. package/esm/types/contracts/generated/index.d.ts +7 -7
  192. package/esm/types/contracts/generated/index.js +1 -1
  193. package/esm/types/contracts/generated/types.d.ts +54 -54
  194. package/esm/types/contracts/generated/types.js +1 -1
  195. package/esm/types/enums.d.ts +253 -226
  196. package/esm/types/enums.js +276 -249
  197. package/esm/types/index.d.ts +264 -248
  198. package/esm/types/index.js +1 -1
  199. package/package.json +60 -60
  200. package/scripts/generateContractTypes.js +39 -39
  201. package/src/abis/Erc20.json +222 -222
  202. package/src/abis/SubStorage.json +21 -21
  203. package/src/abis/UniMulticall.json +17 -17
  204. package/src/abis/index.ts +28 -28
  205. package/src/abis/legacy_AaveV2Subscriptions.json +7 -7
  206. package/src/abis/legacy_AuthCheck.json +7 -7
  207. package/src/abis/legacy_CompoundV2Subscriptions.json +8 -8
  208. package/src/abis/legacy_MakerSubscriptions.json +8 -8
  209. package/src/automation/private/Automation.ts +44 -44
  210. package/src/automation/private/LegacyAutomation.ts +135 -135
  211. package/src/automation/private/LegacyProtocol.test.ts +23 -23
  212. package/src/automation/private/LegacyProtocol.ts +51 -51
  213. package/src/automation/private/Protocol.test.ts +23 -23
  214. package/src/automation/private/Protocol.ts +51 -51
  215. package/src/automation/private/StrategiesAutomation.test.ts +663 -663
  216. package/src/automation/private/StrategiesAutomation.ts +254 -254
  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 +702 -593
  227. package/src/index.ts +39 -39
  228. package/src/services/contractService.ts +77 -77
  229. package/src/services/ethereumService.test.ts +257 -257
  230. package/src/services/ethereumService.ts +69 -69
  231. package/src/services/strategiesService.test.ts +105 -105
  232. package/src/services/strategiesService.ts +1219 -1158
  233. package/src/services/strategySubService.test.ts +1250 -1122
  234. package/src/services/strategySubService.ts +685 -648
  235. package/src/services/subDataService.test.ts +1546 -1387
  236. package/src/services/subDataService.ts +1024 -934
  237. package/src/services/triggerService.test.ts +1234 -1130
  238. package/src/services/triggerService.ts +659 -602
  239. package/src/services/utils.test.ts +430 -430
  240. package/src/services/utils.ts +162 -162
  241. package/src/types/enums.ts +273 -246
  242. package/src/types/index.ts +333 -312
  243. package/tsconfig.esm.json +8 -8
  244. package/tsconfig.json +22 -22
@@ -1,868 +1,916 @@
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
- function parseFluidT1LeverageManagement(position, parseData) {
714
- const _position = cloneDeep(position);
715
- const { subStruct, subId, subHash } = parseData.subscriptionEventData;
716
- const { isEnabled } = parseData.strategiesSubsData;
717
- const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
718
- const subData = subDataService.fluidLeverageManagementSubData.decode(subStruct.subData);
719
- _position.strategyData.decoded.triggerData = triggerData;
720
- _position.strategyData.decoded.subData = subData;
721
- _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault);
722
- const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
723
- if (isRepay) {
724
- _position.specific = {
725
- triggerRepayRatio: triggerData.ratio,
726
- targetRepayRatio: subData.targetRatio,
727
- repayEnabled: isEnabled,
728
- subId1: Number(subId),
729
- subHashRepay: subHash,
730
- mergeWithId: Strategies.Identifiers.Boost,
731
- };
732
- }
733
- else {
734
- _position.specific = {
735
- triggerBoostRatio: triggerData.ratio,
736
- targetBoostRatio: subData.targetRatio,
737
- boostEnabled: isEnabled,
738
- subId2: Number(subId),
739
- subHashBoost: subHash,
740
- mergeId: Strategies.Identifiers.Boost,
741
- };
742
- }
743
- _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
744
- return _position;
745
- }
746
- const parsingMethodsMapping = {
747
- [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
748
- [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
749
- [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
750
- [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
751
- [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
752
- [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
753
- [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
754
- [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
755
- },
756
- [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
757
- [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
758
- [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
759
- [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
760
- [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
761
- [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
762
- [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
763
- [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
764
- [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
765
- },
766
- [ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
767
- [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
768
- [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
769
- [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
770
- [Strategies.Identifiers.BoostOnPrice]: parseLiquityV2LeverageManagementOnPrice,
771
- [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
772
- [Strategies.Identifiers.Payback]: parseLiquityV2Payback,
773
- },
774
- [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
775
- [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
776
- [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
777
- },
778
- [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
779
- [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
780
- [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
781
- [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
782
- [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
783
- [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
784
- [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
785
- [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3LeverageManagementOnPrice,
786
- [Strategies.Identifiers.RepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
787
- },
788
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
789
- [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
790
- [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
791
- },
792
- [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
793
- [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
794
- [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
795
- [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
796
- [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
797
- },
798
- [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
799
- [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
800
- },
801
- [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
802
- [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
803
- [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
804
- },
805
- [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
806
- [Strategies.Identifiers.Dca]: parseExchangeDca,
807
- [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
808
- },
809
- [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
810
- [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
811
- [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
812
- [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
813
- [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
814
- },
815
- [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
816
- [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
817
- [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
818
- [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
819
- },
820
- [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
821
- [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
822
- [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
823
- [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
824
- [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
825
- [Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
826
- },
827
- [ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
828
- [Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
829
- [Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
830
- },
831
- };
832
- function getParsingMethod(id, strategy) {
833
- return parsingMethodsMapping[id][strategy.strategyId];
834
- }
835
- export function parseStrategiesAutomatedPosition(parseData) {
836
- const { chainId, blockNumber, subscriptionEventData, strategiesSubsData, } = parseData;
837
- const { subStruct, proxy, subId, subHash, } = subscriptionEventData;
838
- const { isEnabled } = strategiesSubsData;
839
- const id = subStruct.strategyOrBundleId;
840
- const strategyOrBundleInfo = (subStruct.isBundle
841
- ? BUNDLES_INFO[chainId][id]
842
- : STRATEGIES_INFO[chainId][id]);
843
- if (!strategyOrBundleInfo)
844
- return null;
845
- const position = {
846
- isEnabled,
847
- chainId,
848
- subHash,
849
- blockNumber,
850
- positionId: 'positionId parsing not implemented.',
851
- subId: Number(subId),
852
- owner: proxy.toLowerCase(),
853
- protocol: Object.assign({}, strategyOrBundleInfo.protocol),
854
- strategy: Object.assign({ isBundle: subStruct.isBundle }, strategyOrBundleInfo),
855
- strategyData: {
856
- encoded: {
857
- triggerData: subStruct.triggerData,
858
- subData: subStruct.subData,
859
- },
860
- decoded: {
861
- triggerData: null,
862
- subData: null,
863
- },
864
- },
865
- specific: {},
866
- };
867
- return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
868
- }
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
+ const isEOA = _position.strategy.strategyId.includes('eoa');
300
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
301
+ return _position;
302
+ }
303
+ function parseCompoundV3LeverageManagement(position, parseData) {
304
+ const _position = cloneDeep(position);
305
+ const { subStruct, subId } = parseData.subscriptionEventData;
306
+ const { isEnabled } = parseData.strategiesSubsData;
307
+ const subDataDecoder = position.chainId !== 1
308
+ ? subDataService.compoundV3L2LeverageManagementSubData
309
+ : subDataService.compoundV3LeverageManagementSubData;
310
+ const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
311
+ const subData = subDataDecoder.decode(subStruct.subData);
312
+ _position.strategyData.decoded.triggerData = triggerData;
313
+ _position.strategyData.decoded.subData = subData;
314
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
315
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
316
+ if (isRepay) {
317
+ _position.specific = {
318
+ triggerRepayRatio: triggerData.ratio,
319
+ targetRepayRatio: subData.targetRatio,
320
+ repayEnabled: true,
321
+ subId1: Number(subId),
322
+ mergeWithId: Strategies.Identifiers.Boost,
323
+ };
324
+ }
325
+ else {
326
+ _position.specific = {
327
+ triggerBoostRatio: triggerData.ratio,
328
+ targetBoostRatio: subData.targetRatio,
329
+ boostEnabled: isEnabled,
330
+ subId2: Number(subId),
331
+ mergeId: Strategies.Identifiers.Boost,
332
+ };
333
+ }
334
+ const isEOA = _position.strategy.strategyId.includes('eoa');
335
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
336
+ return _position;
337
+ }
338
+ function parseCompoundV3LeverageManagementOnPrice(position, parseData) {
339
+ const _position = cloneDeep(position);
340
+ const { subStruct } = parseData.subscriptionEventData;
341
+ const triggerData = triggerService.compoundV3PriceTrigger.decode(subStruct.triggerData);
342
+ const subData = subDataService.compoundV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
343
+ _position.strategyData.decoded.triggerData = triggerData;
344
+ _position.strategyData.decoded.subData = subData;
345
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.market, triggerData.user, Math.random());
346
+ _position.specific = {
347
+ market: subData.market,
348
+ collToken: subData.collToken,
349
+ baseToken: subData.baseToken,
350
+ ratio: subData.targetRatio,
351
+ price: triggerData.price,
352
+ priceState: triggerData.priceState,
353
+ };
354
+ const isEOA = _position.strategy.strategyId.includes('eoa');
355
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagementOnPrice : Strategies.IdOverrides.LeverageManagementOnPrice;
356
+ return _position;
357
+ }
358
+ function parseCompoundV3CloseOnPrice(position, parseData) {
359
+ const _position = cloneDeep(position);
360
+ const { subStruct } = parseData.subscriptionEventData;
361
+ const triggerData = triggerService.compoundV3PriceRangeTrigger.decode(subStruct.triggerData);
362
+ const subData = subDataService.compoundV3CloseSubData.decode(subStruct.subData);
363
+ _position.strategyData.decoded.triggerData = triggerData;
364
+ _position.strategyData.decoded.subData = subData;
365
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.market, Math.random());
366
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
367
+ const isEOA = _position.strategy.strategyId.includes('eoa');
368
+ _position.strategy.strategyId = isEOA ? Strategies.Identifiers.EoaCloseOnPrice : Strategies.Identifiers.CloseOnPrice;
369
+ _position.specific = {
370
+ market: subData.market,
371
+ collToken: subData.collToken,
372
+ baseToken: subData.baseToken,
373
+ stopLossPrice: triggerData.lowerPrice,
374
+ takeProfitPrice: triggerData.upperPrice,
375
+ takeProfitType,
376
+ stopLossType,
377
+ };
378
+ return _position;
379
+ }
380
+ function parseChickenBondsRebond(position, parseData) {
381
+ const _position = cloneDeep(position);
382
+ const { subStruct } = parseData.subscriptionEventData;
383
+ _position.strategyData.decoded.triggerData = triggerService.cBondsRebondTrigger.decode(subStruct.triggerData);
384
+ _position.strategyData.decoded.subData = subDataService.cBondsRebondSubData.decode(subStruct.subData);
385
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.strategyData.decoded.triggerData.bondId);
386
+ return _position;
387
+ }
388
+ function parseLiquityBondProtection(position, parseData) {
389
+ const _position = cloneDeep(position);
390
+ const { subStruct } = parseData.subscriptionEventData;
391
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
392
+ _position.strategyData.decoded.triggerData = triggerData;
393
+ _position.strategyData.decoded.subData = subDataService.liquityPaybackUsingChickenBondSubData.decode(subStruct.subData);
394
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
395
+ _position.specific = {
396
+ triggerRepayRatio: Number(triggerData.ratio),
397
+ targetRepayRatio: Infinity,
398
+ repayEnabled: true,
399
+ };
400
+ return _position;
401
+ }
402
+ function parseExchangeDca(position, parseData, chainId) {
403
+ const _position = cloneDeep(position);
404
+ const { subStruct } = parseData.subscriptionEventData;
405
+ _position.strategyData.decoded.triggerData = triggerService.exchangeTimestampTrigger.decode(subStruct.triggerData);
406
+ _position.strategyData.decoded.subData = subDataService.exchangeDcaSubData.decode(subStruct.subData, chainId);
407
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
408
+ return _position;
409
+ }
410
+ function parseExchangeLimitOrder(position, parseData, chainId) {
411
+ const _position = cloneDeep(position);
412
+ const { subStruct } = parseData.subscriptionEventData;
413
+ _position.strategyData.decoded.subData = subDataService.exchangeLimitOrderSubData.decode(subStruct.subData, chainId);
414
+ const fromTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.fromToken, chainId).decimals;
415
+ const toTokenDecimals = getAssetInfoByAddress(_position.strategyData.decoded.subData.toToken, chainId).decimals;
416
+ _position.strategyData.decoded.triggerData = triggerService.exchangeOffchainPriceTrigger.decode(subStruct.triggerData, fromTokenDecimals, toTokenDecimals);
417
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
418
+ return _position;
419
+ }
420
+ function parseLiquityLeverageManagement(position, parseData) {
421
+ const _position = cloneDeep(position);
422
+ const { subStruct, subId } = parseData.subscriptionEventData;
423
+ const { isEnabled } = parseData.strategiesSubsData;
424
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
425
+ const subData = subDataService.liquityLeverageManagementSubData.decode(subStruct.subData);
426
+ _position.strategyData.decoded.triggerData = triggerData;
427
+ _position.strategyData.decoded.subData = subData;
428
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
429
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
430
+ if (isRepay) {
431
+ _position.specific = {
432
+ triggerRepayRatio: triggerData.ratio,
433
+ targetRepayRatio: subData.targetRatio,
434
+ repayEnabled: true,
435
+ subId1: Number(subId),
436
+ mergeWithId: Strategies.Identifiers.Boost,
437
+ };
438
+ }
439
+ else {
440
+ _position.specific = {
441
+ triggerBoostRatio: triggerData.ratio,
442
+ targetBoostRatio: subData.targetRatio,
443
+ boostEnabled: isEnabled,
444
+ subId2: Number(subId),
445
+ mergeId: Strategies.Identifiers.Boost,
446
+ };
447
+ }
448
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
449
+ return _position;
450
+ }
451
+ function parseLiquityV2LeverageManagement(position, parseData) {
452
+ const _position = cloneDeep(position);
453
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
454
+ const { isEnabled } = parseData.strategiesSubsData;
455
+ const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
456
+ const subData = subDataService.liquityV2LeverageManagementSubData.decode(subStruct.subData);
457
+ _position.strategyData.decoded.triggerData = triggerData;
458
+ _position.strategyData.decoded.subData = subData;
459
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
460
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
461
+ if (isRepay) {
462
+ _position.specific = {
463
+ triggerRepayRatio: triggerData.ratio,
464
+ targetRepayRatio: subData.targetRatio,
465
+ repayEnabled: isEnabled,
466
+ subId1: Number(subId),
467
+ subHashRepay: subHash,
468
+ mergeWithId: Strategies.Identifiers.Boost,
469
+ };
470
+ }
471
+ else {
472
+ _position.specific = {
473
+ triggerBoostRatio: triggerData.ratio,
474
+ targetBoostRatio: subData.targetRatio,
475
+ boostEnabled: isEnabled,
476
+ subId2: Number(subId),
477
+ subHashBoost: subHash,
478
+ mergeId: Strategies.Identifiers.Boost,
479
+ };
480
+ }
481
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
482
+ return _position;
483
+ }
484
+ function parseSparkLeverageManagement(position, parseData) {
485
+ const _position = cloneDeep(position);
486
+ const { subStruct, subId } = parseData.subscriptionEventData;
487
+ const { isEnabled } = parseData.strategiesSubsData;
488
+ const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
489
+ const subData = subDataService.sparkLeverageManagementSubData.decode(subStruct.subData);
490
+ _position.strategyData.decoded.triggerData = triggerData;
491
+ _position.strategyData.decoded.subData = subData;
492
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
493
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
494
+ if (isRepay) {
495
+ _position.specific = {
496
+ triggerRepayRatio: triggerData.ratio,
497
+ targetRepayRatio: subData.targetRatio,
498
+ repayEnabled: true,
499
+ subId1: Number(subId),
500
+ mergeWithId: Strategies.Identifiers.Boost,
501
+ };
502
+ }
503
+ else {
504
+ _position.specific = {
505
+ triggerBoostRatio: triggerData.ratio,
506
+ targetBoostRatio: subData.targetRatio,
507
+ boostEnabled: isEnabled,
508
+ subId2: Number(subId),
509
+ mergeId: Strategies.Identifiers.Boost,
510
+ };
511
+ }
512
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
513
+ return _position;
514
+ }
515
+ function parseSparkCloseOnPrice(position, parseData) {
516
+ const _position = cloneDeep(position);
517
+ const { subStruct } = parseData.subscriptionEventData;
518
+ const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
519
+ const subData = subDataService.sparkQuotePriceSubData.decode(subStruct.subData);
520
+ _position.strategyData.decoded.triggerData = triggerData;
521
+ _position.strategyData.decoded.subData = subData;
522
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, SPARK_MARKET_ADDRESSES[_position.chainId]);
523
+ _position.specific = {
524
+ collAsset: subData.collAsset,
525
+ collAssetId: subData.collAssetId,
526
+ debtAsset: subData.debtAsset,
527
+ debtAssetId: subData.debtAssetId,
528
+ baseToken: triggerData.baseTokenAddress,
529
+ quoteToken: triggerData.quoteTokenAddress,
530
+ price: triggerData.price,
531
+ ratioState: triggerData.ratioState,
532
+ };
533
+ const { ratioState } = getRatioStateInfoForAaveCloseStrategy(_position.specific.ratioState, wethToEthByAddress(_position.specific.collAsset, parseData.chainId), wethToEthByAddress(_position.specific.debtAsset, parseData.chainId), parseData.chainId);
534
+ _position.strategy.strategyId = isRatioStateOver(ratioState) ? Strategies.IdOverrides.TakeProfit : Strategies.IdOverrides.StopLoss;
535
+ return _position;
536
+ }
537
+ function parseLiquitySavingsLiqProtection(position, parseData) {
538
+ const _position = cloneDeep(position);
539
+ const { subStruct } = parseData.subscriptionEventData;
540
+ const triggerData = triggerService.liquityRatioTrigger.decode(subStruct.triggerData);
541
+ const subData = subDataService.liquityRepayFromSavingsSubData.decode(subStruct.subData);
542
+ _position.strategyData.decoded.triggerData = triggerData;
543
+ _position.strategyData.decoded.subData = subData;
544
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
545
+ _position.specific = {
546
+ triggerRepayRatio: triggerData.ratio,
547
+ targetRepayRatio: subData.targetRatio,
548
+ repayEnabled: true,
549
+ boostEnabled: false,
550
+ };
551
+ return _position;
552
+ }
553
+ function parseLiquityDebtInFrontRepay(position, parseData) {
554
+ const _position = cloneDeep(position);
555
+ const { subStruct } = parseData.subscriptionEventData;
556
+ const triggerData = triggerService.liquityDebtInFrontWithLimitTrigger.decode(subStruct.triggerData);
557
+ const subData = subDataService.liquityDebtInFrontRepaySubData.decode(subStruct.subData);
558
+ _position.strategyData.decoded.triggerData = triggerData;
559
+ _position.strategyData.decoded.subData = subData;
560
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner);
561
+ _position.specific = {
562
+ debtInFrontMin: triggerData.debtInFrontMin,
563
+ targetRepayRatioIncrease: subData.targetRatioIncrease,
564
+ };
565
+ return _position;
566
+ }
567
+ function parseCrvUSDLeverageManagement(position, parseData) {
568
+ const _position = cloneDeep(position);
569
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
570
+ const { isEnabled } = parseData.strategiesSubsData;
571
+ const triggerData = triggerService.crvUSDRatioTrigger.decode(subStruct.triggerData);
572
+ const subData = subDataService.crvUSDLeverageManagementSubData.decode(subStruct.subData);
573
+ _position.strategyData.decoded.triggerData = triggerData;
574
+ _position.strategyData.decoded.subData = subData;
575
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller);
576
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
577
+ if (isRepay) {
578
+ _position.specific = {
579
+ triggerRepayRatio: triggerData.ratio,
580
+ targetRepayRatio: subData.targetRatio,
581
+ repayEnabled: isEnabled,
582
+ subId1: Number(subId),
583
+ subHashRepay: subHash,
584
+ mergeWithId: Strategies.Identifiers.Boost,
585
+ };
586
+ }
587
+ else {
588
+ _position.specific = {
589
+ triggerBoostRatio: triggerData.ratio,
590
+ targetBoostRatio: subData.targetRatio,
591
+ boostEnabled: isEnabled,
592
+ subId2: Number(subId),
593
+ subHashBoost: subHash,
594
+ mergeId: Strategies.Identifiers.Boost,
595
+ };
596
+ }
597
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
598
+ return _position;
599
+ }
600
+ function parseCrvUSDPayback(position, parseData) {
601
+ const _position = cloneDeep(position);
602
+ const { subStruct } = parseData.subscriptionEventData;
603
+ const triggerData = triggerService.crvUsdHealthRatioTrigger.decode(subStruct.triggerData);
604
+ const subData = subDataService.crvUSDPaybackSubData.decode(subStruct.subData);
605
+ _position.strategyData.decoded.triggerData = triggerData;
606
+ _position.strategyData.decoded.subData = subData;
607
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.controller, Math.random());
608
+ _position.strategy.strategyId = Strategies.Identifiers.Payback;
609
+ return _position;
610
+ }
611
+ function parseMorphoBlueLeverageManagement(position, parseData) {
612
+ const _position = cloneDeep(position);
613
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
614
+ const { isEnabled } = parseData.strategiesSubsData;
615
+ const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
616
+ const subData = subDataService.morphoBlueLeverageManagementSubData.decode(subStruct.subData);
617
+ _position.strategyData.decoded.triggerData = triggerData;
618
+ _position.strategyData.decoded.subData = subData;
619
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
620
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
621
+ if (isRepay) {
622
+ _position.specific = {
623
+ triggerRepayRatio: triggerData.ratio,
624
+ targetRepayRatio: subData.targetRatio,
625
+ repayEnabled: isEnabled,
626
+ subId1: Number(subId),
627
+ subHashRepay: subHash,
628
+ mergeWithId: Strategies.Identifiers.Boost,
629
+ };
630
+ }
631
+ else {
632
+ _position.specific = {
633
+ triggerBoostRatio: triggerData.ratio,
634
+ targetBoostRatio: subData.targetRatio,
635
+ boostEnabled: isEnabled,
636
+ subId2: Number(subId),
637
+ subHashBoost: subHash,
638
+ mergeId: Strategies.Identifiers.Boost,
639
+ };
640
+ }
641
+ const isEOA = _position.strategy.strategyId.includes('eoa');
642
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
643
+ return _position;
644
+ }
645
+ function parseMorphoBlueLeverageManagementOnPrice(position, parseData) {
646
+ const _position = cloneDeep(position);
647
+ const { subStruct } = parseData.subscriptionEventData;
648
+ const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
649
+ const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
650
+ _position.strategyData.decoded.triggerData = triggerData;
651
+ _position.strategyData.decoded.subData = subData;
652
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
653
+ const marketIdEncodedData = web3.eth.abi.encodeParameters(['address', 'address', 'address', 'address', 'uint256'], [
654
+ subData.loanToken,
655
+ subData.collToken,
656
+ subData.oracle,
657
+ subData.irm,
658
+ subData.lltv,
659
+ ]);
660
+ const marketId = web3.utils.keccak256(marketIdEncodedData);
661
+ _position.specific = {
662
+ subHash: _position.subHash,
663
+ marketId,
664
+ collAsset: subData.collToken,
665
+ debtAsset: subData.loanToken,
666
+ price: triggerData.price,
667
+ ratio: subData.targetRatio,
668
+ };
669
+ return _position;
670
+ }
671
+ function parseAaveV3LeverageManagementOnPrice(position, parseData) {
672
+ const _position = cloneDeep(position);
673
+ const { subStruct } = parseData.subscriptionEventData;
674
+ const triggerData = triggerService.aaveV3QuotePriceTrigger.decode(subStruct.triggerData);
675
+ const subData = subDataService.aaveV3LeverageManagementOnPriceSubData.decode(subStruct.subData);
676
+ _position.strategyData.decoded.triggerData = triggerData;
677
+ _position.strategyData.decoded.subData = subData;
678
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
679
+ _position.specific = {
680
+ collAsset: subData.collAsset,
681
+ debtAsset: subData.debtAsset,
682
+ baseToken: triggerData.baseTokenAddress,
683
+ quoteToken: triggerData.quoteTokenAddress,
684
+ price: triggerData.price,
685
+ ratioState: triggerData.ratioState,
686
+ debtAssetId: subData.debtAssetId,
687
+ collAssetId: subData.collAssetId,
688
+ ratio: subData.targetRatio,
689
+ };
690
+ return _position;
691
+ }
692
+ function parseLiquityV2CloseOnPrice(position, parseData) {
693
+ const _position = cloneDeep(position);
694
+ const { subStruct } = parseData.subscriptionEventData;
695
+ const triggerData = triggerService.closePriceTrigger.decode(subStruct.triggerData);
696
+ const subData = subDataService.liquityV2CloseSubData.decode(subStruct.subData);
697
+ _position.strategyData.decoded.triggerData = triggerData;
698
+ _position.strategyData.decoded.subData = subData;
699
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, subData.troveId, subData.market);
700
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
701
+ // User can have:
702
+ // - Only TakeProfit
703
+ // - Only StopLoss
704
+ // - Both
705
+ _position.strategy.strategyId = Strategies.Identifiers.CloseOnPrice;
706
+ _position.specific = {
707
+ market: subData.market,
708
+ troveId: subData.troveId,
709
+ stopLossPrice: triggerData.lowerPrice,
710
+ takeProfitPrice: triggerData.upperPrice,
711
+ closeToAssetAddr: triggerData.tokenAddr,
712
+ takeProfitType,
713
+ stopLossType,
714
+ };
715
+ return _position;
716
+ }
717
+ function parseLiquityV2LeverageManagementOnPrice(position, parseData) {
718
+ const _position = cloneDeep(position);
719
+ const { subStruct } = parseData.subscriptionEventData;
720
+ const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
721
+ const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
722
+ _position.strategyData.decoded.triggerData = triggerData;
723
+ _position.strategyData.decoded.subData = subData;
724
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
725
+ _position.specific = {
726
+ subHash: _position.subHash,
727
+ market: subData.market,
728
+ troveId: subData.troveId,
729
+ collAsset: subData.collToken,
730
+ debtAsset: subData.boldToken,
731
+ price: triggerData.price,
732
+ ratio: subData.targetRatio,
733
+ ratioState: triggerData.ratioState,
734
+ };
735
+ return _position;
736
+ }
737
+ function parseLiquityV2Payback(position, parseData) {
738
+ const _position = cloneDeep(position);
739
+ const { subStruct } = parseData.subscriptionEventData;
740
+ const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
741
+ const subData = subDataService.liquityV2PaybackSubData.decode(subStruct.subData);
742
+ _position.strategyData.decoded.triggerData = triggerData;
743
+ _position.strategyData.decoded.subData = subData;
744
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
745
+ _position.strategy.strategyId = Strategies.Identifiers.Payback;
746
+ _position.specific = {
747
+ subHash: _position.subHash,
748
+ market: subData.market,
749
+ troveId: subData.troveId,
750
+ targetRatio: subData.targetRatio,
751
+ triggerRatio: triggerData.ratio,
752
+ };
753
+ return _position;
754
+ }
755
+ function parseFluidT1LeverageManagement(position, parseData) {
756
+ const _position = cloneDeep(position);
757
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
758
+ const { isEnabled } = parseData.strategiesSubsData;
759
+ const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
760
+ const subData = subDataService.fluidLeverageManagementSubData.decode(subStruct.subData);
761
+ _position.strategyData.decoded.triggerData = triggerData;
762
+ _position.strategyData.decoded.subData = subData;
763
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault);
764
+ const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
765
+ if (isRepay) {
766
+ _position.specific = {
767
+ triggerRepayRatio: triggerData.ratio,
768
+ targetRepayRatio: subData.targetRatio,
769
+ repayEnabled: isEnabled,
770
+ subId1: Number(subId),
771
+ subHashRepay: subHash,
772
+ mergeWithId: Strategies.Identifiers.Boost,
773
+ };
774
+ }
775
+ else {
776
+ _position.specific = {
777
+ triggerBoostRatio: triggerData.ratio,
778
+ targetBoostRatio: subData.targetRatio,
779
+ boostEnabled: isEnabled,
780
+ subId2: Number(subId),
781
+ subHashBoost: subHash,
782
+ mergeId: Strategies.Identifiers.Boost,
783
+ };
784
+ }
785
+ _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
786
+ return _position;
787
+ }
788
+ const parsingMethodsMapping = {
789
+ [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
790
+ [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
791
+ [Strategies.Identifiers.CloseOnPriceToDebt]: parseMakerCloseOnPrice,
792
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseMakerCloseOnPrice,
793
+ [Strategies.Identifiers.TrailingStopToColl]: parseMakerTrailingStop,
794
+ [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
795
+ [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
796
+ [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
797
+ },
798
+ [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
799
+ [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
800
+ [Strategies.Identifiers.TrailingStopToColl]: parseLiquityTrailingStop,
801
+ [Strategies.Identifiers.BondProtection]: parseLiquityBondProtection,
802
+ [Strategies.Identifiers.Repay]: parseLiquityLeverageManagement,
803
+ [Strategies.Identifiers.Boost]: parseLiquityLeverageManagement,
804
+ [Strategies.Identifiers.SavingsDsrPayback]: parseLiquitySavingsLiqProtection,
805
+ [Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
806
+ [Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
807
+ },
808
+ [ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
809
+ [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
810
+ [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
811
+ [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
812
+ [Strategies.Identifiers.BoostOnPrice]: parseLiquityV2LeverageManagementOnPrice,
813
+ [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
814
+ [Strategies.Identifiers.Payback]: parseLiquityV2Payback,
815
+ },
816
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
817
+ [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
818
+ [Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
819
+ },
820
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV3]: {
821
+ [Strategies.Identifiers.Repay]: parseAaveV3LeverageManagement,
822
+ [Strategies.Identifiers.Boost]: parseAaveV3LeverageManagement,
823
+ [Strategies.Identifiers.CloseToDebt]: parseAaveV3CloseOnPrice,
824
+ [Strategies.Identifiers.CloseToDebtWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
825
+ [Strategies.Identifiers.CloseToCollateral]: parseAaveV3CloseOnPrice,
826
+ [Strategies.Identifiers.CloseToCollateralWithGasPrice]: parseAaveV3CloseOnPriceWithMaximumGasPrice,
827
+ [Strategies.Identifiers.OpenOrderFromCollateral]: parseAaveV3LeverageManagementOnPrice,
828
+ [Strategies.Identifiers.RepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
829
+ },
830
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
831
+ [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
832
+ [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
833
+ },
834
+ [ProtocolIdentifiers.StrategiesAutomation.CompoundV3]: {
835
+ [Strategies.Identifiers.Repay]: parseCompoundV3LeverageManagement,
836
+ [Strategies.Identifiers.Boost]: parseCompoundV3LeverageManagement,
837
+ [Strategies.Identifiers.EoaRepay]: parseCompoundV3LeverageManagement,
838
+ [Strategies.Identifiers.EoaBoost]: parseCompoundV3LeverageManagement,
839
+ [Strategies.Identifiers.RepayOnPrice]: parseCompoundV3LeverageManagementOnPrice,
840
+ [Strategies.Identifiers.BoostOnPrice]: parseCompoundV3LeverageManagementOnPrice,
841
+ [Strategies.Identifiers.EoaRepayOnPrice]: parseCompoundV3LeverageManagementOnPrice,
842
+ [Strategies.Identifiers.EoaBoostOnPrice]: parseCompoundV3LeverageManagementOnPrice,
843
+ [Strategies.Identifiers.CloseOnPrice]: parseCompoundV3CloseOnPrice,
844
+ [Strategies.Identifiers.EoaCloseOnPrice]: parseCompoundV3CloseOnPrice,
845
+ },
846
+ [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
847
+ [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
848
+ },
849
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoAaveV2]: {
850
+ [Strategies.Identifiers.Repay]: parseMorphoAaveV2LeverageManagement,
851
+ [Strategies.Identifiers.Boost]: parseMorphoAaveV2LeverageManagement,
852
+ },
853
+ [ProtocolIdentifiers.StrategiesAutomation.Exchange]: {
854
+ [Strategies.Identifiers.Dca]: parseExchangeDca,
855
+ [Strategies.Identifiers.LimitOrder]: parseExchangeLimitOrder,
856
+ },
857
+ [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
858
+ [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
859
+ [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
860
+ [Strategies.Identifiers.CloseToDebt]: parseSparkCloseOnPrice,
861
+ [Strategies.Identifiers.CloseToCollateral]: parseSparkCloseOnPrice,
862
+ },
863
+ [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
864
+ [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
865
+ [Strategies.Identifiers.Boost]: parseCrvUSDLeverageManagement,
866
+ [Strategies.Identifiers.Payback]: parseCrvUSDPayback,
867
+ },
868
+ [ProtocolIdentifiers.StrategiesAutomation.MorphoBlue]: {
869
+ [Strategies.Identifiers.Repay]: parseMorphoBlueLeverageManagement,
870
+ [Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
871
+ [Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
872
+ [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
873
+ [Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
874
+ },
875
+ [ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
876
+ [Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
877
+ [Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
878
+ },
879
+ };
880
+ function getParsingMethod(id, strategy) {
881
+ return parsingMethodsMapping[id][strategy.strategyId];
882
+ }
883
+ export function parseStrategiesAutomatedPosition(parseData) {
884
+ const { chainId, blockNumber, subscriptionEventData, strategiesSubsData, } = parseData;
885
+ const { subStruct, proxy, subId, subHash, } = subscriptionEventData;
886
+ const { isEnabled } = strategiesSubsData;
887
+ const id = subStruct.strategyOrBundleId;
888
+ const strategyOrBundleInfo = (subStruct.isBundle
889
+ ? BUNDLES_INFO[chainId][id]
890
+ : STRATEGIES_INFO[chainId][id]);
891
+ if (!strategyOrBundleInfo)
892
+ return null;
893
+ const position = {
894
+ isEnabled,
895
+ chainId,
896
+ subHash,
897
+ blockNumber,
898
+ positionId: 'positionId parsing not implemented.',
899
+ subId: Number(subId),
900
+ owner: proxy.toLowerCase(),
901
+ protocol: Object.assign({}, strategyOrBundleInfo.protocol),
902
+ strategy: Object.assign({ isBundle: subStruct.isBundle }, strategyOrBundleInfo),
903
+ strategyData: {
904
+ encoded: {
905
+ triggerData: subStruct.triggerData,
906
+ subData: subStruct.subData,
907
+ },
908
+ decoded: {
909
+ triggerData: null,
910
+ subData: null,
911
+ },
912
+ },
913
+ specific: {},
914
+ };
915
+ return getParsingMethod(position.protocol.id, position.strategy)(position, parseData, chainId);
916
+ }