@defisaver/automation-sdk 3.3.16-dev-13082-morpho-eoa-dev → 3.3.16-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.
Files changed (39) hide show
  1. package/cjs/constants/index.js +117 -42
  2. package/cjs/index.d.ts +2 -2
  3. package/cjs/index.js +5 -2
  4. package/cjs/services/strategiesService.js +157 -12
  5. package/cjs/services/strategySubService.d.ts +18 -21
  6. package/cjs/services/strategySubService.js +78 -74
  7. package/cjs/services/strategySubService.test.js +3 -149
  8. package/cjs/services/subDataService.d.ts +70 -20
  9. package/cjs/services/subDataService.js +23 -79
  10. package/cjs/services/subDataService.test.js +17 -202
  11. package/cjs/services/utils.d.ts +2 -1
  12. package/cjs/services/utils.js +14 -1
  13. package/cjs/types/enums.d.ts +36 -17
  14. package/cjs/types/enums.js +30 -11
  15. package/esm/constants/index.js +117 -42
  16. package/esm/index.d.ts +2 -2
  17. package/esm/index.js +5 -2
  18. package/esm/services/strategiesService.js +157 -12
  19. package/esm/services/strategySubService.d.ts +18 -21
  20. package/esm/services/strategySubService.js +78 -73
  21. package/esm/services/strategySubService.test.js +4 -147
  22. package/esm/services/subDataService.d.ts +70 -20
  23. package/esm/services/subDataService.js +21 -77
  24. package/esm/services/subDataService.test.js +18 -200
  25. package/esm/services/utils.d.ts +2 -1
  26. package/esm/services/utils.js +13 -1
  27. package/esm/types/enums.d.ts +36 -17
  28. package/esm/types/enums.js +30 -11
  29. package/package.json +1 -1
  30. package/src/constants/index.ts +119 -43
  31. package/src/index.ts +22 -6
  32. package/src/services/strategiesService.ts +221 -12
  33. package/src/services/strategySubService.test.ts +3 -191
  34. package/src/services/strategySubService.ts +173 -121
  35. package/src/services/subDataService.test.ts +18 -214
  36. package/src/services/subDataService.ts +42 -106
  37. package/src/services/utils.test.ts +1 -1
  38. package/src/services/utils.ts +15 -1
  39. package/src/types/enums.ts +30 -13
