@defisaver/automation-sdk 3.3.14-strategies-refactor-dev → 3.3.15-liq-prot-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -573,6 +573,46 @@ export const MAINNET_BUNDLES_INFO: MainnetBundleInfo = {
573
573
  strategyId: Strategies.Identifiers.EoaCloseOnPrice,
574
574
  protocol: PROTOCOLS.AaveV4,
575
575
  },
576
+ [Bundles.MainnetIds.MAKER_LIQUIDATION_PROTECTION]: {
577
+ strategyOrBundleId: Bundles.MainnetIds.MAKER_LIQUIDATION_PROTECTION,
578
+ strategyId: Strategies.Identifiers.LiquidationProtection,
579
+ protocol: PROTOCOLS.MakerDAO,
580
+ },
581
+ [Bundles.MainnetIds.AAVE_V3_LIQUIDATION_PROTECTION]: {
582
+ strategyOrBundleId: Bundles.MainnetIds.AAVE_V3_LIQUIDATION_PROTECTION,
583
+ strategyId: Strategies.Identifiers.LiquidationProtection,
584
+ protocol: PROTOCOLS.AaveV3,
585
+ },
586
+ [Bundles.MainnetIds.AAVE_V4_LIQUIDATION_PROTECTION]: {
587
+ strategyOrBundleId: Bundles.MainnetIds.AAVE_V4_LIQUIDATION_PROTECTION,
588
+ strategyId: Strategies.Identifiers.LiquidationProtection,
589
+ protocol: PROTOCOLS.AaveV4,
590
+ },
591
+ [Bundles.MainnetIds.SPARK_LIQUIDATION_PROTECTION]: {
592
+ strategyOrBundleId: Bundles.MainnetIds.SPARK_LIQUIDATION_PROTECTION,
593
+ strategyId: Strategies.Identifiers.LiquidationProtection,
594
+ protocol: PROTOCOLS.Spark,
595
+ },
596
+ [Bundles.MainnetIds.COMP_V3_SW_LIQUIDATION_PROTECTION]: {
597
+ strategyOrBundleId: Bundles.MainnetIds.COMP_V3_SW_LIQUIDATION_PROTECTION,
598
+ strategyId: Strategies.Identifiers.LiquidationProtection,
599
+ protocol: PROTOCOLS.CompoundV3,
600
+ },
601
+ [Bundles.MainnetIds.COMP_V3_EOA_LIQUIDATION_PROTECTION]: {
602
+ strategyOrBundleId: Bundles.MainnetIds.COMP_V3_EOA_LIQUIDATION_PROTECTION,
603
+ strategyId: Strategies.Identifiers.LiquidationProtection,
604
+ protocol: PROTOCOLS.CompoundV3,
605
+ },
606
+ [Bundles.MainnetIds.MORPHO_BLUE_LIQUIDATION_PROTECTION]: {
607
+ strategyOrBundleId: Bundles.MainnetIds.MORPHO_BLUE_LIQUIDATION_PROTECTION,
608
+ strategyId: Strategies.Identifiers.LiquidationProtection,
609
+ protocol: PROTOCOLS.MorphoBlue,
610
+ },
611
+ [Bundles.MainnetIds.FLUID_T1_LIQUIDATION_PROTECTION]: {
612
+ strategyOrBundleId: Bundles.MainnetIds.FLUID_T1_LIQUIDATION_PROTECTION,
613
+ strategyId: Strategies.Identifiers.LiquidationProtection,
614
+ protocol: PROTOCOLS.FluidT1,
615
+ },
576
616
  };
577
617
 
578
618
  export const OPTIMISM_BUNDLES_INFO: OptimismBundleInfo = {
@@ -631,6 +671,11 @@ export const OPTIMISM_BUNDLES_INFO: OptimismBundleInfo = {
631
671
  strategyId: Strategies.Identifiers.EoaCloseOnPrice,
632
672
  protocol: PROTOCOLS.AaveV3,
633
673
  },
674
+ [Bundles.OptimismIds.AAVE_V3_LIQUIDATION_PROTECTION]: {
675
+ strategyOrBundleId: Bundles.OptimismIds.AAVE_V3_LIQUIDATION_PROTECTION,
676
+ strategyId: Strategies.Identifiers.LiquidationProtection,
677
+ protocol: PROTOCOLS.AaveV3,
678
+ },
634
679
 
635
680
  };
