@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.
- package/cjs/constants/index.js +95 -0
- package/cjs/index.d.ts +4 -3
- package/cjs/index.js +6 -2
- package/cjs/services/strategiesService.js +151 -0
- package/cjs/services/strategySubService.d.ts +9 -2
- package/cjs/services/strategySubService.js +47 -1
- package/cjs/services/subDataService.d.ts +64 -0
- package/cjs/services/subDataService.js +199 -5
- package/cjs/services/utils.d.ts +3 -1
- package/cjs/services/utils.js +34 -1
- package/cjs/services/utils.test.js +25 -0
- package/cjs/types/enums.d.ts +29 -6
- package/cjs/types/enums.js +23 -0
- package/esm/constants/index.js +95 -0
- package/esm/index.d.ts +4 -3
- package/esm/index.js +7 -3
- package/esm/services/strategiesService.js +151 -0
- package/esm/services/strategySubService.d.ts +9 -2
- package/esm/services/strategySubService.js +48 -2
- package/esm/services/subDataService.d.ts +64 -0
- package/esm/services/subDataService.js +197 -3
- package/esm/services/utils.d.ts +3 -1
- package/esm/services/utils.js +32 -1
- package/esm/services/utils.test.js +27 -2
- package/esm/types/enums.d.ts +29 -6
- package/esm/types/enums.js +23 -0
- package/package.json +1 -1
- package/src/constants/index.ts +96 -0
- package/src/index.ts +24 -6
- package/src/services/strategiesService.ts +216 -0
- package/src/services/strategySubService.ts +142 -5
- package/src/services/subDataService.ts +283 -3
- package/src/services/utils.test.ts +32 -1
- package/src/services/utils.ts +32 -1
- package/src/types/enums.ts +23 -0
package/src/constants/index.ts
CHANGED
|
@@ -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,
|
|
27
|
+
getRatioStateInfoForAaveCloseStrategy,
|
|
28
|
+
compareSubHashes,
|
|
29
|
+
encodeSubId,
|
|
30
|
+
getCloseStrategyType,
|
|
31
|
+
getCompoundV3LeverageManagementBundleId,
|
|
28
32
|
} from './services/utils';
|
|
29
33
|
|
|
30
34
|
const utils = {
|
|
31
|
-
|
|
35
|
+
compareSubHashes,
|
|
36
|
+
encodeSubId,
|
|
37
|
+
getCloseStrategyType,
|
|
38
|
+
getCompoundV3LeverageManagementBundleId,
|
|
39
|
+
getRatioStateInfoForAaveCloseStrategy,
|
|
32
40
|
};
|
|
33
41
|
|
|
34
42
|
export {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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 {
|
|
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,
|
|
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,
|