@defisaver/automation-sdk 3.1.4-dev-2 → 3.1.4-dev-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/constants/index.js +10 -0
- package/cjs/services/strategiesService.js +22 -0
- package/cjs/services/strategySubService.d.ts +2 -1
- package/cjs/services/strategySubService.js +8 -9
- package/cjs/services/subDataService.d.ts +13 -1
- package/cjs/services/subDataService.js +57 -8
- package/cjs/services/triggerService.d.ts +8 -0
- package/cjs/services/triggerService.js +17 -1
- package/cjs/types/enums.d.ts +3 -1
- package/cjs/types/enums.js +2 -0
- package/esm/constants/index.js +10 -0
- package/esm/services/strategiesService.js +22 -0
- package/esm/services/strategySubService.d.ts +2 -1
- package/esm/services/strategySubService.js +8 -9
- package/esm/services/subDataService.d.ts +13 -1
- package/esm/services/subDataService.js +56 -7
- package/esm/services/triggerService.d.ts +8 -0
- package/esm/services/triggerService.js +16 -0
- package/esm/types/enums.d.ts +3 -1
- package/esm/types/enums.js +2 -0
- package/package.json +3 -3
- package/src/constants/index.ts +10 -0
- package/src/services/strategiesService.ts +27 -0
- package/src/services/strategySubService.ts +22 -11
- package/src/services/subDataService.ts +75 -6
- package/src/services/triggerService.ts +23 -0
- package/src/types/enums.ts +2 -0
package/cjs/constants/index.js
CHANGED
|
@@ -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
|
|
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 [
|
|
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
|
|
493
|
-
const
|
|
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[
|
|
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();
|
package/cjs/types/enums.d.ts
CHANGED
|
@@ -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,
|
package/cjs/types/enums.js
CHANGED
|
@@ -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) {
|
package/esm/constants/index.js
CHANGED
|
@@ -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
|
|
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 [
|
|
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
|
|
487
|
-
const
|
|
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[
|
|
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();
|
package/esm/types/enums.d.ts
CHANGED
|
@@ -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,
|
package/esm/types/enums.js
CHANGED
|
@@ -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-
|
|
3
|
+
"version": "3.1.4-dev-3",
|
|
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.
|
|
28
|
-
"@defisaver/tokens": "^1.5.
|
|
27
|
+
"@defisaver/sdk": "^1.2.16-dev-liquity-v2-4",
|
|
28
|
+
"@defisaver/tokens": "^1.5.52-dev-4",
|
|
29
29
|
"@ethersproject/address": "^5.0.10",
|
|
30
30
|
"@ethersproject/solidity": "^5.0.9",
|
|
31
31
|
"decimal.js": "^10.4.3",
|
package/src/constants/index.ts
CHANGED
|
@@ -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
|
|
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 [
|
|
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
|
|
674
|
-
const
|
|
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[
|
|
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,
|
package/src/types/enums.ts
CHANGED