@defisaver/automation-sdk 3.3.22-instant-twap-close-dev → 3.3.22
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 +5 -1
- package/cjs/automation/private/StrategiesAutomation.js +12 -0
- package/cjs/automation/private/StrategiesAutomation.test.js +51 -0
- package/cjs/constants/index.js +0 -40
- package/cjs/services/apiSubscriptionsService.d.ts +7 -0
- package/cjs/services/apiSubscriptionsService.js +33 -0
- package/cjs/services/apiSubscriptionsService.test.d.ts +1 -0
- package/cjs/services/apiSubscriptionsService.test.js +67 -0
- package/cjs/services/strategiesService.js +0 -25
- package/cjs/services/strategiesService.test.js +0 -63
- package/cjs/services/strategySubService.d.ts +0 -1
- package/cjs/services/strategySubService.js +0 -7
- package/cjs/services/strategySubService.test.js +0 -111
- package/cjs/services/subDataService.d.ts +0 -14
- package/cjs/services/subDataService.js +2 -40
- package/cjs/services/subDataService.test.js +0 -70
- package/cjs/types/enums.d.ts +4 -14
- package/cjs/types/enums.js +0 -11
- package/cjs/types/index.d.ts +24 -2
- package/esm/automation/private/StrategiesAutomation.d.ts +5 -1
- package/esm/automation/private/StrategiesAutomation.js +12 -0
- package/esm/automation/private/StrategiesAutomation.test.js +51 -0
- package/esm/constants/index.js +0 -40
- package/esm/services/apiSubscriptionsService.d.ts +7 -0
- package/esm/services/apiSubscriptionsService.js +29 -0
- package/esm/services/apiSubscriptionsService.test.d.ts +1 -0
- package/esm/services/apiSubscriptionsService.test.js +65 -0
- package/esm/services/strategiesService.js +0 -25
- package/esm/services/strategiesService.test.js +1 -64
- package/esm/services/strategySubService.d.ts +0 -1
- package/esm/services/strategySubService.js +0 -7
- package/esm/services/strategySubService.test.js +0 -111
- package/esm/services/subDataService.d.ts +0 -14
- package/esm/services/subDataService.js +0 -38
- package/esm/services/subDataService.test.js +0 -70
- package/esm/types/enums.d.ts +4 -14
- package/esm/types/enums.js +0 -11
- package/esm/types/index.d.ts +24 -2
- package/package.json +1 -1
- package/src/automation/private/StrategiesAutomation.test.ts +65 -1
- package/src/automation/private/StrategiesAutomation.ts +17 -0
- package/src/constants/index.ts +0 -40
- package/src/services/apiSubscriptionsService.test.ts +73 -0
- package/src/services/apiSubscriptionsService.ts +33 -0
- package/src/services/strategiesService.test.ts +1 -79
- package/src/services/strategiesService.ts +0 -33
- package/src/services/strategySubService.test.ts +0 -130
- package/src/services/strategySubService.ts +0 -26
- package/src/services/subDataService.test.ts +0 -98
- package/src/services/subDataService.ts +0 -61
- package/src/types/enums.ts +0 -11
- package/src/types/index.ts +26 -2
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
|
|
3
|
+
import type { ApiSubscriptionRecord, ParseData } from '../types';
|
|
4
|
+
import { ChainId } from '../types/enums';
|
|
5
|
+
|
|
6
|
+
import '../configuration';
|
|
7
|
+
import { parseDataFromApiSubscription } from './apiSubscriptionsService';
|
|
8
|
+
import { parseStrategiesAutomatedPosition } from './strategiesService';
|
|
9
|
+
|
|
10
|
+
describe('Feature: apiSubscriptionsService.ts', () => {
|
|
11
|
+
describe('When testing apiSubscriptionsService.parseDataFromApiSubscription', () => {
|
|
12
|
+
// same subscription as in strategiesService.test.ts, in the shape the automation API returns it
|
|
13
|
+
const record: ApiSubscriptionRecord = {
|
|
14
|
+
id: 379,
|
|
15
|
+
wallet: '0x9cB7E19861665366011899d74E75d4F2A419aEeD',
|
|
16
|
+
wallet_type: 'safe',
|
|
17
|
+
is_enabled: true,
|
|
18
|
+
is_bundle: true,
|
|
19
|
+
strategy_or_bundle_id: 8,
|
|
20
|
+
strategy_ids: [34, 35],
|
|
21
|
+
sub_data_hash: '0xafa4d200be62f171b57b1ae0f4e8348d1ac3f6d0812ad6da74a2adae8037dde1',
|
|
22
|
+
trigger_data: [
|
|
23
|
+
'0000000000000000000000009cb7e19861665366011899d74e75d4f2a419aeed0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e00000000000000000000000000000000000000000000000019ac8532c27900000000000000000000000000000000000000000000000000000000000000000001',
|
|
24
|
+
],
|
|
25
|
+
sub_data: [
|
|
26
|
+
'0x0000000000000000000000000000000000000000000000001bc16d674ec80000',
|
|
27
|
+
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
28
|
+
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
29
|
+
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
30
|
+
],
|
|
31
|
+
block_number: 18015756,
|
|
32
|
+
additional_triggers: null,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const fromEvents: ParseData = {
|
|
36
|
+
chainId: ChainId.Ethereum,
|
|
37
|
+
blockNumber: 18015756,
|
|
38
|
+
subscriptionEventData: {
|
|
39
|
+
subId: '379',
|
|
40
|
+
proxy: '0x9cB7E19861665366011899d74E75d4F2A419aEeD',
|
|
41
|
+
subHash: '0xafa4d200be62f171b57b1ae0f4e8348d1ac3f6d0812ad6da74a2adae8037dde1',
|
|
42
|
+
subStruct: {
|
|
43
|
+
strategyOrBundleId: '8',
|
|
44
|
+
isBundle: true,
|
|
45
|
+
triggerData: [
|
|
46
|
+
'0x0000000000000000000000009cb7e19861665366011899d74e75d4f2a419aeed0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e00000000000000000000000000000000000000000000000019ac8532c27900000000000000000000000000000000000000000000000000000000000000000001',
|
|
47
|
+
],
|
|
48
|
+
subData: record.sub_data,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
strategiesSubsData: {
|
|
52
|
+
userProxy: '0x9cB7E19861665366011899d74E75d4F2A419aEeD',
|
|
53
|
+
isEnabled: true,
|
|
54
|
+
strategySubHash: '0xafa4d200be62f171b57b1ae0f4e8348d1ac3f6d0812ad6da74a2adae8037dde1',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
it('Given an API record should return the same parse data as Subscribe event and SubStorage would', () => {
|
|
59
|
+
expect(parseDataFromApiSubscription(record, ChainId.Ethereum)).to.eql(fromEvents);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('Given an API record the parsed position should match the one parsed from events', () => {
|
|
63
|
+
const fromApi = parseStrategiesAutomatedPosition(parseDataFromApiSubscription(record, ChainId.Ethereum));
|
|
64
|
+
expect(fromApi).to.not.equal(null);
|
|
65
|
+
expect(fromApi).to.eql(parseStrategiesAutomatedPosition(fromEvents));
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('Given a disabled record should keep it disabled', () => {
|
|
69
|
+
const parseData = parseDataFromApiSubscription({ ...record, is_enabled: false }, ChainId.Ethereum);
|
|
70
|
+
expect(parseData.strategiesSubsData.isEnabled).to.equal(false);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ApiSubscriptionRecord, ParseData } from '../types';
|
|
2
|
+
import type { ChainId } from '../types/enums';
|
|
3
|
+
|
|
4
|
+
function addHexPrefix(value: string): string {
|
|
5
|
+
return value.startsWith('0x') ? value : `0x${value}`;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @description Maps a subscription record returned by the automation API to the data
|
|
10
|
+
* the parser expects from Subscribe events and SubStorage (trigger data is stored without 0x prefix)
|
|
11
|
+
*/
|
|
12
|
+
export function parseDataFromApiSubscription(record: ApiSubscriptionRecord, chainId: ChainId): ParseData {
|
|
13
|
+
return {
|
|
14
|
+
chainId,
|
|
15
|
+
blockNumber: record.block_number,
|
|
16
|
+
subscriptionEventData: {
|
|
17
|
+
subId: record.id.toString(),
|
|
18
|
+
proxy: record.wallet,
|
|
19
|
+
subHash: record.sub_data_hash,
|
|
20
|
+
subStruct: {
|
|
21
|
+
strategyOrBundleId: record.strategy_or_bundle_id.toString(),
|
|
22
|
+
isBundle: record.is_bundle,
|
|
23
|
+
triggerData: record.trigger_data.map(addHexPrefix),
|
|
24
|
+
subData: record.sub_data.map(addHexPrefix),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
strategiesSubsData: {
|
|
28
|
+
userProxy: record.wallet,
|
|
29
|
+
isEnabled: record.is_enabled,
|
|
30
|
+
strategySubHash: record.sub_data_hash,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { expect } from 'chai';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
Bundles, CloseStrategyType, CloseToAssetType, ProtocolIdentifiers, Strategies,
|
|
5
|
-
} from '../types/enums';
|
|
3
|
+
import { ProtocolIdentifiers, Strategies } from '../types/enums';
|
|
6
4
|
import type { ParseData, Position } from '../types';
|
|
7
5
|
|
|
8
6
|
import '../configuration';
|
|
9
7
|
import { parseStrategiesAutomatedPosition } from './strategiesService';
|
|
10
|
-
import { aaveV3Encode } from './strategySubService';
|
|
11
8
|
|
|
12
9
|
describe('Feature: strategiesService.ts', () => {
|
|
13
10
|
describe('When testing strategiesService.parseStrategiesAutomatedPosition', async () => {
|
|
@@ -79,7 +76,6 @@ describe('Feature: strategiesService.ts', () => {
|
|
|
79
76
|
subId: '379',
|
|
80
77
|
proxy: '0x9cb7e19861665366011899d74e75d4f2a419aeed',
|
|
81
78
|
subHash: '0xafa4d200be62f171b57b1ae0f4e8348d1ac3f6d0812ad6da74a2adae8037dde1',
|
|
82
|
-
// @ts-ignore
|
|
83
79
|
subStruct:
|
|
84
80
|
{
|
|
85
81
|
strategyOrBundleId: '8',
|
|
@@ -106,78 +102,4 @@ describe('Feature: strategiesService.ts', () => {
|
|
|
106
102
|
});
|
|
107
103
|
});
|
|
108
104
|
});
|
|
109
|
-
|
|
110
|
-
describe('When parsing Aave V3 instant close bundles', () => {
|
|
111
|
-
const owner = '0x1234567890123456789012345678901234567890';
|
|
112
|
-
const market = '0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e';
|
|
113
|
-
const weth = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
|
|
114
|
-
const usdc = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
|
|
115
|
-
|
|
116
|
-
const bundles: Array<[string, Bundles.MainnetIds, Strategies.Identifiers]> = [
|
|
117
|
-
['SW', Bundles.MainnetIds.AAVE_V3_SW_INSTANT_CLOSE, Strategies.Identifiers.InstantCloseOnPrice],
|
|
118
|
-
['EOA', Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE, Strategies.Identifiers.EoaInstantCloseOnPrice],
|
|
119
|
-
];
|
|
120
|
-
|
|
121
|
-
bundles.forEach(([walletType, expectedBundleId, expectedStrategyId]) => {
|
|
122
|
-
describe(`${walletType} bundle`, () => {
|
|
123
|
-
const [bundleId, isBundle, triggerData, subData] = aaveV3Encode.instantCloseOnPriceGeneric(
|
|
124
|
-
expectedBundleId,
|
|
125
|
-
weth, 0, usdc, 1, market, owner,
|
|
126
|
-
'1000000000000000000', '10000000000000000',
|
|
127
|
-
1500, CloseToAssetType.DEBT, 5000, CloseToAssetType.COLLATERAL,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
const parseData = {
|
|
131
|
-
chainId: 1,
|
|
132
|
-
blockNumber: 1,
|
|
133
|
-
subscriptionEventData: {
|
|
134
|
-
subId: '1',
|
|
135
|
-
proxy: owner,
|
|
136
|
-
subHash: '0xhash',
|
|
137
|
-
subStruct: {
|
|
138
|
-
strategyOrBundleId: String(bundleId), isBundle, triggerData, subData,
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
strategiesSubsData: { userProxy: owner, isEnabled: true, strategySubHash: '0xhash' },
|
|
142
|
-
} as unknown as ParseData;
|
|
143
|
-
|
|
144
|
-
const result = parseStrategiesAutomatedPosition(parseData) as Position.Automated;
|
|
145
|
-
|
|
146
|
-
it('should identify the strategy as instant close on price', () => {
|
|
147
|
-
expect(result.strategy.strategyOrBundleId).to.equal(expectedBundleId);
|
|
148
|
-
expect(result.strategy.strategyId).to.equal(expectedStrategyId);
|
|
149
|
-
expect(result.protocol.id).to.equal(ProtocolIdentifiers.StrategiesAutomation.AaveV3);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('should decode sub data including tsi and slippage', () => {
|
|
153
|
-
expect(result.strategyData.decoded.subData).to.eql({
|
|
154
|
-
collAsset: weth,
|
|
155
|
-
collAssetId: 0,
|
|
156
|
-
debtAsset: usdc,
|
|
157
|
-
debtAssetId: 1,
|
|
158
|
-
closeType: CloseStrategyType.TAKE_PROFIT_IN_COLLATERAL_AND_STOP_LOSS_IN_DEBT,
|
|
159
|
-
marketAddr: market,
|
|
160
|
-
owner,
|
|
161
|
-
tsi: '1000000000000000000',
|
|
162
|
-
slippage: '10000000000000000',
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('should fill specific with prices and close types', () => {
|
|
167
|
-
expect(result.specific).to.eql({
|
|
168
|
-
collAsset: weth,
|
|
169
|
-
collAssetId: 0,
|
|
170
|
-
debtAsset: usdc,
|
|
171
|
-
debtAssetId: 1,
|
|
172
|
-
baseToken: weth,
|
|
173
|
-
quoteToken: usdc,
|
|
174
|
-
stopLossPrice: '1500',
|
|
175
|
-
takeProfitPrice: '5000',
|
|
176
|
-
stopLossType: CloseToAssetType.DEBT,
|
|
177
|
-
takeProfitType: CloseToAssetType.COLLATERAL,
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
105
|
});
|
|
@@ -433,37 +433,6 @@ function parseAaveV3CloseOnPrice(position: Position.Automated, parseData: ParseD
|
|
|
433
433
|
return _position;
|
|
434
434
|
}
|
|
435
435
|
|
|
436
|
-
function parseAaveV3InstantCloseOnPrice(position: Position.Automated, parseData: ParseData): Position.Automated {
|
|
437
|
-
const _position = cloneDeep(position);
|
|
438
|
-
|
|
439
|
-
const { subStruct } = parseData.subscriptionEventData;
|
|
440
|
-
|
|
441
|
-
const triggerData = triggerService.aaveV3QuotePriceRangeTrigger.decode(subStruct.triggerData);
|
|
442
|
-
const subData = subDataService.aaveV3InstantCloseGenericSubData.decode(subStruct.subData);
|
|
443
|
-
|
|
444
|
-
const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
|
|
445
|
-
|
|
446
|
-
_position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, AAVE_V3_MARKET_ADDRESSES[_position.chainId]);
|
|
447
|
-
|
|
448
|
-
_position.strategyData.decoded.triggerData = triggerData;
|
|
449
|
-
_position.strategyData.decoded.subData = subData;
|
|
450
|
-
|
|
451
|
-
_position.specific = {
|
|
452
|
-
collAsset: subData.collAsset,
|
|
453
|
-
collAssetId: subData.collAssetId,
|
|
454
|
-
debtAsset: subData.debtAsset,
|
|
455
|
-
debtAssetId: subData.debtAssetId,
|
|
456
|
-
baseToken: triggerData.collToken,
|
|
457
|
-
quoteToken: triggerData.debtToken,
|
|
458
|
-
stopLossPrice: triggerData.lowerPrice,
|
|
459
|
-
takeProfitPrice: triggerData.upperPrice,
|
|
460
|
-
stopLossType,
|
|
461
|
-
takeProfitType,
|
|
462
|
-
};
|
|
463
|
-
|
|
464
|
-
return _position;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
436
|
function parseAaveV3CollateralSwitch(position: Position.Automated, parseData: ParseData): Position.Automated {
|
|
468
437
|
const _position = cloneDeep(position);
|
|
469
438
|
const { subStruct } = parseData.subscriptionEventData;
|
|
@@ -1627,8 +1596,6 @@ const parsingMethodsMapping: StrategiesToProtocolVersionMapping = {
|
|
|
1627
1596
|
[Strategies.Identifiers.EoaRepayOnPrice]: parseAaveV3LeverageManagementOnPrice,
|
|
1628
1597
|
[Strategies.Identifiers.EoaBoostOnPrice]: parseAaveV3LeverageManagementOnPrice,
|
|
1629
1598
|
[Strategies.Identifiers.EoaCloseOnPrice]: parseAaveV3CloseOnPrice,
|
|
1630
|
-
[Strategies.Identifiers.InstantCloseOnPrice]: parseAaveV3InstantCloseOnPrice,
|
|
1631
|
-
[Strategies.Identifiers.EoaInstantCloseOnPrice]: parseAaveV3InstantCloseOnPrice,
|
|
1632
1599
|
[Strategies.Identifiers.CollateralSwitch]: parseAaveV3CollateralSwitch,
|
|
1633
1600
|
[Strategies.Identifiers.LiquidationProtection]: parseAaveV3LiquidationProtection,
|
|
1634
1601
|
[Strategies.Identifiers.EoaLiquidationProtection]: parseAaveV3LiquidationProtection,
|
|
@@ -887,136 +887,6 @@ describe('Feature: strategySubService.ts', () => {
|
|
|
887
887
|
});
|
|
888
888
|
});
|
|
889
889
|
|
|
890
|
-
describe('instantCloseOnPriceGeneric()', () => {
|
|
891
|
-
const examples: Array<[
|
|
892
|
-
[StrategyOrBundleIds, boolean, TriggerData, SubData],
|
|
893
|
-
[
|
|
894
|
-
strategyOrBundleId: number,
|
|
895
|
-
collAsset: EthereumAddress,
|
|
896
|
-
collAssetId: number,
|
|
897
|
-
debtAsset: EthereumAddress,
|
|
898
|
-
debtAssetId: number,
|
|
899
|
-
marketAddr: EthereumAddress,
|
|
900
|
-
user: EthereumAddress,
|
|
901
|
-
tsi: string,
|
|
902
|
-
slippage: string,
|
|
903
|
-
stopLossPrice: number,
|
|
904
|
-
stopLossType: CloseToAssetType,
|
|
905
|
-
takeProfitPrice: number,
|
|
906
|
-
takeProfitType: CloseToAssetType
|
|
907
|
-
]
|
|
908
|
-
]> = [
|
|
909
|
-
// Stop loss only (to debt)
|
|
910
|
-
[
|
|
911
|
-
[
|
|
912
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
913
|
-
true,
|
|
914
|
-
['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000000000000000'],
|
|
915
|
-
[
|
|
916
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
917
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
918
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
919
|
-
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
920
|
-
'0x0000000000000000000000000000000000000000000000000000000000000003',
|
|
921
|
-
'0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e',
|
|
922
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
923
|
-
'0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
|
|
924
|
-
'0x000000000000000000000000000000000000000000000000002386f26fc10000',
|
|
925
|
-
],
|
|
926
|
-
],
|
|
927
|
-
[
|
|
928
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
929
|
-
web3Utils.toChecksumAddress(getAssetInfo('WETH', ChainId.Ethereum).address),
|
|
930
|
-
0,
|
|
931
|
-
web3Utils.toChecksumAddress(getAssetInfo('USDC', ChainId.Ethereum).address),
|
|
932
|
-
1,
|
|
933
|
-
web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
|
|
934
|
-
web3Utils.toChecksumAddress('0x1234567890123456789012345678901234567890'),
|
|
935
|
-
'1000000000000000000', // tsi
|
|
936
|
-
'10000000000000000', // slippage
|
|
937
|
-
1500, // stopLossPrice
|
|
938
|
-
CloseToAssetType.DEBT, // stopLossType
|
|
939
|
-
0, // takeProfitPrice
|
|
940
|
-
CloseToAssetType.COLLATERAL, // takeProfitType (not used since price is 0)
|
|
941
|
-
]
|
|
942
|
-
],
|
|
943
|
-
// Take profit only (to collateral), zero tsi and slippage
|
|
944
|
-
[
|
|
945
|
-
[
|
|
946
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
947
|
-
true,
|
|
948
|
-
['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746a528800'],
|
|
949
|
-
[
|
|
950
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
951
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
952
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
953
|
-
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
954
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
955
|
-
'0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e',
|
|
956
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
957
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
958
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
959
|
-
],
|
|
960
|
-
],
|
|
961
|
-
[
|
|
962
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
963
|
-
web3Utils.toChecksumAddress(getAssetInfo('WETH', ChainId.Ethereum).address),
|
|
964
|
-
0,
|
|
965
|
-
web3Utils.toChecksumAddress(getAssetInfo('USDC', ChainId.Ethereum).address),
|
|
966
|
-
1,
|
|
967
|
-
web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
|
|
968
|
-
web3Utils.toChecksumAddress('0x1234567890123456789012345678901234567890'),
|
|
969
|
-
'0', // tsi
|
|
970
|
-
'0', // slippage
|
|
971
|
-
0, // stopLossPrice
|
|
972
|
-
CloseToAssetType.DEBT, // stopLossType (not used since price is 0)
|
|
973
|
-
5000, // takeProfitPrice
|
|
974
|
-
CloseToAssetType.COLLATERAL, // takeProfitType
|
|
975
|
-
]
|
|
976
|
-
],
|
|
977
|
-
// Take profit (to debt) and stop loss (to collateral)
|
|
978
|
-
[
|
|
979
|
-
[
|
|
980
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
981
|
-
true,
|
|
982
|
-
['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000005d21dba000'],
|
|
983
|
-
[
|
|
984
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
985
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
986
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
987
|
-
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
988
|
-
'0x0000000000000000000000000000000000000000000000000000000000000007',
|
|
989
|
-
'0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e',
|
|
990
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
991
|
-
'0x00000000000000000000000000000000000000000000000000b1a2bc2ec50000',
|
|
992
|
-
'0x0000000000000000000000000000000000000000000000000011c37937e08000',
|
|
993
|
-
],
|
|
994
|
-
],
|
|
995
|
-
[
|
|
996
|
-
Bundles.MainnetIds.AAVE_V3_EOA_INSTANT_CLOSE,
|
|
997
|
-
web3Utils.toChecksumAddress(getAssetInfo('WETH', ChainId.Ethereum).address),
|
|
998
|
-
0,
|
|
999
|
-
web3Utils.toChecksumAddress(getAssetInfo('USDC', ChainId.Ethereum).address),
|
|
1000
|
-
1,
|
|
1001
|
-
web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
|
|
1002
|
-
web3Utils.toChecksumAddress('0x1234567890123456789012345678901234567890'),
|
|
1003
|
-
'50000000000000000', // tsi
|
|
1004
|
-
'5000000000000000', // slippage
|
|
1005
|
-
1500, // stopLossPrice
|
|
1006
|
-
CloseToAssetType.COLLATERAL, // stopLossType
|
|
1007
|
-
4000, // takeProfitPrice
|
|
1008
|
-
CloseToAssetType.DEBT, // takeProfitType
|
|
1009
|
-
]
|
|
1010
|
-
],
|
|
1011
|
-
];
|
|
1012
|
-
|
|
1013
|
-
examples.forEach(([expected, actual]) => {
|
|
1014
|
-
it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
|
|
1015
|
-
expect(aaveV3Encode.instantCloseOnPriceGeneric(...actual)).to.eql(expected);
|
|
1016
|
-
});
|
|
1017
|
-
});
|
|
1018
|
-
});
|
|
1019
|
-
|
|
1020
890
|
describe('collateralSwitch()', () => {
|
|
1021
891
|
const examples: Array<[
|
|
1022
892
|
[StrategyOrBundleIds, boolean, TriggerData, SubData],
|
|
@@ -424,32 +424,6 @@ export const aaveV3Encode = {
|
|
|
424
424
|
return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
|
|
425
425
|
},
|
|
426
426
|
|
|
427
|
-
instantCloseOnPriceGeneric(
|
|
428
|
-
strategyOrBundleId: number,
|
|
429
|
-
collAsset: EthereumAddress,
|
|
430
|
-
collAssetId: number,
|
|
431
|
-
debtAsset: EthereumAddress,
|
|
432
|
-
debtAssetId: number,
|
|
433
|
-
marketAddr: EthereumAddress,
|
|
434
|
-
user: EthereumAddress,
|
|
435
|
-
tsi: string,
|
|
436
|
-
slippage: string,
|
|
437
|
-
stopLossPrice: number = 0,
|
|
438
|
-
stopLossType: CloseToAssetType = CloseToAssetType.DEBT,
|
|
439
|
-
takeProfitPrice: number = 0,
|
|
440
|
-
takeProfitType: CloseToAssetType = CloseToAssetType.COLLATERAL,
|
|
441
|
-
) {
|
|
442
|
-
const isBundle = true;
|
|
443
|
-
const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
|
|
444
|
-
|
|
445
|
-
const subDataEncoded = subDataService.aaveV3InstantCloseGenericSubData.encode(
|
|
446
|
-
collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, user, tsi, slippage,
|
|
447
|
-
);
|
|
448
|
-
const triggerDataEncoded = triggerService.aaveV3QuotePriceRangeTrigger.encode(collAsset, debtAsset, stopLossPrice, takeProfitPrice);
|
|
449
|
-
|
|
450
|
-
return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
|
|
451
|
-
},
|
|
452
|
-
|
|
453
427
|
collateralSwitch(
|
|
454
428
|
strategyOrBundleId: number,
|
|
455
429
|
fromAsset: EthereumAddress,
|
|
@@ -2495,104 +2495,6 @@ describe('Feature: subDataService.ts', () => {
|
|
|
2495
2495
|
});
|
|
2496
2496
|
});
|
|
2497
2497
|
});
|
|
2498
|
-
|
|
2499
|
-
describe("When testing subDataService.aaveV3InstantCloseGenericSubData", () => {
|
|
2500
|
-
const WETH = web3Utils.toChecksumAddress(getAssetInfo('WETH', ChainId.Ethereum).address);
|
|
2501
|
-
const USDC = web3Utils.toChecksumAddress(getAssetInfo('USDC', ChainId.Ethereum).address);
|
|
2502
|
-
const MARKET = web3Utils.toChecksumAddress('0x87870Bca3F3fD6335C3F4ce8392D69d0B4161d39');
|
|
2503
|
-
const USER = web3Utils.toChecksumAddress('0x1234567890123456789012345678901234567890');
|
|
2504
|
-
|
|
2505
|
-
const examples: Array<
|
|
2506
|
-
[
|
|
2507
|
-
string[],
|
|
2508
|
-
[
|
|
2509
|
-
collAsset: EthereumAddress,
|
|
2510
|
-
collAssetId: number,
|
|
2511
|
-
debtAsset: EthereumAddress,
|
|
2512
|
-
debtAssetId: number,
|
|
2513
|
-
closeType: CloseStrategyType,
|
|
2514
|
-
marketAddr: EthereumAddress,
|
|
2515
|
-
user: EthereumAddress,
|
|
2516
|
-
tsi: string,
|
|
2517
|
-
slippage: string
|
|
2518
|
-
]
|
|
2519
|
-
]
|
|
2520
|
-
> = [
|
|
2521
|
-
// TAKE_PROFIT_IN_COLLATERAL, zero tsi and slippage
|
|
2522
|
-
[
|
|
2523
|
-
[
|
|
2524
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
2525
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
2526
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
2527
|
-
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
2528
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
2529
|
-
'0x00000000000000000000000087870bca3f3fd6335c3f4ce8392d69d0b4161d39',
|
|
2530
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
2531
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
2532
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
2533
|
-
],
|
|
2534
|
-
[WETH, 0, USDC, 1, CloseStrategyType.TAKE_PROFIT_IN_COLLATERAL, MARKET, USER, '0', '0'],
|
|
2535
|
-
],
|
|
2536
|
-
// STOP_LOSS_IN_DEBT
|
|
2537
|
-
[
|
|
2538
|
-
[
|
|
2539
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
2540
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
2541
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
2542
|
-
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
2543
|
-
'0x0000000000000000000000000000000000000000000000000000000000000003',
|
|
2544
|
-
'0x00000000000000000000000087870bca3f3fd6335c3f4ce8392d69d0b4161d39',
|
|
2545
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
2546
|
-
'0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
|
|
2547
|
-
'0x000000000000000000000000000000000000000000000000002386f26fc10000',
|
|
2548
|
-
],
|
|
2549
|
-
[WETH, 0, USDC, 1, CloseStrategyType.STOP_LOSS_IN_DEBT, MARKET, USER, '1000000000000000000', '10000000000000000'],
|
|
2550
|
-
],
|
|
2551
|
-
// TAKE_PROFIT_IN_DEBT_AND_STOP_LOSS_IN_COLLATERAL, asset ids above uint8 range
|
|
2552
|
-
[
|
|
2553
|
-
[
|
|
2554
|
-
'0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
2555
|
-
'0x000000000000000000000000000000000000000000000000000000000000012c',
|
|
2556
|
-
'0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
2557
|
-
'0x0000000000000000000000000000000000000000000000000000000000000190',
|
|
2558
|
-
'0x0000000000000000000000000000000000000000000000000000000000000007',
|
|
2559
|
-
'0x00000000000000000000000087870bca3f3fd6335c3f4ce8392d69d0b4161d39',
|
|
2560
|
-
'0x0000000000000000000000001234567890123456789012345678901234567890',
|
|
2561
|
-
'0x00000000000000000000000000000000000000000000000000b1a2bc2ec50000',
|
|
2562
|
-
'0x0000000000000000000000000000000000000000000000000011c37937e08000',
|
|
2563
|
-
],
|
|
2564
|
-
[WETH, 300, USDC, 400, CloseStrategyType.TAKE_PROFIT_IN_DEBT_AND_STOP_LOSS_IN_COLLATERAL, MARKET, USER, '50000000000000000', '5000000000000000'],
|
|
2565
|
-
],
|
|
2566
|
-
];
|
|
2567
|
-
|
|
2568
|
-
describe("encode()", () => {
|
|
2569
|
-
examples.forEach(([expected, actual]) => {
|
|
2570
|
-
it(`Given ${JSON.stringify(
|
|
2571
|
-
actual
|
|
2572
|
-
)} should return expected value: ${JSON.stringify(expected)}`, () => {
|
|
2573
|
-
expect(
|
|
2574
|
-
subDataService.aaveV3InstantCloseGenericSubData.encode(...actual)
|
|
2575
|
-
).to.eql(expected);
|
|
2576
|
-
});
|
|
2577
|
-
});
|
|
2578
|
-
});
|
|
2579
|
-
|
|
2580
|
-
describe("decode()", () => {
|
|
2581
|
-
examples.forEach(([encoded, [collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, user, tsi, slippage]]) => {
|
|
2582
|
-
const expected = {
|
|
2583
|
-
collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, owner: user, tsi, slippage,
|
|
2584
|
-
};
|
|
2585
|
-
|
|
2586
|
-
it(`Given ${JSON.stringify(
|
|
2587
|
-
encoded
|
|
2588
|
-
)} should return expected value: ${JSON.stringify(expected)}`, () => {
|
|
2589
|
-
expect(
|
|
2590
|
-
subDataService.aaveV3InstantCloseGenericSubData.decode(encoded)
|
|
2591
|
-
).to.eql(expected);
|
|
2592
|
-
});
|
|
2593
|
-
});
|
|
2594
|
-
});
|
|
2595
|
-
});
|
|
2596
2498
|
describe('When testing subDataService.sparkLeverageManagementOnPriceSubData', () => {
|
|
2597
2499
|
describe('encode()', () => {
|
|
2598
2500
|
const examples: Array<[SubData, [collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number]] > =
|
|
@@ -687,67 +687,6 @@ export const aaveV3CloseGenericSubData = {
|
|
|
687
687
|
};
|
|
688
688
|
},
|
|
689
689
|
};
|
|
690
|
-
export const aaveV3InstantCloseGenericSubData = {
|
|
691
|
-
encode(
|
|
692
|
-
collAsset: EthereumAddress,
|
|
693
|
-
collAssetId: number,
|
|
694
|
-
debtAsset: EthereumAddress,
|
|
695
|
-
debtAssetId: number,
|
|
696
|
-
closeType: CloseStrategyType,
|
|
697
|
-
marketAddr: EthereumAddress,
|
|
698
|
-
user: EthereumAddress,
|
|
699
|
-
tsi: string,
|
|
700
|
-
slippage: string,
|
|
701
|
-
): SubData {
|
|
702
|
-
const encodedColl = AbiCoder.encodeParameter('address', collAsset);
|
|
703
|
-
const encodedCollId = AbiCoder.encodeParameter('uint16', collAssetId);
|
|
704
|
-
const encodedDebt = AbiCoder.encodeParameter('address', debtAsset);
|
|
705
|
-
const encodedDebtId = AbiCoder.encodeParameter('uint16', debtAssetId);
|
|
706
|
-
const encodedCloseType = AbiCoder.encodeParameter('uint8', closeType);
|
|
707
|
-
const encodedMarket = AbiCoder.encodeParameter('address', marketAddr);
|
|
708
|
-
const encodedUser = AbiCoder.encodeParameter('address', user);
|
|
709
|
-
const encodedTsi = AbiCoder.encodeParameter('uint256', tsi);
|
|
710
|
-
const encodedSlippage = AbiCoder.encodeParameter('uint256', slippage);
|
|
711
|
-
|
|
712
|
-
return [
|
|
713
|
-
encodedColl,
|
|
714
|
-
encodedCollId,
|
|
715
|
-
encodedDebt,
|
|
716
|
-
encodedDebtId,
|
|
717
|
-
encodedCloseType,
|
|
718
|
-
encodedMarket,
|
|
719
|
-
encodedUser,
|
|
720
|
-
encodedTsi,
|
|
721
|
-
encodedSlippage,
|
|
722
|
-
];
|
|
723
|
-
},
|
|
724
|
-
|
|
725
|
-
decode(subData: SubData): {
|
|
726
|
-
collAsset: EthereumAddress,
|
|
727
|
-
collAssetId: number,
|
|
728
|
-
debtAsset: EthereumAddress,
|
|
729
|
-
debtAssetId: number,
|
|
730
|
-
closeType: CloseStrategyType,
|
|
731
|
-
marketAddr: EthereumAddress,
|
|
732
|
-
owner: EthereumAddress,
|
|
733
|
-
tsi: string,
|
|
734
|
-
slippage: string,
|
|
735
|
-
} {
|
|
736
|
-
const collAsset = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
|
|
737
|
-
const collAssetId = Number(AbiCoder.decodeParameter('uint16', subData[1]));
|
|
738
|
-
const debtAsset = AbiCoder.decodeParameter('address', subData[2]) as unknown as EthereumAddress;
|
|
739
|
-
const debtAssetId = Number(AbiCoder.decodeParameter('uint16', subData[3]));
|
|
740
|
-
const closeType = Number(AbiCoder.decodeParameter('uint8', subData[4])) as CloseStrategyType;
|
|
741
|
-
const marketAddr = AbiCoder.decodeParameter('address', subData[5]) as unknown as EthereumAddress;
|
|
742
|
-
const owner = AbiCoder.decodeParameter('address', subData[6]) as unknown as EthereumAddress;
|
|
743
|
-
const tsi = AbiCoder.decodeParameter('uint256', subData[7]) as unknown as string;
|
|
744
|
-
const slippage = AbiCoder.decodeParameter('uint256', subData[8]) as unknown as string;
|
|
745
|
-
|
|
746
|
-
return {
|
|
747
|
-
collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, owner, tsi, slippage,
|
|
748
|
-
};
|
|
749
|
-
},
|
|
750
|
-
};
|
|
751
690
|
export const aaveV3CollateralSwitchSubData = {
|
|
752
691
|
encode(
|
|
753
692
|
fromAsset: EthereumAddress,
|
package/src/types/enums.ts
CHANGED
|
@@ -138,8 +138,6 @@ export namespace Strategies {
|
|
|
138
138
|
CloseOnPriceToColl = 'close-on-price-to-collateral',
|
|
139
139
|
CloseOnPrice = 'close-on-price',
|
|
140
140
|
EoaCloseOnPrice = 'eoa-close-on-price',
|
|
141
|
-
InstantCloseOnPrice = 'instant-close-on-price',
|
|
142
|
-
EoaInstantCloseOnPrice = 'eoa-instant-close-on-price',
|
|
143
141
|
TrailingStopToColl = 'trailing-stop-to-collateral',
|
|
144
142
|
TrailingStopToDebt = 'trailing-stop-to-debt',
|
|
145
143
|
Rebond = 'rebond',
|
|
@@ -268,8 +266,6 @@ export namespace Bundles {
|
|
|
268
266
|
SPARK_EOA_BOOST_ON_PRICE = 91,
|
|
269
267
|
SPARK_EOA_CLOSE = 92,
|
|
270
268
|
SPARK_EOA_LIQUIDATION_PROTECTION = 93,
|
|
271
|
-
AAVE_V3_SW_INSTANT_CLOSE = 94,
|
|
272
|
-
AAVE_V3_EOA_INSTANT_CLOSE = 95,
|
|
273
269
|
}
|
|
274
270
|
|
|
275
271
|
export enum OptimismIds {
|
|
@@ -286,9 +282,6 @@ export namespace Bundles {
|
|
|
286
282
|
AAVE_V3_EOA_CLOSE = 10,
|
|
287
283
|
AAVE_V3_SW_LIQUIDATION_PROTECTION = 11,
|
|
288
284
|
AAVE_V3_EOA_LIQUIDATION_PROTECTION = 12,
|
|
289
|
-
// TODO -> Fix ids
|
|
290
|
-
AAVE_V3_SW_INSTANT_CLOSE = 13,
|
|
291
|
-
AAVE_V3_EOA_INSTANT_CLOSE = 14,
|
|
292
285
|
}
|
|
293
286
|
|
|
294
287
|
export enum BaseIds {
|
|
@@ -332,8 +325,6 @@ export namespace Bundles {
|
|
|
332
325
|
MORPHO_BLUE_EOA_REPAY_ON_PRICE = 40,
|
|
333
326
|
MORPHO_BLUE_EOA_CLOSE = 41,
|
|
334
327
|
MORPHO_BLUE_EOA_LIQUIDATION_PROTECTION = 42,
|
|
335
|
-
AAVE_V3_SW_INSTANT_CLOSE = 43,
|
|
336
|
-
AAVE_V3_EOA_INSTANT_CLOSE = 44,
|
|
337
328
|
}
|
|
338
329
|
|
|
339
330
|
export enum ArbitrumIds {
|
|
@@ -377,7 +368,5 @@ export namespace Bundles {
|
|
|
377
368
|
MORPHO_BLUE_EOA_BOOST_ON_PRICE = 37,
|
|
378
369
|
MORPHO_BLUE_EOA_REPAY_ON_PRICE = 38,
|
|
379
370
|
MORPHO_BLUE_EOA_CLOSE = 39,
|
|
380
|
-
AAVE_V3_SW_INSTANT_CLOSE = 40,
|
|
381
|
-
AAVE_V3_EOA_INSTANT_CLOSE = 41,
|
|
382
371
|
}
|
|
383
372
|
}
|