636
681
 
@@ -770,6 +815,32 @@ export const BASE_BUNDLES_INFO: BaseBundleInfo = {
770
815
  strategyId: Strategies.Identifiers.CloseOnPrice,
771
816
  protocol: PROTOCOLS.MorphoBlue,
772
817
  },
818
+ [Bundles.BaseIds.AAVE_V3_LIQUIDATION_PROTECTION]: {
819
+ strategyOrBundleId: Bundles.BaseIds.AAVE_V3_LIQUIDATION_PROTECTION,
820
+ strategyId: Strategies.Identifiers.LiquidationProtection,
821
+ protocol: PROTOCOLS.AaveV3,
822
+ },
823
+ [Bundles.BaseIds.COMP_V3_SW_LIQUIDATION_PROTECTION]: {
824
+ strategyOrBundleId: Bundles.BaseIds.COMP_V3_SW_LIQUIDATION_PROTECTION,
825
+ strategyId: Strategies.Identifiers.LiquidationProtection,
826
+ protocol: PROTOCOLS.CompoundV3,
827
+ },
828
+ [Bundles.BaseIds.COMP_V3_EOA_LIQUIDATION_PROTECTION]: {
829
+ strategyOrBundleId: Bundles.BaseIds.COMP_V3_EOA_LIQUIDATION_PROTECTION,
830
+ strategyId: Strategies.Identifiers.LiquidationProtection,
831
+ protocol: PROTOCOLS.CompoundV3,
832
+ },
833
+ [Bundles.BaseIds.MORPHO_BLUE_LIQUIDATION_PROTECTION]: {
834
+ strategyOrBundleId: Bundles.BaseIds.MORPHO_BLUE_LIQUIDATION_PROTECTION,
835
+ strategyId: Strategies.Identifiers.LiquidationProtection,
836
+ protocol: PROTOCOLS.MorphoBlue,
837
+ },
838
+ [Bundles.BaseIds.FLUID_T1_LIQUIDATION_PROTECTION]: {
839
+ strategyOrBundleId: Bundles.BaseIds.FLUID_T1_LIQUIDATION_PROTECTION,
840
+ strategyId: Strategies.Identifiers.LiquidationProtection,
841
+ protocol: PROTOCOLS.FluidT1,
842
+ },
843
+
773
844
  };
774
845
 
775
846
  export const ARBITRUM_BUNDLES_INFO: ArbitrumBundleInfo = {
@@ -918,6 +989,31 @@ export const ARBITRUM_BUNDLES_INFO: ArbitrumBundleInfo = {
918
989
  strategyId: Strategies.Identifiers.CloseOnPrice,
919
990
  protocol: PROTOCOLS.MorphoBlue,
920
991
  },
992
+ [Bundles.ArbitrumIds.AAVE_V3_LIQUIDATION_PROTECTION]: {
993
+ strategyOrBundleId: Bundles.ArbitrumIds.AAVE_V3_LIQUIDATION_PROTECTION,
994
+ strategyId: Strategies.Identifiers.LiquidationProtection,
995
+ protocol: PROTOCOLS.AaveV3,
996
+ },
997
+ [Bundles.ArbitrumIds.COMP_V3_SW_LIQUIDATION_PROTECTION]: {
998
+ strategyOrBundleId: Bundles.ArbitrumIds.COMP_V3_SW_LIQUIDATION_PROTECTION,
999
+ strategyId: Strategies.Identifiers.LiquidationProtection,
1000
+ protocol: PROTOCOLS.CompoundV3,
1001
+ },
1002
+ [Bundles.ArbitrumIds.COMP_V3_EOA_LIQUIDATION_PROTECTION]: {
1003
+ strategyOrBundleId: Bundles.ArbitrumIds.COMP_V3_EOA_LIQUIDATION_PROTECTION,
1004
+ strategyId: Strategies.Identifiers.LiquidationProtection,
1005
+ protocol: PROTOCOLS.CompoundV3,
1006
+ },
1007
+ [Bundles.ArbitrumIds.MORPHO_BLUE_LIQUIDATION_PROTECTION]: {
1008
+ strategyOrBundleId: Bundles.ArbitrumIds.MORPHO_BLUE_LIQUIDATION_PROTECTION,
1009
+ strategyId: Strategies.Identifiers.LiquidationProtection,
1010
+ protocol: PROTOCOLS.MorphoBlue,
1011
+ },
1012
+ [Bundles.ArbitrumIds.FLUID_T1_LIQUIDATION_PROTECTION]: {
1013
+ strategyOrBundleId: Bundles.ArbitrumIds.FLUID_T1_LIQUIDATION_PROTECTION,
1014
+ strategyId: Strategies.Identifiers.LiquidationProtection,
1015
+ protocol: PROTOCOLS.FluidT1,
1016
+ },
921
1017
  };
