@defisaver/automation-sdk 3.1.4-dev-2 → 3.1.4-dev-4

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.
@@ -368,6 +368,16 @@ exports.MAINNET_BUNDLES_INFO = {
368
368
  strategyId: enums_1.Strategies.Identifiers.CloseOnPrice,
369
369
  protocol: exports.PROTOCOLS.LiquityV2,
370
370
  },
371
+ [enums_1.Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE]: {
372
+ strategyOrBundleId: enums_1.Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE,
373
+ strategyId: enums_1.Strategies.Identifiers.OpenOrderFromCollateral,
374
+ protocol: exports.PROTOCOLS.LiquityV2,
375
+ },
376
+ [enums_1.Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE]: {
377
+ strategyOrBundleId: enums_1.Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE,
378
+ strategyId: enums_1.Strategies.Identifiers.RepayOnPrice,
379
+ protocol: exports.PROTOCOLS.LiquityV2,
380
+ },
371
381
  };
372
382
  exports.OPTIMISM_BUNDLES_INFO = {
373
383
  [enums_1.Bundles.OptimismIds.AAVE_V3_REPAY]: {
@@ -670,6 +670,26 @@ function parseLiquityV2CloseOnPrice(position, parseData) {
670
670
  };
671
671
  return _position;
672
672
  }
673
+ function parseLiquityV2LeverageManagementOnPrice(position, parseData) {
674
+ const _position = (0, lodash_1.cloneDeep)(position);
675
+ const { subStruct } = parseData.subscriptionEventData;
676
+ const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
677
+ const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
678
+ _position.strategyData.decoded.triggerData = triggerData;
679
+ _position.strategyData.decoded.subData = subData;
680
+ _position.positionId = (0, utils_1.getPositionId)(_position.chainId, _position.protocol.id, _position.owner, Math.random());
681
+ /// @TODO: what does even go here
682
+ /*
683
+ _position.specific = {
684
+ market: subData.market,
685
+ troveId: subData.troveId,
686
+ ratio: subData.targetRatio,
687
+ price: triggerData.price,
688
+ ratioState: triggerData.ratioState,
689
+ };
690
+ */
691
+ return _position;
692
+ }
673
693
  const parsingMethodsMapping = {
674
694
  [enums_1.ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
675
695
  [enums_1.Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
@@ -694,6 +714,8 @@ const parsingMethodsMapping = {
694
714
  [enums_1.Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
695
715
  [enums_1.Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
696
716
  [enums_1.Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
717
+ [enums_1.Strategies.Identifiers.OpenOrderFromCollateral]: parseLiquityV2LeverageManagementOnPrice,
718
+ [enums_1.Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
697
719
  },
698
720
  [enums_1.ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
699
721
  [enums_1.Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
@@ -99,6 +99,7 @@ export declare const morphoBlueEncode: {
99
99
  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.MainnetIds)[] | (boolean | string[] | Bundles.BaseIds)[];
100
100
  };
101
101
  export declare const liquityV2Encode: {
102
- leverageManagement(market: EthereumAddress, troveId: string, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
102
+ leverageManagement(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
103
103
  closeOnPrice(strategyOrBundleId: number, market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
104
+ leverageManagementOnPrice(strategyOrBundleId: number, market: EthereumAddress, price: number, state: RatioState, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, targetRatio: number, isRepayOnPrice: boolean): (number | boolean | string[])[];
104
105
  };
@@ -266,15 +266,10 @@ exports.morphoBlueEncode = {
266
266
  },
267
267
  };
268
268
  exports.liquityV2Encode = {
269
- leverageManagement(market, troveId, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
269
+ leverageManagement(market, troveId, collToken, boldToken, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
270
270
  const isBundle = true;
271
- const isRepay = ratioState === enums_1.RatioState.UNDER;
272
- const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, ratioState, targetRatio);
271
+ const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
273
272
  const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
274
- // TODO: we can hardcode right bundles after testing
275
- // const strategyOrBundleId = ratioState === RatioState.OVER
276
- // ? Bundles.MainnetIds.LIQUITY_V2_BOOST
277
- // : Bundles.MainnetIds.LIQUITY_V2_REPAY;
278
273
  return [strategyOrBundleId, isBundle, triggerData, subData];
279
274
  },
280
275
  closeOnPrice(strategyOrBundleId, market, troveId, collToken, boldToken, stopLossPrice = 0, stopLossType = enums_1.CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = enums_1.CloseToAssetType.COLLATERAL) {
@@ -282,8 +277,12 @@ exports.liquityV2Encode = {
282
277
  const closeType = (0, utils_1.getCloseStrategyType)(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
283
278
  const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
284
279
  const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
285
- // TODO: we can hardcode bundleID after testing
286
- // Bundles.MainnetIds.LIQUITY_V2_CLOSE;
287
280
  return [strategyOrBundleId, isBundle, triggerData, subData];
288
281
  },
282
+ leverageManagementOnPrice(strategyOrBundleId, market, price, state, troveId, collToken, boldToken, targetRatio, isRepayOnPrice) {
283
+ const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice);
284
+ const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
285
+ const isBundle = true;
286
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
287
+ },
289
288
  };
@@ -191,10 +191,12 @@ export declare const aaveV3LeverageManagementOnPriceSubData: {
191
191
  };
192
192
  };
193
193
  export declare const liquityV2LeverageManagementSubData: {
194
- encode: (market: EthereumAddress, troveId: string, ratioState: RatioState, targetRatio: number) => string[];
194
+ encode: (market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number) => string[];
195
195
  decode: (subData: string[]) => {
196
196
  market: string;
197
197
  troveId: string;
198
+ collToken: string;
199
+ boldToken: string;
198
200
  ratioState: RatioState;
199
201
  targetRatio: number;
200
202
  };
@@ -209,3 +211,13 @@ export declare const liquityV2CloseSubData: {
209
211
  closeType: CloseStrategyType;
210
212
  };
211
213
  };
214
+ export declare const liquityV2LeverageManagementOnPriceSubData: {
215
+ encode(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, targetRatio: number, isRepayOnPrice: boolean): string[];
216
+ decode(subData: string[]): {
217
+ market: EthereumAddress;
218
+ troveId: string;
219
+ collToken: EthereumAddress;
220
+ boldToken: EthereumAddress;
221
+ targetRatio: number;
222
+ };
223
+ };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.liquityV2CloseSubData = exports.liquityV2LeverageManagementSubData = exports.aaveV3LeverageManagementOnPriceSubData = exports.morphoBlueLeverageManagementSubData = exports.crvUSDPaybackSubData = exports.crvUSDLeverageManagementSubData = exports.liquityDebtInFrontRepaySubData = exports.liquityDsrSupplySubData = exports.liquityDsrPaybackSubData = exports.sparkQuotePriceSubData = exports.sparkLeverageManagementSubData = exports.exchangeLimitOrderSubData = exports.exchangeDcaSubData = exports.liquityPaybackUsingChickenBondSubData = exports.cBondsRebondSubData = exports.morphoAaveV2LeverageManagementSubData = exports.compoundV3L2LeverageManagementSubData = exports.compoundV3LeverageManagementSubData = exports.compoundV2LeverageManagementSubData = exports.aaveV3QuotePriceSubData = exports.aaveV3LeverageManagementSubData = exports.aaveV2LeverageManagementSubData = exports.liquityCloseSubData = exports.liquityLeverageManagementSubData = exports.makerLeverageManagementSubData = exports.makerCloseSubData = exports.liquityRepayFromSavingsSubData = exports.makerRepayFromSavingsSubData = void 0;
6
+ exports.liquityV2LeverageManagementOnPriceSubData = exports.liquityV2CloseSubData = exports.liquityV2LeverageManagementSubData = exports.aaveV3LeverageManagementOnPriceSubData = exports.morphoBlueLeverageManagementSubData = exports.crvUSDPaybackSubData = exports.crvUSDLeverageManagementSubData = exports.liquityDebtInFrontRepaySubData = exports.liquityDsrSupplySubData = exports.liquityDsrPaybackSubData = exports.sparkQuotePriceSubData = exports.sparkLeverageManagementSubData = exports.exchangeLimitOrderSubData = exports.exchangeDcaSubData = exports.liquityPaybackUsingChickenBondSubData = exports.cBondsRebondSubData = exports.morphoAaveV2LeverageManagementSubData = exports.compoundV3L2LeverageManagementSubData = exports.compoundV3LeverageManagementSubData = exports.compoundV2LeverageManagementSubData = exports.aaveV3QuotePriceSubData = exports.aaveV3LeverageManagementSubData = exports.aaveV2LeverageManagementSubData = exports.liquityCloseSubData = exports.liquityLeverageManagementSubData = exports.makerLeverageManagementSubData = exports.makerCloseSubData = exports.liquityRepayFromSavingsSubData = exports.makerRepayFromSavingsSubData = void 0;
7
7
  const decimal_js_1 = __importDefault(require("decimal.js"));
8
8
  const web3_eth_abi_1 = __importDefault(require("web3-eth-abi"));
9
9
  const web3_utils_1 = require("web3-utils");
@@ -474,9 +474,11 @@ exports.aaveV3LeverageManagementOnPriceSubData = {
474
474
  },
475
475
  };
476
476
  exports.liquityV2LeverageManagementSubData = {
477
- encode: (market, troveId, ratioState, targetRatio) => {
477
+ encode: (market, troveId, collToken, boldToken, ratioState, targetRatio) => {
478
478
  const marketEncoded = web3_eth_abi_1.default.encodeParameter('address', market);
479
479
  const troveIdEncoded = web3_eth_abi_1.default.encodeParameter('uint256', troveId);
480
+ const collTokenEncoded = web3_eth_abi_1.default.encodeParameter('address', collToken);
481
+ const boldTokenEncoded = web3_eth_abi_1.default.encodeParameter('address', boldToken);
480
482
  const ratioStateEncoded = web3_eth_abi_1.default.encodeParameter('uint8', ratioState);
481
483
  const targetRatioEncoded = web3_eth_abi_1.default.encodeParameter('uint256', (0, utils_1.ratioPercentageToWei)(targetRatio));
482
484
  const isRepay = ratioState === enums_1.RatioState.UNDER;
@@ -484,16 +486,27 @@ exports.liquityV2LeverageManagementSubData = {
484
486
  const debtActionType = isRepay ? enums_1.DebtActionType.PAYBACK : enums_1.DebtActionType.BORROW;
485
487
  const collActionTypeEncoded = web3_eth_abi_1.default.encodeParameter('uint8', collActionType);
486
488
  const debtActionTypeEncoded = web3_eth_abi_1.default.encodeParameter('uint8', debtActionType);
487
- return [marketEncoded, troveIdEncoded, ratioStateEncoded, targetRatioEncoded, collActionTypeEncoded, debtActionTypeEncoded];
489
+ return [
490
+ marketEncoded,
491
+ troveIdEncoded,
492
+ collTokenEncoded,
493
+ boldTokenEncoded,
494
+ ratioStateEncoded,
495
+ targetRatioEncoded,
496
+ collActionTypeEncoded,
497
+ debtActionTypeEncoded,
498
+ ];
488
499
  },
489
500
  decode: (subData) => {
490
501
  const market = web3_eth_abi_1.default.decodeParameter('address', subData[0]);
491
502
  const troveId = web3_eth_abi_1.default.decodeParameter('uint256', subData[1]);
492
- const ratioState = web3_eth_abi_1.default.decodeParameter('uint8', subData[2]);
493
- const weiRatio = web3_eth_abi_1.default.decodeParameter('uint256', subData[3]);
503
+ const collToken = web3_eth_abi_1.default.decodeParameter('address', subData[2]);
504
+ const boldToken = web3_eth_abi_1.default.decodeParameter('address', subData[3]);
505
+ const ratioState = web3_eth_abi_1.default.decodeParameter('uint8', subData[4]);
506
+ const weiRatio = web3_eth_abi_1.default.decodeParameter('uint256', subData[5]);
494
507
  const targetRatio = (0, utils_1.weiToRatioPercentage)(weiRatio);
495
508
  return {
496
- market, troveId, ratioState, targetRatio,
509
+ market, troveId, collToken, boldToken, ratioState, targetRatio,
497
510
  };
498
511
  },
499
512
  };
@@ -505,6 +518,8 @@ exports.liquityV2CloseSubData = {
505
518
  const boldTokenEncoded = web3_eth_abi_1.default.encodeParameter('address', boldToken);
506
519
  const wethAddress = (0, tokens_1.getAssetInfo)('WETH').address;
507
520
  const wethAddressEncoded = web3_eth_abi_1.default.encodeParameter('address', wethAddress);
521
+ const gasCompensation = new decimal_js_1.default('0.0375').mul(1e18).toString();
522
+ const gasCompensationEncoded = web3_eth_abi_1.default.encodeParameter('uint256', gasCompensation);
508
523
  const closeTypeEncoded = web3_eth_abi_1.default.encodeParameter('uint8', closeType);
509
524
  return [
510
525
  marketEncoded,
@@ -512,6 +527,7 @@ exports.liquityV2CloseSubData = {
512
527
  collAddrEncoded,
513
528
  boldTokenEncoded,
514
529
  wethAddressEncoded,
530
+ gasCompensationEncoded,
515
531
  closeTypeEncoded,
516
532
  ];
517
533
  },
@@ -520,10 +536,43 @@ exports.liquityV2CloseSubData = {
520
536
  const troveId = web3_eth_abi_1.default.decodeParameter('uint256', subData[1]);
521
537
  const collToken = web3_eth_abi_1.default.decodeParameter('address', subData[2]);
522
538
  const boldToken = web3_eth_abi_1.default.decodeParameter('address', subData[3]);
523
- // skip wethAddress
524
- const closeType = web3_eth_abi_1.default.decodeParameter('uint8', subData[5]);
539
+ // skip wethAddress and gasCompensation
540
+ const closeType = web3_eth_abi_1.default.decodeParameter('uint8', subData[6]);
525
541
  return {
526
542
  market, troveId, collToken, boldToken, closeType,
527
543
  };
528
544
  },
529
545
  };
546
+ exports.liquityV2LeverageManagementOnPriceSubData = {
547
+ encode(market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice) {
548
+ const encodedMarket = web3_eth_abi_1.default.encodeParameter('address', market);
549
+ const encodedTroveId = web3_eth_abi_1.default.encodeParameter('uint256', troveId);
550
+ const encodedCollToken = web3_eth_abi_1.default.encodeParameter('address', collToken);
551
+ const encodedBoldToken = web3_eth_abi_1.default.encodeParameter('address', boldToken);
552
+ const encodedTargetRatio = web3_eth_abi_1.default.encodeParameter('uint256', (0, utils_1.ratioPercentageToWei)(targetRatio));
553
+ const collActionType = isRepayOnPrice ? enums_1.CollActionType.WITHDRAW : enums_1.CollActionType.SUPPLY;
554
+ const debtActionType = isRepayOnPrice ? enums_1.DebtActionType.PAYBACK : enums_1.DebtActionType.BORROW;
555
+ const encodedCollActionType = web3_eth_abi_1.default.encodeParameter('uint8', collActionType);
556
+ const encodedDebtActionType = web3_eth_abi_1.default.encodeParameter('uint8', debtActionType);
557
+ return [
558
+ encodedMarket,
559
+ encodedTroveId,
560
+ encodedCollToken,
561
+ encodedBoldToken,
562
+ encodedTargetRatio,
563
+ encodedCollActionType,
564
+ encodedDebtActionType,
565
+ ];
566
+ },
567
+ decode(subData) {
568
+ const market = web3_eth_abi_1.default.decodeParameter('address', subData[0]);
569
+ const troveId = web3_eth_abi_1.default.decodeParameter('uint256', subData[1]);
570
+ const collToken = web3_eth_abi_1.default.decodeParameter('address', subData[2]);
571
+ const boldToken = web3_eth_abi_1.default.decodeParameter('address', subData[3]);
572
+ const weiRatio = web3_eth_abi_1.default.decodeParameter('uint256', subData[4]);
573
+ const targetRatio = (0, utils_1.weiToRatioPercentage)(weiRatio);
574
+ return {
575
+ market, troveId, collToken, boldToken, targetRatio,
576
+ };
577
+ },
578
+ };
@@ -198,6 +198,14 @@ export declare const liquityV2RatioTrigger: {
198
198
  ratioState: number;
199
199
  };
200
200
  };
201
+ export declare const liquityV2QuotePriceTrigger: {
202
+ encode(market: EthereumAddress, price: number, ratioState: RatioState): string[];
203
+ decode(triggerData: string[]): {
204
+ market: string;
205
+ price: string;
206
+ ratioState: number;
207
+ };
208
+ };
201
209
  export declare const closePriceTrigger: {
202
210
  encode(tokenAddr: EthereumAddress, lowerPrice: number, upperPrice: number): string[];
203
211
  decode(triggerData: string[]): {
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.closePriceTrigger = exports.liquityV2RatioTrigger = exports.morphoBlueRatioTrigger = exports.crvUsdHealthRatioTrigger = exports.crvUSDRatioTrigger = exports.curveUsdSoftLiquidationTrigger = exports.curveUsdBorrowRateTrigger = exports.sparkQuotePriceTrigger = exports.sparkRatioTrigger = exports.exchangeOffchainPriceTrigger = exports.exchangeTimestampTrigger = exports.compoundV3RatioTrigger = exports.cBondsRebondTrigger = exports.aaveV2RatioTrigger = exports.liquityDebtInFrontWithLimitTrigger = exports.liquityDebtInFrontTrigger = exports.liquityRatioTrigger = exports.compoundV2RatioTrigger = exports.aaveV3QuotePriceWithMaximumGasPriceTrigger = exports.aaveV3QuotePriceTrigger = exports.morphoAaveV2RatioTrigger = exports.aaveV3RatioTrigger = exports.makerRatioTrigger = exports.trailingStopTrigger = exports.chainlinkPriceTrigger = void 0;
29
+ exports.closePriceTrigger = exports.liquityV2QuotePriceTrigger = exports.liquityV2RatioTrigger = exports.morphoBlueRatioTrigger = exports.crvUsdHealthRatioTrigger = exports.crvUSDRatioTrigger = exports.curveUsdSoftLiquidationTrigger = exports.curveUsdBorrowRateTrigger = exports.sparkQuotePriceTrigger = exports.sparkRatioTrigger = exports.exchangeOffchainPriceTrigger = exports.exchangeTimestampTrigger = exports.compoundV3RatioTrigger = exports.cBondsRebondTrigger = exports.aaveV2RatioTrigger = exports.liquityDebtInFrontWithLimitTrigger = exports.liquityDebtInFrontTrigger = exports.liquityRatioTrigger = exports.compoundV2RatioTrigger = exports.aaveV3QuotePriceWithMaximumGasPriceTrigger = exports.aaveV3QuotePriceTrigger = exports.morphoAaveV2RatioTrigger = exports.aaveV3RatioTrigger = exports.makerRatioTrigger = exports.trailingStopTrigger = exports.chainlinkPriceTrigger = void 0;
30
30
  const decimal_js_1 = __importDefault(require("decimal.js"));
31
31
  const tokens_1 = require("@defisaver/tokens");
32
32
  const web3_eth_abi_1 = __importDefault(require("web3-eth-abi"));
@@ -380,6 +380,22 @@ exports.liquityV2RatioTrigger = {
380
380
  };
381
381
  },
382
382
  };
383
+ exports.liquityV2QuotePriceTrigger = {
384
+ encode(market, price, ratioState) {
385
+ // Price is always in 18 decimals
386
+ const _price = new decimal_js_1.default(price.toString()).mul(Math.pow(10, 18)).floor().toString();
387
+ return [web3_eth_abi_1.default.encodeParameters(['address', 'uint256', 'uint8'], [market, _price, ratioState])];
388
+ },
389
+ decode(triggerData) {
390
+ const decodedData = web3_eth_abi_1.default.decodeParameters(['address', 'uint256', 'uint8'], triggerData[0]);
391
+ const price = new decimal_js_1.default(decodedData[1]).div(Math.pow(10, 18)).toDP(18).toString();
392
+ return {
393
+ market: decodedData[0],
394
+ price,
395
+ ratioState: Number(decodedData[2]),
396
+ };
397
+ },
398
+ };
383
399
  exports.closePriceTrigger = {
384
400
  encode(tokenAddr, lowerPrice, upperPrice) {
385
401
  const lowerPriceFormatted = new decimal_js_1.default(lowerPrice).mul(1e8).floor().toString();
@@ -178,7 +178,9 @@ export declare namespace Bundles {
178
178
  AAVE_V3_REPAY_ON_PRICE = 37,
179
179
  LIQUITY_V2_REPAY = 39,
180
180
  LIQUITY_V2_BOOST = 40,
181
- LIQUITY_V2_CLOSE = 41
181
+ LIQUITY_V2_CLOSE = 41,
182
+ LIQUITY_V2_REPAY_ON_PRICE = 42,
183
+ LIQUITY_V2_BOOST_ON_PRICE = 43
182
184
  }
183
185
  enum OptimismIds {
184
186
  AAVE_V3_REPAY = 0,
@@ -202,6 +202,8 @@ var Bundles;
202
202
  MainnetIds[MainnetIds["LIQUITY_V2_REPAY"] = 39] = "LIQUITY_V2_REPAY";
203
203
  MainnetIds[MainnetIds["LIQUITY_V2_BOOST"] = 40] = "LIQUITY_V2_BOOST";
204
204
  MainnetIds[MainnetIds["LIQUITY_V2_CLOSE"] = 41] = "LIQUITY_V2_CLOSE";
205
+ MainnetIds[MainnetIds["LIQUITY_V2_REPAY_ON_PRICE"] = 42] = "LIQUITY_V2_REPAY_ON_PRICE";
206
+ MainnetIds[MainnetIds["LIQUITY_V2_BOOST_ON_PRICE"] = 43] = "LIQUITY_V2_BOOST_ON_PRICE";
205
207
  })(MainnetIds = Bundles.MainnetIds || (Bundles.MainnetIds = {}));
206
208
  let OptimismIds;
207
209
  (function (OptimismIds) {
@@ -362,6 +362,16 @@ export const MAINNET_BUNDLES_INFO = {
362
362
  strategyId: Strategies.Identifiers.CloseOnPrice,
363
363
  protocol: PROTOCOLS.LiquityV2,
364
364
  },
365
+ [Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE]: {
366
+ strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE,
367
+ strategyId: Strategies.Identifiers.OpenOrderFromCollateral,
368
+ protocol: PROTOCOLS.LiquityV2,
369
+ },
370
+ [Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE]: {
371
+ strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE,
372
+ strategyId: Strategies.Identifiers.RepayOnPrice,
373
+ protocol: PROTOCOLS.LiquityV2,
374
+ },
365
375
  };
366
376
  export const OPTIMISM_BUNDLES_INFO = {
367
377
  [Bundles.OptimismIds.AAVE_V3_REPAY]: {
@@ -644,6 +644,26 @@ function parseLiquityV2CloseOnPrice(position, parseData) {
644
644
  };
645
645
  return _position;
646
646
  }
647
+ function parseLiquityV2LeverageManagementOnPrice(position, parseData) {
648
+ const _position = cloneDeep(position);
649
+ const { subStruct } = parseData.subscriptionEventData;
650
+ const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
651
+ const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
652
+ _position.strategyData.decoded.triggerData = triggerData;
653
+ _position.strategyData.decoded.subData = subData;
654
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
655
+ /// @TODO: what does even go here
656
+ /*
657
+ _position.specific = {
658
+ market: subData.market,
659
+ troveId: subData.troveId,
660
+ ratio: subData.targetRatio,
661
+ price: triggerData.price,
662
+ ratioState: triggerData.ratioState,
663
+ };
664
+ */
665
+ return _position;
666
+ }
647
667
  const parsingMethodsMapping = {
648
668
  [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
649
669
  [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
@@ -668,6 +688,8 @@ const parsingMethodsMapping = {
668
688
  [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
669
689
  [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
670
690
  [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
691
+ [Strategies.Identifiers.OpenOrderFromCollateral]: parseLiquityV2LeverageManagementOnPrice,
692
+ [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
671
693
  },
672
694
  [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
673
695
  [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
@@ -99,6 +99,7 @@ export declare const morphoBlueEncode: {
99
99
  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.MainnetIds)[] | (boolean | string[] | Bundles.BaseIds)[];
100
100
  };
101
101
  export declare const liquityV2Encode: {
102
- leverageManagement(market: EthereumAddress, troveId: string, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
102
+ leverageManagement(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
103
103
  closeOnPrice(strategyOrBundleId: number, market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
104
+ leverageManagementOnPrice(strategyOrBundleId: number, market: EthereumAddress, price: number, state: RatioState, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, targetRatio: number, isRepayOnPrice: boolean): (number | boolean | string[])[];
104
105
  };
@@ -237,15 +237,10 @@ export const morphoBlueEncode = {
237
237
  },
238
238
  };
239
239
  export const liquityV2Encode = {
240
- leverageManagement(market, troveId, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
240
+ leverageManagement(market, troveId, collToken, boldToken, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
241
241
  const isBundle = true;
242
- const isRepay = ratioState === RatioState.UNDER;
243
- const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, ratioState, targetRatio);
242
+ const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
244
243
  const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
245
- // TODO: we can hardcode right bundles after testing
246
- // const strategyOrBundleId = ratioState === RatioState.OVER
247
- // ? Bundles.MainnetIds.LIQUITY_V2_BOOST
248
- // : Bundles.MainnetIds.LIQUITY_V2_REPAY;
249
244
  return [strategyOrBundleId, isBundle, triggerData, subData];
250
245
  },
251
246
  closeOnPrice(strategyOrBundleId, market, troveId, collToken, boldToken, stopLossPrice = 0, stopLossType = CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = CloseToAssetType.COLLATERAL) {
@@ -253,8 +248,12 @@ export const liquityV2Encode = {
253
248
  const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
254
249
  const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
255
250
  const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
256
- // TODO: we can hardcode bundleID after testing
257
- // Bundles.MainnetIds.LIQUITY_V2_CLOSE;
258
251
  return [strategyOrBundleId, isBundle, triggerData, subData];
259
252
  },
253
+ leverageManagementOnPrice(strategyOrBundleId, market, price, state, troveId, collToken, boldToken, targetRatio, isRepayOnPrice) {
254
+ const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice);
255
+ const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
256
+ const isBundle = true;
257
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
258
+ },
260
259
  };
@@ -191,10 +191,12 @@ export declare const aaveV3LeverageManagementOnPriceSubData: {
191
191
  };
192
192
  };
193
193
  export declare const liquityV2LeverageManagementSubData: {
194
- encode: (market: EthereumAddress, troveId: string, ratioState: RatioState, targetRatio: number) => string[];
194
+ encode: (market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number) => string[];
195
195
  decode: (subData: string[]) => {
196
196
  market: string;
197
197
  troveId: string;
198
+ collToken: string;
199
+ boldToken: string;
198
200
  ratioState: RatioState;
199
201
  targetRatio: number;
200
202
  };
@@ -209,3 +211,13 @@ export declare const liquityV2CloseSubData: {
209
211
  closeType: CloseStrategyType;
210
212
  };
211
213
  };
214
+ export declare const liquityV2LeverageManagementOnPriceSubData: {
215
+ encode(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, targetRatio: number, isRepayOnPrice: boolean): string[];
216
+ decode(subData: string[]): {
217
+ market: EthereumAddress;
218
+ troveId: string;
219
+ collToken: EthereumAddress;
220
+ boldToken: EthereumAddress;
221
+ targetRatio: number;
222
+ };
223
+ };
@@ -468,9 +468,11 @@ export const aaveV3LeverageManagementOnPriceSubData = {
468
468
  },
469
469
  };
470
470
  export const liquityV2LeverageManagementSubData = {
471
- encode: (market, troveId, ratioState, targetRatio) => {
471
+ encode: (market, troveId, collToken, boldToken, ratioState, targetRatio) => {
472
472
  const marketEncoded = AbiCoder.encodeParameter('address', market);
473
473
  const troveIdEncoded = AbiCoder.encodeParameter('uint256', troveId);
474
+ const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
475
+ const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
474
476
  const ratioStateEncoded = AbiCoder.encodeParameter('uint8', ratioState);
475
477
  const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
476
478
  const isRepay = ratioState === RatioState.UNDER;
@@ -478,16 +480,27 @@ export const liquityV2LeverageManagementSubData = {
478
480
  const debtActionType = isRepay ? DebtActionType.PAYBACK : DebtActionType.BORROW;
479
481
  const collActionTypeEncoded = AbiCoder.encodeParameter('uint8', collActionType);
480
482
  const debtActionTypeEncoded = AbiCoder.encodeParameter('uint8', debtActionType);
481
- return [marketEncoded, troveIdEncoded, ratioStateEncoded, targetRatioEncoded, collActionTypeEncoded, debtActionTypeEncoded];
483
+ return [
484
+ marketEncoded,
485
+ troveIdEncoded,
486
+ collTokenEncoded,
487
+ boldTokenEncoded,
488
+ ratioStateEncoded,
489
+ targetRatioEncoded,
490
+ collActionTypeEncoded,
491
+ debtActionTypeEncoded,
492
+ ];
482
493
  },
483
494
  decode: (subData) => {
484
495
  const market = AbiCoder.decodeParameter('address', subData[0]);
485
496
  const troveId = AbiCoder.decodeParameter('uint256', subData[1]);
486
- const ratioState = AbiCoder.decodeParameter('uint8', subData[2]);
487
- const weiRatio = AbiCoder.decodeParameter('uint256', subData[3]);
497
+ const collToken = AbiCoder.decodeParameter('address', subData[2]);
498
+ const boldToken = AbiCoder.decodeParameter('address', subData[3]);
499
+ const ratioState = AbiCoder.decodeParameter('uint8', subData[4]);
500
+ const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]);
488
501
  const targetRatio = weiToRatioPercentage(weiRatio);
489
502
  return {
490
- market, troveId, ratioState, targetRatio,
503
+ market, troveId, collToken, boldToken, ratioState, targetRatio,
491
504
  };
492
505
  },
493
506
  };
@@ -499,6 +512,8 @@ export const liquityV2CloseSubData = {
499
512
  const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
500
513
  const wethAddress = getAssetInfo('WETH').address;
501
514
  const wethAddressEncoded = AbiCoder.encodeParameter('address', wethAddress);
515
+ const gasCompensation = new Dec('0.0375').mul(1e18).toString();
516
+ const gasCompensationEncoded = AbiCoder.encodeParameter('uint256', gasCompensation);
502
517
  const closeTypeEncoded = AbiCoder.encodeParameter('uint8', closeType);
503
518
  return [
504
519
  marketEncoded,
@@ -506,6 +521,7 @@ export const liquityV2CloseSubData = {
506
521
  collAddrEncoded,
507
522
  boldTokenEncoded,
508
523
  wethAddressEncoded,
524
+ gasCompensationEncoded,
509
525
  closeTypeEncoded,
510
526
  ];
511
527
  },
@@ -514,10 +530,43 @@ export const liquityV2CloseSubData = {
514
530
  const troveId = AbiCoder.decodeParameter('uint256', subData[1]);
515
531
  const collToken = AbiCoder.decodeParameter('address', subData[2]);
516
532
  const boldToken = AbiCoder.decodeParameter('address', subData[3]);
517
- // skip wethAddress
518
- const closeType = AbiCoder.decodeParameter('uint8', subData[5]);
533
+ // skip wethAddress and gasCompensation
534
+ const closeType = AbiCoder.decodeParameter('uint8', subData[6]);
519
535
  return {
520
536
  market, troveId, collToken, boldToken, closeType,
521
537
  };
522
538
  },
523
539
  };
540
+ export const liquityV2LeverageManagementOnPriceSubData = {
541
+ encode(market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice) {
542
+ const encodedMarket = AbiCoder.encodeParameter('address', market);
543
+ const encodedTroveId = AbiCoder.encodeParameter('uint256', troveId);
544
+ const encodedCollToken = AbiCoder.encodeParameter('address', collToken);
545
+ const encodedBoldToken = AbiCoder.encodeParameter('address', boldToken);
546
+ const encodedTargetRatio = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
547
+ const collActionType = isRepayOnPrice ? CollActionType.WITHDRAW : CollActionType.SUPPLY;
548
+ const debtActionType = isRepayOnPrice ? DebtActionType.PAYBACK : DebtActionType.BORROW;
549
+ const encodedCollActionType = AbiCoder.encodeParameter('uint8', collActionType);
550
+ const encodedDebtActionType = AbiCoder.encodeParameter('uint8', debtActionType);
551
+ return [
552
+ encodedMarket,
553
+ encodedTroveId,
554
+ encodedCollToken,
555
+ encodedBoldToken,
556
+ encodedTargetRatio,
557
+ encodedCollActionType,
558
+ encodedDebtActionType,
559
+ ];
560
+ },
561
+ decode(subData) {
562
+ const market = AbiCoder.decodeParameter('address', subData[0]);
563
+ const troveId = AbiCoder.decodeParameter('uint256', subData[1]);
564
+ const collToken = AbiCoder.decodeParameter('address', subData[2]);
565
+ const boldToken = AbiCoder.decodeParameter('address', subData[3]);
566
+ const weiRatio = AbiCoder.decodeParameter('uint256', subData[4]);
567
+ const targetRatio = weiToRatioPercentage(weiRatio);
568
+ return {
569
+ market, troveId, collToken, boldToken, targetRatio,
570
+ };
571
+ },
572
+ };
@@ -198,6 +198,14 @@ export declare const liquityV2RatioTrigger: {
198
198
  ratioState: number;
199
199
  };
200
200
  };
201
+ export declare const liquityV2QuotePriceTrigger: {
202
+ encode(market: EthereumAddress, price: number, ratioState: RatioState): string[];
203
+ decode(triggerData: string[]): {
204
+ market: string;
205
+ price: string;
206
+ ratioState: number;
207
+ };
208
+ };
201
209
  export declare const closePriceTrigger: {
202
210
  encode(tokenAddr: EthereumAddress, lowerPrice: number, upperPrice: number): string[];
203
211
  decode(triggerData: string[]): {
@@ -351,6 +351,22 @@ export const liquityV2RatioTrigger = {
351
351
  };
352
352
  },
353
353
  };
354
+ export const liquityV2QuotePriceTrigger = {
355
+ encode(market, price, ratioState) {
356
+ // Price is always in 18 decimals
357
+ const _price = new Dec(price.toString()).mul(Math.pow(10, 18)).floor().toString();
358
+ return [AbiCoder.encodeParameters(['address', 'uint256', 'uint8'], [market, _price, ratioState])];
359
+ },
360
+ decode(triggerData) {
361
+ const decodedData = AbiCoder.decodeParameters(['address', 'uint256', 'uint8'], triggerData[0]);
362
+ const price = new Dec(decodedData[1]).div(Math.pow(10, 18)).toDP(18).toString();
363
+ return {
364
+ market: decodedData[0],
365
+ price,
366
+ ratioState: Number(decodedData[2]),
367
+ };
368
+ },
369
+ };
354
370
  export const closePriceTrigger = {
355
371
  encode(tokenAddr, lowerPrice, upperPrice) {
356
372
  const lowerPriceFormatted = new Dec(lowerPrice).mul(1e8).floor().toString();
@@ -178,7 +178,9 @@ export declare namespace Bundles {
178
178
  AAVE_V3_REPAY_ON_PRICE = 37,
179
179
  LIQUITY_V2_REPAY = 39,
180
180
  LIQUITY_V2_BOOST = 40,
181
- LIQUITY_V2_CLOSE = 41
181
+ LIQUITY_V2_CLOSE = 41,
182
+ LIQUITY_V2_REPAY_ON_PRICE = 42,
183
+ LIQUITY_V2_BOOST_ON_PRICE = 43
182
184
  }
183
185
  enum OptimismIds {
184
186
  AAVE_V3_REPAY = 0,
@@ -199,6 +199,8 @@ export var Bundles;
199
199
  MainnetIds[MainnetIds["LIQUITY_V2_REPAY"] = 39] = "LIQUITY_V2_REPAY";
200
200
  MainnetIds[MainnetIds["LIQUITY_V2_BOOST"] = 40] = "LIQUITY_V2_BOOST";
201
201
  MainnetIds[MainnetIds["LIQUITY_V2_CLOSE"] = 41] = "LIQUITY_V2_CLOSE";
202
+ MainnetIds[MainnetIds["LIQUITY_V2_REPAY_ON_PRICE"] = 42] = "LIQUITY_V2_REPAY_ON_PRICE";
203
+ MainnetIds[MainnetIds["LIQUITY_V2_BOOST_ON_PRICE"] = 43] = "LIQUITY_V2_BOOST_ON_PRICE";
202
204
  })(MainnetIds = Bundles.MainnetIds || (Bundles.MainnetIds = {}));
203
205
  let OptimismIds;
204
206
  (function (OptimismIds) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/automation-sdk",
3
- "version": "3.1.4-dev-2",
3
+ "version": "3.1.4-dev-4",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -24,8 +24,8 @@
24
24
  "license": "ISC",
25
25
  "dependencies": {
26
26
  "@defisaver/eslint-config": "^1.0.1",
27
- "@defisaver/sdk": "^1.0.61",
28
- "@defisaver/tokens": "^1.5.50",
27
+ "@defisaver/sdk": "^1.2.16-dev-liquity-v2-5",
28
+ "@defisaver/tokens": "^1.5.52-dev-5",
29
29
  "@ethersproject/address": "^5.0.10",
30
30
  "@ethersproject/solidity": "^5.0.9",
31
31
  "decimal.js": "^10.4.3",
@@ -391,6 +391,16 @@ export const MAINNET_BUNDLES_INFO: MainnetBundleInfo = {
391
391
  strategyId: Strategies.Identifiers.CloseOnPrice,
392
392
  protocol: PROTOCOLS.LiquityV2,
393
393
  },
394
+ [Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE]: {
395
+ strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_REPAY_ON_PRICE,
396
+ strategyId: Strategies.Identifiers.OpenOrderFromCollateral,
397
+ protocol: PROTOCOLS.LiquityV2,
398
+ },
399
+ [Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE]: {
400
+ strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_BOOST_ON_PRICE,
401
+ strategyId: Strategies.Identifiers.RepayOnPrice,
402
+ protocol: PROTOCOLS.LiquityV2,
403
+ },
394
404
  };
395
405
 
396
406
  export const OPTIMISM_BUNDLES_INFO: OptimismBundleInfo = {
@@ -885,6 +885,31 @@ function parseLiquityV2CloseOnPrice(position: Position.Automated, parseData: Par
885
885
  return _position;
886
886
  }
887
887
 
888
+ function parseLiquityV2LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
889
+ const _position = cloneDeep(position);
890
+
891
+ const { subStruct } = parseData.subscriptionEventData;
892
+
893
+ const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
894
+ const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
895
+
896
+ _position.strategyData.decoded.triggerData = triggerData;
897
+ _position.strategyData.decoded.subData = subData;
898
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
899
+ /// @TODO: what does even go here
900
+ /*
901
+ _position.specific = {
902
+ market: subData.market,
903
+ troveId: subData.troveId,
904
+ ratio: subData.targetRatio,
905
+ price: triggerData.price,
906
+ ratioState: triggerData.ratioState,
907
+ };
908
+ */
909
+
910
+ return _position;
911
+ }
912
+
888
913
  const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
889
914
  [ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
890
915
  [Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
@@ -909,6 +934,8 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
909
934
  [Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
910
935
  [Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
911
936
  [Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
937
+ [Strategies.Identifiers.OpenOrderFromCollateral]: parseLiquityV2LeverageManagementOnPrice,
938
+ [Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
912
939
  },
913
940
  [ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
914
941
  [Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
@@ -530,22 +530,17 @@ export const liquityV2Encode = {
530
530
  leverageManagement(
531
531
  market: EthereumAddress,
532
532
  troveId: string,
533
+ collToken: EthereumAddress,
534
+ boldToken: EthereumAddress,
533
535
  ratioState: RatioState,
534
536
  targetRatio: number,
535
537
  triggerRatio: number,
536
538
  strategyOrBundleId: number,
537
539
  ) {
538
540
  const isBundle = true;
539
- const isRepay = ratioState === RatioState.UNDER;
540
-
541
- const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, ratioState, targetRatio);
541
+ const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
542
542
  const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
543
543
 
544
- // TODO: we can hardcode right bundles after testing
545
- // const strategyOrBundleId = ratioState === RatioState.OVER
546
- // ? Bundles.MainnetIds.LIQUITY_V2_BOOST
547
- // : Bundles.MainnetIds.LIQUITY_V2_REPAY;
548
-
549
544
  return [strategyOrBundleId, isBundle, triggerData, subData];
550
545
  },
551
546
  closeOnPrice(
@@ -565,9 +560,25 @@ export const liquityV2Encode = {
565
560
  const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
566
561
  const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
567
562
 
568
- // TODO: we can hardcode bundleID after testing
569
- // Bundles.MainnetIds.LIQUITY_V2_CLOSE;
570
-
571
563
  return [strategyOrBundleId, isBundle, triggerData, subData];
572
564
  },
565
+ leverageManagementOnPrice(
566
+ strategyOrBundleId: number,
567
+ market: EthereumAddress,
568
+ price: number,
569
+ state: RatioState,
570
+ troveId: string,
571
+ collToken: EthereumAddress,
572
+ boldToken: EthereumAddress,
573
+ targetRatio: number,
574
+ isRepayOnPrice: boolean,
575
+ ) {
576
+ const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(
577
+ market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice,
578
+ );
579
+
580
+ const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
581
+ const isBundle = true;
582
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
583
+ },
573
584
  };
@@ -650,11 +650,15 @@ export const liquityV2LeverageManagementSubData = {
650
650
  encode: (
651
651
  market: EthereumAddress,
652
652
  troveId: string,
653
+ collToken: EthereumAddress,
654
+ boldToken: EthereumAddress,
653
655
  ratioState: RatioState,
654
656
  targetRatio: number,
655
657
  ) => {
656
658
  const marketEncoded = AbiCoder.encodeParameter('address', market);
657
659
  const troveIdEncoded = AbiCoder.encodeParameter('uint256', troveId);
660
+ const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
661
+ const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
658
662
  const ratioStateEncoded = AbiCoder.encodeParameter('uint8', ratioState);
659
663
  const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
660
664
 
@@ -665,17 +669,28 @@ export const liquityV2LeverageManagementSubData = {
665
669
  const collActionTypeEncoded = AbiCoder.encodeParameter('uint8', collActionType);
666
670
  const debtActionTypeEncoded = AbiCoder.encodeParameter('uint8', debtActionType);
667
671
 
668
- return [marketEncoded, troveIdEncoded, ratioStateEncoded, targetRatioEncoded, collActionTypeEncoded, debtActionTypeEncoded];
672
+ return [
673
+ marketEncoded,
674
+ troveIdEncoded,
675
+ collTokenEncoded,
676
+ boldTokenEncoded,
677
+ ratioStateEncoded,
678
+ targetRatioEncoded,
679
+ collActionTypeEncoded,
680
+ debtActionTypeEncoded,
681
+ ];
669
682
  },
670
683
  decode: (subData: SubData) => {
671
684
  const market = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
672
685
  const troveId = AbiCoder.decodeParameter('uint256', subData[1]) as any as string;
673
- const ratioState = AbiCoder.decodeParameter('uint8', subData[2]) as any as RatioState;
674
- const weiRatio = AbiCoder.decodeParameter('uint256', subData[3]) as any as string;
686
+ const collToken = AbiCoder.decodeParameter('address', subData[2]) as any as EthereumAddress;
687
+ const boldToken = AbiCoder.decodeParameter('address', subData[3]) as any as EthereumAddress;
688
+ const ratioState = AbiCoder.decodeParameter('uint8', subData[4]) as any as RatioState;
689
+ const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]) as any as string;
675
690
  const targetRatio = weiToRatioPercentage(weiRatio);
676
691
 
677
692
  return {
678
- market, troveId, ratioState, targetRatio,
693
+ market, troveId, collToken, boldToken, ratioState, targetRatio,
679
694
  };
680
695
  },
681
696
  };
@@ -694,6 +709,8 @@ export const liquityV2CloseSubData = {
694
709
  const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
695
710
  const wethAddress = getAssetInfo('WETH').address;
696
711
  const wethAddressEncoded = AbiCoder.encodeParameter('address', wethAddress);
712
+ const gasCompensation = new Dec('0.0375').mul(1e18).toString();
713
+ const gasCompensationEncoded = AbiCoder.encodeParameter('uint256', gasCompensation);
697
714
  const closeTypeEncoded = AbiCoder.encodeParameter('uint8', closeType);
698
715
 
699
716
  return [
@@ -702,6 +719,7 @@ export const liquityV2CloseSubData = {
702
719
  collAddrEncoded,
703
720
  boldTokenEncoded,
704
721
  wethAddressEncoded,
722
+ gasCompensationEncoded,
705
723
  closeTypeEncoded,
706
724
  ];
707
725
  },
@@ -716,11 +734,62 @@ export const liquityV2CloseSubData = {
716
734
  const troveId = AbiCoder.decodeParameter('uint256', subData[1]) as any as string;
717
735
  const collToken = AbiCoder.decodeParameter('address', subData[2]) as any as EthereumAddress;
718
736
  const boldToken = AbiCoder.decodeParameter('address', subData[3]) as any as EthereumAddress;
719
- // skip wethAddress
720
- const closeType = AbiCoder.decodeParameter('uint8', subData[5]) as any as CloseStrategyType;
737
+ // skip wethAddress and gasCompensation
738
+ const closeType = AbiCoder.decodeParameter('uint8', subData[6]) as any as CloseStrategyType;
721
739
 
722
740
  return {
723
741
  market, troveId, collToken, boldToken, closeType,
724
742
  };
725
743
  },
726
744
  };
745
+
746
+ export const liquityV2LeverageManagementOnPriceSubData = {
747
+ encode(
748
+ market: EthereumAddress,
749
+ troveId: string,
750
+ collToken: EthereumAddress,
751
+ boldToken: EthereumAddress,
752
+ targetRatio: number,
753
+ isRepayOnPrice: boolean,
754
+ ): SubData {
755
+ const encodedMarket = AbiCoder.encodeParameter('address', market);
756
+ const encodedTroveId = AbiCoder.encodeParameter('uint256', troveId);
757
+ const encodedCollToken = AbiCoder.encodeParameter('address', collToken);
758
+ const encodedBoldToken = AbiCoder.encodeParameter('address', boldToken);
759
+ const encodedTargetRatio = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
760
+
761
+ const collActionType = isRepayOnPrice ? CollActionType.WITHDRAW : CollActionType.SUPPLY;
762
+ const debtActionType = isRepayOnPrice ? DebtActionType.PAYBACK : DebtActionType.BORROW;
763
+
764
+ const encodedCollActionType = AbiCoder.encodeParameter('uint8', collActionType);
765
+ const encodedDebtActionType = AbiCoder.encodeParameter('uint8', debtActionType);
766
+
767
+ return [
768
+ encodedMarket,
769
+ encodedTroveId,
770
+ encodedCollToken,
771
+ encodedBoldToken,
772
+ encodedTargetRatio,
773
+ encodedCollActionType,
774
+ encodedDebtActionType,
775
+ ];
776
+ },
777
+ decode(subData: SubData): {
778
+ market: EthereumAddress,
779
+ troveId: string,
780
+ collToken: EthereumAddress,
781
+ boldToken: EthereumAddress,
782
+ targetRatio: number,
783
+ } {
784
+ const market = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
785
+ const troveId = AbiCoder.decodeParameter('uint256', subData[1]) as any as string;
786
+ const collToken = AbiCoder.decodeParameter('address', subData[2]) as unknown as EthereumAddress;
787
+ const boldToken = AbiCoder.decodeParameter('address', subData[3]) as unknown as EthereumAddress;
788
+ const weiRatio = AbiCoder.decodeParameter('uint256', subData[4]) as any as string;
789
+ const targetRatio = weiToRatioPercentage(weiRatio);
790
+
791
+ return {
792
+ market, troveId, collToken, boldToken, targetRatio,
793
+ };
794
+ },
795
+ };
@@ -471,6 +471,29 @@ export const liquityV2RatioTrigger = {
471
471
  },
472
472
  };
473
473
 
474
+ export const liquityV2QuotePriceTrigger = {
475
+ encode(
476
+ market: EthereumAddress,
477
+ price: number,
478
+ ratioState: RatioState,
479
+ ) {
480
+ // Price is always in 18 decimals
481
+ const _price = new Dec(price.toString()).mul(10 ** 18).floor().toString();
482
+ return [AbiCoder.encodeParameters(['address', 'uint256', 'uint8'], [market, _price, ratioState])];
483
+ },
484
+ decode(
485
+ triggerData: TriggerData,
486
+ ) {
487
+ const decodedData = AbiCoder.decodeParameters(['address', 'uint256', 'uint8'], triggerData[0]);
488
+ const price = new Dec(decodedData[1] as string).div(10 ** 18).toDP(18).toString();
489
+ return {
490
+ market: decodedData[0] as EthereumAddress,
491
+ price,
492
+ ratioState: Number(decodedData[2]),
493
+ };
494
+ },
495
+ };
496
+
474
497
  export const closePriceTrigger = {
475
498
  encode(
476
499
  tokenAddr: EthereumAddress,
@@ -194,6 +194,8 @@ export namespace Bundles {
194
194
  LIQUITY_V2_REPAY = 39,
195
195
  LIQUITY_V2_BOOST = 40,
196
196
  LIQUITY_V2_CLOSE = 41,
197
+ LIQUITY_V2_REPAY_ON_PRICE = 42,
198
+ LIQUITY_V2_BOOST_ON_PRICE = 43,
197
199
  }
198
200
 
199
201
  export enum OptimismIds {