@defisaver/automation-sdk 3.1.4 → 3.1.5
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 +32 -0
- package/cjs/services/strategySubService.d.ts +1 -0
- package/cjs/services/strategySubService.js +5 -0
- package/cjs/services/subDataService.d.ts +12 -0
- package/cjs/services/subDataService.js +32 -1
- package/cjs/services/triggerService.d.ts +10 -0
- package/cjs/services/triggerService.js +19 -1
- package/cjs/types/enums.d.ts +5 -2
- package/cjs/types/enums.js +3 -0
- package/cjs/types/index.d.ts +5 -1
- package/esm/constants/index.js +10 -0
- package/esm/services/strategiesService.js +29 -0
- package/esm/services/strategySubService.d.ts +1 -0
- package/esm/services/strategySubService.js +5 -0
- package/esm/services/subDataService.d.ts +12 -0
- package/esm/services/subDataService.js +31 -0
- package/esm/services/triggerService.d.ts +10 -0
- package/esm/services/triggerService.js +18 -0
- package/esm/types/enums.d.ts +5 -2
- package/esm/types/enums.js +3 -0
- package/esm/types/index.d.ts +5 -1
- package/package.json +1 -1
- package/src/constants/index.ts +10 -0
- package/src/services/strategiesService.ts +40 -0
- package/src/services/strategySubService.ts +17 -0
- package/src/services/subDataService.ts +41 -0
- package/src/services/triggerService.ts +29 -0
- package/src/types/enums.ts +3 -0
- package/src/types/index.ts +7 -1
package/cjs/constants/index.js
CHANGED
|
@@ -353,6 +353,11 @@ exports.MAINNET_BUNDLES_INFO = {
|
|
|
353
353
|
strategyId: enums_1.Strategies.Identifiers.RepayOnPrice,
|
|
354
354
|
protocol: exports.PROTOCOLS.AaveV3,
|
|
355
355
|
},
|
|
356
|
+
[enums_1.Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
357
|
+
strategyOrBundleId: enums_1.Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
358
|
+
strategyId: enums_1.Strategies.Identifiers.BoostOnPrice,
|
|
359
|
+
protocol: exports.PROTOCOLS.MorphoBlue,
|
|
360
|
+
},
|
|
356
361
|
};
|
|
357
362
|
exports.OPTIMISM_BUNDLES_INFO = {
|
|
358
363
|
[enums_1.Bundles.OptimismIds.AAVE_V3_REPAY]: {
|
|
@@ -437,6 +442,11 @@ exports.BASE_BUNDLES_INFO = {
|
|
|
437
442
|
strategyId: enums_1.Strategies.Identifiers.RepayOnPrice,
|
|
438
443
|
protocol: exports.PROTOCOLS.AaveV3,
|
|
439
444
|
},
|
|
445
|
+
[enums_1.Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
446
|
+
strategyOrBundleId: enums_1.Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
447
|
+
strategyId: enums_1.Strategies.Identifiers.BoostOnPrice,
|
|
448
|
+
protocol: exports.PROTOCOLS.MorphoBlue,
|
|
449
|
+
},
|
|
440
450
|
};
|
|
441
451
|
exports.ARBITRUM_BUNDLES_INFO = {
|
|
442
452
|
[enums_1.Bundles.ArbitrumIds.AAVE_V3_REPAY]: {
|
|
@@ -22,15 +22,20 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
29
|
exports.parseStrategiesAutomatedPosition = void 0;
|
|
27
30
|
const tokens_1 = require("@defisaver/tokens");
|
|
28
31
|
const lodash_1 = require("lodash");
|
|
32
|
+
const web3_1 = __importDefault(require("web3"));
|
|
29
33
|
const constants_1 = require("../constants");
|
|
30
34
|
const enums_1 = require("../types/enums");
|
|
31
35
|
const utils_1 = require("./utils");
|
|
32
36
|
const subDataService = __importStar(require("./subDataService"));
|
|
33
37
|
const triggerService = __importStar(require("./triggerService"));
|
|
38
|
+
const web3 = new web3_1.default();
|
|
34
39
|
const SPARK_MARKET_ADDRESSES = {
|
|
35
40
|
[enums_1.ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
|
|
36
41
|
};
|
|
@@ -590,6 +595,32 @@ function parseMorphoBlueLeverageManagement(position, parseData) {
|
|
|
590
595
|
_position.strategy.strategyId = isEOA ? enums_1.Strategies.IdOverrides.EoaLeverageManagement : enums_1.Strategies.IdOverrides.LeverageManagement;
|
|
591
596
|
return _position;
|
|
592
597
|
}
|
|
598
|
+
function parseMorphoBlueLeverageManagementOnPrice(position, parseData) {
|
|
599
|
+
const _position = (0, lodash_1.cloneDeep)(position);
|
|
600
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
601
|
+
const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
|
|
602
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
|
|
603
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
604
|
+
_position.strategyData.decoded.subData = subData;
|
|
605
|
+
_position.positionId = (0, utils_1.getPositionId)(_position.chainId, _position.protocol.id, _position.owner, Math.random());
|
|
606
|
+
const marketIdEncodedData = web3.eth.abi.encodeParameters(['address', 'address', 'address', 'address', 'uint256'], [
|
|
607
|
+
subData.loanToken,
|
|
608
|
+
subData.collToken,
|
|
609
|
+
subData.oracle,
|
|
610
|
+
subData.irm,
|
|
611
|
+
subData.lltv,
|
|
612
|
+
]);
|
|
613
|
+
const marketId = web3.utils.keccak256(marketIdEncodedData);
|
|
614
|
+
_position.specific = {
|
|
615
|
+
subHash: _position.subHash,
|
|
616
|
+
marketId,
|
|
617
|
+
collAsset: subData.collToken,
|
|
618
|
+
debtAsset: subData.loanToken,
|
|
619
|
+
price: triggerData.price,
|
|
620
|
+
ratio: subData.targetRatio,
|
|
621
|
+
};
|
|
622
|
+
return _position;
|
|
623
|
+
}
|
|
593
624
|
function parseAaveV3LeverageManagementOnPrice(position, parseData) {
|
|
594
625
|
const _position = (0, lodash_1.cloneDeep)(position);
|
|
595
626
|
const { subStruct } = parseData.subscriptionEventData;
|
|
@@ -682,6 +713,7 @@ const parsingMethodsMapping = {
|
|
|
682
713
|
[enums_1.Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
|
|
683
714
|
[enums_1.Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
|
|
684
715
|
[enums_1.Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
|
|
716
|
+
[enums_1.Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
|
|
685
717
|
},
|
|
686
718
|
};
|
|
687
719
|
function getParsingMethod(id, strategy) {
|
|
@@ -97,4 +97,5 @@ export declare const crvUSDEncode: {
|
|
|
97
97
|
};
|
|
98
98
|
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
|
+
leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, targetRatio: number, price: number, priceState: RatioState): (number | boolean | string[])[];
|
|
100
101
|
};
|
|
@@ -264,4 +264,9 @@ exports.morphoBlueEncode = {
|
|
|
264
264
|
const isBundle = true;
|
|
265
265
|
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
266
266
|
},
|
|
267
|
+
leverageManagementOnPrice(strategyOrBundleId, isBundle = true, loanToken, collToken, oracle, irm, lltv, user, targetRatio, price, priceState) {
|
|
268
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
|
|
269
|
+
const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
|
|
270
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
271
|
+
},
|
|
267
272
|
};
|
|
@@ -190,3 +190,15 @@ export declare const aaveV3LeverageManagementOnPriceSubData: {
|
|
|
190
190
|
targetRatio: number;
|
|
191
191
|
};
|
|
192
192
|
};
|
|
193
|
+
export declare const morphoBlueLeverageManagementOnPriceSubData: {
|
|
194
|
+
encode(loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, targetRatio: number, user: EthereumAddress): string[];
|
|
195
|
+
decode(subData: string[]): {
|
|
196
|
+
loanToken: string;
|
|
197
|
+
collToken: string;
|
|
198
|
+
oracle: string;
|
|
199
|
+
irm: string;
|
|
200
|
+
lltv: string;
|
|
201
|
+
targetRatio: number;
|
|
202
|
+
user: string;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
@@ -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.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.morphoBlueLeverageManagementOnPriceSubData = 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");
|
|
@@ -473,3 +473,34 @@ exports.aaveV3LeverageManagementOnPriceSubData = {
|
|
|
473
473
|
};
|
|
474
474
|
},
|
|
475
475
|
};
|
|
476
|
+
exports.morphoBlueLeverageManagementOnPriceSubData = {
|
|
477
|
+
encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user) {
|
|
478
|
+
const loanTokenEncoded = web3_eth_abi_1.default.encodeParameter('address', loanToken);
|
|
479
|
+
const collTokenEncoded = web3_eth_abi_1.default.encodeParameter('address', collToken);
|
|
480
|
+
const oracleEncoded = web3_eth_abi_1.default.encodeParameter('address', oracle);
|
|
481
|
+
const irmEncoded = web3_eth_abi_1.default.encodeParameter('address', irm);
|
|
482
|
+
const lltvEncoded = web3_eth_abi_1.default.encodeParameter('uint256', lltv);
|
|
483
|
+
const targetRatioEncoded = web3_eth_abi_1.default.encodeParameter('uint256', (0, utils_1.ratioPercentageToWei)(targetRatio));
|
|
484
|
+
const userEncoded = web3_eth_abi_1.default.encodeParameter('address', user);
|
|
485
|
+
return [loanTokenEncoded, collTokenEncoded, oracleEncoded, irmEncoded, lltvEncoded, targetRatioEncoded, userEncoded];
|
|
486
|
+
},
|
|
487
|
+
decode(subData) {
|
|
488
|
+
const loanToken = web3_eth_abi_1.default.decodeParameter('address', subData[0]);
|
|
489
|
+
const collToken = web3_eth_abi_1.default.decodeParameter('address', subData[1]);
|
|
490
|
+
const oracle = web3_eth_abi_1.default.decodeParameter('address', subData[2]);
|
|
491
|
+
const irm = web3_eth_abi_1.default.decodeParameter('address', subData[3]);
|
|
492
|
+
const lltv = web3_eth_abi_1.default.decodeParameter('uint256', subData[4]);
|
|
493
|
+
const weiRatio = web3_eth_abi_1.default.decodeParameter('uint256', subData[5]);
|
|
494
|
+
const targetRatio = (0, utils_1.weiToRatioPercentage)(weiRatio);
|
|
495
|
+
const user = web3_eth_abi_1.default.decodeParameter('address', subData[6]);
|
|
496
|
+
return {
|
|
497
|
+
loanToken,
|
|
498
|
+
collToken,
|
|
499
|
+
oracle,
|
|
500
|
+
irm,
|
|
501
|
+
lltv,
|
|
502
|
+
targetRatio,
|
|
503
|
+
user,
|
|
504
|
+
};
|
|
505
|
+
},
|
|
506
|
+
};
|
|
@@ -189,3 +189,13 @@ export declare const morphoBlueRatioTrigger: {
|
|
|
189
189
|
ratioState: number;
|
|
190
190
|
};
|
|
191
191
|
};
|
|
192
|
+
export declare const morphoBluePriceTrigger: {
|
|
193
|
+
encode(oracle: EthereumAddress, collateralToken: EthereumAddress, loanToken: EthereumAddress, price: number, priceState: RatioState): string[];
|
|
194
|
+
decode(triggerData: string[]): {
|
|
195
|
+
oracle: string;
|
|
196
|
+
collateralToken: string;
|
|
197
|
+
loanToken: string;
|
|
198
|
+
price: string;
|
|
199
|
+
priceState: number;
|
|
200
|
+
};
|
|
201
|
+
};
|
|
@@ -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.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.morphoBluePriceTrigger = 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"));
|
|
@@ -365,3 +365,21 @@ exports.morphoBlueRatioTrigger = {
|
|
|
365
365
|
};
|
|
366
366
|
},
|
|
367
367
|
};
|
|
368
|
+
exports.morphoBluePriceTrigger = {
|
|
369
|
+
encode(oracle, collateralToken, loanToken, price, priceState) {
|
|
370
|
+
const _price = new decimal_js_1.default(price.toString()).mul(1e8).floor().toString();
|
|
371
|
+
return [
|
|
372
|
+
web3_eth_abi_1.default.encodeParameters(['address', 'address', 'address', 'uint256', 'uint8'], [oracle, collateralToken, loanToken, _price, priceState]),
|
|
373
|
+
];
|
|
374
|
+
},
|
|
375
|
+
decode(triggerData) {
|
|
376
|
+
const decodedData = web3_eth_abi_1.default.decodeParameters(['address', 'address', 'address', 'uint256', 'uint8'], triggerData[0]);
|
|
377
|
+
return {
|
|
378
|
+
oracle: decodedData[0],
|
|
379
|
+
collateralToken: decodedData[1],
|
|
380
|
+
loanToken: decodedData[2],
|
|
381
|
+
price: new decimal_js_1.default(decodedData[3]).div(1e8).toString(),
|
|
382
|
+
priceState: Number(decodedData[4]),
|
|
383
|
+
};
|
|
384
|
+
},
|
|
385
|
+
};
|
package/cjs/types/enums.d.ts
CHANGED
|
@@ -98,6 +98,7 @@ export declare namespace Strategies {
|
|
|
98
98
|
DebtInFrontRepay = "debt-in-front-repay",
|
|
99
99
|
OpenOrderFromCollateral = "open-order-from-collateral",
|
|
100
100
|
OpenOrderFromDebt = "open-order-from-debt",
|
|
101
|
+
BoostOnPrice = "boost-on-price",
|
|
101
102
|
RepayOnPrice = "repay-on-price"
|
|
102
103
|
}
|
|
103
104
|
enum IdOverrides {
|
|
@@ -151,7 +152,8 @@ export declare namespace Bundles {
|
|
|
151
152
|
MORPHO_BLUE_EOA_REPAY = 34,
|
|
152
153
|
MORPHO_BLUE_EOA_BOOST = 35,
|
|
153
154
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 36,
|
|
154
|
-
AAVE_V3_REPAY_ON_PRICE = 37
|
|
155
|
+
AAVE_V3_REPAY_ON_PRICE = 37,
|
|
156
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 38
|
|
155
157
|
}
|
|
156
158
|
enum OptimismIds {
|
|
157
159
|
AAVE_V3_REPAY = 0,
|
|
@@ -171,7 +173,8 @@ export declare namespace Bundles {
|
|
|
171
173
|
MORPHO_BLUE_REPAY = 8,
|
|
172
174
|
MORPHO_BLUE_BOOST = 9,
|
|
173
175
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 10,
|
|
174
|
-
AAVE_V3_REPAY_ON_PRICE = 11
|
|
176
|
+
AAVE_V3_REPAY_ON_PRICE = 11,
|
|
177
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 12
|
|
175
178
|
}
|
|
176
179
|
enum ArbitrumIds {
|
|
177
180
|
AAVE_V3_REPAY = 0,
|
package/cjs/types/enums.js
CHANGED
|
@@ -114,6 +114,7 @@ var Strategies;
|
|
|
114
114
|
Identifiers["DebtInFrontRepay"] = "debt-in-front-repay";
|
|
115
115
|
Identifiers["OpenOrderFromCollateral"] = "open-order-from-collateral";
|
|
116
116
|
Identifiers["OpenOrderFromDebt"] = "open-order-from-debt";
|
|
117
|
+
Identifiers["BoostOnPrice"] = "boost-on-price";
|
|
117
118
|
Identifiers["RepayOnPrice"] = "repay-on-price";
|
|
118
119
|
})(Identifiers = Strategies.Identifiers || (Strategies.Identifiers = {}));
|
|
119
120
|
let IdOverrides;
|
|
@@ -171,6 +172,7 @@ var Bundles;
|
|
|
171
172
|
MainnetIds[MainnetIds["MORPHO_BLUE_EOA_BOOST"] = 35] = "MORPHO_BLUE_EOA_BOOST";
|
|
172
173
|
MainnetIds[MainnetIds["AAVE_V3_OPEN_ORDER_FROM_COLLATERAL"] = 36] = "AAVE_V3_OPEN_ORDER_FROM_COLLATERAL";
|
|
173
174
|
MainnetIds[MainnetIds["AAVE_V3_REPAY_ON_PRICE"] = 37] = "AAVE_V3_REPAY_ON_PRICE";
|
|
175
|
+
MainnetIds[MainnetIds["MORPHO_BLUE_BOOST_ON_PRICE"] = 38] = "MORPHO_BLUE_BOOST_ON_PRICE";
|
|
174
176
|
})(MainnetIds = Bundles.MainnetIds || (Bundles.MainnetIds = {}));
|
|
175
177
|
let OptimismIds;
|
|
176
178
|
(function (OptimismIds) {
|
|
@@ -193,6 +195,7 @@ var Bundles;
|
|
|
193
195
|
BaseIds[BaseIds["MORPHO_BLUE_BOOST"] = 9] = "MORPHO_BLUE_BOOST";
|
|
194
196
|
BaseIds[BaseIds["AAVE_V3_OPEN_ORDER_FROM_COLLATERAL"] = 10] = "AAVE_V3_OPEN_ORDER_FROM_COLLATERAL";
|
|
195
197
|
BaseIds[BaseIds["AAVE_V3_REPAY_ON_PRICE"] = 11] = "AAVE_V3_REPAY_ON_PRICE";
|
|
198
|
+
BaseIds[BaseIds["MORPHO_BLUE_BOOST_ON_PRICE"] = 12] = "MORPHO_BLUE_BOOST_ON_PRICE";
|
|
196
199
|
})(BaseIds = Bundles.BaseIds || (Bundles.BaseIds = {}));
|
|
197
200
|
let ArbitrumIds;
|
|
198
201
|
(function (ArbitrumIds) {
|
package/cjs/types/index.d.ts
CHANGED
|
@@ -123,6 +123,10 @@ export declare namespace Position {
|
|
|
123
123
|
interface BoostOnPriceAave extends CloseOnPriceAave {
|
|
124
124
|
ratio: number;
|
|
125
125
|
}
|
|
126
|
+
interface BoostOnPriceMorpho extends Base {
|
|
127
|
+
marketId: string;
|
|
128
|
+
subHash: string;
|
|
129
|
+
}
|
|
126
130
|
interface CloseOnPriceWithMaximumGasPriceAave extends Base {
|
|
127
131
|
collAsset: EthereumAddress;
|
|
128
132
|
collAssetId: number;
|
|
@@ -148,7 +152,7 @@ export declare namespace Position {
|
|
|
148
152
|
subHashRepay?: string;
|
|
149
153
|
}
|
|
150
154
|
}
|
|
151
|
-
type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD;
|
|
155
|
+
type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD | Specific.BoostOnPriceMorpho;
|
|
152
156
|
interface Automated {
|
|
153
157
|
chainId: ChainId;
|
|
154
158
|
positionId: string;
|
package/esm/constants/index.js
CHANGED
|
@@ -347,6 +347,11 @@ export const MAINNET_BUNDLES_INFO = {
|
|
|
347
347
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
348
348
|
protocol: PROTOCOLS.AaveV3,
|
|
349
349
|
},
|
|
350
|
+
[Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
351
|
+
strategyOrBundleId: Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
352
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
353
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
354
|
+
},
|
|
350
355
|
};
|
|
351
356
|
export const OPTIMISM_BUNDLES_INFO = {
|
|
352
357
|
[Bundles.OptimismIds.AAVE_V3_REPAY]: {
|
|
@@ -431,6 +436,11 @@ export const BASE_BUNDLES_INFO = {
|
|
|
431
436
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
432
437
|
protocol: PROTOCOLS.AaveV3,
|
|
433
438
|
},
|
|
439
|
+
[Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
440
|
+
strategyOrBundleId: Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
441
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
442
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
443
|
+
},
|
|
434
444
|
};
|
|
435
445
|
export const ARBITRUM_BUNDLES_INFO = {
|
|
436
446
|
[Bundles.ArbitrumIds.AAVE_V3_REPAY]: {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { getAssetInfoByAddress } from '@defisaver/tokens';
|
|
2
2
|
import { cloneDeep } from 'lodash';
|
|
3
|
+
import Web3 from 'web3';
|
|
3
4
|
import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
|
|
4
5
|
import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
|
|
5
6
|
import { getPositionId, getRatioStateInfoForAaveCloseStrategy, isRatioStateOver, wethToEthByAddress, } from './utils';
|
|
6
7
|
import * as subDataService from './subDataService';
|
|
7
8
|
import * as triggerService from './triggerService';
|
|
9
|
+
const web3 = new Web3();
|
|
8
10
|
const SPARK_MARKET_ADDRESSES = {
|
|
9
11
|
[ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
|
|
10
12
|
};
|
|
@@ -564,6 +566,32 @@ function parseMorphoBlueLeverageManagement(position, parseData) {
|
|
|
564
566
|
_position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
|
|
565
567
|
return _position;
|
|
566
568
|
}
|
|
569
|
+
function parseMorphoBlueLeverageManagementOnPrice(position, parseData) {
|
|
570
|
+
const _position = cloneDeep(position);
|
|
571
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
572
|
+
const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
|
|
573
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
|
|
574
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
575
|
+
_position.strategyData.decoded.subData = subData;
|
|
576
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
|
|
577
|
+
const marketIdEncodedData = web3.eth.abi.encodeParameters(['address', 'address', 'address', 'address', 'uint256'], [
|
|
578
|
+
subData.loanToken,
|
|
579
|
+
subData.collToken,
|
|
580
|
+
subData.oracle,
|
|
581
|
+
subData.irm,
|
|
582
|
+
subData.lltv,
|
|
583
|
+
]);
|
|
584
|
+
const marketId = web3.utils.keccak256(marketIdEncodedData);
|
|
585
|
+
_position.specific = {
|
|
586
|
+
subHash: _position.subHash,
|
|
587
|
+
marketId,
|
|
588
|
+
collAsset: subData.collToken,
|
|
589
|
+
debtAsset: subData.loanToken,
|
|
590
|
+
price: triggerData.price,
|
|
591
|
+
ratio: subData.targetRatio,
|
|
592
|
+
};
|
|
593
|
+
return _position;
|
|
594
|
+
}
|
|
567
595
|
function parseAaveV3LeverageManagementOnPrice(position, parseData) {
|
|
568
596
|
const _position = cloneDeep(position);
|
|
569
597
|
const { subStruct } = parseData.subscriptionEventData;
|
|
@@ -656,6 +684,7 @@ const parsingMethodsMapping = {
|
|
|
656
684
|
[Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
|
|
657
685
|
[Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
|
|
658
686
|
[Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
|
|
687
|
+
[Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
|
|
659
688
|
},
|
|
660
689
|
};
|
|
661
690
|
function getParsingMethod(id, strategy) {
|
|
@@ -97,4 +97,5 @@ export declare const crvUSDEncode: {
|
|
|
97
97
|
};
|
|
98
98
|
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
|
+
leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, user: EthereumAddress, targetRatio: number, price: number, priceState: RatioState): (number | boolean | string[])[];
|
|
100
101
|
};
|
|
@@ -235,4 +235,9 @@ export const morphoBlueEncode = {
|
|
|
235
235
|
const isBundle = true;
|
|
236
236
|
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
237
237
|
},
|
|
238
|
+
leverageManagementOnPrice(strategyOrBundleId, isBundle = true, loanToken, collToken, oracle, irm, lltv, user, targetRatio, price, priceState) {
|
|
239
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
|
|
240
|
+
const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
|
|
241
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
242
|
+
},
|
|
238
243
|
};
|
|
@@ -190,3 +190,15 @@ export declare const aaveV3LeverageManagementOnPriceSubData: {
|
|
|
190
190
|
targetRatio: number;
|
|
191
191
|
};
|
|
192
192
|
};
|
|
193
|
+
export declare const morphoBlueLeverageManagementOnPriceSubData: {
|
|
194
|
+
encode(loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, targetRatio: number, user: EthereumAddress): string[];
|
|
195
|
+
decode(subData: string[]): {
|
|
196
|
+
loanToken: string;
|
|
197
|
+
collToken: string;
|
|
198
|
+
oracle: string;
|
|
199
|
+
irm: string;
|
|
200
|
+
lltv: string;
|
|
201
|
+
targetRatio: number;
|
|
202
|
+
user: string;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
@@ -467,3 +467,34 @@ export const aaveV3LeverageManagementOnPriceSubData = {
|
|
|
467
467
|
};
|
|
468
468
|
},
|
|
469
469
|
};
|
|
470
|
+
export const morphoBlueLeverageManagementOnPriceSubData = {
|
|
471
|
+
encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user) {
|
|
472
|
+
const loanTokenEncoded = AbiCoder.encodeParameter('address', loanToken);
|
|
473
|
+
const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
474
|
+
const oracleEncoded = AbiCoder.encodeParameter('address', oracle);
|
|
475
|
+
const irmEncoded = AbiCoder.encodeParameter('address', irm);
|
|
476
|
+
const lltvEncoded = AbiCoder.encodeParameter('uint256', lltv);
|
|
477
|
+
const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
|
|
478
|
+
const userEncoded = AbiCoder.encodeParameter('address', user);
|
|
479
|
+
return [loanTokenEncoded, collTokenEncoded, oracleEncoded, irmEncoded, lltvEncoded, targetRatioEncoded, userEncoded];
|
|
480
|
+
},
|
|
481
|
+
decode(subData) {
|
|
482
|
+
const loanToken = AbiCoder.decodeParameter('address', subData[0]);
|
|
483
|
+
const collToken = AbiCoder.decodeParameter('address', subData[1]);
|
|
484
|
+
const oracle = AbiCoder.decodeParameter('address', subData[2]);
|
|
485
|
+
const irm = AbiCoder.decodeParameter('address', subData[3]);
|
|
486
|
+
const lltv = AbiCoder.decodeParameter('uint256', subData[4]);
|
|
487
|
+
const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]);
|
|
488
|
+
const targetRatio = weiToRatioPercentage(weiRatio);
|
|
489
|
+
const user = AbiCoder.decodeParameter('address', subData[6]);
|
|
490
|
+
return {
|
|
491
|
+
loanToken,
|
|
492
|
+
collToken,
|
|
493
|
+
oracle,
|
|
494
|
+
irm,
|
|
495
|
+
lltv,
|
|
496
|
+
targetRatio,
|
|
497
|
+
user,
|
|
498
|
+
};
|
|
499
|
+
},
|
|
500
|
+
};
|
|
@@ -189,3 +189,13 @@ export declare const morphoBlueRatioTrigger: {
|
|
|
189
189
|
ratioState: number;
|
|
190
190
|
};
|
|
191
191
|
};
|
|
192
|
+
export declare const morphoBluePriceTrigger: {
|
|
193
|
+
encode(oracle: EthereumAddress, collateralToken: EthereumAddress, loanToken: EthereumAddress, price: number, priceState: RatioState): string[];
|
|
194
|
+
decode(triggerData: string[]): {
|
|
195
|
+
oracle: string;
|
|
196
|
+
collateralToken: string;
|
|
197
|
+
loanToken: string;
|
|
198
|
+
price: string;
|
|
199
|
+
priceState: number;
|
|
200
|
+
};
|
|
201
|
+
};
|
|
@@ -336,3 +336,21 @@ export const morphoBlueRatioTrigger = {
|
|
|
336
336
|
};
|
|
337
337
|
},
|
|
338
338
|
};
|
|
339
|
+
export const morphoBluePriceTrigger = {
|
|
340
|
+
encode(oracle, collateralToken, loanToken, price, priceState) {
|
|
341
|
+
const _price = new Dec(price.toString()).mul(1e8).floor().toString();
|
|
342
|
+
return [
|
|
343
|
+
AbiCoder.encodeParameters(['address', 'address', 'address', 'uint256', 'uint8'], [oracle, collateralToken, loanToken, _price, priceState]),
|
|
344
|
+
];
|
|
345
|
+
},
|
|
346
|
+
decode(triggerData) {
|
|
347
|
+
const decodedData = AbiCoder.decodeParameters(['address', 'address', 'address', 'uint256', 'uint8'], triggerData[0]);
|
|
348
|
+
return {
|
|
349
|
+
oracle: decodedData[0],
|
|
350
|
+
collateralToken: decodedData[1],
|
|
351
|
+
loanToken: decodedData[2],
|
|
352
|
+
price: new Dec(decodedData[3]).div(1e8).toString(),
|
|
353
|
+
priceState: Number(decodedData[4]),
|
|
354
|
+
};
|
|
355
|
+
},
|
|
356
|
+
};
|
package/esm/types/enums.d.ts
CHANGED
|
@@ -98,6 +98,7 @@ export declare namespace Strategies {
|
|
|
98
98
|
DebtInFrontRepay = "debt-in-front-repay",
|
|
99
99
|
OpenOrderFromCollateral = "open-order-from-collateral",
|
|
100
100
|
OpenOrderFromDebt = "open-order-from-debt",
|
|
101
|
+
BoostOnPrice = "boost-on-price",
|
|
101
102
|
RepayOnPrice = "repay-on-price"
|
|
102
103
|
}
|
|
103
104
|
enum IdOverrides {
|
|
@@ -151,7 +152,8 @@ export declare namespace Bundles {
|
|
|
151
152
|
MORPHO_BLUE_EOA_REPAY = 34,
|
|
152
153
|
MORPHO_BLUE_EOA_BOOST = 35,
|
|
153
154
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 36,
|
|
154
|
-
AAVE_V3_REPAY_ON_PRICE = 37
|
|
155
|
+
AAVE_V3_REPAY_ON_PRICE = 37,
|
|
156
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 38
|
|
155
157
|
}
|
|
156
158
|
enum OptimismIds {
|
|
157
159
|
AAVE_V3_REPAY = 0,
|
|
@@ -171,7 +173,8 @@ export declare namespace Bundles {
|
|
|
171
173
|
MORPHO_BLUE_REPAY = 8,
|
|
172
174
|
MORPHO_BLUE_BOOST = 9,
|
|
173
175
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 10,
|
|
174
|
-
AAVE_V3_REPAY_ON_PRICE = 11
|
|
176
|
+
AAVE_V3_REPAY_ON_PRICE = 11,
|
|
177
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 12
|
|
175
178
|
}
|
|
176
179
|
enum ArbitrumIds {
|
|
177
180
|
AAVE_V3_REPAY = 0,
|
package/esm/types/enums.js
CHANGED
|
@@ -111,6 +111,7 @@ export var Strategies;
|
|
|
111
111
|
Identifiers["DebtInFrontRepay"] = "debt-in-front-repay";
|
|
112
112
|
Identifiers["OpenOrderFromCollateral"] = "open-order-from-collateral";
|
|
113
113
|
Identifiers["OpenOrderFromDebt"] = "open-order-from-debt";
|
|
114
|
+
Identifiers["BoostOnPrice"] = "boost-on-price";
|
|
114
115
|
Identifiers["RepayOnPrice"] = "repay-on-price";
|
|
115
116
|
})(Identifiers = Strategies.Identifiers || (Strategies.Identifiers = {}));
|
|
116
117
|
let IdOverrides;
|
|
@@ -168,6 +169,7 @@ export var Bundles;
|
|
|
168
169
|
MainnetIds[MainnetIds["MORPHO_BLUE_EOA_BOOST"] = 35] = "MORPHO_BLUE_EOA_BOOST";
|
|
169
170
|
MainnetIds[MainnetIds["AAVE_V3_OPEN_ORDER_FROM_COLLATERAL"] = 36] = "AAVE_V3_OPEN_ORDER_FROM_COLLATERAL";
|
|
170
171
|
MainnetIds[MainnetIds["AAVE_V3_REPAY_ON_PRICE"] = 37] = "AAVE_V3_REPAY_ON_PRICE";
|
|
172
|
+
MainnetIds[MainnetIds["MORPHO_BLUE_BOOST_ON_PRICE"] = 38] = "MORPHO_BLUE_BOOST_ON_PRICE";
|
|
171
173
|
})(MainnetIds = Bundles.MainnetIds || (Bundles.MainnetIds = {}));
|
|
172
174
|
let OptimismIds;
|
|
173
175
|
(function (OptimismIds) {
|
|
@@ -190,6 +192,7 @@ export var Bundles;
|
|
|
190
192
|
BaseIds[BaseIds["MORPHO_BLUE_BOOST"] = 9] = "MORPHO_BLUE_BOOST";
|
|
191
193
|
BaseIds[BaseIds["AAVE_V3_OPEN_ORDER_FROM_COLLATERAL"] = 10] = "AAVE_V3_OPEN_ORDER_FROM_COLLATERAL";
|
|
192
194
|
BaseIds[BaseIds["AAVE_V3_REPAY_ON_PRICE"] = 11] = "AAVE_V3_REPAY_ON_PRICE";
|
|
195
|
+
BaseIds[BaseIds["MORPHO_BLUE_BOOST_ON_PRICE"] = 12] = "MORPHO_BLUE_BOOST_ON_PRICE";
|
|
193
196
|
})(BaseIds = Bundles.BaseIds || (Bundles.BaseIds = {}));
|
|
194
197
|
let ArbitrumIds;
|
|
195
198
|
(function (ArbitrumIds) {
|
package/esm/types/index.d.ts
CHANGED
|
@@ -123,6 +123,10 @@ export declare namespace Position {
|
|
|
123
123
|
interface BoostOnPriceAave extends CloseOnPriceAave {
|
|
124
124
|
ratio: number;
|
|
125
125
|
}
|
|
126
|
+
interface BoostOnPriceMorpho extends Base {
|
|
127
|
+
marketId: string;
|
|
128
|
+
subHash: string;
|
|
129
|
+
}
|
|
126
130
|
interface CloseOnPriceWithMaximumGasPriceAave extends Base {
|
|
127
131
|
collAsset: EthereumAddress;
|
|
128
132
|
collAssetId: number;
|
|
@@ -148,7 +152,7 @@ export declare namespace Position {
|
|
|
148
152
|
subHashRepay?: string;
|
|
149
153
|
}
|
|
150
154
|
}
|
|
151
|
-
type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD;
|
|
155
|
+
type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD | Specific.BoostOnPriceMorpho;
|
|
152
156
|
interface Automated {
|
|
153
157
|
chainId: ChainId;
|
|
154
158
|
positionId: string;
|
package/package.json
CHANGED
package/src/constants/index.ts
CHANGED
|
@@ -376,6 +376,11 @@ export const MAINNET_BUNDLES_INFO: MainnetBundleInfo = {
|
|
|
376
376
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
377
377
|
protocol: PROTOCOLS.AaveV3,
|
|
378
378
|
},
|
|
379
|
+
[Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
380
|
+
strategyOrBundleId: Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
381
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
382
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
383
|
+
},
|
|
379
384
|
};
|
|
380
385
|
|
|
381
386
|
export const OPTIMISM_BUNDLES_INFO: OptimismBundleInfo = {
|
|
@@ -462,6 +467,11 @@ export const BASE_BUNDLES_INFO: BaseBundleInfo = {
|
|
|
462
467
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
463
468
|
protocol: PROTOCOLS.AaveV3,
|
|
464
469
|
},
|
|
470
|
+
[Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
471
|
+
strategyOrBundleId: Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
472
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
473
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
474
|
+
},
|
|
465
475
|
};
|
|
466
476
|
|
|
467
477
|
export const ARBITRUM_BUNDLES_INFO: ArbitrumBundleInfo = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getAssetInfoByAddress } from '@defisaver/tokens';
|
|
2
2
|
import { cloneDeep } from 'lodash';
|
|
3
3
|
|
|
4
|
+
import Web3 from 'web3';
|
|
4
5
|
import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
|
|
5
6
|
import type {
|
|
6
7
|
Position, ParseData, StrategiesToProtocolVersionMapping, BundleOrStrategy, StrategyOrBundleIds,
|
|
@@ -14,6 +15,8 @@ import {
|
|
|
14
15
|
import * as subDataService from './subDataService';
|
|
15
16
|
import * as triggerService from './triggerService';
|
|
16
17
|
|
|
18
|
+
const web3 = new Web3();
|
|
19
|
+
|
|
17
20
|
const SPARK_MARKET_ADDRESSES = {
|
|
18
21
|
[ChainId.Ethereum]: '0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE',
|
|
19
22
|
};
|
|
@@ -779,6 +782,42 @@ function parseMorphoBlueLeverageManagement(position: Position.Automated, parseDa
|
|
|
779
782
|
return _position;
|
|
780
783
|
}
|
|
781
784
|
|
|
785
|
+
function parseMorphoBlueLeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
|
|
786
|
+
const _position = cloneDeep(position);
|
|
787
|
+
|
|
788
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
789
|
+
const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
|
|
790
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
|
|
791
|
+
|
|
792
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
793
|
+
_position.strategyData.decoded.subData = subData;
|
|
794
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
|
|
795
|
+
|
|
796
|
+
const marketIdEncodedData = web3.eth.abi.encodeParameters(
|
|
797
|
+
['address', 'address', 'address', 'address', 'uint256'],
|
|
798
|
+
[
|
|
799
|
+
subData.loanToken,
|
|
800
|
+
subData.collToken,
|
|
801
|
+
subData.oracle,
|
|
802
|
+
subData.irm,
|
|
803
|
+
subData.lltv,
|
|
804
|
+
],
|
|
805
|
+
);
|
|
806
|
+
|
|
807
|
+
const marketId = web3.utils.keccak256(marketIdEncodedData);
|
|
808
|
+
|
|
809
|
+
_position.specific = {
|
|
810
|
+
subHash: _position.subHash,
|
|
811
|
+
marketId,
|
|
812
|
+
collAsset: subData.collToken,
|
|
813
|
+
debtAsset: subData.loanToken,
|
|
814
|
+
price: triggerData.price,
|
|
815
|
+
ratio: subData.targetRatio,
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
return _position;
|
|
819
|
+
}
|
|
820
|
+
|
|
782
821
|
function parseAaveV3LeverageManagementOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
|
|
783
822
|
const _position = cloneDeep(position);
|
|
784
823
|
|
|
@@ -877,6 +916,7 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
|
|
|
877
916
|
[Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
|
|
878
917
|
[Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
|
|
879
918
|
[Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
|
|
919
|
+
[Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
|
|
880
920
|
},
|
|
881
921
|
};
|
|
882
922
|
|
|
@@ -521,4 +521,21 @@ export const morphoBlueEncode = {
|
|
|
521
521
|
|
|
522
522
|
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
523
523
|
},
|
|
524
|
+
leverageManagementOnPrice(
|
|
525
|
+
strategyOrBundleId: number,
|
|
526
|
+
isBundle: boolean = true,
|
|
527
|
+
loanToken: EthereumAddress,
|
|
528
|
+
collToken: EthereumAddress,
|
|
529
|
+
oracle: EthereumAddress,
|
|
530
|
+
irm: EthereumAddress,
|
|
531
|
+
lltv: string,
|
|
532
|
+
user: EthereumAddress,
|
|
533
|
+
targetRatio: number,
|
|
534
|
+
price: number,
|
|
535
|
+
priceState: RatioState,
|
|
536
|
+
) {
|
|
537
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user);
|
|
538
|
+
const triggerData = triggerService.morphoBluePriceTrigger.encode(oracle, collToken, loanToken, price, priceState);
|
|
539
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
540
|
+
},
|
|
524
541
|
};
|
|
@@ -643,3 +643,44 @@ export const aaveV3LeverageManagementOnPriceSubData = {
|
|
|
643
643
|
};
|
|
644
644
|
},
|
|
645
645
|
};
|
|
646
|
+
|
|
647
|
+
export const morphoBlueLeverageManagementOnPriceSubData = {
|
|
648
|
+
encode(
|
|
649
|
+
loanToken: EthereumAddress,
|
|
650
|
+
collToken: EthereumAddress,
|
|
651
|
+
oracle: EthereumAddress,
|
|
652
|
+
irm: EthereumAddress,
|
|
653
|
+
lltv: string,
|
|
654
|
+
targetRatio: number,
|
|
655
|
+
user: EthereumAddress,
|
|
656
|
+
): SubData {
|
|
657
|
+
const loanTokenEncoded = AbiCoder.encodeParameter('address', loanToken);
|
|
658
|
+
const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
659
|
+
const oracleEncoded = AbiCoder.encodeParameter('address', oracle);
|
|
660
|
+
const irmEncoded = AbiCoder.encodeParameter('address', irm);
|
|
661
|
+
const lltvEncoded = AbiCoder.encodeParameter('uint256', lltv);
|
|
662
|
+
const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
|
|
663
|
+
const userEncoded = AbiCoder.encodeParameter('address', user);
|
|
664
|
+
return [loanTokenEncoded, collTokenEncoded, oracleEncoded, irmEncoded, lltvEncoded, targetRatioEncoded, userEncoded];
|
|
665
|
+
},
|
|
666
|
+
decode(subData: SubData) {
|
|
667
|
+
const loanToken = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
|
|
668
|
+
const collToken = AbiCoder.decodeParameter('address', subData[1]) as any as EthereumAddress;
|
|
669
|
+
const oracle = AbiCoder.decodeParameter('address', subData[2]) as any as EthereumAddress;
|
|
670
|
+
const irm = AbiCoder.decodeParameter('address', subData[3]) as any as EthereumAddress;
|
|
671
|
+
const lltv = AbiCoder.decodeParameter('uint256', subData[4]) as any as EthereumAddress;
|
|
672
|
+
const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]) as any as EthereumAddress;
|
|
673
|
+
const targetRatio = weiToRatioPercentage(weiRatio);
|
|
674
|
+
const user = AbiCoder.decodeParameter('address', subData[6]) as any as EthereumAddress;
|
|
675
|
+
|
|
676
|
+
return {
|
|
677
|
+
loanToken,
|
|
678
|
+
collToken,
|
|
679
|
+
oracle,
|
|
680
|
+
irm,
|
|
681
|
+
lltv,
|
|
682
|
+
targetRatio,
|
|
683
|
+
user,
|
|
684
|
+
};
|
|
685
|
+
},
|
|
686
|
+
};
|
|
@@ -447,3 +447,32 @@ export const morphoBlueRatioTrigger = {
|
|
|
447
447
|
};
|
|
448
448
|
},
|
|
449
449
|
};
|
|
450
|
+
|
|
451
|
+
export const morphoBluePriceTrigger = {
|
|
452
|
+
encode(
|
|
453
|
+
oracle: EthereumAddress,
|
|
454
|
+
collateralToken: EthereumAddress,
|
|
455
|
+
loanToken: EthereumAddress,
|
|
456
|
+
price: number,
|
|
457
|
+
priceState: RatioState,
|
|
458
|
+
) {
|
|
459
|
+
const _price = new Dec(price.toString()).mul(1e8).floor().toString();
|
|
460
|
+
return [
|
|
461
|
+
AbiCoder.encodeParameters(
|
|
462
|
+
['address', 'address', 'address', 'uint256', 'uint8'],
|
|
463
|
+
[oracle, collateralToken, loanToken, _price, priceState]),
|
|
464
|
+
];
|
|
465
|
+
},
|
|
466
|
+
decode(
|
|
467
|
+
triggerData: TriggerData,
|
|
468
|
+
) {
|
|
469
|
+
const decodedData = AbiCoder.decodeParameters(['address', 'address', 'address', 'uint256', 'uint8'], triggerData[0]);
|
|
470
|
+
return {
|
|
471
|
+
oracle: decodedData[0] as EthereumAddress,
|
|
472
|
+
collateralToken: decodedData[1] as EthereumAddress,
|
|
473
|
+
loanToken: decodedData[2] as EthereumAddress,
|
|
474
|
+
price: new Dec(decodedData[3] as string).div(1e8).toString(),
|
|
475
|
+
priceState: Number(decodedData[4]),
|
|
476
|
+
};
|
|
477
|
+
},
|
|
478
|
+
};
|
package/src/types/enums.ts
CHANGED
|
@@ -108,6 +108,7 @@ export namespace Strategies {
|
|
|
108
108
|
DebtInFrontRepay = 'debt-in-front-repay',
|
|
109
109
|
OpenOrderFromCollateral = 'open-order-from-collateral',
|
|
110
110
|
OpenOrderFromDebt = 'open-order-from-debt',
|
|
111
|
+
BoostOnPrice = 'boost-on-price',
|
|
111
112
|
RepayOnPrice = 'repay-on-price',
|
|
112
113
|
}
|
|
113
114
|
export enum IdOverrides {
|
|
@@ -163,6 +164,7 @@ export namespace Bundles {
|
|
|
163
164
|
MORPHO_BLUE_EOA_BOOST = 35,
|
|
164
165
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 36,
|
|
165
166
|
AAVE_V3_REPAY_ON_PRICE = 37,
|
|
167
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 38,
|
|
166
168
|
}
|
|
167
169
|
|
|
168
170
|
export enum OptimismIds {
|
|
@@ -185,6 +187,7 @@ export namespace Bundles {
|
|
|
185
187
|
MORPHO_BLUE_BOOST = 9,
|
|
186
188
|
AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 10,
|
|
187
189
|
AAVE_V3_REPAY_ON_PRICE = 11,
|
|
190
|
+
MORPHO_BLUE_BOOST_ON_PRICE = 12,
|
|
188
191
|
}
|
|
189
192
|
|
|
190
193
|
export enum ArbitrumIds {
|
package/src/types/index.ts
CHANGED
|
@@ -149,6 +149,11 @@ export declare namespace Position {
|
|
|
149
149
|
ratio: number,
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
interface BoostOnPriceMorpho extends Base {
|
|
153
|
+
marketId: string;
|
|
154
|
+
subHash: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
152
157
|
interface CloseOnPriceWithMaximumGasPriceAave extends Base {
|
|
153
158
|
collAsset: EthereumAddress,
|
|
154
159
|
collAssetId: number,
|
|
@@ -186,7 +191,8 @@ export declare namespace Position {
|
|
|
186
191
|
| Specific.BoostOnPriceAave
|
|
187
192
|
| Specific.CloseOnPriceWithMaximumGasPriceAave
|
|
188
193
|
| Specific.DebtInFrontRepay
|
|
189
|
-
| Specific.LeverageManagementCrvUSD
|
|
194
|
+
| Specific.LeverageManagementCrvUSD
|
|
195
|
+
| Specific.BoostOnPriceMorpho;
|
|
190
196
|
|
|
191
197
|
export interface Automated {
|
|
192
198
|
chainId: ChainId,
|