@defisaver/automation-sdk 3.2.5 → 3.3.0
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/.babelrc +3 -3
- package/.editorconfig +9 -9
- package/.env.dev +4 -4
- package/.eslintignore +6 -6
- package/.eslintrc.js +39 -39
- package/.mocharc.json +4 -4
- package/.nvmrc +1 -1
- package/README.md +46 -46
- package/cjs/abis/Erc20.json +223 -223
- package/cjs/abis/SubStorage.json +21 -21
- package/cjs/abis/UniMulticall.json +17 -17
- package/cjs/abis/index.d.ts +9 -9
- package/cjs/abis/index.js +30 -30
- package/cjs/abis/legacy_AaveV2Subscriptions.json +8 -8
- package/cjs/abis/legacy_AuthCheck.json +8 -8
- package/cjs/abis/legacy_CompoundV2Subscriptions.json +9 -9
- package/cjs/abis/legacy_MakerSubscriptions.json +9 -9
- package/cjs/automation/private/Automation.d.ts +12 -12
- package/cjs/automation/private/Automation.js +42 -42
- package/cjs/automation/private/LegacyAutomation.d.ts +25 -25
- package/cjs/automation/private/LegacyAutomation.js +118 -118
- package/cjs/automation/private/LegacyProtocol.d.ts +22 -22
- package/cjs/automation/private/LegacyProtocol.js +41 -41
- package/cjs/automation/private/LegacyProtocol.test.d.ts +1 -1
- package/cjs/automation/private/LegacyProtocol.test.js +25 -25
- package/cjs/automation/private/Protocol.d.ts +22 -22
- package/cjs/automation/private/Protocol.js +41 -41
- package/cjs/automation/private/Protocol.test.d.ts +1 -1
- package/cjs/automation/private/Protocol.test.js +25 -25
- package/cjs/automation/private/StrategiesAutomation.d.ts +33 -33
- package/cjs/automation/private/StrategiesAutomation.js +189 -189
- package/cjs/automation/private/StrategiesAutomation.test.d.ts +1 -1
- package/cjs/automation/private/StrategiesAutomation.test.js +671 -671
- package/cjs/automation/public/ArbitrumStrategies.d.ts +5 -5
- package/cjs/automation/public/ArbitrumStrategies.js +13 -13
- package/cjs/automation/public/BaseStrategies.d.ts +5 -5
- package/cjs/automation/public/BaseStrategies.js +13 -13
- package/cjs/automation/public/EthereumStrategies.d.ts +5 -5
- package/cjs/automation/public/EthereumStrategies.js +13 -13
- package/cjs/automation/public/OptimismStrategies.d.ts +5 -5
- package/cjs/automation/public/OptimismStrategies.js +13 -13
- package/cjs/automation/public/Strategies.test.d.ts +1 -1
- package/cjs/automation/public/Strategies.test.js +61 -61
- package/cjs/automation/public/legacy/LegacyAaveAutomation.d.ts +6 -6
- package/cjs/automation/public/legacy/LegacyAaveAutomation.js +20 -20
- package/cjs/automation/public/legacy/LegacyCompoundAutomation.d.ts +6 -6
- package/cjs/automation/public/legacy/LegacyCompoundAutomation.js +20 -20
- package/cjs/automation/public/legacy/LegacyMakerAutomation.d.ts +6 -6
- package/cjs/automation/public/legacy/LegacyMakerAutomation.js +20 -20
- package/cjs/configuration.d.ts +1 -1
- package/cjs/configuration.js +12 -12
- package/cjs/constants/index.d.ts +28 -28
- package/cjs/constants/index.js +674 -564
- package/cjs/index.d.ts +23 -23
- package/cjs/index.js +65 -65
- package/cjs/services/contractService.d.ts +12 -12
- package/cjs/services/contractService.js +54 -54
- package/cjs/services/ethereumService.d.ts +7 -7
- package/cjs/services/ethereumService.js +49 -49
- package/cjs/services/ethereumService.test.d.ts +1 -1
- package/cjs/services/ethereumService.test.js +242 -242
- package/cjs/services/strategiesService.d.ts +2 -2
- package/cjs/services/strategiesService.js +946 -898
- package/cjs/services/strategiesService.test.d.ts +1 -1
- package/cjs/services/strategiesService.test.js +110 -110
- package/cjs/services/strategySubService.d.ts +113 -111
- package/cjs/services/strategySubService.js +328 -314
- package/cjs/services/strategySubService.test.d.ts +1 -1
- package/cjs/services/strategySubService.test.js +1058 -936
- package/cjs/services/subDataService.d.ts +282 -261
- package/cjs/services/subDataService.js +740 -683
- package/cjs/services/subDataService.test.d.ts +1 -1
- package/cjs/services/subDataService.test.js +1458 -1282
- package/cjs/services/triggerService.d.ts +268 -249
- package/cjs/services/triggerService.js +509 -473
- package/cjs/services/triggerService.test.d.ts +1 -1
- package/cjs/services/triggerService.test.js +1139 -1045
- package/cjs/services/utils.d.ts +30 -30
- package/cjs/services/utils.js +182 -182
- package/cjs/services/utils.test.d.ts +1 -1
- package/cjs/services/utils.test.js +376 -376
- package/cjs/types/contracts/generated/Erc20.d.ts +53 -53
- package/cjs/types/contracts/generated/Erc20.js +5 -5
- package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
- package/cjs/types/contracts/generated/Legacy_AaveV2Subscriptions.js +5 -5
- package/cjs/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
- package/cjs/types/contracts/generated/Legacy_AuthCheck.js +5 -5
- package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
- package/cjs/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +5 -5
- package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
- package/cjs/types/contracts/generated/Legacy_MakerSubscriptions.js +5 -5
- package/cjs/types/contracts/generated/SubStorage.d.ts +114 -114
- package/cjs/types/contracts/generated/SubStorage.js +5 -5
- package/cjs/types/contracts/generated/UniMulticall.d.ts +55 -55
- package/cjs/types/contracts/generated/UniMulticall.js +5 -5
- package/cjs/types/contracts/generated/index.d.ts +7 -7
- package/cjs/types/contracts/generated/index.js +2 -2
- package/cjs/types/contracts/generated/types.d.ts +54 -54
- package/cjs/types/contracts/generated/types.js +2 -2
- package/cjs/types/enums.d.ts +253 -226
- package/cjs/types/enums.js +279 -252
- package/cjs/types/index.d.ts +264 -248
- package/cjs/types/index.js +2 -2
- package/esm/abis/Erc20.json +223 -223
- package/esm/abis/SubStorage.json +21 -21
- package/esm/abis/UniMulticall.json +17 -17
- package/esm/abis/index.d.ts +9 -9
- package/esm/abis/index.js +18 -18
- package/esm/abis/legacy_AaveV2Subscriptions.json +8 -8
- package/esm/abis/legacy_AuthCheck.json +8 -8
- package/esm/abis/legacy_CompoundV2Subscriptions.json +9 -9
- package/esm/abis/legacy_MakerSubscriptions.json +9 -9
- package/esm/automation/private/Automation.d.ts +12 -12
- package/esm/automation/private/Automation.js +39 -39
- package/esm/automation/private/LegacyAutomation.d.ts +25 -25
- package/esm/automation/private/LegacyAutomation.js +112 -112
- package/esm/automation/private/LegacyProtocol.d.ts +22 -22
- package/esm/automation/private/LegacyProtocol.js +38 -38
- package/esm/automation/private/LegacyProtocol.test.d.ts +1 -1
- package/esm/automation/private/LegacyProtocol.test.js +20 -20
- package/esm/automation/private/Protocol.d.ts +22 -22
- package/esm/automation/private/Protocol.js +38 -38
- package/esm/automation/private/Protocol.test.d.ts +1 -1
- package/esm/automation/private/Protocol.test.js +20 -20
- package/esm/automation/private/StrategiesAutomation.d.ts +33 -33
- package/esm/automation/private/StrategiesAutomation.js +183 -183
- package/esm/automation/private/StrategiesAutomation.test.d.ts +1 -1
- package/esm/automation/private/StrategiesAutomation.test.js +666 -666
- package/esm/automation/public/ArbitrumStrategies.d.ts +5 -5
- package/esm/automation/public/ArbitrumStrategies.js +7 -7
- package/esm/automation/public/BaseStrategies.d.ts +5 -5
- package/esm/automation/public/BaseStrategies.js +7 -7
- package/esm/automation/public/EthereumStrategies.d.ts +5 -5
- package/esm/automation/public/EthereumStrategies.js +7 -7
- package/esm/automation/public/OptimismStrategies.d.ts +5 -5
- package/esm/automation/public/OptimismStrategies.js +7 -7
- package/esm/automation/public/Strategies.test.d.ts +1 -1
- package/esm/automation/public/Strategies.test.js +56 -56
- package/esm/automation/public/legacy/LegacyAaveAutomation.d.ts +6 -6
- package/esm/automation/public/legacy/LegacyAaveAutomation.js +14 -14
- package/esm/automation/public/legacy/LegacyCompoundAutomation.d.ts +6 -6
- package/esm/automation/public/legacy/LegacyCompoundAutomation.js +14 -14
- package/esm/automation/public/legacy/LegacyMakerAutomation.d.ts +6 -6
- package/esm/automation/public/legacy/LegacyMakerAutomation.js +14 -14
- package/esm/configuration.d.ts +1 -1
- package/esm/configuration.js +7 -7
- package/esm/constants/index.d.ts +28 -28
- package/esm/constants/index.js +668 -558
- package/esm/index.d.ts +23 -23
- package/esm/index.js +23 -23
- package/esm/services/contractService.d.ts +12 -12
- package/esm/services/contractService.js +45 -45
- package/esm/services/ethereumService.d.ts +7 -7
- package/esm/services/ethereumService.js +41 -41
- package/esm/services/ethereumService.test.d.ts +1 -1
- package/esm/services/ethereumService.test.js +237 -237
- package/esm/services/strategiesService.d.ts +2 -2
- package/esm/services/strategiesService.js +916 -868
- package/esm/services/strategiesService.test.d.ts +1 -1
- package/esm/services/strategiesService.test.js +108 -108
- package/esm/services/strategySubService.d.ts +113 -111
- package/esm/services/strategySubService.js +299 -285
- package/esm/services/strategySubService.test.d.ts +1 -1
- package/esm/services/strategySubService.test.js +1030 -908
- package/esm/services/subDataService.d.ts +282 -261
- package/esm/services/subDataService.js +734 -677
- package/esm/services/subDataService.test.d.ts +1 -1
- package/esm/services/subDataService.test.js +1430 -1254
- package/esm/services/triggerService.d.ts +268 -249
- package/esm/services/triggerService.js +480 -444
- package/esm/services/triggerService.test.d.ts +1 -1
- package/esm/services/triggerService.test.js +1114 -1020
- package/esm/services/utils.d.ts +30 -30
- package/esm/services/utils.js +131 -131
- package/esm/services/utils.test.d.ts +1 -1
- package/esm/services/utils.test.js +348 -348
- package/esm/types/contracts/generated/Erc20.d.ts +53 -53
- package/esm/types/contracts/generated/Erc20.js +4 -4
- package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.d.ts +129 -129
- package/esm/types/contracts/generated/Legacy_AaveV2Subscriptions.js +4 -4
- package/esm/types/contracts/generated/Legacy_AuthCheck.d.ts +20 -20
- package/esm/types/contracts/generated/Legacy_AuthCheck.js +4 -4
- package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.d.ts +128 -128
- package/esm/types/contracts/generated/Legacy_CompoundV2Subscriptions.js +4 -4
- package/esm/types/contracts/generated/Legacy_MakerSubscriptions.d.ts +246 -246
- package/esm/types/contracts/generated/Legacy_MakerSubscriptions.js +4 -4
- package/esm/types/contracts/generated/SubStorage.d.ts +114 -114
- package/esm/types/contracts/generated/SubStorage.js +4 -4
- package/esm/types/contracts/generated/UniMulticall.d.ts +55 -55
- package/esm/types/contracts/generated/UniMulticall.js +4 -4
- package/esm/types/contracts/generated/index.d.ts +7 -7
- package/esm/types/contracts/generated/index.js +1 -1
- package/esm/types/contracts/generated/types.d.ts +54 -54
- package/esm/types/contracts/generated/types.js +1 -1
- package/esm/types/enums.d.ts +253 -226
- package/esm/types/enums.js +276 -249
- package/esm/types/index.d.ts +264 -248
- package/esm/types/index.js +1 -1
- package/package.json +60 -60
- package/scripts/generateContractTypes.js +39 -39
- package/src/abis/Erc20.json +222 -222
- package/src/abis/SubStorage.json +21 -21
- package/src/abis/UniMulticall.json +17 -17
- package/src/abis/index.ts +28 -28
- package/src/abis/legacy_AaveV2Subscriptions.json +7 -7
- package/src/abis/legacy_AuthCheck.json +7 -7
- package/src/abis/legacy_CompoundV2Subscriptions.json +8 -8
- package/src/abis/legacy_MakerSubscriptions.json +8 -8
- package/src/automation/private/Automation.ts +44 -44
- package/src/automation/private/LegacyAutomation.ts +135 -135
- package/src/automation/private/LegacyProtocol.test.ts +23 -23
- package/src/automation/private/LegacyProtocol.ts +51 -51
- package/src/automation/private/Protocol.test.ts +23 -23
- package/src/automation/private/Protocol.ts +51 -51
- package/src/automation/private/StrategiesAutomation.test.ts +663 -663
- package/src/automation/private/StrategiesAutomation.ts +254 -254
- package/src/automation/public/ArbitrumStrategies.ts +10 -10
- package/src/automation/public/BaseStrategies.ts +10 -10
- package/src/automation/public/EthereumStrategies.ts +10 -10
- package/src/automation/public/OptimismStrategies.ts +10 -10
- package/src/automation/public/Strategies.test.ts +49 -49
- package/src/automation/public/legacy/LegacyAaveAutomation.ts +20 -20
- package/src/automation/public/legacy/LegacyCompoundAutomation.ts +20 -20
- package/src/automation/public/legacy/LegacyMakerAutomation.ts +20 -20
- package/src/configuration.ts +8 -8
- package/src/constants/index.ts +702 -593
- package/src/index.ts +39 -39
- package/src/services/contractService.ts +77 -77
- package/src/services/ethereumService.test.ts +257 -257
- package/src/services/ethereumService.ts +69 -69
- package/src/services/strategiesService.test.ts +105 -105
- package/src/services/strategiesService.ts +1219 -1158
- package/src/services/strategySubService.test.ts +1250 -1122
- package/src/services/strategySubService.ts +685 -648
- package/src/services/subDataService.test.ts +1546 -1387
- package/src/services/subDataService.ts +1024 -934
- package/src/services/triggerService.test.ts +1234 -1130
- package/src/services/triggerService.ts +659 -602
- package/src/services/utils.test.ts +430 -430
- package/src/services/utils.ts +162 -162
- package/src/types/enums.ts +273 -246
- package/src/types/index.ts +333 -312
- package/tsconfig.esm.json +8 -8
- package/tsconfig.json +22 -22
|
@@ -1,183 +1,183 @@
|
|
|
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 Dec from 'decimal.js';
|
|
11
|
-
import PromisePool from 'es6-promise-pool';
|
|
12
|
-
import { Strategies, ProtocolIdentifiers } from '../../types/enums';
|
|
13
|
-
import { addToObjectIf, isDefined, isUndefined } from '../../services/utils';
|
|
14
|
-
import { getAbiItem, makeSubStorageContract } from '../../services/contractService';
|
|
15
|
-
import { getEventsFromContract, multicall } from '../../services/ethereumService';
|
|
16
|
-
import { parseStrategiesAutomatedPosition } from '../../services/strategiesService';
|
|
17
|
-
import Automation from './Automation';
|
|
18
|
-
export default class StrategiesAutomation extends Automation {
|
|
19
|
-
constructor(args) {
|
|
20
|
-
super();
|
|
21
|
-
this.web3 = args.provider;
|
|
22
|
-
this.web3Fork = args.providerFork;
|
|
23
|
-
this.chainId = args.chainId;
|
|
24
|
-
this.subStorageContract = makeSubStorageContract(this.web3, this.chainId);
|
|
25
|
-
this.subStorageContractFork = this.web3Fork ? makeSubStorageContract(this.web3Fork, this.chainId) : null;
|
|
26
|
-
this.assert();
|
|
27
|
-
}
|
|
28
|
-
getEventFromSubStorage(event, options) {
|
|
29
|
-
var _a;
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
// only used for backfilling, so in case options?.fromBlock in undefined
|
|
32
|
-
// (just like we omit fromBlock when we call from app when not on fork), we still want to fetch events
|
|
33
|
-
if (new Dec(this.subStorageContract.createdBlock.toString()).gt(((_a = options === null || options === void 0 ? void 0 : options.fromBlock) === null || _a === void 0 ? void 0 : _a.toString()) || this.subStorageContract.createdBlock.toString())) {
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
return getEventsFromContract(this.subStorageContract, this.subStorageContractFork, event, options);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
getStrategiesSubs(subIds, fromBlock = 'latest') {
|
|
40
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
let options;
|
|
42
|
-
let web3;
|
|
43
|
-
if (this.web3Fork && this.subStorageContractFork) {
|
|
44
|
-
options = {
|
|
45
|
-
target: this.subStorageContractFork.address,
|
|
46
|
-
abiItem: getAbiItem(this.subStorageContractFork.abi, 'strategiesSubs'),
|
|
47
|
-
};
|
|
48
|
-
web3 = this.web3Fork;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
options = {
|
|
52
|
-
target: this.subStorageContract.address,
|
|
53
|
-
abiItem: getAbiItem(this.subStorageContract.abi, 'strategiesSubs'),
|
|
54
|
-
};
|
|
55
|
-
web3 = this.web3;
|
|
56
|
-
}
|
|
57
|
-
const multicallCalls = subIds.map((subId) => (Object.assign(Object.assign({}, options), { params: [subId] })));
|
|
58
|
-
return multicall(web3, this.chainId, multicallCalls, fromBlock);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
getSubscriptionEventsFromSubStorage(options) {
|
|
62
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
-
return this.getEventFromSubStorage('Subscribe', options);
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
getUpdateDataEventsFromSubStorage(options) {
|
|
67
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
-
const events = yield this.getEventFromSubStorage('UpdateData', options);
|
|
69
|
-
/** @dev - Some RPCs sort events differently */
|
|
70
|
-
return events.sort((a, b) => a.blockNumber - b.blockNumber);
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
getParsedSubscriptions(parseData) {
|
|
74
|
-
return parseStrategiesAutomatedPosition(parseData);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* @description Removes expired Limit Order subscriptions
|
|
78
|
-
*/
|
|
79
|
-
removeExpiredSubscriptions(subscriptions) {
|
|
80
|
-
return subscriptions.filter((subscription) => {
|
|
81
|
-
if (!subscription) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
const { protocol, strategy, strategyData } = subscription;
|
|
85
|
-
if (protocol.id === ProtocolIdentifiers.StrategiesAutomation.Exchange
|
|
86
|
-
&& strategy.strategyId === Strategies.Identifiers.LimitOrder) {
|
|
87
|
-
return new Dec(strategyData.decoded.triggerData.goodUntil).gt(new Dec(Date.now()).div(1000));
|
|
88
|
-
}
|
|
89
|
-
return true;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
_mergeCheck(s, current) {
|
|
93
|
-
return s.owner === current.owner
|
|
94
|
-
&& s.strategy.strategyId === current.strategy.strategyId
|
|
95
|
-
&& s.protocol.id === current.protocol.id
|
|
96
|
-
&& s.specific.mergeId === current.specific.mergeWithId
|
|
97
|
-
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.MakerDAO // reflexer needs to get added if we have it
|
|
98
|
-
|| s.strategyData.decoded.subData.vaultId === current.strategyData.decoded.triggerData.vaultId)
|
|
99
|
-
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.CrvUSD // merge only crvUSD leverage management for the same market
|
|
100
|
-
|| s.strategyData.decoded.subData.controller.toLowerCase() === current.strategyData.decoded.triggerData.controller.toLowerCase())
|
|
101
|
-
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.MorphoBlue // merge morpho blue with the same marketId
|
|
102
|
-
|| s.strategyData.decoded.triggerData.marketId.toLowerCase() === current.strategyData.decoded.triggerData.marketId.toLowerCase());
|
|
103
|
-
}
|
|
104
|
-
mergeSubs(_subscriptions) {
|
|
105
|
-
const mergeBase = _subscriptions.filter(s => isDefined(s) && isDefined(s.specific.mergeWithId));
|
|
106
|
-
const mergeExtension = _subscriptions.filter(s => isDefined(s) && isDefined(s.specific.mergeId));
|
|
107
|
-
let subscriptions = _subscriptions.filter(s => isDefined(s) && isUndefined(s.specific.mergeWithId) && isUndefined(s.specific.mergeId)).map((s) => (Object.assign(Object.assign({}, s), { subIds: [s.subId] })));
|
|
108
|
-
mergeBase.forEach((current) => {
|
|
109
|
-
const mergePairIndexSubEnabled = mergeExtension.findIndex(s => this._mergeCheck(s, current) && s.isEnabled === current.isEnabled);
|
|
110
|
-
const mergePairIndexSubDisabled = mergeExtension.findIndex(s => this._mergeCheck(s, current));
|
|
111
|
-
const mergePairIndex = mergePairIndexSubEnabled !== -1 ? mergePairIndexSubEnabled : mergePairIndexSubDisabled;
|
|
112
|
-
if (mergePairIndex !== -1) {
|
|
113
|
-
const mergePair = mergeExtension[mergePairIndex];
|
|
114
|
-
mergeExtension.splice(mergePairIndex, 1);
|
|
115
|
-
subscriptions.push(Object.assign(Object.assign(Object.assign({}, mergePair), current), {
|
|
116
|
-
// @ts-ignore
|
|
117
|
-
blockNumber: Dec.max(mergePair.blockNumber, current.blockNumber).toNumber(), subIds: [current.subId, mergePair.subId], isEnabled: mergePair.isEnabled || current.isEnabled, specific: Object.assign(Object.assign({}, mergePair.specific), current.specific) }));
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
subscriptions.push(Object.assign(Object.assign({}, current), { subIds: [current.subId] }));
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
if (mergeExtension.length > 0) {
|
|
124
|
-
subscriptions = [...subscriptions, ...mergeExtension.map((s) => (Object.assign(Object.assign({}, s), { subIds: [s.subId] })))];
|
|
125
|
-
}
|
|
126
|
-
return subscriptions;
|
|
127
|
-
}
|
|
128
|
-
_getSubscriptions(addresses, options) {
|
|
129
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
-
const _options = Object.assign(Object.assign({}, addToObjectIf(isDefined(options), options)), addToObjectIf(isDefined(addresses), { filter: { proxy: addresses } }));
|
|
131
|
-
let subscriptionEvents = yield this.getSubscriptionEventsFromSubStorage(_options);
|
|
132
|
-
let subscriptions = [];
|
|
133
|
-
if (subscriptionEvents) {
|
|
134
|
-
let strategiesSubs = yield this.getStrategiesSubs(subscriptionEvents.map((e) => +e.returnValues.subId), _options.toBlock);
|
|
135
|
-
if (_options.enabledOnly) {
|
|
136
|
-
const filteredSubscriptionEvents = [];
|
|
137
|
-
strategiesSubs = strategiesSubs.filter((sub, index) => {
|
|
138
|
-
if (sub === null || sub === void 0 ? void 0 : sub.isEnabled)
|
|
139
|
-
filteredSubscriptionEvents.push(subscriptionEvents[index]);
|
|
140
|
-
return sub === null || sub === void 0 ? void 0 : sub.isEnabled;
|
|
141
|
-
});
|
|
142
|
-
subscriptionEvents = filteredSubscriptionEvents;
|
|
143
|
-
}
|
|
144
|
-
const replaceSubWithUpdate = (index) => __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
var _a;
|
|
146
|
-
const sub = strategiesSubs[index];
|
|
147
|
-
let latestUpdate = Object.assign({}, subscriptionEvents[index].returnValues);
|
|
148
|
-
if (latestUpdate.subHash !== (sub === null || sub === void 0 ? void 0 : sub.strategySubHash)) {
|
|
149
|
-
const updates = yield this.getUpdateDataEventsFromSubStorage(Object.assign(Object.assign({}, addToObjectIf(!!_options, _options)), { filter: { subId: latestUpdate.subId } }));
|
|
150
|
-
latestUpdate = Object.assign(Object.assign(Object.assign({}, latestUpdate), (_a = updates === null || updates === void 0 ? void 0 : updates[updates.length - 1]) === null || _a === void 0 ? void 0 : _a.returnValues), { 2: latestUpdate[2] });
|
|
151
|
-
}
|
|
152
|
-
subscriptions.push(this.getParsedSubscriptions({
|
|
153
|
-
chainId: this.chainId,
|
|
154
|
-
blockNumber: subscriptionEvents[index].blockNumber,
|
|
155
|
-
subscriptionEventData: latestUpdate,
|
|
156
|
-
strategiesSubsData: sub,
|
|
157
|
-
}));
|
|
158
|
-
});
|
|
159
|
-
// eslint-disable-next-line func-names
|
|
160
|
-
const pool = new PromisePool(function* () {
|
|
161
|
-
for (let index = 0; index < strategiesSubs.length; index++) {
|
|
162
|
-
yield replaceSubWithUpdate(index);
|
|
163
|
-
}
|
|
164
|
-
}, 50);
|
|
165
|
-
yield pool.start();
|
|
166
|
-
if (options === null || options === void 0 ? void 0 : options.mergeSubs) {
|
|
167
|
-
subscriptions = this.mergeSubs(subscriptions);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return _options.unexpiredOnly ? this.removeExpiredSubscriptions(subscriptions) : subscriptions;
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
getSubscriptions(options) {
|
|
174
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
-
return this._getSubscriptions(undefined, options);
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
getSubscriptionsFor(addresses, options) {
|
|
179
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
return this._getSubscriptions(addresses, options);
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
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 Dec from 'decimal.js';
|
|
11
|
+
import PromisePool from 'es6-promise-pool';
|
|
12
|
+
import { Strategies, ProtocolIdentifiers } from '../../types/enums';
|
|
13
|
+
import { addToObjectIf, isDefined, isUndefined } from '../../services/utils';
|
|
14
|
+
import { getAbiItem, makeSubStorageContract } from '../../services/contractService';
|
|
15
|
+
import { getEventsFromContract, multicall } from '../../services/ethereumService';
|
|
16
|
+
import { parseStrategiesAutomatedPosition } from '../../services/strategiesService';
|
|
17
|
+
import Automation from './Automation';
|
|
18
|
+
export default class StrategiesAutomation extends Automation {
|
|
19
|
+
constructor(args) {
|
|
20
|
+
super();
|
|
21
|
+
this.web3 = args.provider;
|
|
22
|
+
this.web3Fork = args.providerFork;
|
|
23
|
+
this.chainId = args.chainId;
|
|
24
|
+
this.subStorageContract = makeSubStorageContract(this.web3, this.chainId);
|
|
25
|
+
this.subStorageContractFork = this.web3Fork ? makeSubStorageContract(this.web3Fork, this.chainId) : null;
|
|
26
|
+
this.assert();
|
|
27
|
+
}
|
|
28
|
+
getEventFromSubStorage(event, options) {
|
|
29
|
+
var _a;
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
// only used for backfilling, so in case options?.fromBlock in undefined
|
|
32
|
+
// (just like we omit fromBlock when we call from app when not on fork), we still want to fetch events
|
|
33
|
+
if (new Dec(this.subStorageContract.createdBlock.toString()).gt(((_a = options === null || options === void 0 ? void 0 : options.fromBlock) === null || _a === void 0 ? void 0 : _a.toString()) || this.subStorageContract.createdBlock.toString())) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return getEventsFromContract(this.subStorageContract, this.subStorageContractFork, event, options);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getStrategiesSubs(subIds, fromBlock = 'latest') {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
let options;
|
|
42
|
+
let web3;
|
|
43
|
+
if (this.web3Fork && this.subStorageContractFork) {
|
|
44
|
+
options = {
|
|
45
|
+
target: this.subStorageContractFork.address,
|
|
46
|
+
abiItem: getAbiItem(this.subStorageContractFork.abi, 'strategiesSubs'),
|
|
47
|
+
};
|
|
48
|
+
web3 = this.web3Fork;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
options = {
|
|
52
|
+
target: this.subStorageContract.address,
|
|
53
|
+
abiItem: getAbiItem(this.subStorageContract.abi, 'strategiesSubs'),
|
|
54
|
+
};
|
|
55
|
+
web3 = this.web3;
|
|
56
|
+
}
|
|
57
|
+
const multicallCalls = subIds.map((subId) => (Object.assign(Object.assign({}, options), { params: [subId] })));
|
|
58
|
+
return multicall(web3, this.chainId, multicallCalls, fromBlock);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
getSubscriptionEventsFromSubStorage(options) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
return this.getEventFromSubStorage('Subscribe', options);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
getUpdateDataEventsFromSubStorage(options) {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
const events = yield this.getEventFromSubStorage('UpdateData', options);
|
|
69
|
+
/** @dev - Some RPCs sort events differently */
|
|
70
|
+
return events.sort((a, b) => a.blockNumber - b.blockNumber);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
getParsedSubscriptions(parseData) {
|
|
74
|
+
return parseStrategiesAutomatedPosition(parseData);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @description Removes expired Limit Order subscriptions
|
|
78
|
+
*/
|
|
79
|
+
removeExpiredSubscriptions(subscriptions) {
|
|
80
|
+
return subscriptions.filter((subscription) => {
|
|
81
|
+
if (!subscription) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
const { protocol, strategy, strategyData } = subscription;
|
|
85
|
+
if (protocol.id === ProtocolIdentifiers.StrategiesAutomation.Exchange
|
|
86
|
+
&& strategy.strategyId === Strategies.Identifiers.LimitOrder) {
|
|
87
|
+
return new Dec(strategyData.decoded.triggerData.goodUntil).gt(new Dec(Date.now()).div(1000));
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
_mergeCheck(s, current) {
|
|
93
|
+
return s.owner === current.owner
|
|
94
|
+
&& s.strategy.strategyId === current.strategy.strategyId
|
|
95
|
+
&& s.protocol.id === current.protocol.id
|
|
96
|
+
&& s.specific.mergeId === current.specific.mergeWithId
|
|
97
|
+
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.MakerDAO // reflexer needs to get added if we have it
|
|
98
|
+
|| s.strategyData.decoded.subData.vaultId === current.strategyData.decoded.triggerData.vaultId)
|
|
99
|
+
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.CrvUSD // merge only crvUSD leverage management for the same market
|
|
100
|
+
|| s.strategyData.decoded.subData.controller.toLowerCase() === current.strategyData.decoded.triggerData.controller.toLowerCase())
|
|
101
|
+
&& (s.protocol.id !== ProtocolIdentifiers.StrategiesAutomation.MorphoBlue // merge morpho blue with the same marketId
|
|
102
|
+
|| s.strategyData.decoded.triggerData.marketId.toLowerCase() === current.strategyData.decoded.triggerData.marketId.toLowerCase());
|
|
103
|
+
}
|
|
104
|
+
mergeSubs(_subscriptions) {
|
|
105
|
+
const mergeBase = _subscriptions.filter(s => isDefined(s) && isDefined(s.specific.mergeWithId));
|
|
106
|
+
const mergeExtension = _subscriptions.filter(s => isDefined(s) && isDefined(s.specific.mergeId));
|
|
107
|
+
let subscriptions = _subscriptions.filter(s => isDefined(s) && isUndefined(s.specific.mergeWithId) && isUndefined(s.specific.mergeId)).map((s) => (Object.assign(Object.assign({}, s), { subIds: [s.subId] })));
|
|
108
|
+
mergeBase.forEach((current) => {
|
|
109
|
+
const mergePairIndexSubEnabled = mergeExtension.findIndex(s => this._mergeCheck(s, current) && s.isEnabled === current.isEnabled);
|
|
110
|
+
const mergePairIndexSubDisabled = mergeExtension.findIndex(s => this._mergeCheck(s, current));
|
|
111
|
+
const mergePairIndex = mergePairIndexSubEnabled !== -1 ? mergePairIndexSubEnabled : mergePairIndexSubDisabled;
|
|
112
|
+
if (mergePairIndex !== -1) {
|
|
113
|
+
const mergePair = mergeExtension[mergePairIndex];
|
|
114
|
+
mergeExtension.splice(mergePairIndex, 1);
|
|
115
|
+
subscriptions.push(Object.assign(Object.assign(Object.assign({}, mergePair), current), {
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
blockNumber: Dec.max(mergePair.blockNumber, current.blockNumber).toNumber(), subIds: [current.subId, mergePair.subId], isEnabled: mergePair.isEnabled || current.isEnabled, specific: Object.assign(Object.assign({}, mergePair.specific), current.specific) }));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
subscriptions.push(Object.assign(Object.assign({}, current), { subIds: [current.subId] }));
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
if (mergeExtension.length > 0) {
|
|
124
|
+
subscriptions = [...subscriptions, ...mergeExtension.map((s) => (Object.assign(Object.assign({}, s), { subIds: [s.subId] })))];
|
|
125
|
+
}
|
|
126
|
+
return subscriptions;
|
|
127
|
+
}
|
|
128
|
+
_getSubscriptions(addresses, options) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
const _options = Object.assign(Object.assign({}, addToObjectIf(isDefined(options), options)), addToObjectIf(isDefined(addresses), { filter: { proxy: addresses } }));
|
|
131
|
+
let subscriptionEvents = yield this.getSubscriptionEventsFromSubStorage(_options);
|
|
132
|
+
let subscriptions = [];
|
|
133
|
+
if (subscriptionEvents) {
|
|
134
|
+
let strategiesSubs = yield this.getStrategiesSubs(subscriptionEvents.map((e) => +e.returnValues.subId), _options.toBlock);
|
|
135
|
+
if (_options.enabledOnly) {
|
|
136
|
+
const filteredSubscriptionEvents = [];
|
|
137
|
+
strategiesSubs = strategiesSubs.filter((sub, index) => {
|
|
138
|
+
if (sub === null || sub === void 0 ? void 0 : sub.isEnabled)
|
|
139
|
+
filteredSubscriptionEvents.push(subscriptionEvents[index]);
|
|
140
|
+
return sub === null || sub === void 0 ? void 0 : sub.isEnabled;
|
|
141
|
+
});
|
|
142
|
+
subscriptionEvents = filteredSubscriptionEvents;
|
|
143
|
+
}
|
|
144
|
+
const replaceSubWithUpdate = (index) => __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
var _a;
|
|
146
|
+
const sub = strategiesSubs[index];
|
|
147
|
+
let latestUpdate = Object.assign({}, subscriptionEvents[index].returnValues);
|
|
148
|
+
if (latestUpdate.subHash !== (sub === null || sub === void 0 ? void 0 : sub.strategySubHash)) {
|
|
149
|
+
const updates = yield this.getUpdateDataEventsFromSubStorage(Object.assign(Object.assign({}, addToObjectIf(!!_options, _options)), { filter: { subId: latestUpdate.subId } }));
|
|
150
|
+
latestUpdate = Object.assign(Object.assign(Object.assign({}, latestUpdate), (_a = updates === null || updates === void 0 ? void 0 : updates[updates.length - 1]) === null || _a === void 0 ? void 0 : _a.returnValues), { 2: latestUpdate[2] });
|
|
151
|
+
}
|
|
152
|
+
subscriptions.push(this.getParsedSubscriptions({
|
|
153
|
+
chainId: this.chainId,
|
|
154
|
+
blockNumber: subscriptionEvents[index].blockNumber,
|
|
155
|
+
subscriptionEventData: latestUpdate,
|
|
156
|
+
strategiesSubsData: sub,
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
// eslint-disable-next-line func-names
|
|
160
|
+
const pool = new PromisePool(function* () {
|
|
161
|
+
for (let index = 0; index < strategiesSubs.length; index++) {
|
|
162
|
+
yield replaceSubWithUpdate(index);
|
|
163
|
+
}
|
|
164
|
+
}, 50);
|
|
165
|
+
yield pool.start();
|
|
166
|
+
if (options === null || options === void 0 ? void 0 : options.mergeSubs) {
|
|
167
|
+
subscriptions = this.mergeSubs(subscriptions);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return _options.unexpiredOnly ? this.removeExpiredSubscriptions(subscriptions) : subscriptions;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
getSubscriptions(options) {
|
|
174
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
return this._getSubscriptions(undefined, options);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
getSubscriptionsFor(addresses, options) {
|
|
179
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
+
return this._getSubscriptions(addresses, options);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '../../configuration';
|
|
1
|
+
import '../../configuration';
|