@defisaver/automation-sdk 3.3.16 → 3.3.17-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 (35) hide show
  1. package/cjs/constants/index.js +190 -0
  2. package/cjs/index.d.ts +2 -2
  3. package/cjs/index.js +5 -2
  4. package/cjs/services/strategiesService.js +169 -12
  5. package/cjs/services/strategySubService.d.ts +22 -17
  6. package/cjs/services/strategySubService.js +115 -38
  7. package/cjs/services/strategySubService.test.js +111 -41
  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/types/enums.d.ts +48 -6
  12. package/cjs/types/enums.js +42 -0
  13. package/esm/constants/index.js +190 -0
  14. package/esm/index.d.ts +2 -2
  15. package/esm/index.js +5 -2
  16. package/esm/services/strategiesService.js +169 -12
  17. package/esm/services/strategySubService.d.ts +22 -17
  18. package/esm/services/strategySubService.js +113 -37
  19. package/esm/services/strategySubService.test.js +112 -39
  20. package/esm/services/subDataService.d.ts +70 -20
  21. package/esm/services/subDataService.js +21 -77
  22. package/esm/services/subDataService.test.js +18 -200
  23. package/esm/types/enums.d.ts +48 -6
  24. package/esm/types/enums.js +42 -0
  25. package/package.json +1 -1
  26. package/src/constants/index.ts +192 -1
  27. package/src/index.ts +22 -6
  28. package/src/services/strategiesService.ts +234 -12
  29. package/src/services/strategySubService.test.ts +147 -47
  30. package/src/services/strategySubService.ts +246 -47
  31. package/src/services/subDataService.test.ts +18 -214
  32. package/src/services/subDataService.ts +42 -106
  33. package/src/services/utils.test.ts +1 -1
  34. package/src/services/utils.ts +3 -1
  35. package/src/types/enums.ts +42 -2
@@ -1,26 +1,24 @@
1
- import type { OrderType } from '../types/enums';
2
- import { CloseToAssetType, Bundles, ChainId, RatioState, Strategies } from '../types/enums';
1
+ import { Bundles, ChainId, CloseToAssetType, RatioState, Strategies } from '../types/enums';
3
2
  import type { EthereumAddress, StrategyOrBundleIds } from '../types';
