@defisaver/automation-sdk 3.3.8 → 3.3.10-aave-v4-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.
Files changed (42) hide show
  1. package/cjs/constants/index.js +55 -0
  2. package/cjs/services/ethereumService.js +21 -14
  3. package/cjs/services/strategiesService.js +101 -0
  4. package/cjs/services/strategySubService.d.ts +8 -0
  5. package/cjs/services/strategySubService.js +47 -1
  6. package/cjs/services/strategySubService.test.js +143 -0
  7. package/cjs/services/subDataService.d.ts +302 -129
  8. package/cjs/services/subDataService.js +629 -372
  9. package/cjs/services/subDataService.test.js +213 -0
  10. package/cjs/services/triggerService.d.ts +29 -0
  11. package/cjs/services/triggerService.js +55 -1
  12. package/cjs/services/triggerService.test.js +84 -0
  13. package/cjs/types/enums.d.ts +14 -2
  14. package/cjs/types/enums.js +12 -0
  15. package/cjs/types/index.d.ts +22 -1
  16. package/esm/constants/index.js +55 -0
  17. package/esm/services/ethereumService.js +21 -14
  18. package/esm/services/strategiesService.js +102 -1
  19. package/esm/services/strategySubService.d.ts +8 -0
  20. package/esm/services/strategySubService.js +46 -0
  21. package/esm/services/strategySubService.test.js +144 -1
  22. package/esm/services/subDataService.d.ts +302 -129
  23. package/esm/services/subDataService.js +628 -371
  24. package/esm/services/subDataService.test.js +213 -0
  25. package/esm/services/triggerService.d.ts +29 -0
  26. package/esm/services/triggerService.js +54 -0
  27. package/esm/services/triggerService.test.js +85 -1
  28. package/esm/types/enums.d.ts +14 -2
  29. package/esm/types/enums.js +12 -0
  30. package/esm/types/index.d.ts +22 -1
  31. package/package.json +1 -1
  32. package/src/constants/index.ts +55 -0
  33. package/src/services/ethereumService.ts +23 -16
  34. package/src/services/strategiesService.ts +116 -1
  35. package/src/services/strategySubService.test.ts +180 -0
  36. package/src/services/strategySubService.ts +162 -2
  37. package/src/services/subDataService.test.ts +233 -0
  38. package/src/services/subDataService.ts +977 -703
  39. package/src/services/triggerService.test.ts +99 -0
  40. package/src/services/triggerService.ts +76 -1
  41. package/src/types/enums.ts +12 -0
  42. package/src/types/index.ts +27 -1
@@ -2,7 +2,7 @@ import { getAssetInfoByAddress } from '@defisaver/tokens';
2
2
  import { cloneDeep } from 'lodash';
3
3
  import Web3 from 'web3';
4
4
  import { BUNDLES_INFO, STRATEGIES_INFO } from '../constants';
5
- import { ChainId, ProtocolIdentifiers, Strategies } from '../types/enums';
5
+ import { ChainId, ProtocolIdentifiers, Strategies, } from '../types/enums';
6
6
  import { getPositionId, getRatioStateInfoForAaveCloseStrategy, getStopLossAndTakeProfitTypeByCloseStrategyType, isRatioStateOver, wethToEthByAddress, } from './utils';
7
7
  import * as subDataService from './subDataService';
8
8
  import * as triggerService from './triggerService';
@@ -285,6 +285,94 @@ function parseAaveV3CollateralSwitch(position, parseData) {
285
285
  _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, subData.marketAddr);
286
286
  return _position;
287
287
  }
