@defisaver/automation-sdk 3.3.14 → 3.3.15-liq-prot-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 (41) hide show
  1. package/cjs/constants/index.js +95 -0
  2. package/cjs/index.d.ts +4 -3
  3. package/cjs/index.js +6 -2
  4. package/cjs/services/strategiesService.js +181 -17
  5. package/cjs/services/strategySubService.d.ts +14 -13
  6. package/cjs/services/strategySubService.js +74 -63
  7. package/cjs/services/strategySubService.test.js +0 -234
  8. package/cjs/services/subDataService.d.ts +98 -1
  9. package/cjs/services/subDataService.js +264 -6
  10. package/cjs/services/subDataService.test.js +0 -42
  11. package/cjs/services/utils.d.ts +3 -1
  12. package/cjs/services/utils.js +34 -1
  13. package/cjs/services/utils.test.js +25 -0
  14. package/cjs/types/enums.d.ts +29 -6
  15. package/cjs/types/enums.js +23 -0
  16. package/esm/constants/index.js +95 -0
  17. package/esm/index.d.ts +4 -3
  18. package/esm/index.js +7 -3
  19. package/esm/services/strategiesService.js +181 -17
  20. package/esm/services/strategySubService.d.ts +14 -13
  21. package/esm/services/strategySubService.js +74 -60
  22. package/esm/services/strategySubService.test.js +2 -236
  23. package/esm/services/subDataService.d.ts +98 -1
  24. package/esm/services/subDataService.js +262 -5
  25. package/esm/services/subDataService.test.js +0 -42
  26. package/esm/services/utils.d.ts +3 -1
  27. package/esm/services/utils.js +32 -1
  28. package/esm/services/utils.test.js +27 -2
  29. package/esm/types/enums.d.ts +29 -6
  30. package/esm/types/enums.js +23 -0
  31. package/package.json +1 -1
  32. package/src/constants/index.ts +96 -0
  33. package/src/index.ts +24 -6
  34. package/src/services/strategiesService.ts +246 -17
  35. package/src/services/strategySubService.test.ts +0 -279
  36. package/src/services/strategySubService.ts +196 -110
  37. package/src/services/subDataService.test.ts +0 -48
  38. package/src/services/subDataService.ts +363 -4
  39. package/src/services/utils.test.ts +32 -1
  40. package/src/services/utils.ts +32 -1
  41. package/src/types/enums.ts +23 -0
@@ -1,22 +1,26 @@
1
- import Dec from 'decimal.js';
2
1
  import { getAssetInfo } from '@defisaver/tokens';
2
+ import Dec from 'decimal.js';
3
3
 
4
- import type { OrderType } from '../types/enums';
4
+ import { STRATEGY_IDS } from '../constants';
5
5
  import {
6
- CloseToAssetType,
7
6
  Bundles,
8
7
  ChainId,
8
+ CloseToAssetType,
9
9
  RatioState,
10
10
  Strategies,
11
11
  } from '../types/enums';
12
12
  import type { EthereumAddress, StrategyOrBundleIds } from '../types';
13
13
 
14
- import { STRATEGY_IDS } from '../constants';
14
+ import type { OrderType } from '../types/enums';
15
15
 
16
16
  import * as subDataService from './subDataService';
17
17
  import * as triggerService from './triggerService';
18
18
  import {
19
- compareAddresses, getCloseStrategyType, requireAddress, requireAddresses,
19
+ compareAddresses,
20
+ getBundleIdsByNetwork,
21
+ getCloseStrategyType,
22
+ requireAddress,
23
+ requireAddresses,
20
24
  } from './utils';
21
25
 