922
1018
 
923
1019
  export const BUNDLES_INFO: BundlesInfo = {
package/src/index.ts CHANGED
@@ -24,18 +24,36 @@ import * as enums from './types/enums';
24
24
  import type * as types from './types';
25
25
 
26
26
  import {
27
- getRatioStateInfoForAaveCloseStrategy, compareSubHashes, encodeSubId, getCloseStrategyType,
27
+ getRatioStateInfoForAaveCloseStrategy,
28
+ compareSubHashes,
29
+ encodeSubId,
30
+ getCloseStrategyType,
31
+ getCompoundV3LeverageManagementBundleId,
28
32
  } from './services/utils';
29
33
 
30
34
  const utils = {
31
- getRatioStateInfoForAaveCloseStrategy, compareSubHashes, encodeSubId, getCloseStrategyType,
35
+ compareSubHashes,
36
+ encodeSubId,
37
+ getCloseStrategyType,
38
+ getCompoundV3LeverageManagementBundleId,
39
+ getRatioStateInfoForAaveCloseStrategy,
32
40
  };
33
41
 
34
42
  export {
35
- LegacyMakerAutomation, LegacyAaveAutomation, LegacyCompoundAutomation,
36
- EthereumStrategies, OptimismStrategies, ArbitrumStrategies, BaseStrategies,
37
- triggerService, subDataService, strategySubService, utils,
38
- enums, constants, strategiesService,
43
+ ArbitrumStrategies,
44
+ BaseStrategies,
45
+ EthereumStrategies,
46
+ LegacyAaveAutomation,
47
+ LegacyCompoundAutomation,
48
+ LegacyMakerAutomation,
49
+ OptimismStrategies,
50
+ constants,
51
+ enums,
52
+ strategiesService,
53
+ strategySubService,
54
+ subDataService,
55
+ triggerService,
56
+ utils,
39
57
  };
40
58
 
41
59
  export type { types };
@@ -140,6 +140,34 @@ function parseMakerLeverageManagement(position: Position.Automated, parseData: P
140
140
  return _position;
141
141
  }
142
142
 
143
+ function parseMakerLiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
144
+ const _position = cloneDeep(position);
145
+
146
+ const { subStruct, subId } = parseData.subscriptionEventData;
147
+ const { isEnabled } = parseData.strategiesSubsData;
148
+
149
+ const triggerData = triggerService.makerRatioTrigger.decode(subStruct.triggerData);
150
+ const subData = subDataService.makerLiquidationProtectionSubData.decode(subStruct.subData);
151
+
152
+ _position.strategyData.decoded.triggerData = triggerData;
153
+ _position.strategyData.decoded.subData = subData;
154
+
155
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, subData.vaultId);
156
+
157
+
158
+ _position.specific = {
159
+ triggerRepayRatio: triggerData.ratio,
160
+ targetRepayRatio: subData.targetRatio,
161
+ repayEnabled: isEnabled, // TODO -> Not sure if should hardcode to TRUE
162
+ subId1: Number(subId),
163
+ };
164
+
165
+ // TODO -> Is this ok?
166
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
167
+
168
+ return _position;
169
+ }
170
+
143
171
  function parseLiquityCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
144
172
  const _position = cloneDeep(position);
145
173
 