288
+ function parseAaveV4LeverageManagement(position, parseData) {
289
+ const _position = cloneDeep(position);
290
+ const { subStruct, subId, subHash } = parseData.subscriptionEventData;
291
+ const { isEnabled } = parseData.strategiesSubsData;
292
+ const triggerData = triggerService.aaveV4RatioTrigger.decode(subStruct.triggerData);
293
+ const subData = subDataService.aaveV4LeverageManagementSubData.decode(subStruct.subData);
294
+ const isEOA = _position.strategy.strategyId.includes('eoa');
295
+ const isRepay = [Strategies.Identifiers.Repay, Strategies.Identifiers.EoaRepay].includes(_position.strategy.strategyId);
296
+ _position.strategyData.decoded.triggerData = triggerData;
297
+ _position.strategyData.decoded.subData = subData;
298
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.spoke);
299
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagement : Strategies.IdOverrides.LeverageManagement;
300
+ if (isRepay) {
301
+ _position.specific = {
302
+ triggerRepayRatio: triggerData.ratio,
303
+ targetRepayRatio: subData.targetRatio,
304
+ repayEnabled: isEnabled,
305
+ subId1: Number(subId),
306
+ mergeWithId: isEOA ? Strategies.Identifiers.EoaBoost : Strategies.Identifiers.Boost,
307
+ subHashRepay: subHash,
308
+ };
309
+ }
310
+ else {
311
+ _position.specific = {
312
+ triggerBoostRatio: triggerData.ratio,
313
+ targetBoostRatio: subData.targetRatio,
314
+ boostEnabled: isEnabled,
315
+ subId2: Number(subId),
316
+ mergeId: isEOA ? Strategies.Identifiers.EoaBoost : Strategies.Identifiers.Boost,
317
+ subHashBoost: subHash,
318
+ };
319
+ }
320
+ return _position;
321
+ }
322
+ function parseAaveV4LeverageManagementOnPrice(position, parseData) {
323
+ const _position = cloneDeep(position);
324
+ const { subStruct } = parseData.subscriptionEventData;
325
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.decode(subStruct.triggerData);
326
+ const subData = subDataService.aaveV4LeverageManagementOnPriceSubData.decode(subStruct.subData);
327
+ const isEOA = _position.strategy.strategyId.includes('eoa');
328
+ _position.strategyData.decoded.triggerData = triggerData;
329
+ _position.strategyData.decoded.subData = subData;
330
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.spoke);
331
+ _position.strategy.strategyId = isEOA ? Strategies.IdOverrides.EoaLeverageManagementOnPrice : Strategies.IdOverrides.LeverageManagementOnPrice;
332
+ _position.specific = {
333
+ collAsset: subData.collAsset,
334
+ collAssetId: subData.collAssetId,
335
+ debtAsset: subData.debtAsset,
336
+ debtAssetId: subData.debtAssetId,
337
+ price: triggerData.price,
338
+ ratioState: triggerData.ratioState,
339
+ ratio: subData.targetRatio,
340
+ };
341
+ return _position;
342
+ }
343
+ function parseAaveV4CloseOnPrice(position, parseData) {
344
+ const _position = cloneDeep(position);
345
+ const { subStruct } = parseData.subscriptionEventData;
346
+ const triggerData = triggerService.aaveV4QuotePriceRangeTrigger.decode(subStruct.triggerData);
347
+ const subData = subDataService.aaveV4CloseSubData.decode(subStruct.subData);
348
+ const { takeProfitType, stopLossType } = getStopLossAndTakeProfitTypeByCloseStrategyType(+subData.closeType);
349
+ const isEOA = _position.strategy.strategyId.includes('eoa');
350
+ _position.strategyData.decoded.triggerData = triggerData;
351
+ _position.strategyData.decoded.subData = subData;
352
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.spoke);
353
+ _position.strategy.strategyId = isEOA ? Strategies.Identifiers.EoaCloseOnPrice : Strategies.Identifiers.CloseOnPrice;
354
+ _position.specific = {
355
+ collAsset: subData.collAsset,
356
+ collAssetId: subData.collAssetId,
357
+ debtAsset: subData.debtAsset,
358
+ debtAssetId: subData.debtAssetId,
359
+ stopLossPrice: triggerData.lowerPrice,
360
+ takeProfitPrice: triggerData.upperPrice,
361
+ stopLossType,
362
+ takeProfitType,
363
+ };
364
+ return _position;
365
+ }
366
+ function parseAaveV4CollateralSwitch(position, parseData) {
367
+ const _position = cloneDeep(position);
368
+ const { subStruct } = parseData.subscriptionEventData;
369
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.decode(subStruct.triggerData);
370
+ const subData = subDataService.aaveV4CollateralSwitchSubData.decode(subStruct.subData);
371
+ _position.strategyData.decoded.triggerData = triggerData;
372
+ _position.strategyData.decoded.subData = subData;
373
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, triggerData.spoke);
374
+ return _position;
375
+ }
288
376
  function parseMorphoAaveV2LeverageManagement(position, parseData) {
289
377
  const _position = cloneDeep(position);
290
378
  const { subStruct, subId } = parseData.subscriptionEventData;
@@ -914,6 +1002,19 @@ const parsingMethodsMapping = {
914
1002
  [Strategies.Identifiers.EoaCloseOnPrice]: parseAaveV3CloseOnPrice,
915
1003
  [Strategies.Identifiers.CollateralSwitch]: parseAaveV3CollateralSwitch,
916
1004
  },
1005
+ [ProtocolIdentifiers.StrategiesAutomation.AaveV4]: {
1006
+ [Strategies.Identifiers.Repay]: parseAaveV4LeverageManagement,
1007
+ [Strategies.Identifiers.Boost]: parseAaveV4LeverageManagement,
1008
+ [Strategies.Identifiers.RepayOnPrice]: parseAaveV4LeverageManagementOnPrice,
1009
+ [Strategies.Identifiers.BoostOnPrice]: parseAaveV4LeverageManagementOnPrice,
1010
+ [Strategies.Identifiers.CloseOnPrice]: parseAaveV4CloseOnPrice,
1011
+ [Strategies.Identifiers.EoaRepay]: parseAaveV4LeverageManagement,
1012
+ [Strategies.Identifiers.EoaBoost]: parseAaveV4LeverageManagement,
1013
+ [Strategies.Identifiers.EoaRepayOnPrice]: parseAaveV4LeverageManagementOnPrice,
1014
+ [Strategies.Identifiers.EoaBoostOnPrice]: parseAaveV4LeverageManagementOnPrice,
1015
+ [Strategies.Identifiers.EoaCloseOnPrice]: parseAaveV4CloseOnPrice,
1016
+ [Strategies.Identifiers.CollateralSwitch]: parseAaveV4CollateralSwitch,
1017
+ },
917
1018
  [ProtocolIdentifiers.StrategiesAutomation.CompoundV2]: {
918
1019
  [Strategies.Identifiers.Repay]: parseCompoundV2LeverageManagement,
919
1020
  [Strategies.Identifiers.Boost]: parseCompoundV2LeverageManagement,
@@ -6,6 +6,7 @@ export declare const makerEncode: {
6
6
  closeOnPrice(vaultId: number, ratioState: RatioState, price: string, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
7
7
  trailingStop(vaultId: number, triggerPercentage: number, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, roundId: number, chainId?: ChainId, daiAddr?: EthereumAddress, mcdCdpManagerAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
8
8
  leverageManagement(vaultId: number, triggerRepayRatio: string, triggerBoostRatio: string, targetBoostRatio: string, targetRepayRatio: string, boostEnabled: boolean): (string | number | boolean)[];
9
+ leverageManagementWithoutSubProxy(vaultId: number, triggerRatio: number, targetRatio: number, ratioState: RatioState, isBoost: boolean, daiAddr?: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
9
10
  };
10
11
  export declare const liquityEncode: {
11
12
  closeOnPrice(priceOverOrUnder: RatioState, price: string, closeToAssetAddr: EthereumAddress, chainlinkCollAddress: EthereumAddress, chainId?: ChainId, collAddr?: EthereumAddress, debtAddr?: EthereumAddress): (boolean | string[] | Strategies.MainnetIds)[];
@@ -86,6 +87,7 @@ export declare const exchangeEncode: {
86
87
  export declare const sparkEncode: {
87
88
  leverageManagement(triggerRepayRatio: number, triggerBoostRatio: number, targetBoostRatio: number, targetRepayRatio: number, boostEnabled: boolean): string;
88
89
  closeOnPriceGeneric(strategyOrBundleId: number, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, user: EthereumAddress, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
90
+ leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
89
91
  };
90
92
  export declare const crvUSDEncode: {
91
93
  leverageManagement(owner: EthereumAddress, controllerAddr: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, collTokenAddr: EthereumAddress, crvUSDAddr: EthereumAddress): (boolean | string[] | Bundles.MainnetIds)[];
@@ -105,3 +107,9 @@ export declare const liquityV2Encode: {
105
107
  export declare const fluidEncode: {
106
108
  leverageManagement(nftId: string, vault: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number, strategyOrBundleId: number): (number | boolean | string[])[];
107
109
  };
110
+ export declare const aaveV4Encode: {
111
+ leverageManagement(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
112
+ leverageManagementOnPrice(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, targetRatio: number, price: number, priceState: RatioState, ratioState: RatioState): (number | boolean | string[])[];
113
+ closeOnPrice(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, stopLossPrice?: number, stopLossType?: CloseToAssetType, takeProfitPrice?: number, takeProfitType?: CloseToAssetType): (number | boolean | string[])[];
114
+ collateralSwitch(strategyOrBundleId: number, owner: EthereumAddress, spoke: EthereumAddress, fromAsset: EthereumAddress, fromAssetId: number, toAsset: EthereumAddress, toAssetId: number, amountToSwitch: string, price: number, ratioState: RatioState): (number | boolean | string[])[];
115
+ };
@@ -41,6 +41,17 @@ export const makerEncode = {
41
41
  boostEnabled,
42
42
  ];
43
43
  },
44
+ leverageManagementWithoutSubProxy(vaultId, triggerRatio, targetRatio, ratioState, isBoost, daiAddr) {
45
+ const bundleId = isBoost ? Bundles.MainnetIds.MAKER_BOOST : Bundles.MainnetIds.MAKER_REPAY;
46
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
47
+ const subData = subDataService.makerLeverageManagementWithoutSubProxy.encode(vaultId, targetRatio, daiAddr);
48
+ return [
49
+ bundleId,
50
+ true,
51
+ triggerData,
52
+ subData,
53
+ ];
54
+ },
44
55
  };
45
56
  export const liquityEncode = {
46
57
  closeOnPrice(priceOverOrUnder, price, closeToAssetAddr, chainlinkCollAddress, chainId = ChainId.Ethereum, collAddr, debtAddr) {
@@ -239,6 +250,12 @@ export const sparkEncode = {
239
250
  const triggerDataEncoded = triggerService.sparkQuotePriceRangeTrigger.encode(collAsset, debtAsset, stopLossPrice, takeProfitPrice);
240
251
  return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
241
252
  },
253
+ leverageManagementWithoutSubProxy(strategyOrBundleId, market, user, ratioState, targetRatio, triggerRatio) {
254
+ const isBundle = true;
255
+ const subData = subDataService.sparkLeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
256
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
257
+ return [strategyOrBundleId, isBundle, triggerData, subData];
258
+ },
242
259
  };
243
260
  export const crvUSDEncode = {
244
261
  leverageManagement(owner, controllerAddr, ratioState, targetRatio, triggerRatio, collTokenAddr, crvUSDAddr) {
@@ -324,3 +341,32 @@ export const fluidEncode = {
324
341
  return [strategyOrBundleId, isBundle, triggerData, subData];
325
342
  },
326
343
  };
344
+ export const aaveV4Encode = {
345
+ leverageManagement(strategyOrBundleId, owner, spoke, ratioState, targetRatio, triggerRatio) {
346
+ const isBundle = true;
347
+ const subData = subDataService.aaveV4LeverageManagementSubData.encode(spoke, owner, ratioState, targetRatio);
348
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
349
+ return [strategyOrBundleId, isBundle, triggerData, subData];
350
+ },
351
+ leverageManagementOnPrice(strategyOrBundleId, owner, spoke, collAsset, collAssetId, debtAsset, debtAssetId, targetRatio, price, priceState, ratioState) {
352
+ const isBundle = true;
353
+ const subData = subDataService.aaveV4LeverageManagementOnPriceSubData.encode(spoke, owner, collAsset, collAssetId, debtAsset, debtAssetId, ratioState, targetRatio);
354
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.encode(spoke, collAssetId, debtAssetId, price, priceState);
355
+ return [strategyOrBundleId, isBundle, triggerData, subData];
356
+ },
357
+ closeOnPrice(strategyOrBundleId, owner, spoke, collAsset, collAssetId, debtAsset, debtAssetId, stopLossPrice = 0, stopLossType = CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = CloseToAssetType.COLLATERAL) {
358
+ const isBundle = true;
359
+ const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
360
+ const subData = subDataService.aaveV4CloseSubData.encode(spoke, owner, collAsset, collAssetId, debtAsset, debtAssetId, closeType);
361
+ const triggerData = triggerService.aaveV4QuotePriceRangeTrigger.encode(spoke, collAssetId, debtAssetId, stopLossPrice, takeProfitPrice);
362
+ return [strategyOrBundleId, isBundle, triggerData, subData];
363
+ },
364
+ collateralSwitch(strategyOrBundleId, owner, spoke, fromAsset, fromAssetId, toAsset, toAssetId, amountToSwitch, price, ratioState) {
365
+ const isBundle = false;
366
+ const subData = subDataService.aaveV4CollateralSwitchSubData.encode(spoke, owner, fromAsset, fromAssetId, toAsset, toAssetId, amountToSwitch);
367
+ const triggerData = triggerService.aaveV4QuotePriceTrigger.encode(spoke, fromAssetId, // baseTokenId
368
+ toAssetId, // quoteTokenId
369
+ price, ratioState);
370
+ return [strategyOrBundleId, isBundle, triggerData, subData];
371
+ },
372
+ };
@@ -5,7 +5,7 @@ import { getAssetInfo, MAXUINT } from '@defisaver/tokens';
5
5
  import * as web3Utils from 'web3-utils';
6
6
  import { Bundles, ChainId, CloseToAssetType, OrderType, RatioState, Strategies } from '../types/enums';
7
7
  import '../configuration';
8
- import { aaveV2Encode, chickenBondsEncode, liquityEncode, makerEncode, aaveV3Encode, compoundV2Encode, compoundV3Encode, morphoAaveV2Encode, exchangeEncode, crvUSDEncode, compoundV3L2Encode, morphoBlueEncode, } from './strategySubService';
8
+ import { aaveV2Encode, chickenBondsEncode, liquityEncode, makerEncode, aaveV3Encode, compoundV2Encode, compoundV3Encode, morphoAaveV2Encode, exchangeEncode, crvUSDEncode, compoundV3L2Encode, morphoBlueEncode, aaveV4Encode, } from './strategySubService';
9
9
  describe('Feature: strategySubService.ts', () => {
10
10
  describe('When testing strategySubService.makerEncode', () => {
11
11
  // @ts-ignore // TODO - this requires change in @defisaver/tokens
@@ -118,6 +118,53 @@ describe('Feature: strategySubService.ts', () => {
118
118
  });
119
119
  });
120
120
  });
121
+ describe('leverageManagementWithoutSubProxy()', () => {
122
+ const examples = [
123
+ // Repay scenario (isBoost=false, RatioState.UNDER)
124
+ [
125
+ [
126
+ Bundles.MainnetIds.MAKER_REPAY,
127
+ true,
128
+ ['0x00000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000136dcc951d8c00000000000000000000000000000000000000000000000000000000000000000001'],
129
+ [
130
+ '0x00000000000000000000000000000000000000000000000000000000000000de', '0x00000000000000000000000000000000000000000000000018fae27693b40000',
131
+ '0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f',
132
+ ],
133
+ ],
134
+ [
135
+ 222,
136
+ 140,
137
+ 180,
138
+ RatioState.UNDER,
139
+ false, // isBoost
140
+ ]
141
+ ],
142
+ // Boost scenario (isBoost=true, RatioState.OVER)
143
+ [
144
+ [
145
+ Bundles.MainnetIds.MAKER_BOOST,
146
+ true,
147
+ ['0x000000000000000000000000000000000000000000000000000000000000014d00000000000000000000000000000000000000000000000026db992a3b1800000000000000000000000000000000000000000000000000000000000000000000'],
148
+ [
149
+ '0x000000000000000000000000000000000000000000000000000000000000014d', '0x00000000000000000000000000000000000000000000000022b1c8c1227a0000',
150
+ '0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f',
151
+ ],
152
+ ],
153
+ [
154
+ 333,
155
+ 280,
156
+ 250,
157
+ RatioState.OVER,
158
+ true, // isBoost
159
+ ]
160
+ ],
161
+ ];
162
+ examples.forEach(([expected, actual]) => {
163
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
164
+ expect(makerEncode.leverageManagementWithoutSubProxy(...actual)).to.eql(expected);
165
+ });
166
+ });
167
+ });
121
168
  });
122
169
  describe('When testing strategySubService.liquityEncode', () => {
123
170
  describe('closeOnPrice()', () => {
@@ -1406,4 +1453,100 @@ describe('Feature: strategySubService.ts', () => {
1406
1453
  });
1407
1454
  });
1408
1455
  });
1456
+ describe('When testing strategySubService.aaveV4Encode', () => {
1457
+ describe('leverageManagement()', () => {
1458
+ const examples = [
1459
+ [
1460
+ [1, true, ["0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e00000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000000000000000000001"], ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e", "0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x00000000000000000000000000000000000000000000000014d1120d7b160000"]],
1461
+ [
1462
+ 1,
1463
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1464
+ web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
1465
+ RatioState.UNDER,
1466
+ 150,
1467
+ 120,
1468
+ ]
1469
+ ]
1470
+ ];
1471
+ examples.forEach(([expected, actual]) => {
1472
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1473
+ expect(aaveV4Encode.leverageManagement(...actual)).to.eql(expected);
1474
+ });
1475
+ });
1476
+ });
1477
+ describe('leverageManagementOnPrice()', () => {
1478
+ const examples = [
1479
+ [
1480
+ [2, true, ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000000000000000"], ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e", "0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c", "0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "0x0000000000000000000000000000000000000000000000000000000000000014", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000000000000000000000000000016345785d8a00000"]],
1481
+ [
1482
+ 2,
1483
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1484
+ web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
1485
+ web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
1486
+ 10,
1487
+ web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
1488
+ 20,
1489
+ 160,
1490
+ 1500,
1491
+ RatioState.OVER,
1492
+ RatioState.OVER, // ratioState - UNDER for repay, OVER for boost
1493
+ ]
1494
+ ]
1495
+ ];
1496
+ examples.forEach(([expected, actual]) => {
1497
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1498
+ expect(aaveV4Encode.leverageManagementOnPrice(...actual)).to.eql(expected);
1499
+ });
1500
+ });
1501
+ });
1502
+ describe('closeOnPrice()', () => {
1503
+ const examples = [
1504
+ [
1505
+ [3, true, ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000002098a678000000000000000000000000000000000000000000000000000000000000000000"], ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e", "0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c", "0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "0x0000000000000000000000000000000000000000000000000000000000000014", "0x0000000000000000000000000000000000000000000000000000000000000003"]],
1506
+ [
1507
+ 3,
1508
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1509
+ web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
1510
+ web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
1511
+ 10,
1512
+ web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
1513
+ 20,
1514
+ 1400,
1515
+ CloseToAssetType.DEBT,
1516
+ 0,
1517
+ CloseToAssetType.COLLATERAL
1518
+ ]
1519
+ ]
1520
+ ];
1521
+ examples.forEach(([expected, actual]) => {
1522
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1523
+ expect(aaveV4Encode.closeOnPrice(...actual)).to.eql(expected);
1524
+ });
1525
+ });
1526
+ });
1527
+ describe('collateralSwitch()', () => {
1528
+ const examples = [
1529
+ [
1530
+ [4, false, ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000000000000001"], ["0x0000000000000000000000002f39d218133afab8f2b819b1066c7e434ad94e9e", "0x0000000000000000000000001031d218133afab8c2b819b1366c7e434ad91e9c", "0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "0x0000000000000000000000000000000000000000000000000000000000000014", "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000"]],
1531
+ [
1532
+ 4,
1533
+ web3Utils.toChecksumAddress('0x1031d218133AFaB8c2B819B1366c7E434Ad91E9c'),
1534
+ web3Utils.toChecksumAddress('0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e'),
1535
+ web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
1536
+ 10,
1537
+ web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
1538
+ 20,
1539
+ '1000000000000000000',
1540
+ 1500,
1541
+ RatioState.UNDER,
1542
+ ]
1543
+ ]
1544
+ ];
1545
+ examples.forEach(([expected, actual]) => {
1546
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
1547
+ expect(aaveV4Encode.collateralSwitch(...actual)).to.eql(expected);
1548
+ });
1549
+ });
1550
+ });
1551
+ });
1409
1552
  });