22
26
  export const makerEncode = {
@@ -81,23 +85,6 @@ export const makerEncode = {
81
85
 
82
86
  return [strategyOrBundleId, isBundle, triggerData, subData];
83
87
  },
84
- leverageManagement(
85
- vaultId: number,
86
- triggerRepayRatio: string,
87
- triggerBoostRatio: string,
88
- targetBoostRatio: string,
89
- targetRepayRatio: string,
90
- boostEnabled: boolean,
91
- ) {
92
- return [
93
- vaultId,
94
- new Dec(triggerRepayRatio).mul(1e16).toString(),
95
- new Dec(triggerBoostRatio).mul(1e16).toString(),
96
- new Dec(targetBoostRatio).mul(1e16).toString(),
97
- new Dec(targetRepayRatio).mul(1e16).toString(),
98
- boostEnabled,
99
- ];
100
- },
101
88
  leverageManagementWithoutSubProxy(
102
89
  vaultId: number,
103
90
  triggerRatio: number,
@@ -119,6 +106,26 @@ export const makerEncode = {
119
106
  subData,
120
107
  ];
121
108
  },
109
+
110
+ liquidationProtection(
111
+ vaultId: number,
112
+ triggerRatio: number,
113
+ targetRatio: number,
114
+ ratioState: RatioState,
115
+ daiAddr?: EthereumAddress,
116
+ ) {
117
+ const bundleId = Bundles.MainnetIds.MAKER_LIQUIDATION_PROTECTION;
118
+
119
+ const triggerData = triggerService.makerRatioTrigger.encode(vaultId, triggerRatio, ratioState);
120
+ const subData = subDataService.makerLiquidationProtectionSubData.encode(vaultId, targetRatio, daiAddr);
121
+
122
+ return [
123
+ bundleId,
124
+ true,
125
+ triggerData,
126
+ subData,
127
+ ];
128
+ },
122
129
  };
123
130
 