@@ -280,6 +308,36 @@ function parseAaveV3LeverageManagement(position: Position.Automated, parseData:
280
308
  return _position;
281
309
  }
282
310
 
311
+ function parseAaveV3LiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
312
+ const _position = cloneDeep(position);
313
+
314
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
315
+ const { isEnabled } = parseData.strategiesSubsData;
316
+
317
+ const triggerData = triggerService.aaveV3RatioTrigger.decode(subStruct.triggerData);
318
+ // const isEOA = _position.strategy.strategyId.includes('eoa');
319
+
320
+ const subData = subDataService.aaveV3LiquidationProtectionSubData.decode(subStruct.subData);
321
+
322
+ _position.strategyData.decoded.triggerData = triggerData;
323
+ _position.strategyData.decoded.subData = subData;
324
+
325
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
326
+
327
+ _position.specific = {
328
+ triggerRepayRatio: triggerData.ratio,
329
+ targetRepayRatio: subData.targetRatio,
330
+ repayEnabled: isEnabled,
331
+ subId1: Number(subId),
332
+ subHashRepay: subHash,
333
+ };
334
+
335
+ // TODO -> Should split for EOA or not? Prob not as they will use same encoding and decoding
336
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
337
+
338
+ return _position;
339
+ }
340
+
283
341
  function parseAaveV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
284
342
  const _position = cloneDeep(position);
285
343
  const { subStruct } = parseData.subscriptionEventData;
@@ -437,6 +495,32 @@ function parseAaveV4LeverageManagement(position: Position.Automated, parseData:
437
495
  return _position;
438
496
  }
439
497
 
498
+ function parseAaveV4LiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
499
+ const _position = cloneDeep(position);
500
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
501
+ const { isEnabled } = parseData.strategiesSubsData;
502
+ const triggerData = triggerService.aaveV4RatioTrigger.decode(subStruct.triggerData);
503
+ const subData = subDataService.aaveV4LiquidationProtectionSubData.decode(subStruct.subData);
504
+ // const isEOA = _position.strategy.strategyId.includes('eoa');
505
+ // const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
506
+
507
+ _position.strategyData.decoded.triggerData = triggerData;
508
+ _position.strategyData.decoded.subData = subData;
509
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.spoke);
510
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
511
+
512
+ _position.specific = {
513
+ triggerRepayRatio: triggerData.ratio,
514
+ targetRepayRatio: subData.targetRatio,
515
+ repayEnabled: isEnabled,
516
+ subId1: Number(subId),
517
+ subHashRepay: subHash,
518
+ };
519
+
520
+ return _position;
521
+ }
522
+
523
+
440
524
  function parseAaveV4LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
441
525
  const _position = cloneDeep(position);
442
526
  const { subStruct } = parseData.subscriptionEventData;
@@ -670,6 +754,41 @@ function parseCompoundV3LeverageManagement(position: Position.Automated, parseDa
670
754
  return _position;
671
755
  }
672
756
 
757
+
758
+ function parseCompoundV3LiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
759
+ const _position = cloneDeep(position);
760
+
761
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
762
+ const { isEnabled } = parseData.strategiesSubsData;
763
+
764
+ const subDataDecoder = subDataService.compoundV3LiquidationProtectionSubData;
765
+
766
+ const triggerData = triggerService.compoundV3RatioTrigger.decode(subStruct.triggerData);
767
+ const subData = subDataDecoder.decode(subStruct.subData);
768
+
769
+ _position.strategyData.decoded.triggerData = triggerData;
770
+ _position.strategyData.decoded.subData = subData;
771
+
772
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.market);
773
+
774
+ // const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId as Strategies.Identifiers);
775
+
776
+ const isEOA = _position.strategy.strategyId.includes('eoa');
777
+
778
+ _position.specific = {
779
+ triggerRepayRatio: triggerData.ratio,
780
+ targetRepayRatio: subData.targetRatio,
781
+ repayEnabled: isEnabled, // TODO -> Should be hardcoded to true?
782
+ subId1: Number(subId),
783
+ subHashRepay: subHash,
784
+ };
785
+
786
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLiquidationProtection : Strategies.IdOverrides.LiquidationProtection;
787
+
788
+ return _position;
789
+ }
790
+
791
+
673
792
  function parseCompoundV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
