@defisaver/automation-sdk 3.1.4 → 3.1.6-fluid-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/automation/private/StrategiesAutomation.d.ts +2 -2
- package/cjs/automation/public/Strategies.test.d.ts +1 -0
- package/cjs/automation/public/Strategies.test.js +61 -0
- package/cjs/constants/index.js +45 -0
- package/cjs/services/strategiesService.js +155 -0
- package/cjs/services/strategySubService.d.ts +10 -1
- package/cjs/services/strategySubService.js +35 -1
- package/cjs/services/subDataService.d.ts +55 -1
- package/cjs/services/subDataService.js +174 -1
- package/cjs/services/triggerService.d.ts +43 -0
- package/cjs/services/triggerService.js +81 -1
- package/cjs/services/utils.d.ts +6 -1
- package/cjs/services/utils.js +52 -1
- package/cjs/types/enums.d.ts +38 -3
- package/cjs/types/enums.js +40 -1
- package/cjs/types/index.d.ts +16 -3
- package/esm/automation/private/StrategiesAutomation.d.ts +2 -2
- package/esm/automation/public/Strategies.test.d.ts +1 -0
- package/esm/automation/public/Strategies.test.js +56 -0
- package/esm/constants/index.js +45 -0
- package/esm/services/strategiesService.js +153 -1
- package/esm/services/strategySubService.d.ts +10 -1
- package/esm/services/strategySubService.js +36 -2
- package/esm/services/subDataService.d.ts +55 -1
- package/esm/services/subDataService.js +174 -1
- package/esm/services/triggerService.d.ts +43 -0
- package/esm/services/triggerService.js +80 -0
- package/esm/services/utils.d.ts +6 -1
- package/esm/services/utils.js +50 -1
- package/esm/types/enums.d.ts +38 -3
- package/esm/types/enums.js +39 -0
- package/esm/types/index.d.ts +16 -3
- package/package.json +3 -3
- package/src/automation/private/StrategiesAutomation.ts +2 -2
- package/src/automation/public/Strategies.test.ts +49 -0
- package/src/constants/index.ts +45 -0
- package/src/services/strategiesService.ts +199 -1
- package/src/services/strategySubService.ts +97 -1
- package/src/services/subDataService.ts +243 -2
- package/src/services/triggerService.ts +125 -0
- package/src/services/utils.ts +60 -1
- package/src/types/enums.ts +39 -0
- package/src/types/index.ts +20 -2
- package/umd/index.js +34219 -0
|
@@ -6,12 +6,12 @@ import type { ChainId } from '../../types/enums';
|
|
|
6
6
|
import Automation from './Automation';
|
|
7
7
|
interface IStrategiesAutomation extends Interfaces.Automation {
|
|
8
8
|
chainId: ChainId;
|
|
9
|
-
providerFork
|
|
9
|
+
providerFork?: Web3;
|
|
10
10
|
}
|
|
11
11
|
export default class StrategiesAutomation extends Automation {
|
|
12
12
|
protected chainId: ChainId;
|
|
13
13
|
protected web3: Web3;
|
|
14
|
-
protected web3Fork
|
|
14
|
+
protected web3Fork?: Web3;
|
|
15
15
|
protected subStorageContract: Contract.WithMeta<SubStorage>;
|
|
16
16
|
protected subStorageContractFork: Contract.WithMeta<SubStorage> | null;
|
|
17
17
|
constructor(args: IStrategiesAutomation);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '../../configuration';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import Web3 from 'web3';
|
|
11
|
+
import '../../configuration';
|
|
12
|
+
import EthereumStrategies from './EthereumStrategies';
|
|
13
|
+
import ArbitrumStrategies from './ArbitrumStrategies';
|
|
14
|
+
import OptimismStrategies from './OptimismStrategies';
|
|
15
|
+
import BaseStrategies from './BaseStrategies';
|
|
16
|
+
require('dotenv').config({ path: '.env' });
|
|
17
|
+
const Web3_1 = new Web3(process.env.RPC_1);
|
|
18
|
+
const Web3_42161 = new Web3(process.env.RPC_42161);
|
|
19
|
+
const Web3_10 = new Web3(process.env.RPC_10);
|
|
20
|
+
const Web3_8453 = new Web3(process.env.RPC_8453);
|
|
21
|
+
describe('Feature: StrategiesAutomation.ts', () => {
|
|
22
|
+
describe('Fetching subscriptions', () => {
|
|
23
|
+
it('can fetch subscriptions on Mainnet', function () {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
this.timeout(120000);
|
|
26
|
+
const ethStrategies = new EthereumStrategies({ provider: Web3_1 });
|
|
27
|
+
const subs = yield ethStrategies.getSubscriptions({ mergeSubs: true });
|
|
28
|
+
console.log(subs.length);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('can fetch subscriptions on Arbitrum', function () {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
this.timeout(120000);
|
|
34
|
+
const arbiStrategies = new ArbitrumStrategies({ provider: Web3_42161 });
|
|
35
|
+
const subs = yield arbiStrategies.getSubscriptions({ mergeSubs: true });
|
|
36
|
+
console.log(subs.length);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it('can fetch subscriptions on Optimism', function () {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
this.timeout(120000);
|
|
42
|
+
const optimismStrategies = new OptimismStrategies({ provider: Web3_10 });
|
|
43
|
+
const subs = yield optimismStrategies.getSubscriptions({ mergeSubs: true });
|
|
44
|
+
console.log(subs.length);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('can fetch subscriptions on Base', function () {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
this.timeout(120000);
|
|
50
|
+
const baseStrategies = new BaseStrategies({ provider: Web3_8453 });
|
|
51
|
+
const subs = yield baseStrategies.getSubscriptions({ mergeSubs: true });
|
|
52
|
+
console.log(subs.length);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|
package/esm/constants/index.js
CHANGED
|
@@ -347,6 +347,46 @@ export const MAINNET_BUNDLES_INFO = {
|
|
|
347
347
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
348
348
|
protocol: PROTOCOLS.AaveV3,
|
|
349
349
|
},
|
|
350
|
+
[Bundles.MainnetIds.LIQUITY_V2_REPAY]: {
|
|
351
|
+
strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_REPAY,
|
|
352
|
+
strategyId: Strategies.Identifiers.Repay,
|
|
353
|
+
protocol: PROTOCOLS.LiquityV2,
|
|
354
|
+
},
|
|
355
|
+
[Bundles.MainnetIds.LIQUITY_V2_BOOST]: {
|
|
356
|
+
strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_BOOST,
|
|
357
|
+
strategyId: Strategies.Identifiers.Boost,
|
|
358
|
+
protocol: PROTOCOLS.LiquityV2,
|
|
359
|
+
},
|
|
360
|
+
[Bundles.MainnetIds.LIQUITY_V2_CLOSE]: {
|
|
361
|
+
strategyOrBundleId: Bundles.MainnetIds.LIQUITY_V2_CLOSE,
|
|
362
|
+
strategyId: Strategies.Identifiers.CloseOnPrice,
|
|
363
|
+
protocol: PROTOCOLS.LiquityV2,
|
|
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
|
+
},
|
|
375
|
+
[Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
376
|
+
strategyOrBundleId: Bundles.MainnetIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
377
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
378
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
379
|
+
},
|
|
380
|
+
[Bundles.MainnetIds.FLUID_T1_REPAY]: {
|
|
381
|
+
strategyOrBundleId: Bundles.MainnetIds.FLUID_T1_REPAY,
|
|
382
|
+
strategyId: Strategies.Identifiers.Repay,
|
|
383
|
+
protocol: PROTOCOLS.FluidT1,
|
|
384
|
+
},
|
|
385
|
+
[Bundles.MainnetIds.FLUID_T2_BOOST]: {
|
|
386
|
+
strategyOrBundleId: Bundles.MainnetIds.FLUID_T2_BOOST,
|
|
387
|
+
strategyId: Strategies.Identifiers.Boost,
|
|
388
|
+
protocol: PROTOCOLS.FluidT1,
|
|
389
|
+
},
|
|
350
390
|
};
|
|
351
391
|
export const OPTIMISM_BUNDLES_INFO = {
|
|
352
392
|
[Bundles.OptimismIds.AAVE_V3_REPAY]: {
|
|
@@ -431,6 +471,11 @@ export const BASE_BUNDLES_INFO = {
|
|
|
431
471
|
strategyId: Strategies.Identifiers.RepayOnPrice,
|
|
432
472
|
protocol: PROTOCOLS.AaveV3,
|
|
433
473
|
},
|
|
474
|
+
[Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE]: {
|
|
475
|
+
strategyOrBundleId: Bundles.BaseIds.MORPHO_BLUE_BOOST_ON_PRICE,
|
|
476
|
+
strategyId: Strategies.Identifiers.BoostOnPrice,
|
|
477
|
+
protocol: PROTOCOLS.MorphoBlue,
|
|
478
|
+
},
|
|
434
479
|
};
|
|
435
480
|
export const ARBITRUM_BUNDLES_INFO = {
|
|
436
481
|
[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
|
-
import { getPositionId, getRatioStateInfoForAaveCloseStrategy, isRatioStateOver, wethToEthByAddress, } from './utils';
|
|
6
|
+
import { getPositionId, getRatioStateInfoForAaveCloseStrategy, getStopLossAndTakeProfitTypeByCloseStrategyType, 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
|
};
|
|
@@ -403,6 +405,39 @@ function parseLiquityLeverageManagement(position, parseData) {
|
|
|
403
405
|
_position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
|
|
404
406
|
return _position;
|
|
405
407
|
}
|
|
408
|
+
function parseLiquityV2LeverageManagement(position, parseData) {
|
|
409
|
+
const _position = cloneDeep(position);
|
|
410
|
+
const { subStruct, subId, subHash } = parseData.subscriptionEventData;
|
|
411
|
+
const { isEnabled } = parseData.strategiesSubsData;
|
|
412
|
+
const triggerData = triggerService.liquityV2RatioTrigger.decode(subStruct.triggerData);
|
|
413
|
+
const subData = subDataService.liquityV2LeverageManagementSubData.decode(subStruct.subData);
|
|
414
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
415
|
+
_position.strategyData.decoded.subData = subData;
|
|
416
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.troveId, triggerData.market);
|
|
417
|
+
const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
|
|
418
|
+
if (isRepay) {
|
|
419
|
+
_position.specific = {
|
|
420
|
+
triggerRepayRatio: triggerData.ratio,
|
|
421
|
+
targetRepayRatio: subData.targetRatio,
|
|
422
|
+
repayEnabled: isEnabled,
|
|
423
|
+
subId1: Number(subId),
|
|
424
|
+
subHashRepay: subHash,
|
|
425
|
+
mergeWithId: Strategies.Identifiers.Boost,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
_position.specific = {
|
|
430
|
+
triggerBoostRatio: triggerData.ratio,
|
|
431
|
+
targetBoostRatio: subData.targetRatio,
|
|
432
|
+
boostEnabled: isEnabled,
|
|
433
|
+
subId2: Number(subId),
|
|
434
|
+
subHashBoost: subHash,
|
|
435
|
+
mergeId: Strategies.Identifiers.Boost,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
_position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
|
|
439
|
+
return _position;
|
|
440
|
+
}
|
|
406
441
|
function parseSparkLeverageManagement(position, parseData) {
|
|
407
442
|
const _position = cloneDeep(position);
|
|
408
443
|
const { subStruct, subId } = parseData.subscriptionEventData;
|
|
@@ -564,6 +599,32 @@ function parseMorphoBlueLeverageManagement(position, parseData) {
|
|
|
564
599
|
_position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
|
|
565
600
|
return _position;
|
|
566
601
|
}
|
|
602
|
+
function parseMorphoBlueLeverageManagementOnPrice(position, parseData) {
|
|
603
|
+
const _position = cloneDeep(position);
|
|
604
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
605
|
+
const triggerData = triggerService.morphoBluePriceTrigger.decode(subStruct.triggerData);
|
|
606
|
+
const subData = subDataService.morphoBlueLeverageManagementOnPriceSubData.decode(subStruct.subData);
|
|
607
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
608
|
+
_position.strategyData.decoded.subData = subData;
|
|
609
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
|
|
610
|
+
const marketIdEncodedData = web3.eth.abi.encodeParameters(['address', 'address', 'address', 'address', 'uint256'], [
|
|
611
|
+
subData.loanToken,
|
|
612
|
+
subData.collToken,
|
|
613
|
+
subData.oracle,
|
|
614
|
+
subData.irm,
|
|
615
|
+
subData.lltv,
|
|
616
|
+
]);
|
|
617
|
+
const marketId = web3.utils.keccak256(marketIdEncodedData);
|
|
618
|
+
_position.specific = {
|
|
619
|
+
subHash: _position.subHash,
|
|
620
|
+
marketId,
|
|
621
|
+
collAsset: subData.collToken,
|
|
622
|
+
debtAsset: subData.loanToken,
|
|
623
|
+
price: triggerData.price,
|
|
624
|
+
ratio: subData.targetRatio,
|
|
625
|
+
};
|
|
626
|
+
return _position;
|
|
627
|
+
}
|
|
567
628
|
function parseAaveV3LeverageManagementOnPrice(position, parseData) {
|
|
568
629
|
const _position = cloneDeep(position);
|
|
569
630
|
const { subStruct } = parseData.subscriptionEventData;
|
|
@@ -585,6 +646,85 @@ function parseAaveV3LeverageManagementOnPrice(position, parseData) {
|
|
|
585
646
|
};
|
|
586
647
|
return _position;
|
|
587
648
|
}
|
|
649
|
+
function parseLiquityV2CloseOnPrice(position, parseData) {
|
|
650
|
+
const _position = cloneDeep(position);
|
|
651
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
652
|
+
const triggerData = triggerService.closePriceTrigger.decode(subStruct.triggerData);
|
|
653
|
+
const subData = subDataService.liquityV2CloseSubData.decode(subStruct.subData);
|
|
654
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
655
|
+
_position.strategyData.decoded.subData = subData;
|
|
656
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, subData.troveId, subData.market);
|
|
657
|
+
const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
|
|
658
|
+
// User can have:
|
|
659
|
+
// - Only TakeProfit
|
|
660
|
+
// - Only StopLoss
|
|
661
|
+
// - Both
|
|
662
|
+
// TODO: see on frontend what specific data we need here because stop-loss and take-profit is one bundle now
|
|
663
|
+
_position.strategy.strategyId = Strategies.Identifiers.CloseOnPrice;
|
|
664
|
+
_position.specific = {
|
|
665
|
+
market: subData.market,
|
|
666
|
+
troveId: subData.troveId,
|
|
667
|
+
stopLossPrice: triggerData.lowerPrice,
|
|
668
|
+
takeProfitPrice: triggerData.upperPrice,
|
|
669
|
+
closeToAssetAddr: triggerData.tokenAddr,
|
|
670
|
+
takeProfitType,
|
|
671
|
+
stopLossType,
|
|
672
|
+
};
|
|
673
|
+
return _position;
|
|
674
|
+
}
|
|
675
|
+
function parseLiquityV2LeverageManagementOnPrice(position, parseData) {
|
|
676
|
+
const _position = cloneDeep(position);
|
|
677
|
+
const { subStruct } = parseData.subscriptionEventData;
|
|
678
|
+
const triggerData = triggerService.liquityV2QuotePriceTrigger.decode(subStruct.triggerData);
|
|
679
|
+
const subData = subDataService.liquityV2LeverageManagementOnPriceSubData.decode(subStruct.subData);
|
|
680
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
681
|
+
_position.strategyData.decoded.subData = subData;
|
|
682
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, Math.random());
|
|
683
|
+
/// @TODO: what does even go here
|
|
684
|
+
/*
|
|
685
|
+
_position.specific = {
|
|
686
|
+
market: subData.market,
|
|
687
|
+
troveId: subData.troveId,
|
|
688
|
+
ratio: subData.targetRatio,
|
|
689
|
+
price: triggerData.price,
|
|
690
|
+
ratioState: triggerData.ratioState,
|
|
691
|
+
};
|
|
692
|
+
*/
|
|
693
|
+
return _position;
|
|
694
|
+
}
|
|
695
|
+
function parseFluidT1LeverageManagement(position, parseData) {
|
|
696
|
+
const _position = cloneDeep(position);
|
|
697
|
+
const { subStruct, subId, subHash } = parseData.subscriptionEventData;
|
|
698
|
+
const { isEnabled } = parseData.strategiesSubsData;
|
|
699
|
+
const triggerData = triggerService.fluidRatioTrigger.decode(subStruct.triggerData);
|
|
700
|
+
const subData = subDataService.fluidLeverageManagementSubData.decode(subStruct.subData);
|
|
701
|
+
_position.strategyData.decoded.triggerData = triggerData;
|
|
702
|
+
_position.strategyData.decoded.subData = subData;
|
|
703
|
+
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.nftId, subData.vault);
|
|
704
|
+
const isRepay = _position.strategy.strategyId === Strategies.Identifiers.Repay;
|
|
705
|
+
if (isRepay) {
|
|
706
|
+
_position.specific = {
|
|
707
|
+
triggerRepayRatio: triggerData.ratio,
|
|
708
|
+
targetRepayRatio: subData.targetRatio,
|
|
709
|
+
repayEnabled: isEnabled,
|
|
710
|
+
subId1: Number(subId),
|
|
711
|
+
subHashRepay: subHash,
|
|
712
|
+
mergeWithId: Strategies.Identifiers.Boost,
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
_position.specific = {
|
|
717
|
+
triggerBoostRatio: triggerData.ratio,
|
|
718
|
+
targetBoostRatio: subData.targetRatio,
|
|
719
|
+
boostEnabled: isEnabled,
|
|
720
|
+
subId2: Number(subId),
|
|
721
|
+
subHashBoost: subHash,
|
|
722
|
+
mergeId: Strategies.Identifiers.Boost,
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
_position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
|
|
726
|
+
return _position;
|
|
727
|
+
}
|
|
588
728
|
const parsingMethodsMapping = {
|
|
589
729
|
[ProtocolIdentifiers.StrategiesAutomation.MakerDAO]: {
|
|
590
730
|
[Strategies.Identifiers.SavingsLiqProtection]: parseMakerSavingsLiqProtection,
|
|
@@ -605,6 +745,13 @@ const parsingMethodsMapping = {
|
|
|
605
745
|
[Strategies.Identifiers.SavingsDsrSupply]: parseLiquitySavingsLiqProtection,
|
|
606
746
|
[Strategies.Identifiers.DebtInFrontRepay]: parseLiquityDebtInFrontRepay,
|
|
607
747
|
},
|
|
748
|
+
[ProtocolIdentifiers.StrategiesAutomation.LiquityV2]: {
|
|
749
|
+
[Strategies.Identifiers.Repay]: parseLiquityV2LeverageManagement,
|
|
750
|
+
[Strategies.Identifiers.Boost]: parseLiquityV2LeverageManagement,
|
|
751
|
+
[Strategies.Identifiers.CloseOnPrice]: parseLiquityV2CloseOnPrice,
|
|
752
|
+
[Strategies.Identifiers.OpenOrderFromCollateral]: parseLiquityV2LeverageManagementOnPrice,
|
|
753
|
+
[Strategies.Identifiers.RepayOnPrice]: parseLiquityV2LeverageManagementOnPrice,
|
|
754
|
+
},
|
|
608
755
|
[ProtocolIdentifiers.StrategiesAutomation.AaveV2]: {
|
|
609
756
|
[Strategies.Identifiers.Repay]: parseAaveV2LeverageManagement,
|
|
610
757
|
[Strategies.Identifiers.Boost]: parseAaveV2LeverageManagement,
|
|
@@ -656,6 +803,11 @@ const parsingMethodsMapping = {
|
|
|
656
803
|
[Strategies.Identifiers.Boost]: parseMorphoBlueLeverageManagement,
|
|
657
804
|
[Strategies.Identifiers.EoaRepay]: parseMorphoBlueLeverageManagement,
|
|
658
805
|
[Strategies.Identifiers.EoaBoost]: parseMorphoBlueLeverageManagement,
|
|
806
|
+
[Strategies.Identifiers.BoostOnPrice]: parseMorphoBlueLeverageManagementOnPrice,
|
|
807
|
+
},
|
|
808
|
+
[ProtocolIdentifiers.StrategiesAutomation.FluidT1]: {
|
|
809
|
+
[Strategies.Identifiers.Repay]: parseFluidT1LeverageManagement,
|
|
810
|
+
[Strategies.Identifiers.Boost]: parseFluidT1LeverageManagement,
|
|
659
811
|
},
|
|
660
812
|
};
|
|
661
813
|
function getParsingMethod(id, strategy) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { OrderType } from '../types/enums';
|
|
2
|
-
import { Bundles, ChainId, RatioState, Strategies } from '../types/enums';
|
|
2
|
+
import { CloseToAssetType, Bundles, ChainId, RatioState, Strategies } from '../types/enums';
|
|
3
3
|
import type { EthereumAddress, StrategyOrBundleIds } from '../types';
|
|
4
4
|
export declare const makerEncode: {
|
|
5
5
|
repayFromSavings(bundleId: StrategyOrBundleIds, vaultId: number, triggerRepayRatio: number, targetRepayRatio: number, isBundle?: boolean, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds | Strategies.OptimismIds | Strategies.ArbitrumIds | Strategies.BaseIds | Bundles.MainnetIds | Bundles.OptimismIds | Bundles.ArbitrumIds | Bundles.BaseIds)[];
|
|
@@ -97,4 +97,13 @@ 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[])[];
|
|
101
|
+
};
|
|
102
|
+
export declare const liquityV2Encode: {
|
|
103
|
+
leverageManagement(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
|
|
104
|
+
closeOnPrice(strategyOrBundleId: number, market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
|
|
105
|
+
leverageManagementOnPrice(strategyOrBundleId: number, market: EthereumAddress, price: number, state: RatioState, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, targetRatio: number, isRepayOnPrice: boolean): (number | boolean | string[])[];
|
|
106
|
+
};
|
|
107
|
+
export declare const fluidEncode: {
|
|
108
|
+
leverageManagement(nftId: string, vault: EthereumAddress, collToken: EthereumAddress, debtToken: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
|
|
100
109
|
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import Dec from 'decimal.js';
|
|
2
2
|
import { getAssetInfo } from '@defisaver/tokens';
|
|
3
|
-
import { Bundles, ChainId, RatioState, Strategies, } from '../types/enums';
|
|
3
|
+
import { CloseToAssetType, Bundles, ChainId, RatioState, Strategies, } from '../types/enums';
|
|
4
4
|
import { STRATEGY_IDS } from '../constants';
|
|
5
5
|
import * as subDataService from './subDataService';
|
|
6
6
|
import * as triggerService from './triggerService';
|
|
7
|
-
import { compareAddresses, requireAddress, requireAddresses } from './utils';
|
|
7
|
+
import { compareAddresses, getCloseStrategyType, requireAddress, requireAddresses, } from './utils';
|
|
8
8
|
export const makerEncode = {
|
|
9
9
|
repayFromSavings(bundleId, vaultId, triggerRepayRatio, targetRepayRatio, isBundle = true, chainId = ChainId.Ethereum, daiAddr, mcdCdpManagerAddr) {
|
|
10
10
|
const subData = subDataService.makerRepayFromSavingsSubData.encode(vaultId, targetRepayRatio, chainId, daiAddr, mcdCdpManagerAddr);
|
|
@@ -235,4 +235,38 @@ 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
|
+
},
|
|
243
|
+
};
|
|
244
|
+
export const liquityV2Encode = {
|
|
245
|
+
leverageManagement(market, troveId, collToken, boldToken, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
|
|
246
|
+
const isBundle = true;
|
|
247
|
+
const subData = subDataService.liquityV2LeverageManagementSubData.encode(market, troveId, collToken, boldToken, ratioState, targetRatio);
|
|
248
|
+
const triggerData = triggerService.liquityV2RatioTrigger.encode(market, troveId, triggerRatio, ratioState);
|
|
249
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
250
|
+
},
|
|
251
|
+
closeOnPrice(strategyOrBundleId, market, troveId, collToken, boldToken, stopLossPrice = 0, stopLossType = CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = CloseToAssetType.COLLATERAL) {
|
|
252
|
+
const isBundle = true;
|
|
253
|
+
const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
|
|
254
|
+
const subData = subDataService.liquityV2CloseSubData.encode(market, troveId, collToken, boldToken, closeType);
|
|
255
|
+
const triggerData = triggerService.closePriceTrigger.encode(collToken, stopLossPrice, takeProfitPrice);
|
|
256
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
257
|
+
},
|
|
258
|
+
leverageManagementOnPrice(strategyOrBundleId, market, price, state, troveId, collToken, boldToken, targetRatio, isRepayOnPrice) {
|
|
259
|
+
const subDataEncoded = subDataService.liquityV2LeverageManagementOnPriceSubData.encode(market, troveId, collToken, boldToken, targetRatio, isRepayOnPrice);
|
|
260
|
+
const triggerDataEncoded = triggerService.liquityV2QuotePriceTrigger.encode(market, price, state);
|
|
261
|
+
const isBundle = true;
|
|
262
|
+
return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
export const fluidEncode = {
|
|
266
|
+
leverageManagement(nftId, vault, collToken, debtToken, ratioState, targetRatio, triggerRatio, strategyOrBundleId) {
|
|
267
|
+
const isBundle = true;
|
|
268
|
+
const subData = subDataService.fluidLeverageManagementSubData.encode(nftId, vault, collToken, debtToken, ratioState, targetRatio);
|
|
269
|
+
const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
|
|
270
|
+
return [strategyOrBundleId, isBundle, triggerData, subData];
|
|
271
|
+
},
|
|
238
272
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EthereumAddress } from '../types';
|
|
2
|
-
import type { OrderType } from '../types/enums';
|
|
2
|
+
import type { CloseStrategyType, OrderType } from '../types/enums';
|
|
3
3
|
import { ChainId, RatioState } from '../types/enums';
|
|
4
4
|
export declare const makerRepayFromSavingsSubData: {
|
|
5
5
|
encode(vaultId: number, targetRatioPercentage: number, chainId: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): string[];
|
|
@@ -190,3 +190,57 @@ export declare const aaveV3LeverageManagementOnPriceSubData: {
|
|
|
190
190
|
targetRatio: number;
|
|
191
191
|
};
|
|
192
192
|
};
|
|
193
|
+
export declare const liquityV2LeverageManagementSubData: {
|
|
194
|
+
encode: (market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, ratioState: RatioState, targetRatio: number) => string[];
|
|
195
|
+
decode: (subData: string[]) => {
|
|
196
|
+
market: string;
|
|
197
|
+
troveId: string;
|
|
198
|
+
collToken: string;
|
|
199
|
+
boldToken: string;
|
|
200
|
+
ratioState: RatioState;
|
|
201
|
+
targetRatio: number;
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
export declare const liquityV2CloseSubData: {
|
|
205
|
+
encode(market: EthereumAddress, troveId: string, collToken: EthereumAddress, boldToken: EthereumAddress, closeType: CloseStrategyType): string[];
|
|
206
|
+
decode(subData: string[]): {
|
|
207
|
+
market: EthereumAddress;
|
|
208
|
+
troveId: string;
|
|
209
|
+
collToken: EthereumAddress;
|
|
210
|
+
boldToken: EthereumAddress;
|
|
211
|
+
closeType: CloseStrategyType;
|
|
212
|
+
};
|
|
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
|
+
};
|
|
224
|
+
export declare const morphoBlueLeverageManagementOnPriceSubData: {
|
|
225
|
+
encode(loanToken: EthereumAddress, collToken: EthereumAddress, oracle: EthereumAddress, irm: EthereumAddress, lltv: string, targetRatio: number, user: EthereumAddress): string[];
|
|
226
|
+
decode(subData: string[]): {
|
|
227
|
+
loanToken: string;
|
|
228
|
+
collToken: string;
|
|
229
|
+
oracle: string;
|
|
230
|
+
irm: string;
|
|
231
|
+
lltv: string;
|
|
232
|
+
targetRatio: number;
|
|
233
|
+
user: string;
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
export declare const fluidLeverageManagementSubData: {
|
|
237
|
+
encode: (nftId: string, vault: EthereumAddress, collToken: EthereumAddress, debtToken: EthereumAddress, ratioState: RatioState, targetRatio: number) => string[];
|
|
238
|
+
decode: (subData: string[]) => {
|
|
239
|
+
nftId: string;
|
|
240
|
+
vault: string;
|
|
241
|
+
collToken: string;
|
|
242
|
+
debtToken: string;
|
|
243
|
+
ratioState: RatioState;
|
|
244
|
+
targetRatio: number;
|
|
245
|
+
};
|
|
246
|
+
};
|
|
@@ -3,7 +3,7 @@ import AbiCoder from 'web3-eth-abi';
|
|
|
3
3
|
import { fromWei, toWei } from 'web3-utils';
|
|
4
4
|
import { assetAmountInEth, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
|
|
5
5
|
import { otherAddresses } from '@defisaver/sdk';
|
|
6
|
-
import { ChainId, RatioState } from '../types/enums';
|
|
6
|
+
import { ChainId, CollActionType, DebtActionType, RatioState, } from '../types/enums';
|
|
7
7
|
import { ZERO_ADDRESS } from '../constants';
|
|
8
8
|
import { compareAddresses, ratioPercentageToWei, weiToRatioPercentage } from './utils';
|
|
9
9
|
export const makerRepayFromSavingsSubData = {
|
|
@@ -467,3 +467,176 @@ export const aaveV3LeverageManagementOnPriceSubData = {
|
|
|
467
467
|
};
|
|
468
468
|
},
|
|
469
469
|
};
|
|
470
|
+
export const liquityV2LeverageManagementSubData = {
|
|
471
|
+
encode: (market, troveId, collToken, boldToken, ratioState, targetRatio) => {
|
|
472
|
+
const marketEncoded = AbiCoder.encodeParameter('address', market);
|
|
473
|
+
const troveIdEncoded = AbiCoder.encodeParameter('uint256', troveId);
|
|
474
|
+
const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
475
|
+
const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
|
|
476
|
+
const ratioStateEncoded = AbiCoder.encodeParameter('uint8', ratioState);
|
|
477
|
+
const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
|
|
478
|
+
const isRepay = ratioState === RatioState.UNDER;
|
|
479
|
+
const collActionType = isRepay ? CollActionType.WITHDRAW : CollActionType.SUPPLY;
|
|
480
|
+
const debtActionType = isRepay ? DebtActionType.PAYBACK : DebtActionType.BORROW;
|
|
481
|
+
const collActionTypeEncoded = AbiCoder.encodeParameter('uint8', collActionType);
|
|
482
|
+
const debtActionTypeEncoded = AbiCoder.encodeParameter('uint8', debtActionType);
|
|
483
|
+
return [
|
|
484
|
+
marketEncoded,
|
|
485
|
+
troveIdEncoded,
|
|
486
|
+
collTokenEncoded,
|
|
487
|
+
boldTokenEncoded,
|
|
488
|
+
ratioStateEncoded,
|
|
489
|
+
targetRatioEncoded,
|
|
490
|
+
collActionTypeEncoded,
|
|
491
|
+
debtActionTypeEncoded,
|
|
492
|
+
];
|
|
493
|
+
},
|
|
494
|
+
decode: (subData) => {
|
|
495
|
+
const market = AbiCoder.decodeParameter('address', subData[0]);
|
|
496
|
+
const troveId = AbiCoder.decodeParameter('uint256', subData[1]);
|
|
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]);
|
|
501
|
+
const targetRatio = weiToRatioPercentage(weiRatio);
|
|
502
|
+
return {
|
|
503
|
+
market, troveId, collToken, boldToken, ratioState, targetRatio,
|
|
504
|
+
};
|
|
505
|
+
},
|
|
506
|
+
};
|
|
507
|
+
export const liquityV2CloseSubData = {
|
|
508
|
+
encode(market, troveId, collToken, boldToken, closeType) {
|
|
509
|
+
const marketEncoded = AbiCoder.encodeParameter('address', market);
|
|
510
|
+
const troveIdEncoded = AbiCoder.encodeParameter('uint256', troveId);
|
|
511
|
+
const collAddrEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
512
|
+
const boldTokenEncoded = AbiCoder.encodeParameter('address', boldToken);
|
|
513
|
+
const wethAddress = getAssetInfo('WETH').address;
|
|
514
|
+
const wethAddressEncoded = AbiCoder.encodeParameter('address', wethAddress);
|
|
515
|
+
const gasCompensation = new Dec('0.0375').mul(1e18).toString();
|
|
516
|
+
const gasCompensationEncoded = AbiCoder.encodeParameter('uint256', gasCompensation);
|
|
517
|
+
const closeTypeEncoded = AbiCoder.encodeParameter('uint8', closeType);
|
|
518
|
+
return [
|
|
519
|
+
marketEncoded,
|
|
520
|
+
troveIdEncoded,
|
|
521
|
+
collAddrEncoded,
|
|
522
|
+
boldTokenEncoded,
|
|
523
|
+
wethAddressEncoded,
|
|
524
|
+
gasCompensationEncoded,
|
|
525
|
+
closeTypeEncoded,
|
|
526
|
+
];
|
|
527
|
+
},
|
|
528
|
+
decode(subData) {
|
|
529
|
+
const market = AbiCoder.decodeParameter('address', subData[0]);
|
|
530
|
+
const troveId = AbiCoder.decodeParameter('uint256', subData[1]);
|
|
531
|
+
const collToken = AbiCoder.decodeParameter('address', subData[2]);
|
|
532
|
+
const boldToken = AbiCoder.decodeParameter('address', subData[3]);
|
|
533
|
+
// skip wethAddress and gasCompensation
|
|
534
|
+
const closeType = AbiCoder.decodeParameter('uint8', subData[6]);
|
|
535
|
+
return {
|
|
536
|
+
market, troveId, collToken, boldToken, closeType,
|
|
537
|
+
};
|
|
538
|
+
},
|
|
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
|
+
};
|
|
573
|
+
export const morphoBlueLeverageManagementOnPriceSubData = {
|
|
574
|
+
encode(loanToken, collToken, oracle, irm, lltv, targetRatio, user) {
|
|
575
|
+
const loanTokenEncoded = AbiCoder.encodeParameter('address', loanToken);
|
|
576
|
+
const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
577
|
+
const oracleEncoded = AbiCoder.encodeParameter('address', oracle);
|
|
578
|
+
const irmEncoded = AbiCoder.encodeParameter('address', irm);
|
|
579
|
+
const lltvEncoded = AbiCoder.encodeParameter('uint256', lltv);
|
|
580
|
+
const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
|
|
581
|
+
const userEncoded = AbiCoder.encodeParameter('address', user);
|
|
582
|
+
return [loanTokenEncoded, collTokenEncoded, oracleEncoded, irmEncoded, lltvEncoded, targetRatioEncoded, userEncoded];
|
|
583
|
+
},
|
|
584
|
+
decode(subData) {
|
|
585
|
+
const loanToken = AbiCoder.decodeParameter('address', subData[0]);
|
|
586
|
+
const collToken = AbiCoder.decodeParameter('address', subData[1]);
|
|
587
|
+
const oracle = AbiCoder.decodeParameter('address', subData[2]);
|
|
588
|
+
const irm = AbiCoder.decodeParameter('address', subData[3]);
|
|
589
|
+
const lltv = AbiCoder.decodeParameter('uint256', subData[4]);
|
|
590
|
+
const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]);
|
|
591
|
+
const targetRatio = weiToRatioPercentage(weiRatio);
|
|
592
|
+
const user = AbiCoder.decodeParameter('address', subData[6]);
|
|
593
|
+
return {
|
|
594
|
+
loanToken,
|
|
595
|
+
collToken,
|
|
596
|
+
oracle,
|
|
597
|
+
irm,
|
|
598
|
+
lltv,
|
|
599
|
+
targetRatio,
|
|
600
|
+
user,
|
|
601
|
+
};
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
export const fluidLeverageManagementSubData = {
|
|
605
|
+
encode: (nftId, vault, collToken, debtToken, ratioState, targetRatio) => {
|
|
606
|
+
const nftIdEncoded = AbiCoder.encodeParameter('uint256', nftId);
|
|
607
|
+
const vaultEncoded = AbiCoder.encodeParameter('address', vault);
|
|
608
|
+
const collTokenEncoded = AbiCoder.encodeParameter('address', collToken);
|
|
609
|
+
const debtTokenEncoded = AbiCoder.encodeParameter('address', debtToken);
|
|
610
|
+
const ratioStateEncoded = AbiCoder.encodeParameter('uint8', ratioState);
|
|
611
|
+
const targetRatioEncoded = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
|
|
612
|
+
const wrapEthEncoded = AbiCoder.encodeParameter('bool', true);
|
|
613
|
+
const isRepay = ratioState === RatioState.UNDER;
|
|
614
|
+
const collActionType = isRepay ? CollActionType.WITHDRAW : CollActionType.SUPPLY;
|
|
615
|
+
const debtActionType = isRepay ? DebtActionType.PAYBACK : DebtActionType.BORROW;
|
|
616
|
+
const collActionTypeEncoded = AbiCoder.encodeParameter('uint8', collActionType);
|
|
617
|
+
const debtActionTypeEncoded = AbiCoder.encodeParameter('uint8', debtActionType);
|
|
618
|
+
return [
|
|
619
|
+
nftIdEncoded,
|
|
620
|
+
vaultEncoded,
|
|
621
|
+
collTokenEncoded,
|
|
622
|
+
debtTokenEncoded,
|
|
623
|
+
ratioStateEncoded,
|
|
624
|
+
targetRatioEncoded,
|
|
625
|
+
wrapEthEncoded,
|
|
626
|
+
collActionTypeEncoded,
|
|
627
|
+
debtActionTypeEncoded,
|
|
628
|
+
];
|
|
629
|
+
},
|
|
630
|
+
decode: (subData) => {
|
|
631
|
+
const nftId = AbiCoder.decodeParameter('uint256', subData[0]);
|
|
632
|
+
const vault = AbiCoder.decodeParameter('address', subData[1]);
|
|
633
|
+
const collToken = AbiCoder.decodeParameter('address', subData[2]);
|
|
634
|
+
const debtToken = AbiCoder.decodeParameter('address', subData[3]);
|
|
635
|
+
const ratioState = AbiCoder.decodeParameter('uint8', subData[4]);
|
|
636
|
+
const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]);
|
|
637
|
+
const targetRatio = weiToRatioPercentage(weiRatio);
|
|
638
|
+
return {
|
|
639
|
+
nftId, vault, collToken, debtToken, ratioState, targetRatio,
|
|
640
|
+
};
|
|
641
|
+
},
|
|
642
|
+
};
|