3
+ import type { OrderType } from '../types/enums';
4
4
  export declare const makerEncode: {
5
5
  repayFromSavings(bundleId: StrategyOrBundleIds, vaultId: number, triggerRepayRatio: number, targetRepayRatio: number, isBundle?: boolean, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds | Strategies.OptimismIds | Strategies.ArbitrumIds | Strategies.BaseIds | Bundles.MainnetIds | Bundles.OptimismIds | Bundles.ArbitrumIds | Bundles.BaseIds)[];
6
6
  closeOnPrice(vaultId: number, ratioState: RatioState, price: string, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
7
7
  trailingStop(vaultId: number, triggerPercentage: number, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, roundId: number, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
8
- leverageManagementWithoutSubProxy(vaultId: number, triggerRatio: number, targetRatio: number, ratioState: RatioState, isBoost: boolean, daiAddr?: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
8
+ leverageManagement(vaultId: number, triggerRatio: number, targetRatio: number, ratioState: RatioState, isBoost: boolean, daiAddr?: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
9
+ liquidationProtection(vaultId: number, triggerRatio: number, targetRatio: number, ratioState: RatioState, daiAddr?: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
9
10
  };
10
11
  export declare const liquityEncode: {
11
12
  closeOnPrice(priceOverOrUnder: RatioState, price: string, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, chainId?: ChainId, collAddr?: EthereumAddress, debtAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
12
13
  trailingStop(triggerPercentage: number, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, roundId: number, chainId?: ChainId, collAddr?: EthereumAddress, debtAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
13
14
  paybackFromChickenBondStrategySub(proxyAddress: EthereumAddress, ratio: number, sourceId: string, sourceType: number, ratioState?: RatioState): (boolean | string[] | Bundles.MainnetIds)[];
14
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
15
+ leverageManagement(strategyOrBundleId: number, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
15
16
  dsrPayback(proxyAddress: EthereumAddress, triggerRatio: number, targetRatio: number): (boolean | string[] | Strategies.MainnetIds)[];
16
17
  dsrSupply(proxyAddress: EthereumAddress, triggerRatio: number, targetRatio: number): (boolean | string[] | Strategies.MainnetIds)[];
17
18
  debtInFrontRepay(proxyAddress: EthereumAddress, debtInFrontMin: string, targetRatioIncrease: number): (boolean | string[] | Strategies.MainnetIds)[];
18
19
  };
19
- export declare const chickenBondsEncode: {
20
- rebond(bondId: number): string[];
21
- };
22
20
  export declare const aaveV2Encode: {
23
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
21
+ leverageManagement(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
24
22
  };
25
23
  export declare const aaveV3Encode: {
26
24
  closeToAsset(strategyOrBundleId: number, isBundle: boolean | undefined, triggerData: {
@@ -59,25 +57,24 @@ export declare const aaveV3Encode: {
59
57
  marketAddr: EthereumAddress;
60
58
  targetRatio: number;
61
59
  }): (number | boolean | string[])[];
62
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, isGeneric?: boolean): (number | boolean | string[])[];
60
+ leverageManagement(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, isGeneric?: boolean): (number | boolean | string[])[];
61
+ liquidationProtection(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
63
62
  leverageManagementOnPriceGeneric(strategyOrBundleId: number, price: number, ratioState: RatioState, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number, user: EthereumAddress): (number | boolean | string[])[];
64
63
  closeOnPriceGeneric(strategyOrBundleId: number, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, user: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
65
64
  collateralSwitch(strategyOrBundleId: number, fromAsset: EthereumAddress, fromAssetId: number, toAsset: EthereumAddress, toAssetId: number, marketAddr: EthereumAddress, amountToSwitch: string, baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, state: RatioState): (number | boolean | string[])[];
66
65
  };
67
66
  export declare const compoundV2Encode: {
68
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
67
+ leverageManagement(strategyOrBundleId: number, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
69
68
  };
70
69
  export declare const compoundV3Encode: {
71
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, baseToken: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
70
+ leverageManagement(strategyOrBundleId: number, market: EthereumAddress, baseToken: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
71
+ liquidationProtection(strategyOrBundleId: number, market: EthereumAddress, baseToken: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
72
72
  leverageManagementOnPrice(strategyOrBundleId: number, market: EthereumAddress, collToken: EthereumAddress, baseToken: EthereumAddress, targetRatio: number, price: number, priceState: RatioState, ratioState: RatioState, user: EthereumAddress): (number | boolean | string[])[];
73
73
  closeOnPrice(strategyOrBundleId: number, market: EthereumAddress, collToken: EthereumAddress, baseToken: EthereumAddress, stopLossPrice: number | undefined, stopLossType: CloseToAssetType | undefined, takeProfitPrice: number | undefined, takeProfitType: CloseToAssetType | undefined, user: EthereumAddress): (number | boolean | string[])[];
74
74
  };
75
- export declare const morphoAaveV2Encode: {
76
- leverageManagement(triggerRepayRatio: number, triggerBoostRatio: number, targetBoostRatio: number, targetRepayRatio: number, boostEnabled: boolean): string[];
77
- };
78
75
  export declare const exchangeEncode: {
79
76
  dca(fromToken: EthereumAddress, toToken: EthereumAddress, amount: string, timestamp: number, interval: number, network: ChainId): (boolean | string[] | Strategies.MainnetIds | Strategies.OptimismIds | Strategies.ArbitrumIds | Strategies.BaseIds)[];
80
- limitOrderWithoutSubProxy(fromToken: EthereumAddress, toToken: EthereumAddress, amount: string, targetPrice: string, goodUntil: string | number, orderType: OrderType, fromTokenDecimals: number, toTokenDecimals: number, network: ChainId): (boolean | string[] | Strategies.MainnetIds | Strategies.OptimismIds | Strategies.ArbitrumIds | Strategies.BaseIds)[];
77
+ limitOrder(fromToken: EthereumAddress, toToken: EthereumAddress, amount: string, targetPrice: string, goodUntil: string | number, orderType: OrderType, fromTokenDecimals: number, toTokenDecimals: number, network: ChainId): (boolean | string[] | Strategies.MainnetIds | Strategies.OptimismIds | Strategies.ArbitrumIds | Strategies.BaseIds)[];
81
78
  };
82
79
  export declare const sparkEncode: {
83
80
  leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, triggerData: {
@@ -94,17 +91,23 @@ export declare const sparkEncode: {
94
91
  targetRatio: number;
95
92
  }): (number | boolean | string[])[];
96
93
  closeOnPriceGeneric(strategyOrBundleId: number, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, user: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
97
- leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
94
+ leverageManagement(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
95
+ liquidationProtection(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
98
96
  collateralSwitch(strategyOrBundleId: number, fromAsset: EthereumAddress, fromAssetId: number, toAsset: EthereumAddress, toAssetId: number, marketAddr: EthereumAddress, amountToSwitch: string, baseTokenAddress: EthereumAddress, quoteTokenAddress: EthereumAddress, price: number, state: RatioState): (number | boolean | string[])[];
99
97
  };
100
98
  export declare const crvUSDEncode: {
101
99
  leverageManagement(owner: EthereumAddress, controllerAddr: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, collTokenAddr: EthereumAddress, crvUSDAddr: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
102
100
  payback(proxyAddress: EthereumAddress, addressToPullTokensFrom: EthereumAddress, positionOwner: EthereumAddress, paybackAmount: string, crvUSDAddr: EthereumAddress, controllerAddr: EthereumAddress, minHealthRatio: number): (boolean | string[] | Strategies.MainnetIds)[];
103
101
  };
102
+ export type MorphoBlueBundleStrategy = 'repay' | 'boost' | 'repayOnPrice' | 'boostOnPrice' | 'close' | 'liquidationProtection';
103
+ export declare function getMorphoBlueBundleId(network: ChainId, strategy: MorphoBlueBundleStrategy, isEOA: boolean): number;
104
104
  export declare const morphoBlueEncode: {
105
- leverageManagement(marketId: string, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, ratioState: RatioState, targetRatio: number, triggerRatio: number, user: EthereumAddress, isEOA: boolean, network: ChainId): (boolean | string[] | Bundles.BaseIds)[] | (boolean | string[] | Bundles.MainnetIds | Bundles.ArbitrumIds)[];
105
+ leverageManagement(marketId: string, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, ratioState: RatioState, targetRatio: number, triggerRatio: number, user: EthereumAddress, isEOA: boolean, network: ChainId): (number | boolean | string[])[];
106
+ liquidationProtection(marketId: string, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, ratioState: RatioState, targetRatio: number, triggerRatio: number, user: EthereumAddress, isEOA: boolean, network: ChainId): (number | boolean | string[])[];
106
107
  leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, targetRatio: number, price: number, priceState: RatioState): (number | boolean | string[])[];
108
+ leverageManagementOnPriceGeneric(loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, targetRatio: number, price: number, priceState: RatioState, isBoost: boolean, isEOA: boolean, network: ChainId): (number | boolean | string[])[];
107
109
  closeOnPrice(strategyOrBundleId: number, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
110
+ closeOnPriceGeneric(loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, stopLossPrice: number | undefined, stopLossType: CloseToAssetType | undefined, takeProfitPrice: number | undefined, takeProfitType: CloseToAssetType | undefined, isEOA: boolean, network: ChainId): (number | boolean | string[])[];
108
111
  };
109
112
  export declare const liquityV2Encode: {
110
113
  leverageManagement(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
@@ -114,9 +117,11 @@ export declare const liquityV2Encode: {
114
117
  };
115
118
  export declare const fluidEncode: {
116
119
  leverageManagement(nftId: string, vault: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
120
+ liquidationProtection(nftId: string, vault: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
117
121
  };
118
122
  export declare const aaveV4Encode: {
119
123
  leverageManagement(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
124
+ liquidationProtection(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
120
125
  leverageManagementOnPrice(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, targetRatio: number, price: string, priceState: RatioState, ratioState: RatioState): (number | boolean | string[])[];
121
126
  closeOnPrice(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, stopLossPrice?: string, stopLossType?: CloseToAssetType, takeProfitPrice?: string, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
122
127
  collateralSwitch(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, fromAsset: EthereumAddress, fromAssetId: number, toAsset: EthereumAddress, toAssetId: number, amountToSwitch: string, price: string, ratioState: RatioState): (number | boolean | string[])[];
@@ -23,10 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.aaveV4Encode = exports.fluidEncode = exports.liquityV2Encode = exports.morphoBlueEncode = exports.crvUSDEncode = exports.sparkEncode = exports.exchangeEncode = exports.morphoAaveV2Encode = exports.compoundV3Encode = exports.compoundV2Encode = exports.aaveV3Encode = exports.aaveV2Encode = exports.chickenBondsEncode = exports.liquityEncode = exports.makerEncode = void 0;
26
+ exports.aaveV4Encode = exports.fluidEncode = exports.liquityV2Encode = exports.morphoBlueEncode = exports.getMorphoBlueBundleId = exports.crvUSDEncode = exports.sparkEncode = exports.exchangeEncode = exports.compoundV3Encode = exports.compoundV2Encode = exports.aaveV3Encode = exports.aaveV2Encode = exports.liquityEncode = exports.makerEncode = void 0;
27
27
  const tokens_1 = require("@defisaver/tokens");
28
- const enums_1 = require("../types/enums");
29
28
  const constants_1 = require("../constants");
29
+ const enums_1 = require("../types/enums");
30
30
  const subDataService = __importStar(require("./subDataService"));
31
31
  const triggerService = __importStar(require("./triggerService"));
32
32
  const utils_1 = require("./utils");
@@ -56,10 +56,21 @@ exports.makerEncode = {
56
56
  const isBundle = false;
57
57
  return [strategyOrBundleId, isBundle, triggerData, subData];
58
58
  },
59
- leverageManagementWithoutSubProxy(vaultId, triggerRatio, targetRatio, ratioState, isBoost, daiAddr) {
59
+ leverageManagement(vaultId, triggerRatio, targetRatio, ratioState, isBoost, daiAddr) {
60
60
  const bundleId = isBoost ? enums_1.Bundles.MainnetIds.MAKER_BOOST : enums_1.Bundles.MainnetIds.MAKER_REPAY;
61
61
  const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
62
- const subData = subDataService.makerLeverageManagementWithoutSubProxy.encode(vaultId, targetRatio, daiAddr);
62
+ const subData = subDataService.makerLeverageManagementSubData.encode(vaultId, targetRatio, daiAddr);
63
+ return [
64
+ bundleId,
65
+ true,
66
+ triggerData,
67
+ subData,
68
+ ];
69
+ },
70
+ liquidationProtection(vaultId, triggerRatio, targetRatio, ratioState, daiAddr) {
71
+ const bundleId = enums_1.Bundles.MainnetIds.MAKER_SW_LIQUIDATION_PROTECTION;
72
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
73
+ const subData = subDataService.makerLiquidationProtectionSubData.encode(vaultId, targetRatio, daiAddr);
63
74
  return [
64
75
  bundleId,
65
76
  true,
@@ -93,9 +104,9 @@ exports.liquityEncode = {
93
104
  const isBundle = true;
94
105
  return [strategyId, isBundle, triggerData, subData];
95
106
  },
96
- leverageManagementWithoutSubProxy(strategyOrBundleId, user, ratioState, targetRatio, triggerRatio) {
107
+ leverageManagement(strategyOrBundleId, user, ratioState, targetRatio, triggerRatio) {
97
108
  const isBundle = true;
98
- const subData = subDataService.liquityLeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
109
+ const subData = subDataService.liquityLeverageManagementSubData.encode(targetRatio, ratioState);
99
110
  const triggerData = triggerService.liquityRatioTrigger.encode(user, triggerRatio, ratioState);
100
111
  return [strategyOrBundleId, isBundle, triggerData, subData];
101
112
  },
@@ -124,15 +135,10 @@ exports.liquityEncode = {
124
135
  return [strategyOrBundleId, isBundle, triggerData, subData];
125
136
  },
126
137
  };
127
- exports.chickenBondsEncode = {
128
- rebond(bondId) {
129
- return subDataService.cBondsRebondSubData.encode(bondId);
130
- },
131
- };
132
138
  exports.aaveV2Encode = {
133
- leverageManagementWithoutSubProxy(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
139
+ leverageManagement(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
134
140
  const isBundle = true;
135
- const subData = subDataService.aaveV2LeverageManagementSubDataWithoutSubProxy.encode(market, targetRatio, ratioState);
141
+ const subData = subDataService.aaveV2LeverageManagementSubData.encode(market, targetRatio, ratioState);
136
142
  const triggerData = triggerService.aaveV2RatioTrigger.encode(user, market, triggerRatio, ratioState);
137
143
  return [strategyOrBundleId, isBundle, triggerData, subData];
138
144
  },
@@ -159,9 +165,15 @@ exports.aaveV3Encode = {
159
165
  const triggerDataEncoded = triggerService.aaveV3QuotePriceTrigger.encode(baseTokenAddress, quoteTokenAddress, price, state);
160
166
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
161
167
  },
162
- leverageManagementWithoutSubProxy(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio, isGeneric = false) {
168
+ leverageManagement(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio, isGeneric = false) {
169
+ const isBundle = true;
170
+ const subData = subDataService.aaveV3LeverageManagementSubData.encode(targetRatio, ratioState, market, user, isGeneric);
171
+ const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
172
+ return [strategyOrBundleId, isBundle, triggerData, subData];
173
+ },
174
+ liquidationProtection(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
163
175
  const isBundle = true;
164
- const subData = subDataService.aaveV3LeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState, market, user, isGeneric);
176
+ const subData = subDataService.aaveV3LiquidationProtectionSubData.encode(targetRatio, ratioState, market, user, true);
165
177
  const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
166
178
  return [strategyOrBundleId, isBundle, triggerData, subData];
167
179
  },
@@ -186,17 +198,23 @@ exports.aaveV3Encode = {
186
198
  },
187
199
  };
188
200
  exports.compoundV2Encode = {
189
- leverageManagementWithoutSubProxy(strategyOrBundleId, user, ratioState, targetRatio, triggerRatio) {
201
+ leverageManagement(strategyOrBundleId, user, ratioState, targetRatio, triggerRatio) {
190
202
  const isBundle = true;
191
- const subData = subDataService.compoundV2LeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
203
+ const subData = subDataService.compoundV2LeverageManagementSubData.encode(targetRatio, ratioState);
192
204
  const triggerData = triggerService.compoundV2RatioTrigger.encode(user, triggerRatio, ratioState);
193
205
  return [strategyOrBundleId, isBundle, triggerData, subData];
194
206
  },
195
207
  };
196
208
  exports.compoundV3Encode = {
197
- leverageManagementWithoutSubProxy(strategyOrBundleId, market, baseToken, user, ratioState, targetRatio, triggerRatio) {
209
+ leverageManagement(strategyOrBundleId, market, baseToken, user, ratioState, targetRatio, triggerRatio) {
210
+ const isBundle = true;
211
+ const subData = subDataService.compoundV3LeverageManagementSubData.encode(market, baseToken, targetRatio, ratioState);
212
+ const triggerData = triggerService.compoundV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
213
+ return [strategyOrBundleId, isBundle, triggerData, subData];
214
+ },
215
+ liquidationProtection(strategyOrBundleId, market, baseToken, user, ratioState, targetRatio, triggerRatio) {
198
216
  const isBundle = true;
199
- const subData = subDataService.compoundV3LeverageManagementSubDataWithoutSubProxy.encode(market, baseToken, targetRatio, ratioState);
217
+ const subData = subDataService.compoundV3LiquidationProtectionSubData.encode(market, baseToken, targetRatio, ratioState);
200
218
  const triggerData = triggerService.compoundV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
201
219
  return [strategyOrBundleId, isBundle, triggerData, subData];
202
220
  },
@@ -215,11 +233,6 @@ exports.compoundV3Encode = {
215
233
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
216
234
  },
217
235
  };
218
- exports.morphoAaveV2Encode = {
219
- leverageManagement(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled) {
220
- return subDataService.morphoAaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
221
- },
222
- };
223
236
  exports.exchangeEncode = {
224
237
  dca(fromToken, toToken, amount, timestamp, interval, network) {
225
238
  (0, utils_1.requireAddresses)([fromToken, toToken]);
@@ -228,9 +241,9 @@ exports.exchangeEncode = {
228
241
  const strategyId = constants_1.STRATEGY_IDS[network].EXCHANGE_DCA;
229
242
  return [strategyId, false, triggerData, subData];
230
243
  },
231
- limitOrderWithoutSubProxy(fromToken, toToken, amount, targetPrice, goodUntil, orderType, fromTokenDecimals, toTokenDecimals, network) {
244
+ limitOrder(fromToken, toToken, amount, targetPrice, goodUntil, orderType, fromTokenDecimals, toTokenDecimals, network) {
232
245
  (0, utils_1.requireAddresses)([fromToken, toToken]);
233
- const subData = subDataService.exchangeLimitOrderSubDataWithoutSubProxy.encode(fromToken, toToken, amount);
246
+ const subData = subDataService.exchangeLimitOrderSubData.encode(fromToken, toToken, amount);
234
247
  const triggerData = triggerService.exchangeOffchainPriceTrigger.encode(targetPrice, Number(goodUntil), orderType, fromTokenDecimals, toTokenDecimals);
235
248
  const strategyId = constants_1.STRATEGY_IDS[network].EXCHANGE_LIMIT_ORDER;
236
249
  return [strategyId, false, triggerData, subData];
@@ -251,9 +264,15 @@ exports.sparkEncode = {
251
264
  const triggerDataEncoded = triggerService.sparkQuotePriceRangeTrigger.encode(collAsset, debtAsset, stopLossPrice, takeProfitPrice);
252
265
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
253
266
  },
254
- leverageManagementWithoutSubProxy(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
267
+ leverageManagement(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
268
+ const isBundle = true;
269
+ const subData = subDataService.sparkLeverageManagementSubData.encode(targetRatio, ratioState);
270
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
271
+ return [strategyOrBundleId, isBundle, triggerData, subData];
272
+ },
273
+ liquidationProtection(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
255
274
  const isBundle = true;
256
- const subData = subDataService.sparkLeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
275
+ const subData = subDataService.sparkLiquidationProtectionSubData.encode(targetRatio, ratioState);
257
276
  const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
258
277
  return [strategyOrBundleId, isBundle, triggerData, subData];
259
278
  },
@@ -281,29 +300,67 @@ exports.crvUSDEncode = {
281
300
  return [strategyId, isBundle, triggerData, subData];
282
301
  },
283
302
  };
303
+ function getMorphoBlueBundlesIds(network) {
304
+ switch (network) {
305
+ case enums_1.ChainId.Ethereum:
306
+ return enums_1.Bundles.MainnetIds;
307
+ case enums_1.ChainId.Base:
308
+ return enums_1.Bundles.BaseIds;
309
+ case enums_1.ChainId.Arbitrum:
310
+ return enums_1.Bundles.ArbitrumIds;
311
+ default:
312
+ throw new Error(`Morpho Blue strategies are not supported on chain ${network}`);
313
+ }
314
+ }
315
+ function getMorphoBlueBundleId(network, strategy, isEOA) {
316
+ const bundlesIds = getMorphoBlueBundlesIds(network);
317
+ switch (strategy) {
318
+ case 'repay':
319
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY : bundlesIds.MORPHO_BLUE_REPAY;
320
+ case 'boost':
321
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST : bundlesIds.MORPHO_BLUE_BOOST;
322
+ case 'repayOnPrice':
323
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY_ON_PRICE : bundlesIds.MORPHO_BLUE_REPAY_ON_PRICE;
324
+ case 'boostOnPrice':
325
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST_ON_PRICE : bundlesIds.MORPHO_BLUE_BOOST_ON_PRICE;
326
+ case 'close':
327
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_CLOSE : bundlesIds.MORPHO_BLUE_CLOSE;
328
+ case 'liquidationProtection':
329
+ return isEOA ? bundlesIds.MORPHO_BLUE_EOA_LIQUIDATION_PROTECTION : bundlesIds.MORPHO_BLUE_SW_LIQUIDATION_PROTECTION;
330
+ default:
331
+ throw new Error(`Unknown Morpho Blue strategy: ${strategy}`);
332
+ }
333
+ }
334
+ exports.getMorphoBlueBundleId = getMorphoBlueBundleId;
284
335
  exports.morphoBlueEncode = {
285
336
  leverageManagement(marketId, loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, triggerRatio, user, isEOA, network) {
286
337
  const subData = subDataService.morphoBlueLeverageManagementSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
287
338
  const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
288
339
  // over is boost, under is repay
289
340
  const isBoost = ratioState === enums_1.RatioState.OVER;
290
- let strategyOrBundleId;
291
- if (network === enums_1.ChainId.Base) {
292
- return [isBoost ? enums_1.Bundles.BaseIds.MORPHO_BLUE_BOOST : enums_1.Bundles.BaseIds.MORPHO_BLUE_REPAY, true, triggerData, subData];
293
- }
294
- const bundlesIds = network === enums_1.ChainId.Arbitrum ? enums_1.Bundles.ArbitrumIds : enums_1.Bundles.MainnetIds;
295
- if (isBoost)
296
- strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_BOOST : bundlesIds.MORPHO_BLUE_BOOST;
297
- else
298
- strategyOrBundleId = isEOA ? bundlesIds.MORPHO_BLUE_EOA_REPAY : bundlesIds.MORPHO_BLUE_REPAY;
341
+ const bundleId = getMorphoBlueBundleId(network, isBoost ? 'boost' : 'repay', isEOA);
299
342
  const isBundle = true;
300
- return [strategyOrBundleId, isBundle, triggerData, subData];
343
+ return [bundleId, isBundle, triggerData, subData];
344
+ },
345
+ liquidationProtection(marketId, loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, triggerRatio, user, isEOA, network) {
346
+ const subData = subDataService.morphoBlueLiquidationProtectionSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
347
+ const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
348
+ const bundleId = getMorphoBlueBundleId(network, 'liquidationProtection', isEOA);
349
+ const isBundle = true;
350
+ return [bundleId, isBundle, triggerData, subData];
301
351
  },
302
352
  leverageManagementOnPrice(strategyOrBundleId, isBundle = true, loanToken, collToken, oracle, irm, lltv, user, targetRatio, price, priceState) {
303
353
  const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
304
354
  const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
305
355
  return [strategyOrBundleId, isBundle, triggerData, subData];
306
356
  },
357
+ leverageManagementOnPriceGeneric(loanToken, collToken, oracle, irm, lltv, user, targetRatio, price, priceState, isBoost, isEOA, network) {
358
+ const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
359
+ const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
360
+ const bundleId = getMorphoBlueBundleId(network, isBoost ? 'boostOnPrice' : 'repayOnPrice', isEOA);
361
+ const isBundle = true;
362
+ return [bundleId, isBundle, triggerData, subData];
363
+ },
307
364
  closeOnPrice(strategyOrBundleId, loanToken, collToken, oracle, irm, lltv, user, stopLossPrice = 0, stopLossType = enums_1.CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = enums_1.CloseToAssetType.COLLATERAL) {
308
365
  const isBundle = true;
309
366
  const closeType = (0, utils_1.getCloseStrategyType)(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
@@ -311,6 +368,14 @@ exports.morphoBlueEncode = {
311
368
  const triggerDataEncoded = triggerService.morphoBluePriceRangeTrigger.encode(oracle, collToken, loanToken, stopLossPrice, takeProfitPrice);
312
369
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
313
370
  },
371
+ closeOnPriceGeneric(loanToken, collToken, oracle, irm, lltv, user, stopLossPrice = 0, stopLossType = enums_1.CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = enums_1.CloseToAssetType.COLLATERAL, isEOA, network) {
372
+ const isBundle = true;
373
+ const closeType = (0, utils_1.getCloseStrategyType)(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
374
+ const subDataEncoded = subDataService.morphoBlueCloseOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, user, closeType);
375
+ const triggerDataEncoded = triggerService.morphoBluePriceRangeTrigger.encode(oracle, collToken, loanToken, stopLossPrice, takeProfitPrice);
376
+ const bundleId = getMorphoBlueBundleId(network, 'close', isEOA);
377
+ return [bundleId, isBundle, triggerDataEncoded, subDataEncoded];
378
+ },
314
379
  };
315
380
  exports.liquityV2Encode = {
316
381
  leverageManagement(market, troveId, collToken, boldToken, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
@@ -347,6 +412,12 @@ exports.fluidEncode = {
347
412
  const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
348
413
  return [strategyOrBundleId, isBundle, triggerData, subData];
349
414
  },
415
+ liquidationProtection(nftId, vault, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
416
+ const isBundle = true;
417
+ const subData = subDataService.fluidLiquidationProtectionSubData.encode(nftId, vault, ratioState, targetRatio);
418
+ const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
419
+ return [strategyOrBundleId, isBundle, triggerData, subData];
420
+ },
350
421
  };
351
422
  exports.aaveV4Encode = {
352
423
  leverageManagement(strategyOrBundleId, owner, spoke, ratioState, targetRatio, triggerRatio) {
@@ -355,6 +426,12 @@ exports.aaveV4Encode = {
355
426
  const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
356
427
  return [strategyOrBundleId, isBundle, triggerData, subData];
357
428
  },
429
+ liquidationProtection(strategyOrBundleId, owner, spoke, ratioState, targetRatio, triggerRatio) {
430
+ const isBundle = true;
431
+ const subData = subDataService.aaveV4LiquidationProtectionSubData.encode(spoke, owner, ratioState, targetRatio);
432
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
433
+ return [strategyOrBundleId, isBundle, triggerData, subData];
434
+ },
358
435
  leverageManagementOnPrice(strategyOrBundleId, owner, spoke, collAsset, collAssetId, debtAsset, debtAssetId, targetRatio, price, priceState, ratioState) {
359
436
  const isBundle = true;
360
437
  const subData = subDataService.aaveV4LeverageManagementOnPriceSubData.encode(spoke, owner, collAsset, collAssetId, debtAsset, debtAssetId, ratioState, targetRatio);
@@ -22,12 +22,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  const chai_1 = require("chai");
30
- const decimal_js_1 = __importDefault(require("decimal.js"));
31
27
  const sdk_1 = require("@defisaver/sdk");
32
28
  const tokens_1 = require("@defisaver/tokens");
33
29
  const web3Utils = __importStar(require("web3-utils"));
@@ -124,7 +120,7 @@ describe('Feature: strategySubService.ts', () => {
124
120
  });
125
121
  });
126
122
  });
127
- describe('leverageManagementWithoutSubProxy()', () => {
123
+ describe('leverageManagement()', () => {
128
124
  const examples = [
129
125
  // Repay scenario (isBoost=false, RatioState.UNDER)
130
126
  [
@@ -167,7 +163,7 @@ describe('Feature: strategySubService.ts', () => {
167
163
  ];
168
164
  examples.forEach(([expected, actual]) => {
169
165
  it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
170
- (0, chai_1.expect)(strategySubService_1.makerEncode.leverageManagementWithoutSubProxy(...actual)).to.eql(expected);
166
+ (0, chai_1.expect)(strategySubService_1.makerEncode.leverageManagement(...actual)).to.eql(expected);
171
167
  });
172
168
  });
173
169
  });
@@ -294,21 +290,6 @@ describe('Feature: strategySubService.ts', () => {
294
290
  });
295
291
  });
296
292
  });
297
- describe('When testing strategySubService.chickenBondsEncode', () => {
298
- describe('rebond()', () => {
299
- const examples = [
300
- [
301
- ['0x00000000000000000000000000000000000000000000000000000000000005e3'],
302
- [1507]
303
- ]
304
- ];
305
- examples.forEach(([expected, actual]) => {
306
- it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
307
- (0, chai_1.expect)(strategySubService_1.chickenBondsEncode.rebond(...actual)).to.eql(expected);
308
- });
309
- });
310
- });
311
- });
312
293
  describe('When testing strategySubService.aaveV3Encode', () => {
313
294
  describe('closeToAsset()', () => {
314
295
  const examples = [
@@ -998,25 +979,6 @@ describe('Feature: strategySubService.ts', () => {
998
979
  });
999
980
  });
1000
981
  });
1001
- describe('When testing strategySubService.morphoAaveV2Encode', () => {
1002
- describe('leverageManagement()', () => {
1003
- const examples = [
1004
- [
1005
- [new decimal_js_1.default(160).mul(1e16).toString(), new decimal_js_1.default(220).mul(1e16).toString(), new decimal_js_1.default(180).mul(1e16).toString(), new decimal_js_1.default(190).mul(1e16).toString(), true],
1006
- [160, 220, 180, 190, true]
1007
- ],
1008
- [
1009
- [new decimal_js_1.default(160).mul(1e16).toString(), new decimal_js_1.default(200).mul(1e16).toString(), new decimal_js_1.default(180).mul(1e16).toString(), new decimal_js_1.default(190).mul(1e16).toString(), false],
1010
- [160, 200, 180, 190, false]
1011
- ],
1012
- ];
1013
- examples.forEach(([expected, actual]) => {
1014
- it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1015
- (0, chai_1.expect)(strategySubService_1.morphoAaveV2Encode.leverageManagement(...actual)).to.eql(expected);
1016
- });
1017
- });
1018
- });
1019
- });
1020
982
  describe('When testing strategySubService.exchangeEncode', () => {
1021
983
  describe('dca()', () => {
1022
984
  const examples = [
@@ -1292,6 +1254,75 @@ describe('Feature: strategySubService.ts', () => {
1292
1254
  });
1293
1255
  });
1294
1256
  });
1257
+ describe('leverageManagementOnPriceGeneric()', () => {
1258
+ const examples = [
1259
+ [
1260
+ [
1261
+ enums_1.Bundles.MainnetIds.MORPHO_BLUE_REPAY_ON_PRICE,
1262
+ true,
1263
+ ['0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000003a352944000000000000000000000000000000000000000000000000000000000000000001'],
1264
+ [
1265
+ '0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
1266
+ '0x0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0',
1267
+ '0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc',
1268
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1269
+ '0x0000000000000000000000000000000000000000000000000d1d507e40be8000',
1270
+ '0x0000000000000000000000000000000000000000000000001bc16d674ec80000',
1271
+ '0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c',
1272
+ ],
1273
+ ],
1274
+ [
1275
+ web3Utils.toChecksumAddress('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
1276
+ web3Utils.toChecksumAddress('0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'),
1277
+ web3Utils.toChecksumAddress('0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC'),
1278
+ web3Utils.toChecksumAddress('0x0000000000000000000000000000000000000000'),
1279
+ '945000000000000000',
1280
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1281
+ 200,
1282
+ 2500,
1283
+ enums_1.RatioState.UNDER,
1284
+ false,
1285
+ false,
1286
+ enums_1.ChainId.Ethereum,
1287
+ ],
1288
+ ],
1289
+ [
1290
+ [
1291
+ enums_1.Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE,
1292
+ true,
1293
+ ['0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000005d21dba0000000000000000000000000000000000000000000000000000000000000000000'],
1294
+ [
1295
+ '0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
1296
+ '0x0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0',
1297
+ '0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc',
1298
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1299
+ '0x0000000000000000000000000000000000000000000000000d1d507e40be8000',
1300
+ '0x00000000000000000000000000000000000000000000000016345785d8a00000',
1301
+ '0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c',
1302
+ ],
1303
+ ],
1304
+ [
1305
+ web3Utils.toChecksumAddress('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
1306
+ web3Utils.toChecksumAddress('0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'),
1307
+ web3Utils.toChecksumAddress('0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC'),
1308
+ web3Utils.toChecksumAddress('0x0000000000000000000000000000000000000000'),
1309
+ '945000000000000000',
1310
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1311
+ 160,
1312
+ 4000,
1313
+ enums_1.RatioState.OVER,
1314
+ true,
1315
+ false,
1316
+ enums_1.ChainId.Ethereum,
1317
+ ],
1318
+ ],
1319
+ ];
1320
+ examples.forEach(([expected, actual]) => {
1321
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1322
+ (0, chai_1.expect)(strategySubService_1.morphoBlueEncode.leverageManagementOnPriceGeneric(...actual)).to.eql(expected);
1323
+ });
1324
+ });
1325
+ });
1295
1326
  describe('closeOnPrice()', () => {
1296
1327
  const examples = [
1297
1328
  [
@@ -1320,7 +1351,7 @@ describe('Feature: strategySubService.ts', () => {
1320
1351
  1500,
1321
1352
  enums_1.CloseToAssetType.DEBT,
1322
1353
  4000,
1323
- enums_1.CloseToAssetType.COLLATERAL
1354
+ enums_1.CloseToAssetType.COLLATERAL,
1324
1355
  ]
1325
1356
  ],
1326
1357
  ];
@@ -1330,6 +1361,45 @@ describe('Feature: strategySubService.ts', () => {
1330
1361
  });
1331
1362
  });
1332
1363
  });
1364
+ describe('closeOnPriceGeneric()', () => {
1365
+ const examples = [
1366
+ [
1367
+ [
1368
+ enums_1.Bundles.MainnetIds.MORPHO_BLUE_CLOSE,
1369
+ true,
1370
+ ['0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000005d21dba000'],
1371
+ [
1372
+ '0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
1373
+ '0x0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0',
1374
+ '0x000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc',
1375
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1376
+ '0x0000000000000000000000000000000000000000000000000d1d507e40be8000',
1377
+ '0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c',
1378
+ '0x0000000000000000000000000000000000000000000000000000000000000005',
1379
+ ],
1380
+ ],
1381
+ [
1382
+ web3Utils.toChecksumAddress('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
1383
+ web3Utils.toChecksumAddress('0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'),
1384
+ web3Utils.toChecksumAddress('0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC'),
1385
+ web3Utils.toChecksumAddress('0x0000000000000000000000000000000000000000'),
1386
+ '945000000000000000',
1387
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1388
+ 1500,
1389
+ enums_1.CloseToAssetType.DEBT,
1390
+ 4000,
1391
+ enums_1.CloseToAssetType.COLLATERAL,
1392
+ false,
1393
+ enums_1.ChainId.Ethereum,
1394
+ ]
1395
+ ],
1396
+ ];
1397
+ examples.forEach(([expected, actual]) => {
1398
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1399
+ (0, chai_1.expect)(strategySubService_1.morphoBlueEncode.closeOnPriceGeneric(...actual)).to.eql(expected);
1400
+ });
1401
+ });
1402
+ });
1333
1403
  });
1334
1404
  describe('When testing strategySubService.sparkEncode', () => {
1335
1405
  describe('leverageManagementOnPrice()', () => {