674
793
  const _position = cloneDeep(position);
675
794
 
@@ -909,6 +1028,34 @@ function parseSparkLeverageManagement(position: Position.Automated, parseData: P
909
1028
  return _position;
910
1029
  }
911
1030
 
1031
+ function parseSparkLiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
1032
+ const _position = cloneDeep(position);
1033
+
1034
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
1035
+ const { isEnabled } = parseData.strategiesSubsData;
1036
+
1037
+ const triggerData = triggerService.sparkRatioTrigger.decode(subStruct.triggerData);
1038
+ const subData = subDataService.sparkLiquidationProtectionSubData.decode(subStruct.subData);
1039
+
1040
+ _position.strategyData.decoded.triggerData = triggerData;
1041
+ _position.strategyData.decoded.subData = subData;
1042
+
1043
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.market);
1044
+
1045
+ _position.specific = {
1046
+ triggerRepayRatio: triggerData.ratio,
1047
+ targetRepayRatio: subData.targetRatio,
1048
+ repayEnabled: isEnabled,
1049
+ subId1: Number(subId),
1050
+ subHashRepay: subHash,
1051
+ };
1052
+
1053
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
1054
+
1055
+ return _position;
1056
+ }
1057
+
1058
+
912
1059
  function parseSparkLeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
913
1060
  const _position = cloneDeep(position);
914
1061
  const { subStruct } = parseData.subscriptionEventData;
@@ -1109,6 +1256,35 @@ function parseMorphoBlueLeverageManagement(position: Position.Automated, parseDa
1109
1256
  return _position;
1110
1257
  }
1111
1258
 
1259
+
1260
+ function parseMorphoBlueLiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
1261
+ const _position = cloneDeep(position);
1262
+
1263
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
1264
+ const { isEnabled } = parseData.strategiesSubsData;
1265
+ const triggerData = triggerService.morphoBlueRatioTrigger.decode(subStruct.triggerData);
1266
+ const subData = subDataService.morphoBlueLiquidationProtectionSubData.decode(subStruct.subData);
1267
+
1268
+ _position.strategyData.decoded.triggerData = triggerData;
1269
+ _position.strategyData.decoded.subData = subData;
1270
+
1271
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, triggerData.owner.toLowerCase(), triggerData.marketId);
1272
+
1273
+ _position.specific = {
1274
+ triggerRepayRatio: triggerData.ratio,
1275
+ targetRepayRatio: subData.targetRatio,
1276
+ repayEnabled: isEnabled,
1277
+ subId1: Number(subId),
1278
+ subHashRepay: subHash,
1279
+ };
1280
+
1281
+ const isEOA = _position.strategy.strategyId.includes('eoa');
1282
+ // TODO -> Should be separate for EOA ?
1283
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
1284
+
1285
+ return _position;
1286
+ }
1287
+
1112
1288
  function parseMorphoBlueLeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
1113
1289
  const _position = cloneDeep(position);
1114
1290
 
@@ -1315,6 +1491,37 @@ function parseFluidT1LeverageManagement(position: Position.Automated, parseData:
1315
1491
  return _position;
1316
1492
  }
1317
1493
 
1494
+
1495
+ function parseFluidT1LiquidationProtection(position: Position.Automated, parseData: ParseData): Position.Automated {
1496
+ const _position = cloneDeep(position);
1497
+
1498
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
1499
+ const { isEnabled } = parseData.strategiesSubsData;
1500
+
1501
+ const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
1502
+ const subData = subDataService.fluidLiquidationProtectionSubData.decode(subStruct.subData);
1503
+
1504
+ _position.strategyData.decoded.triggerData = triggerData;
1505
+ _position.strategyData.decoded.subData = subData;
1506
+
1507
+ _position.positionId = getPositionId(
1508
+ _position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault,
1509
+ );
1510
+
1511
+ _position.specific = {
1512
+ triggerRepayRatio: triggerData.ratio,
1513
+ targetRepayRatio: subData.targetRatio,
1514
+ repayEnabled: isEnabled,
1515
+ subId1: Number(subId),
1516
+ subHashRepay: subHash,
1517
+ };
1518
+
1519
+ _position.strategy.strategyId = Strategies.IdOverrides.LiquidationProtection;
1520
+
1521
+ return _position;
1522
+ }
1523
+
1524
+
1318
1525
  const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1319