124
131
  export const liquityEncode = {
@@ -179,20 +186,19 @@ export const liquityEncode = {
179
186
 
180
187
  return [strategyId, isBundle, triggerData, subData];
181
188
  },
182
- leverageManagement(
183
- triggerRepayRatio:string,
184
- triggerBoostRatio:string,
185
- targetBoostRatio:string,
186
- targetRepayRatio:string,
187
- boostEnabled:boolean,
189
+ leverageManagementWithoutSubProxy(
190
+ strategyOrBundleId: number,
191
+ user: EthereumAddress,
192
+ ratioState: RatioState,
193
+ targetRatio: number,
194
+ triggerRatio: number,
188
195
  ) {
189
- return [
190
- new Dec(triggerRepayRatio).mul(1e16).toString(),
191
- new Dec(triggerBoostRatio).mul(1e16).toString(),
192
- new Dec(targetBoostRatio).mul(1e16).toString(),
193
- new Dec(targetRepayRatio).mul(1e16).toString(),
194
- boostEnabled,
195
- ];
196
+ const isBundle = true;
197
+
198
+ const subData = subDataService.liquityLeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
199
+ const triggerData = triggerService.liquityRatioTrigger.encode(user, triggerRatio, ratioState);
200
+
201
+ return [strategyOrBundleId, isBundle, triggerData, subData];
196
202
  },
197
203
  dsrPayback(
198
204
  proxyAddress: EthereumAddress,
@@ -248,39 +254,24 @@ export const chickenBondsEncode = {
248
254
  };
249
255
 
250
256
  export const aaveV2Encode = {
251
- leverageManagement(
252
- triggerRepayRatio: number,
253
- triggerBoostRatio: number,
254
- targetBoostRatio: number,
255
- targetRepayRatio: number,
256
- boostEnabled: boolean,
257
+ leverageManagementWithoutSubProxy(
258
+ strategyOrBundleId: number,
259
+ market: EthereumAddress,
260
+ user: EthereumAddress,
261
+ ratioState: RatioState,
262
+ targetRatio: number,
263
+ triggerRatio: number,
257
264
  ) {
258
- return subDataService.aaveV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
265
+ const isBundle = true;
266
+
267
+ const subData = subDataService.aaveV2LeverageManagementSubDataWithoutSubProxy.encode(market, targetRatio, ratioState);
268
+ const triggerData = triggerService.aaveV2RatioTrigger.encode(user, market, triggerRatio, ratioState);
269
+
270
+ return [strategyOrBundleId, isBundle, triggerData, subData];
259
271
  },
260
272
  };
261
273
 
262
274
  export const aaveV3Encode = {
263
- leverageManagement(
264
- triggerRepayRatio: number,
265
- triggerBoostRatio: number,
266
- targetBoostRatio: number,
267
- targetRepayRatio: number,
268
- boostEnabled: boolean,
269
- ) {
270
- let subInput = '0x';
271
-
272
- subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
273
- .padStart(32, '0'));
274
- subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
275
- .padStart(32, '0'));
276
- subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
277
- .padStart(32, '0'));
278
- subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
279
- .padStart(32, '0'));
280
- subInput = subInput.concat(boostEnabled ? '01' : '00');
281
-
282
- return subInput;
283
- },
284
275
  closeToAsset(
285
276
  strategyOrBundleId: number,
286
277
  isBundle: boolean = true,
@@ -370,6 +361,27 @@ export const aaveV3Encode = {
370
361
  return [strategyOrBundleId, isBundle, triggerData, subData];
371
362
  },
372
363
 
364
+ liquidationProtection(
365
+ strategyOrBundleId: number,
366
+ market: EthereumAddress,
367
+ user: EthereumAddress,
368
+ ratioState: RatioState,
369
+ targetRatio: number,
370
+ triggerRatio: number,
371
+ ) {
372
+ const isBundle = true;
373
+
374
+ const subData = subDataService.aaveV3LiquidationProtectionSubData.encode(
375
+ targetRatio,
376
+ ratioState,
377
+ market,
378
+ user,
379
+ );
380
+ const triggerData = triggerService.aaveV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
381
+
382
+ return [strategyOrBundleId, isBundle, triggerData, subData];
383
+ },
384
+
373
385
  leverageManagementOnPriceGeneric(
374
386
  strategyOrBundleId: number,
375
387
  price: number,
@@ -441,19 +453,41 @@ export const aaveV3Encode = {
441
453
  };
442
454
 
443
455
  export const compoundV2Encode = {
444
- leverageManagement(
445
- triggerRepayRatio: number,
446
- triggerBoostRatio: number,
447
- targetBoostRatio: number,
448
- targetRepayRatio: number,
449
- boostEnabled: boolean,
456
+ leverageManagementWithoutSubProxy(
457
+ strategyOrBundleId: number,
458
+ user: EthereumAddress,
459
+ ratioState: RatioState,
460
+ targetRatio: number,
461
+ triggerRatio: number,
450
462
  ) {
451
- return subDataService.compoundV2LeverageManagementSubData.encode(triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled);
463
+ const isBundle = true;
464
+
465
+ const subData = subDataService.compoundV2LeverageManagementSubDataWithoutSubProxy.encode(targetRatio, ratioState);
466
+ const triggerData = triggerService.compoundV2RatioTrigger.encode(user, triggerRatio, ratioState);
467
+
468
+ return [strategyOrBundleId, isBundle, triggerData, subData];
452
469
  },
453
470
  };
454
471
 
455
472
  export const compoundV3Encode = {
456
- leverageManagement(
473
+ leverageManagementWithoutSubProxy(
474
+ strategyOrBundleId: number,
475
+ market: EthereumAddress,
476
+ baseToken: EthereumAddress,
477
+ user: EthereumAddress,
478
+ ratioState: RatioState,
479
+ targetRatio: number,
480
+ triggerRatio: number,
481
+ ) {
482
+ const isBundle = true;
483
+
484
+ const subData = subDataService.compoundV3LeverageManagementSubDataWithoutSubProxy.encode(market, baseToken, targetRatio, ratioState);
485
+ const triggerData = triggerService.compoundV3RatioTrigger.encode(user, market, triggerRatio, ratioState);
486
+
487
+ return [strategyOrBundleId, isBundle, triggerData, subData];
488
+ },
489
+
490
+ liquidationProtection(
457
491
  market: EthereumAddress,
458
492
  baseToken: EthereumAddress,
459
493
  triggerRepayRatio: number,
@@ -463,8 +497,9 @@ export const compoundV3Encode = {
463
497
  boostEnabled: boolean,
464
498
  isEOA: boolean,
465
499
  ) {
466
- return subDataService.compoundV3LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
500
+ return subDataService.compoundV3LiquidationProtectionSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
467
501
  },
502
+
468
503
  leverageManagementOnPrice(
469
504
  strategyOrBundleId: number,
470
505
  market: EthereumAddress,
@@ -503,21 +538,6 @@ export const compoundV3Encode = {
503
538
  },
504
539
  };
505
540
 
506
- export const compoundV3L2Encode = {
507
- leverageManagement(
508
- market: EthereumAddress,
509
- baseToken: EthereumAddress,
510
- triggerRepayRatio: number,
511
- triggerBoostRatio: number,
512
- targetBoostRatio: number,
513
- targetRepayRatio: number,
514
- boostEnabled: boolean,
515
- isEOA: boolean = false,
516
- ) {
517
- return subDataService.compoundV3L2LeverageManagementSubData.encode(market, baseToken, triggerRepayRatio, triggerBoostRatio, targetBoostRatio, targetRepayRatio, boostEnabled, isEOA);
518
- },
519
- };
520
-
521
541
  export const morphoAaveV2Encode = {
522
542
  leverageManagement(
523
543
  triggerRepayRatio: number,
@@ -547,40 +567,28 @@ export const exchangeEncode = {
547
567
 
548
568
  return [strategyId, false, triggerData, subData];
549
569
  },
550
- limitOrder(
570
+ limitOrderWithoutSubProxy(
551
571
  fromToken: EthereumAddress,
552
572
  toToken: EthereumAddress,
553
573
  amount: string,
554
574
  targetPrice: string,
555
575
  goodUntil: string | number,
556
576
  orderType: OrderType,
577
+ fromTokenDecimals: number,
578
+ toTokenDecimals: number,
579
+ network: ChainId,
557
580
  ) {
558
- return subDataService.exchangeLimitOrderSubData.encode(fromToken, toToken, amount, targetPrice, goodUntil, orderType);
581
+ requireAddresses([fromToken, toToken]);
582
+ const subData = subDataService.exchangeLimitOrderSubDataWithoutSubProxy.encode(fromToken, toToken, amount);
583
+ const triggerData = triggerService.exchangeOffchainPriceTrigger.encode(targetPrice, Number(goodUntil), orderType, fromTokenDecimals, toTokenDecimals);
584
+
585
+ const strategyId = STRATEGY_IDS[network].EXCHANGE_LIMIT_ORDER;
586
+
587
+ return [strategyId, false, triggerData, subData];
559
588
  },
560
589
  };
561
590
 
562
591
  export const sparkEncode = {
563
- leverageManagement(
564
- triggerRepayRatio: number,
565
- triggerBoostRatio: number,
566
- targetBoostRatio: number,
567
- targetRepayRatio: number,
568
- boostEnabled: boolean,
569
- ) {
570
- let subInput = '0x';
571
-
572
- subInput = subInput.concat(new Dec(triggerRepayRatio).mul(1e16).toHex().slice(2)
573
- .padStart(32, '0'));
574
- subInput = subInput.concat(new Dec(triggerBoostRatio).mul(1e16).toHex().slice(2)
575
- .padStart(32, '0'));
576
- subInput = subInput.concat(new Dec(targetBoostRatio).mul(1e16).toHex().slice(2)
577
- .padStart(32, '0'));
578
- subInput = subInput.concat(new Dec(targetRepayRatio).mul(1e16).toHex().slice(2)
579
- .padStart(32, '0'));
580
- subInput = subInput.concat(boostEnabled ? '01' : '00');
581
-
582
- return subInput;
583
- },
584
592
  leverageManagementOnPrice(
585
593
  strategyOrBundleId: number,
586
594
  isBundle: boolean = true,
@@ -642,6 +650,26 @@ export const sparkEncode = {
642
650
 
643
651
  return [strategyOrBundleId, isBundle, triggerData, subData];
644
652
  },
653
+
654
+ liquidationProtection(
655
+ strategyOrBundleId: number,
656
+ market: EthereumAddress,
657
+ user: EthereumAddress,
658
+ ratioState: RatioState,
659
+ targetRatio: number,
660
+ triggerRatio: number,
661
+ ) {
662
+ const isBundle = true;
663
+
664
+ const subData = subDataService.sparkLiquidationProtectionSubData.encode(
665
+ targetRatio,
666
+ ratioState,
667
+ );
668
+ const triggerData = triggerService.sparkRatioTrigger.encode(user, market, triggerRatio, ratioState);
669
+
670
+ return [strategyOrBundleId, isBundle, triggerData, subData];
671
+ },
672
+
645
673
  collateralSwitch(
646
674
  strategyOrBundleId: number,
647
675
  fromAsset: EthereumAddress,
@@ -738,6 +766,32 @@ export const morphoBlueEncode = {
738
766
 
739
767
  return [strategyOrBundleId, isBundle, triggerData, subData];
740
768
  },
769
+
770
+ liquidationProtection(
771
+ marketId: string,
772
+ loanToken: EthereumAddress,
773
+ collToken: EthereumAddress,
774
+ oracle: EthereumAddress,
775
+ irm: EthereumAddress,
776
+ lltv: string,
777
+ ratioState: RatioState,
778
+ targetRatio: number,
779
+ triggerRatio: number,
780
+ user: EthereumAddress,
781
+ isEOA: boolean,
782
+ network: ChainId,
783
+ ) {
784
+ const subData = subDataService.morphoBlueLiquidationProtectionSubData.encode(loanToken, collToken, oracle, irm, lltv, ratioState, targetRatio, user, isEOA);
785
+
786
+ const triggerData = triggerService.morphoBlueRatioTrigger.encode(marketId, user, triggerRatio, ratioState);
787
+
788
+ // TODO -> Check if need to deploy separate bundles for EOA, or can reuse this for EOA. Logic above is different for EOA and SW on arbi and mainnet. Base uses same for both, not sure if because of lack of EOA support or because it is using same bundle for both.
789
+ const bundleId = (getBundleIdsByNetwork(network) as typeof Bundles.MainnetIds).MORPHO_BLUE_LIQUIDATION_PROTECTION;
790
+ const isBundle = true;
791
+
792
+ return [bundleId, isBundle, triggerData, subData];
793
+ },
794
+
741
795
  leverageManagementOnPrice(
742
796
  strategyOrBundleId: number,
743
797
  isBundle: boolean = true,
@@ -866,6 +920,22 @@ export const fluidEncode = {
866
920
 
867
921
  return [strategyOrBundleId, isBundle, triggerData, subData];
868
922
  },
923
+
924
+ liquidationProtection(
925
+ nftId: string,
926
+ vault: EthereumAddress,
927
+ ratioState: RatioState,
928
+ targetRatio: number,
929
+ triggerRatio: number,
930
+ strategyOrBundleId: number,
931
+ ) {
932
+ const isBundle = true;
933
+ const subData = subDataService.fluidLiquidationProtectionSubData.encode(nftId, vault, ratioState, targetRatio);
934
+ const triggerData = triggerService.fluidRatioTrigger.encode(nftId, triggerRatio, ratioState);
935
+
936
+ return [strategyOrBundleId, isBundle, triggerData, subData];
937
+ },
938
+
869
939
  };
870
940
 
871
941
  export const aaveV4Encode = {
@@ -883,6 +953,22 @@ export const aaveV4Encode = {
883
953
 
884
954
  return [strategyOrBundleId, isBundle, triggerData, subData];
885
955
  },
956
+
957
+ liquidationProtection(
958
+ strategyOrBundleId: number,
959
+ owner: EthereumAddress,
960
+ spoke: EthereumAddress,
961
+ ratioState: RatioState,
962
+ targetRatio: number,
963
+ triggerRatio: number,
964
+ ) {
965
+ const isBundle = true;
966
+ const subData = subDataService.aaveV4LiquidationProtectionSubData.encode(spoke, owner, ratioState, targetRatio);
967
+ const triggerData = triggerService.aaveV4RatioTrigger.encode(owner, spoke, triggerRatio, ratioState);
968
+
969
+ return [strategyOrBundleId, isBundle, triggerData, subData];
970
+ },
971
+
886
972
  leverageManagementOnPrice(
887
973
  strategyOrBundleId: number,
888
974
  owner: EthereumAddress,
@@ -1408,54 +1408,6 @@ describe('Feature: subDataService.ts', () => {
1408
1408
  });
1409
1409
  });
1410
1410
 
1411
- describe('When testing subDataService.compoundV3L2LeverageManagementSubData', () => {
1412
- describe('encode()', () => {
1413
- const examples: Array<[
1414
- string,
1415
- [market: EthereumAddress, baseToken: EthereumAddress, triggerRepayRatio: number, triggerBoostRatio: number, targetBoostRatio: number, targetRepayRatio: number, boostEnabled: boolean, isEOA: boolean],
1416
- ]> = [
1417
- [
1418
- '0x0313D212133AFab8F2b829B1066c7e43caD94e2c0213D212133AfaB8F2b829B1066C7E43cAD94E2c000000000000000016345785d8a0000000000000000000001e87f85809dc0000000000000000000018fae27693b4000000000000000000001a5e27eef13e00000100',
1419
- [web3Utils.toChecksumAddress('0x0313d212133AFaB8F2B829B1066c7E43cAd94E2c'), web3Utils.toChecksumAddress('0x0213d212133AFaB8F2B829B1066c7E43cAd94E2c'), 160, 220, 180, 190, true, false]
1420
- ],
1421
- [
1422
- '0x0313D212133AFab8F2b829B1066c7e43caD94e2c0413d212133afAb8F2B829b1066C7e43cAd94e2c000000000000000016345785d8a0000000000000000000001e87f85809dc0000000000000000000018fae27693b4000000000000000000000f43fc2c04ee00000000',
1423
- [web3Utils.toChecksumAddress('0x0313d212133AFaB8F2B829B1066c7E43cAd94E2c'), web3Utils.toChecksumAddress('0x0413d212133AFaB8F2B829B1066c7E43cAd94E2c'), 160, 220, 180, 110, false, false]
1424
- ],
1425
- ];
1426
-
1427
- examples.forEach(([expected, actual]) => {
1428
- it(`Given ${actual} should return expected value: ${expected}`, () => {
1429
- expect(subDataService.compoundV3L2LeverageManagementSubData.encode(...actual)).to.eql(expected);
1430
- });
1431
- });
1432
- });
1433
- describe('decode()', () => {
1434
- const examples: Array<[{ targetRatio: number }, SubData]> = [
1435
- [
1436
- { targetRatio: 200 },
1437
- [
1438
- '0x0000000000000000000000000313d212133AFaB8F2B829B1066c7E43cAd94E2c', '0x0000000000000000000000000213d212133AFaB8F2B829B1066c7E43cAd94E2c',
1439
- '0x0000000000000000000000000000000000000000000000000000000000000001', '0x0000000000000000000000000000000000000000000000001bc16d674ec80000',
1440
- ],
1441
- ],
1442
- [
1443
- { targetRatio: 123 },
1444
- [
1445
- '0x0000000000000000000000000313d212133AFaB8F2B829B1066c7E43cAd94E2c', '0x0000000000000000000000000413d212133AFaB8F2B829B1066c7E43cAd94E2c',
1446
- '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000001111d67bb1bb0000',
1447
- ],
1448
- ],
1449
- ];
1450
-
1451
- examples.forEach(([expected, actual]) => {
1452
- it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1453
- expect(subDataService.compoundV3L2LeverageManagementSubData.decode(actual)).to.eql(expected);
1454
- });
1455
- });
1456
- });
1457
- });
1458
-
1459
1411
  describe('When testing subDataService.morphoBlueLeverageManagementSubData', () => {
1460
1412
  describe('encode()', () => {
1461
1413
  const examples: Array<[