@@ -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 = {
@@ -81,7 +85,7 @@ export const makerEncode = {
81
85
 
82
86
  return [strategyOrBundleId, isBundle, triggerData, subData];
83
87
  },
84
- leverageManagementWithoutSubProxy(
88
+ leverageManagement(
85
89
  vaultId: number,
86
90
  triggerRatio: number,
87
91
  targetRatio: number,
@@ -93,7 +97,27 @@ export const makerEncode = {
93
97
 
94
98
  const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
95
99
 
96
- const subData = subDataService.makerLeverageManagementWithoutSubProxy.encode(vaultId, targetRatio, daiAddr);
100
+ const subData = subDataService.makerLeverageManagementSubData.encode(vaultId, targetRatio, daiAddr);
101
+
102
+ return [
103
+ bundleId,
104
+ true,
105
+ triggerData,
106
+ subData,
107
+ ];
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_SW_LIQUIDATION_PROTECTION;
118
+
119
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
120
+ const subData = subDataService.makerLiquidationProtectionSubData.encode(vaultId, targetRatio, daiAddr);
97
121
 
98
122
  return [
99
123
  bundleId,
@@ -162,7 +186,7 @@ export const liquityEncode = {
162
186
 
163
187
  return [strategyId, isBundle, triggerData, subData];
164
188
  },
165
- leverageManagementWithoutSubProxy(
189
+ leverageManagement(
166
190
  strategyOrBundleId: number,
167
191
  user: EthereumAddress,
168
192
  ratioState: RatioState,
@@ -171,7 +195,7 @@ export const liquityEncode = {
171
195
  ) {
172
196
  const isBundle = true;
173
197
 
174
- const subData = subDataService.liquityLeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
198
+ const subData = subDataService.liquityLeverageManagementSubData.encode(targetRatio, ratioState);
175
199
  const triggerData = triggerService.liquityRatioTrigger.encode(user, triggerRatio, ratioState);
176
200
 
177
201
  return [strategyOrBundleId, isBundle, triggerData, subData];
@@ -223,14 +247,8 @@ export const liquityEncode = {
223
247
  },
224
248
  };
225
249
 
226
- export const chickenBondsEncode = {
227
- rebond(bondId: number) {
228
- return subDataService.cBondsRebondSubData.encode(bondId);
229
- },
230
- };
231
-
232
250
  export const aaveV2Encode = {
233
- leverageManagementWithoutSubProxy(
251
+ leverageManagement(
234
252
  strategyOrBundleId: number,
235
253
  market: EthereumAddress,
236
254
  user: EthereumAddress,
@@ -240,7 +258,7 @@ export const aaveV2Encode = {
240
258
  ) {
241
259
  const isBundle = true;
242
260
 
243
- const subData = subDataService.aaveV2LeverageManagementSubDataWithoutSubProxy.encode(market, targetRatio, ratioState);
261
+ const subData = subDataService.aaveV2LeverageManagementSubData.encode(market, targetRatio, ratioState);
244
262
  const triggerData = triggerService.aaveV2RatioTrigger.encode(user, market, triggerRatio, ratioState);
245
263
 
246
264
  return [strategyOrBundleId, isBundle, triggerData, subData];
@@ -314,7 +332,7 @@ export const aaveV3Encode = {
314
332
 
315
333
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
316
334
  },
317
- leverageManagementWithoutSubProxy(
335
+ leverageManagement(
318
336
  strategyOrBundleId: number,
319
337
  market: EthereumAddress,
320
338
  user: EthereumAddress,
@@ -325,7 +343,7 @@ export const aaveV3Encode = {
325
343
  ) {
326
344
  const isBundle = true;
327
345
 
328
- const subData = subDataService.aaveV3LeverageManagementSubDataWithoutSubProxy.encode(
346
+ const subData = subDataService.aaveV3LeverageManagementSubData.encode(
329
347
  targetRatio,
330
348
  ratioState,
331
349
  market,
@@ -337,6 +355,28 @@ export const aaveV3Encode = {
337
355
  return [strategyOrBundleId, isBundle, triggerData, subData];
338
356
  },
339
357
 
358
+ liquidationProtection(
359
+ strategyOrBundleId: number,
360
+ market: EthereumAddress,
361
+ user: EthereumAddress,
362
+ ratioState: RatioState,
363
+ targetRatio: number,
364
+ triggerRatio: number,
365
+ ) {
366
+ const isBundle = true;
367
+
368
+ const subData = subDataService.aaveV3LiquidationProtectionSubData.encode(
369
+ targetRatio,
370
+ ratioState,
371
+ market,
372
+ user,
373
+ true, // isGeneric
374
+ );
375
+ const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
376
+
377
+ return [strategyOrBundleId, isBundle, triggerData, subData];
378
+ },
379
+
340
380
  leverageManagementOnPriceGeneric(
341
381
  strategyOrBundleId: number,
342
382
  price: number,
@@ -408,7 +448,7 @@ export const aaveV3Encode = {
408
448
  };
409
449
 
410
450
  export const compoundV2Encode = {
411
- leverageManagementWithoutSubProxy(
451
+ leverageManagement(
412
452
  strategyOrBundleId: number,
413
453
  user: EthereumAddress,
414
454
  ratioState: RatioState,
@@ -417,7 +457,7 @@ export const compoundV2Encode = {
417
457
  ) {
418
458
  const isBundle = true;
419
459
 
420
- const subData = subDataService.compoundV2LeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
460
+ const subData = subDataService.compoundV2LeverageManagementSubData.encode(targetRatio, ratioState);
421
461
  const triggerData = triggerService.compoundV2RatioTrigger.encode(user, triggerRatio, ratioState);
422
462
 
423
463
  return [strategyOrBundleId, isBundle, triggerData, subData];
@@ -425,7 +465,24 @@ export const compoundV2Encode = {
425
465
  };
426
466
 
427
467
  export const compoundV3Encode = {
428
- leverageManagementWithoutSubProxy(
468
+ leverageManagement(
469
+ strategyOrBundleId: number,
470
+ market: EthereumAddress,
471
+ baseToken: EthereumAddress,
472
+ user: EthereumAddress,
473
+ ratioState: RatioState,
474
+ targetRatio: number,
475
+ triggerRatio: number,
476
+ ) {
477
+ const isBundle = true;
478
+
479
+ const subData = subDataService.compoundV3LeverageManagementSubData.encode(market, baseToken, targetRatio, ratioState);
480
+ const triggerData = triggerService.compoundV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
481
+
482
+ return [strategyOrBundleId, isBundle, triggerData, subData];
483
+ },
484
+
485
+ liquidationProtection(
429
486
  strategyOrBundleId: number,
430
487
  market: EthereumAddress,
431
488
  baseToken: EthereumAddress,
@@ -436,11 +493,12 @@ export const compoundV3Encode = {
436
493
  ) {
437
494
  const isBundle = true;
438
495
 
439
- const subData = subDataService.compoundV3LeverageManagementSubDataWithoutSubProxy.encode(market, baseToken, targetRatio, ratioState);
496
+ const subData = subDataService.compoundV3LiquidationProtectionSubData.encode(market, baseToken, targetRatio, ratioState);
440
497
  const triggerData = triggerService.compoundV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
441
498
 
442
499
  return [strategyOrBundleId, isBundle, triggerData, subData];
443
500
  },
501
+
444
502
  leverageManagementOnPrice(
445
503
  strategyOrBundleId: number,
446
504
  market: EthereumAddress,
@@ -479,18 +537,6 @@ export const compoundV3Encode = {
479
537
  },
480
538
  };
481
539
 
482
- export const morphoAaveV2Encode = {
483
- leverageManagement(
484
- triggerRepayRatio: number,
485
- triggerBoostRatio: number,
486
- targetBoostRatio: number,
487
- targetRepayRatio: number,
488
- boostEnabled: boolean,
489
- ) {
490
- return subDataService.morphoAaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
491
- },
492
- };
493
-
494
540
  export const exchangeEncode = {
495
541
  dca(
496
542
  fromToken: EthereumAddress,
@@ -508,7 +554,7 @@ export const exchangeEncode = {
508
554
 
509
555
  return [strategyId, false, triggerData, subData];
510
556
  },
511
- limitOrderWithoutSubProxy(
557
+ limitOrder(
512
558
  fromToken: EthereumAddress,
513
559
  toToken: EthereumAddress,
514
560
  amount: string,
@@ -520,7 +566,7 @@ export const exchangeEncode = {
520
566
  network: ChainId,
521
567
  ) {
522
568
  requireAddresses([fromToken, toToken]);
523
- const subData = subDataService.exchangeLimitOrderSubDataWithoutSubProxy.encode(fromToken, toToken, amount);
569
+ const subData = subDataService.exchangeLimitOrderSubData.encode(fromToken, toToken, amount);
524
570
  const triggerData = triggerService.exchangeOffchainPriceTrigger.encode(targetPrice, Number(goodUntil), orderType, fromTokenDecimals, toTokenDecimals);
525
571
 
526
572
  const strategyId = STRATEGY_IDS[network].EXCHANGE_LIMIT_ORDER;
@@ -573,7 +619,26 @@ export const sparkEncode = {
573
619
 
574
620
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
575
621
  },
576
- leverageManagementWithoutSubProxy(
622
+ leverageManagement(
623
+ strategyOrBundleId: number,
624
+ market: EthereumAddress,
625
+ user: EthereumAddress,
626
+ ratioState: RatioState,
627
+ targetRatio: number,
628
+ triggerRatio: number,
629
+ ) {
630
+ const isBundle = true;
631
+
632
+ const subData = subDataService.sparkLeverageManagementSubData.encode(
633
+ targetRatio,
634
+ ratioState,
635
+ );
636
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
637
+
638
+ return [strategyOrBundleId, isBundle, triggerData, subData];
639
+ },
640
+
641
+ liquidationProtection(
577
642
  strategyOrBundleId: number,
578
643
  market: EthereumAddress,
579
644
  user: EthereumAddress,
@@ -583,7 +648,7 @@ export const sparkEncode = {
583
648
  ) {
584
649
  const isBundle = true;
585
650
 
586
- const subData = subDataService.sparkLeverageManagementSubDataWithoutSubProxy.encode(
651
+ const subData = subDataService.sparkLiquidationProtectionSubData.encode(
587
652
  targetRatio,
588
653
  ratioState,
589
654
  );
@@ -591,6 +656,7 @@ export const sparkEncode = {
591
656
 
592
657
  return [strategyOrBundleId, isBundle, triggerData, subData];
593
658
  },
659
+
594
660
  collateralSwitch(
595
661
  strategyOrBundleId: number,
596
662
  fromAsset: EthereumAddress,
@@ -652,44 +718,6 @@ export const crvUSDEncode = {
652
718
  },
653
719
  };
654
720
 
655
- export type MorphoBlueBundleStrategy = 'repay' | 'boost' | 'repayOnPrice' | 'boostOnPrice' | 'close';
656
-
657
- function getMorphoBlueBundlesIds(network: ChainId) {
658
- switch (network) {
659
- case ChainId.Ethereum:
660
- return Bundles.MainnetIds;
661
- case ChainId.Base:
662
- return Bundles.BaseIds;
663
- case ChainId.Arbitrum:
664
- return Bundles.ArbitrumIds;
665
- default:
666
- throw new Error(`Morpho Blue strategies are not supported on chain ${network}`);
667
- }
668
- }
669
-
670
- export function getMorphoBlueBundleId(
671
- network: ChainId,
672
- strategy: MorphoBlueBundleStrategy,
673
- isEOA: boolean,
674
- ): number {
675
- const bundlesIds = getMorphoBlueBundlesIds(network);
676
-
677
- switch (strategy) {
678
- case 'repay':
679
- return isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY : bundlesIds.MORPHO_BLUE_REPAY;
680
- case 'boost':
681
- return isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST : bundlesIds.MORPHO_BLUE_BOOST;
682
- case 'repayOnPrice':
683
- return isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY_ON_PRICE : bundlesIds.MORPHO_BLUE_REPAY_ON_PRICE;
684
- case 'boostOnPrice':
685
- return isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST_ON_PRICE : bundlesIds.MORPHO_BLUE_BOOST_ON_PRICE;
686
- case 'close':
687
- return isEOA ? bundlesIds.MORPHO_BLUE_EOA_CLOSE : bundlesIds.MORPHO_BLUE_CLOSE;
688
- default:
689
- throw new Error(`Unknown Morpho Blue strategy: ${strategy}`);
690
- }
691
- }
692
-
693
721
  export const morphoBlueEncode = {
694
722
  leverageManagement(
695
723
  marketId: string,
@@ -711,72 +739,68 @@ export const morphoBlueEncode = {
711
739
 
712
740
  // over is boost, under is repay
713
741
  const isBoost = ratioState === RatioState.OVER;
714
- const bundleId = getMorphoBlueBundleId(network, isBoost ? 'boost' : 'repay', isEOA);
742
+ let strategyOrBundleId;
743
+
744
+ if (network === ChainId.Base) {
745
+ return [isBoost ? Bundles.BaseIds.MORPHO_BLUE_BOOST : Bundles.BaseIds.MORPHO_BLUE_REPAY, true, triggerData, subData];
746
+ }
747
+
748
+ const bundlesIds = network === ChainId.Arbitrum ? Bundles.ArbitrumIds : Bundles.MainnetIds;
749
+
750
+ if (isBoost) strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST : bundlesIds.MORPHO_BLUE_BOOST;
751
+ else strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY : bundlesIds.MORPHO_BLUE_REPAY;
715
752
  const isBundle = true;
716
753
 
717
- return [bundleId, isBundle, triggerData, subData];
718
- },
719
- leverageManagementOnPrice(
720
- strategyOrBundleId: number,
721
- isBundle: boolean = true,
722
- loanToken: EthereumAddress,
723
- collToken: EthereumAddress,
724
- oracle: EthereumAddress,
725
- irm: EthereumAddress,
726
- lltv: string,
727
- user: EthereumAddress,
728
- targetRatio: number,
729
- price: number,
730
- priceState: RatioState,
731
- ) {
732
- const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
733
- const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
734
754
  return [strategyOrBundleId, isBundle, triggerData, subData];
735
755
  },
736
- leverageManagementOnPriceGeneric(
756
+
757
+ liquidationProtection(
758
+ marketId: string,
737
759
  loanToken: EthereumAddress,
738
760
  collToken: EthereumAddress,
739
761
  oracle: EthereumAddress,
740
762
  irm: EthereumAddress,
741
763
  lltv: string,
742
- user: EthereumAddress,
764
+ ratioState: RatioState,
743
765
  targetRatio: number,
744
- price: number,
745
- priceState: RatioState,
746
- isBoost: boolean,
766
+ triggerRatio: number,
767
+ user: EthereumAddress,
747
768
  isEOA: boolean,
748
769
  network: ChainId,
749
770
  ) {
750
- const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
751
- const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
771
+ const subData = subDataService.morphoBlueLiquidationProtectionSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
772
+
773
+ const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
752
774
 
753
- const bundleId = getMorphoBlueBundleId(network, isBoost ? 'boostOnPrice' : 'repayOnPrice', isEOA);
775
+
776
+ // Type casting because there is no MORPHO_BLUE_EOA_LIQUIDATION_PROTECTION for Base chain.
777
+ // That is fine because we will just always send isEOA == false for Base chain.
778
+ const bundleNetwork = getBundleIdsByNetwork(network) as typeof Bundles.MainnetIds;
779
+ const bundleId = isEOA ? bundleNetwork.MORPHO_BLUE_EOA_LIQUIDATION_PROTECTION : bundleNetwork.MORPHO_BLUE_SW_LIQUIDATION_PROTECTION;
754
780
  const isBundle = true;
755
781
 
756
782
  return [bundleId, isBundle, triggerData, subData];
757
783
  },
758
- closeOnPrice(
784
+
785
+ leverageManagementOnPrice(
759
786
  strategyOrBundleId: number,
787
+ isBundle: boolean = true,
760
788
  loanToken: EthereumAddress,
761
789
  collToken: EthereumAddress,
762
790
  oracle: EthereumAddress,
763
791
  irm: EthereumAddress,
764
792
  lltv: string,
765
793
  user: EthereumAddress,
766
- stopLossPrice: number = 0,
767
- stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
768
- takeProfitPrice: number = 0,
769
- takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
794
+ targetRatio: number,
795
+ price: number,
796
+ priceState: RatioState,
770
797
  ) {
771
- const isBundle = true;
772
- const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
773
-
774
- const subDataEncoded = subDataService.morphoBlueCloseOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, user, closeType);
775
- const triggerDataEncoded = triggerService.morphoBluePriceRangeTrigger.encode(oracle, collToken, loanToken, stopLossPrice, takeProfitPrice);
776
-
777
- return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
798
+ const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
799
+ const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
800
+ return [strategyOrBundleId, isBundle, triggerData, subData];
778
801
  },
779
- closeOnPriceGeneric(
802
+ closeOnPrice(
803
+ strategyOrBundleId: number,
780
804
  loanToken: EthereumAddress,
781
805
  collToken: EthereumAddress,
782
806
  oracle: EthereumAddress,
@@ -787,8 +811,6 @@ export const morphoBlueEncode = {
787
811
  stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
788
812
  takeProfitPrice: number = 0,
789
813
  takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
790
- isEOA: boolean,
791
- network: ChainId,
792
814
  ) {
793
815
  const isBundle = true;
794
816
  const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
@@ -796,9 +818,7 @@ export const morphoBlueEncode = {
796
818
  const subDataEncoded = subDataService.morphoBlueCloseOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, user, closeType);
797
819
  const triggerDataEncoded = triggerService.morphoBluePriceRangeTrigger.encode(oracle, collToken, loanToken, stopLossPrice, takeProfitPrice);
798
820
 
799
- const bundleId = getMorphoBlueBundleId(network, 'close', isEOA);
800
-
801
- return [bundleId, isBundle, triggerDataEncoded, subDataEncoded];
821
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
802
822
  },
803
823
  };
804
824
 
@@ -890,6 +910,22 @@ export const fluidEncode = {
890
910
 
891
911
  return [strategyOrBundleId, isBundle, triggerData, subData];
892
912
  },
913
+
914
+ liquidationProtection(
915
+ nftId: string,
916
+ vault: EthereumAddress,
917
+ ratioState: RatioState,
918
+ targetRatio: number,
919
+ triggerRatio: number,
920
+ strategyOrBundleId: number,
921
+ ) {
922
+ const isBundle = true;
923
+ const subData = subDataService.fluidLiquidationProtectionSubData.encode(nftId, vault, ratioState, targetRatio);
924
+ const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
925
+
926
+ return [strategyOrBundleId, isBundle, triggerData, subData];
927
+ },
928
+
893
929
  };
894
930
 
895
931
  export const aaveV4Encode = {
@@ -907,6 +943,22 @@ export const aaveV4Encode = {
907
943
 
908
944
  return [strategyOrBundleId, isBundle, triggerData, subData];
909
945
  },
946
+
947
+ liquidationProtection(
948
+ strategyOrBundleId: number,
949
+ owner: EthereumAddress,
950
+ spoke: EthereumAddress,
951
+ ratioState: RatioState,
952
+ targetRatio: number,
953
+ triggerRatio: number,
954
+ ) {
955
+ const isBundle = true;
956
+ const subData = subDataService.aaveV4LiquidationProtectionSubData.encode(spoke, owner, ratioState, targetRatio);
957
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
958
+
959
+ return [strategyOrBundleId, isBundle, triggerData, subData];
960
+ },
961
+
910
962
  leverageManagementOnPrice(
911
963
  strategyOrBundleId: number,
912
964
  owner: EthereumAddress,