1526
  [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
1320
1527
  [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
@@ -1324,6 +1531,7 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1324
1531
  [Strategies.Identifiers.TrailingStopToDebt]: parseMakerTrailingStop,
1325
1532
  [Strategies.Identifiers.Repay]: parseMakerLeverageManagement,
1326
1533
  [Strategies.Identifiers.Boost]: parseMakerLeverageManagement,
1534
+ [Strategies.Identifiers.LiquidationProtection]: parseMakerLiquidationProtection,
1327
1535
  },
1328
1536
  [ProtocolIdentifiers.StrategiesAutomation.Liquity]: {
1329
1537
  [Strategies.Identifiers.CloseOnPriceToColl]: parseLiquityCloseOnPrice,
@@ -1362,6 +1570,7 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1362
1570
  [Strategies.Identifiers.EoaBoostOnPrice]: parseAaveV3LeverageManagementOnPrice,
1363
1571
  [Strategies.Identifiers.EoaCloseOnPrice]: parseAaveV3CloseOnPrice,
1364
1572
  [Strategies.Identifiers.CollateralSwitch]: parseAaveV3CollateralSwitch,
1573
+ [Strategies.Identifiers.LiquidationProtection]: parseAaveV3LiquidationProtection,
1365
1574
  },
1366
1575
  [ProtocolIdentifiers.StrategiesAutomation.AaveV4]: {
1367
1576
  [Strategies.Identifiers.Repay]: parseAaveV4LeverageManagement,
@@ -1376,6 +1585,7 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1376
1585
  [Strategies.Identifiers.EoaCloseOnPrice]: parseAaveV4CloseOnPrice,
1377
1586
  [Strategies.Identifiers.CollateralSwitch]: parseAaveV4CollateralSwitch,
1378
1587
  [Strategies.Identifiers.EoaCollateralSwitch]: parseAaveV4CollateralSwitch,
1588
+ [Strategies.Identifiers.LiquidationProtection]: parseAaveV4LiquidationProtection,
1379
1589
  },
1380
1590
  [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
1381
1591
  [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
@@ -1392,6 +1602,9 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1392
1602
  [Strategies.Identifiers.EoaBoostOnPrice]: parseCompoundV3LeverageManagementOnPrice,
1393
1603
  [Strategies.Identifiers.CloseOnPrice]: parseCompoundV3CloseOnPrice,
1394
1604
  [Strategies.Identifiers.EoaCloseOnPrice]: parseCompoundV3CloseOnPrice,
1605
+ // TODO -> here should prob separate EOA from SW
1606
+ [Strategies.Identifiers.LiquidationProtection]: parseCompoundV3LiquidationProtection,
1607
+ [Strategies.Identifiers.EoaLiquidationProtection]: parseCompoundV3LiquidationProtection,
1395
1608
  },
1396
1609
  [ProtocolIdentifiers.StrategiesAutomation.ChickenBonds]: {
1397
1610
  [Strategies.Identifiers.Rebond]: parseChickenBondsRebond,
@@ -1411,6 +1624,7 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1411
1624
  [Strategies.Identifiers.BoostOnPrice]: parseSparkLeverageManagementOnPrice,
1412
1625
  [Strategies.Identifiers.CloseOnPrice]: parseSparkCloseOnPrice,
1413
1626
  [Strategies.Identifiers.CollateralSwitch]: parseSparkCollateralSwitch,
1627
+ [Strategies.Identifiers.LiquidationProtection]: parseSparkLiquidationProtection,
1414
1628
  },
1415
1629
  [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
1416
1630
  [Strategies.Identifiers.Repay]: parseCrvUSDLeverageManagement,
@@ -1424,10 +1638,12 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
1424
1638
  [Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
1425
1639
  [Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
1426
1640
  [Strategies.Identifiers.CloseOnPrice]: parseMorphoBlueCloseOnPrice,
1641
+ [Strategies.Identifiers.LiquidationProtection]: parseMorphoBlueLiquidationProtection,
1427
1642
  },
1428
1643
  [ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
1429
1644
  [Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
1430
1645
  [Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
1646
+ [Strategies.Identifiers.LiquidationProtection]: parseFluidT1LiquidationProtection,
1431
1647
  },
1432
1648
  };
1433
1649
 
@@ -1,22 +1,26 @@
1
- import Dec from 'decimal.js';
2
1
  import { getAssetInfo } from '@defisaver/tokens';
2
+ import Dec from 'decimal.js';
3
3
 
4
- import type { OrderType } from '../types/enums';
4
+ import { STRATEGY_IDS } from '../constants';
5
5
  import {
6
- CloseToAssetType,
7
6
  Bundles,
8
7
  ChainId,
8
+ CloseToAssetType,
9
9
  RatioState,
10
10
  Strategies,
11
11
  } from '../types/enums';
12
12
  import type { EthereumAddress, StrategyOrBundleIds } from '../types';
13
13
 
14
- import { STRATEGY_IDS } from '../constants';
14
+ import type { OrderType } from '../types/enums';
15
15
 
16
16
  import * as subDataService from './subDataService';
17
17
  import * as triggerService from './triggerService';
18
18
  import {
19
- compareAddresses, getCloseStrategyType, requireAddress, requireAddresses,
19
+ compareAddresses,
20
+ getBundleIdsByNetwork,
21
+ getCloseStrategyType,
22
+ requireAddress,
23
+ requireAddresses,
20
24
  } from './utils';
21
25
 
22
26
  export const makerEncode = {
@@ -102,6 +106,26 @@ export const makerEncode = {
102
106
  subData,
103
107
  ];
104
108
  },
109
+
110
+ liquidationProtection(
111
+ vaultId: number,
112
+ triggerRatio: number,
113
+ targetRatio: number,
114
+ ratioState: RatioState,
115
+ daiAddr?: EthereumAddress,
116
+ ) {
117
+ const bundleId = Bundles.MainnetIds.MAKER_LIQUIDATION_PROTECTION;
118
+
119
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
120
+ const subData = subDataService.makerLiquidationProtectionSubData.encode(vaultId, targetRatio, daiAddr);
121
+
122
+ return [
123
+ bundleId,
124
+ true,
125
+ triggerData,
126
+ subData,
127
+ ];
128
+ },
105
129
  };
106
130
 
107
131
  export const liquityEncode = {
@@ -337,6 +361,27 @@ export const aaveV3Encode = {
337
361
  return [strategyOrBundleId, isBundle, triggerData, subData];
338
362
  },
339
363
 
364
+ liquidationProtection(
365
+ strategyOrBundleId: number,
366
+ market: EthereumAddress,
367
+ user: EthereumAddress,
368
+ ratioState: RatioState,
369
+ targetRatio: number,
370
+ triggerRatio: number,
371
+ ) {
372
+ const isBundle = true;
373
+
374
+ const subData = subDataService.aaveV3LiquidationProtectionSubData.encode(
375
+ targetRatio,
376
+ ratioState,
377
+ market,
378
+ user,
379
+ );
380
+ const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
381
+
382
+ return [strategyOrBundleId, isBundle, triggerData, subData];
383
+ },
384
+
340
385
  leverageManagementOnPriceGeneric(
341
386
  strategyOrBundleId: number,
342
387
  price: number,
@@ -441,6 +486,20 @@ export const compoundV3Encode = {
441
486
 
442
487
  return [strategyOrBundleId, isBundle, triggerData, subData];
443
488
  },
489
+
490
+ liquidationProtection(
491
+ market: EthereumAddress,
492
+ baseToken: EthereumAddress,
493
+ triggerRepayRatio: number,
494
+ triggerBoostRatio: number,
495
+ targetBoostRatio: number,
496
+ targetRepayRatio: number,
497
+ boostEnabled: boolean,
498
+ isEOA: boolean,
499
+ ) {
500
+ return subDataService.compoundV3LiquidationProtectionSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
501
+ },
502
+
444
503
  leverageManagementOnPrice(
445
504
  strategyOrBundleId: number,
446
505
  market: EthereumAddress,
@@ -591,6 +650,26 @@ export const sparkEncode = {
591
650
 
592
651
  return [strategyOrBundleId, isBundle, triggerData, subData];
593
652
  },
653
+
654
+ liquidationProtection(
655
+ strategyOrBundleId: number,
656
+ market: EthereumAddress,
657
+ user: EthereumAddress,
658
+ ratioState: RatioState,
659
+ targetRatio: number,
660
+ triggerRatio: number,
661
+ ) {
662
+ const isBundle = true;
663
+
664
+ const subData = subDataService.sparkLiquidationProtectionSubData.encode(
665
+ targetRatio,
666
+ ratioState,
667
+ );
668
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
669
+
670
+ return [strategyOrBundleId, isBundle, triggerData, subData];
671
+ },
672
+
594
673
  collateralSwitch(
595
674
  strategyOrBundleId: number,
596
675
  fromAsset: EthereumAddress,
@@ -687,6 +766,32 @@ export const morphoBlueEncode = {
687
766
 
688
767
  return [strategyOrBundleId, isBundle, triggerData, subData];
689
768
  },
769
+
770
+ liquidationProtection(
771
+ marketId: string,
772
+ loanToken: EthereumAddress,
773
+ collToken: EthereumAddress,
774
+ oracle: EthereumAddress,
775
+ irm: EthereumAddress,
776
+ lltv: string,
777
+ ratioState: RatioState,
778
+ targetRatio: number,
779
+ triggerRatio: number,
780
+ user: EthereumAddress,
781
+ isEOA: boolean,
782
+ network: ChainId,
783
+ ) {
784
+ const subData = subDataService.morphoBlueLiquidationProtectionSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
785
+
786
+ const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
787
+
788
+ // TODO -> Check if need to deploy separate bundles for EOA, or can reuse this for EOA. Logic above is different for EOA and SW on arbi and mainnet. Base uses same for both, not sure if because of lack of EOA support or because it is using same bundle for both.
789
+ const bundleId = (getBundleIdsByNetwork(network) as typeof Bundles.MainnetIds).MORPHO_BLUE_LIQUIDATION_PROTECTION;
790
+ const isBundle = true;
791
+
792
+ return [bundleId, isBundle, triggerData, subData];
793
+ },
794
+
690
795
  leverageManagementOnPrice(
691
796
  strategyOrBundleId: number,
692
797
  isBundle: boolean = true,
@@ -815,6 +920,22 @@ export const fluidEncode = {
815
920
 
816
921
  return [strategyOrBundleId, isBundle, triggerData, subData];
817
922
  },
923
+
924
+ liquidationProtection(
925
+ nftId: string,
926
+ vault: EthereumAddress,
927
+ ratioState: RatioState,
928
+ targetRatio: number,
929
+ triggerRatio: number,
930
+ strategyOrBundleId: number,
931
+ ) {
932
+ const isBundle = true;
933
+ const subData = subDataService.fluidLiquidationProtectionSubData.encode(nftId, vault, ratioState, targetRatio);
934
+ const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
935
+
936
+ return [strategyOrBundleId, isBundle, triggerData, subData];
937
+ },
938
+
818
939
  };
819
940
 
820
941
  export const aaveV4Encode = {
@@ -832,6 +953,22 @@ export const aaveV4Encode = {
832
953
 
833
954
  return [strategyOrBundleId, isBundle, triggerData, subData];
834
955
  },
956
+
957
+ liquidationProtection(
958
+ strategyOrBundleId: number,
959
+ owner: EthereumAddress,
960
+ spoke: EthereumAddress,
961
+ ratioState: RatioState,
962
+ targetRatio: number,
963
+ triggerRatio: number,
964
+ ) {
965
+ const isBundle = true;
966
+ const subData = subDataService.aaveV4LiquidationProtectionSubData.encode(spoke, owner, ratioState, targetRatio);
967
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
968
+
969
+ return [strategyOrBundleId, isBundle, triggerData, subData];
970
+ },
971
+
835
972
  leverageManagementOnPrice(
836
973
  strategyOrBundleId: number,
837
974
  owner: EthereumAddress,