@defisaver/automation-sdk 3.3.1 → 3.3.2-dev.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.
Files changed (42) hide show
  1. package/cjs/constants/index.js +100 -0
  2. package/cjs/index.d.ts +2 -1
  3. package/cjs/index.js +1 -1
  4. package/cjs/services/strategiesService.js +28 -9
  5. package/cjs/services/strategySubService.d.ts +3 -1
  6. package/cjs/services/strategySubService.js +15 -2
  7. package/cjs/services/strategySubService.test.js +314 -0
  8. package/cjs/services/subDataService.d.ts +25 -1
  9. package/cjs/services/subDataService.js +78 -2
  10. package/cjs/services/subDataService.test.js +456 -0
  11. package/cjs/services/triggerService.d.ts +9 -0
  12. package/cjs/services/triggerService.js +20 -1
  13. package/cjs/services/triggerService.test.js +46 -0
  14. package/cjs/types/enums.d.ts +24 -4
  15. package/cjs/types/enums.js +21 -0
  16. package/esm/constants/index.js +100 -0
  17. package/esm/index.d.ts +2 -1
  18. package/esm/index.js +2 -2
  19. package/esm/services/strategiesService.js +28 -9
  20. package/esm/services/strategySubService.d.ts +3 -1
  21. package/esm/services/strategySubService.js +15 -2
  22. package/esm/services/strategySubService.test.js +314 -0
  23. package/esm/services/subDataService.d.ts +25 -1
  24. package/esm/services/subDataService.js +77 -1
  25. package/esm/services/subDataService.test.js +456 -0
  26. package/esm/services/triggerService.d.ts +9 -0
  27. package/esm/services/triggerService.js +19 -0
  28. package/esm/services/triggerService.test.js +47 -1
  29. package/esm/types/enums.d.ts +24 -4
  30. package/esm/types/enums.js +21 -0
  31. package/package.json +1 -1
  32. package/src/constants/index.ts +103 -0
  33. package/src/index.ts +4 -2
  34. package/src/services/strategiesService.ts +31 -10
  35. package/src/services/strategySubService.test.ts +347 -0
  36. package/src/services/strategySubService.ts +57 -1
  37. package/src/services/subDataService.test.ts +532 -0
  38. package/src/services/subDataService.ts +122 -2
  39. package/src/services/triggerService.test.ts +50 -0
  40. package/src/services/triggerService.ts +29 -0
  41. package/src/types/enums.ts +21 -0
  42. package/src/types/index.ts +20 -0
@@ -164,7 +164,7 @@ export const aaveV2LeverageManagementSubData = {
164
164
  },
165
165
  };
166
166
 
167
- export const aaveV3LeverageManagementSubData = { // TODO encode?
167
+ export const aaveV3LeverageManagementSubData = {
168
168
  decode(subData: SubData): { targetRatio: number } {
169
169
  const ratioWei = AbiCoder.decodeParameter('uint256', subData[0]) as any as string;
170
170
  const targetRatio = weiToRatioPercentage(ratioWei);
@@ -177,12 +177,20 @@ export const aaveV3LeverageManagementSubDataWithoutSubProxy = {
177
177
  encode(
178
178
  targetRatio: number,
179
179
  ratioState: RatioState,
180
+ market: EthereumAddress,
181
+ user: EthereumAddress,
182
+ isGeneric: boolean,
180
183
  ): SubData {
181
184
  const encodedTargetRatio = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
182
185
  const encodedRatioState = AbiCoder.encodeParameter('uint8', ratioState);
186
+
187
+ if (isGeneric) {
188
+ const encodedMarket = AbiCoder.encodeParameter('address', market);
189
+ const encodedUser = AbiCoder.encodeParameter('address', user);
190
+ return [encodedTargetRatio, encodedRatioState, encodedMarket, encodedUser];
191
+ }
183
192
  const encodedUseDefaultMarket = AbiCoder.encodeParameter('bool', true);
184
193
  const encodedUseOnBehalf = AbiCoder.encodeParameter('bool', false);
185
-
186
194
  return [encodedTargetRatio, encodedRatioState, encodedUseDefaultMarket, encodedUseOnBehalf];
187
195
  },
188
196
  decode(subData: SubData): { targetRatio: number, ratioState: RatioState } {
@@ -193,6 +201,118 @@ export const aaveV3LeverageManagementSubDataWithoutSubProxy = {
193
201
  },
194
202
  };
195
203
 
204
+ export const aaveV3LeverageManagementOnPriceGeneric = {
205
+ encode(
206
+ collAsset: EthereumAddress,
207
+ collAssetId: number,
208
+ debtAsset: EthereumAddress,
209
+ debtAssetId: number,
210
+ marketAddr: EthereumAddress,
211
+ targetRatio: number,
212
+ user: EthereumAddress,
213
+ ): SubData {
214
+ const encodedColl = AbiCoder.encodeParameter('address', collAsset);
215
+ const encodedCollId = AbiCoder.encodeParameter('uint8', collAssetId);
216
+ const encodedDebt = AbiCoder.encodeParameter('address', debtAsset);
217
+ const encodedDebtId = AbiCoder.encodeParameter('uint8', debtAssetId);
218
+ const encodedMarket = AbiCoder.encodeParameter('address', marketAddr);
219
+ const encodedTargetRatio = AbiCoder.encodeParameter('uint256', ratioPercentageToWei(targetRatio));
220
+ const userEncoded = AbiCoder.encodeParameter('address', user);
221
+
222
+ return [
223
+ encodedColl,
224
+ encodedCollId,
225
+ encodedDebt,
226
+ encodedDebtId,
227
+ encodedMarket,
228
+ encodedTargetRatio,
229
+ userEncoded,
230
+ ];
231
+ },
232
+ decode(subData: SubData): {
233
+ collAsset: EthereumAddress,
234
+ collAssetId: number,
235
+ debtAsset: EthereumAddress,
236
+ debtAssetId: number,
237
+ marketAddr: EthereumAddress,
238
+ targetRatio: number,
239
+ user: EthereumAddress,
240
+ } {
241
+ const collAsset = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
242
+ const collAssetId = Number(AbiCoder.decodeParameter('uint8', subData[1]));
243
+ const debtAsset = AbiCoder.decodeParameter('address', subData[2]) as unknown as EthereumAddress;
244
+ const debtAssetId = Number(AbiCoder.decodeParameter('uint8', subData[3]));
245
+ const marketAddr = AbiCoder.decodeParameter('address', subData[4]) as unknown as EthereumAddress;
246
+
247
+ const weiRatio = AbiCoder.decodeParameter('uint256', subData[5]) as unknown as string;
248
+ const targetRatio = weiToRatioPercentage(weiRatio);
249
+
250
+ const user = AbiCoder.decodeParameter('address', subData[6]) as unknown as EthereumAddress;
251
+
252
+ return {
253
+ collAsset,
254
+ collAssetId,
255
+ debtAsset,
256
+ debtAssetId,
257
+ marketAddr,
258
+ targetRatio,
259
+ user,
260
+ };
261
+ },
262
+ };
263
+
264
+ export const aaveV3CloseGenericSubData = {
265
+ encode(
266
+ collAsset: EthereumAddress,
267
+ collAssetId: number,
268
+ debtAsset: EthereumAddress,
269
+ debtAssetId: number,
270
+ closeType: CloseStrategyType,
271
+ marketAddr: EthereumAddress,
272
+ user: EthereumAddress,
273
+ ): SubData {
274
+ const encodedColl = AbiCoder.encodeParameter('address', collAsset);
275
+ const encodedCollId = AbiCoder.encodeParameter('uint8', collAssetId);
276
+ const encodedDebt = AbiCoder.encodeParameter('address', debtAsset);
277
+ const encodedDebtId = AbiCoder.encodeParameter('uint8', debtAssetId);
278
+ const encodedCloseType = AbiCoder.encodeParameter('uint8', closeType);
279
+ const encodedMarket = AbiCoder.encodeParameter('address', marketAddr);
280
+ const userEncoded = AbiCoder.encodeParameter('address', user);
281
+
282
+ return [
283
+ encodedColl,
284
+ encodedCollId,
285
+ encodedDebt,
286
+ encodedDebtId,
287
+ encodedCloseType,
288
+ encodedMarket,
289
+ userEncoded,
290
+ ];
291
+ },
292
+
293
+ decode(subData: SubData): {
294
+ collAsset: EthereumAddress,
295
+ collAssetId: number,
296
+ debtAsset: EthereumAddress,
297
+ debtAssetId: number,
298
+ closeType: CloseStrategyType,
299
+ marketAddr: EthereumAddress,
300
+ user: EthereumAddress,
301
+ } {
302
+ const collAsset = AbiCoder.decodeParameter('address', subData[0]) as unknown as EthereumAddress;
303
+ const collAssetId = Number(AbiCoder.decodeParameter('uint8', subData[1]));
304
+ const debtAsset = AbiCoder.decodeParameter('address', subData[2]) as unknown as EthereumAddress;
305
+ const debtAssetId = Number(AbiCoder.decodeParameter('uint8', subData[3]));
306
+ const closeType = Number(AbiCoder.decodeParameter('uint8', subData[4])) as CloseStrategyType;
307
+ const marketAddr = AbiCoder.decodeParameter('address', subData[5]) as unknown as EthereumAddress;
308
+ const user = AbiCoder.decodeParameter('address', subData[6]) as unknown as EthereumAddress;
309
+
310
+ return {
311
+ collAsset, collAssetId, debtAsset, debtAssetId, closeType, marketAddr, user,
312
+ };
313
+ },
314
+ };
315
+
196
316
  export const aaveV3QuotePriceSubData = {
197
317
  encode(
198
318
  collAsset: EthereumAddress,
@@ -31,6 +31,7 @@ import {
31
31
  morphoBlueRatioTrigger,
32
32
  crvUsdHealthRatioTrigger, liquityV2DebtInFrontTrigger, liquityV2AdjustTimeTrigger,
33
33
  compoundV3PriceRangeTrigger,
34
+ aaveV3QuotePriceRangeTrigger,
34
35
  } from './triggerService';
35
36
 
36
37
  describe('Feature: triggerService.ts', () => {
@@ -1231,4 +1232,53 @@ describe('Feature: triggerService.ts', () => {
1231
1232
  });
1232
1233
  });
1233
1234
  });
1235
+ describe('When testing triggerService.aaveV3PriceRangeTrigger', () => {
1236
+ describe('encode()', () => {
1237
+ const examples: Array<[[string], [collToken: EthereumAddress, debtToken: EthereumAddress, lowerPrice: number, upperPrice: number]]> = [
1238
+ [
1239
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000005d21dba000'],
1240
+ [web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'), web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'), 1500, 4000]
1241
+ ],
1242
+ [
1243
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746a528800'],
1244
+ [web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'), web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'), 0, 5000]
1245
+ ],
1246
+ ];
1247
+
1248
+ examples.forEach(([expected, actual]) => {
1249
+ it(`Given ${actual} should return expected value: ${expected}`, () => {
1250
+ expect(aaveV3QuotePriceRangeTrigger.encode(...actual)).to.eql(expected);
1251
+ });
1252
+ });
1253
+ });
1254
+
1255
+ describe('decode()', () => {
1256
+ const examples: Array<[{ collToken: EthereumAddress, debtToken: EthereumAddress, lowerPrice: string, upperPrice: string }, TriggerData]> = [
1257
+ [
1258
+ {
1259
+ collToken: web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
1260
+ debtToken: web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
1261
+ lowerPrice: '1500',
1262
+ upperPrice: '4000',
1263
+ },
1264
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000022ecb25c000000000000000000000000000000000000000000000000000000005d21dba000'],
1265
+ ],
1266
+ [
1267
+ {
1268
+ collToken: web3Utils.toChecksumAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),
1269
+ debtToken: web3Utils.toChecksumAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
1270
+ lowerPrice: '0',
1271
+ upperPrice: '5000',
1272
+ },
1273
+ ['000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746a528800'],
1274
+ ],
1275
+ ];
1276
+
1277
+ examples.forEach(([expected, actual]) => {
1278
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1279
+ expect(aaveV3QuotePriceRangeTrigger.decode(actual)).to.eql(expected);
1280
+ });
1281
+ });
1282
+ });
1283
+ });
1234
1284
  });
@@ -656,4 +656,33 @@ export const compoundV3PriceRangeTrigger = {
656
656
  upperPrice: new Dec(decodedData[3] as string).div(1e8).toString(),
657
657
  };
658
658
  },
659
+ };
660
+
661
+ export const aaveV3QuotePriceRangeTrigger = {
662
+ encode(
663
+ collToken: EthereumAddress,
664
+ debtToken: EthereumAddress,
665
+ lowerPrice: number,
666
+ upperPrice: number,
667
+ ) {
668
+ // Price is scaled to 1e8
669
+ const lowerPriceFormatted = new Dec(lowerPrice).mul(1e8).floor().toString();
670
+ const upperPriceFormatted = new Dec(upperPrice).mul(1e8).floor().toString();
671
+ return [
672
+ AbiCoder.encodeParameters(
673
+ ['address', 'address', 'uint256', 'uint256'],
674
+ [collToken, debtToken, lowerPriceFormatted, upperPriceFormatted]),
675
+ ];
676
+ },
677
+ decode(
678
+ triggerData: TriggerData,
679
+ ) {
680
+ const decodedData = AbiCoder.decodeParameters(['address', 'address', 'uint256', 'uint256'], triggerData[0]);
681
+ return {
682
+ collToken: decodedData[0] as EthereumAddress,
683
+ debtToken: decodedData[1] as EthereumAddress,
684
+ lowerPrice: new Dec(decodedData[2] as string).div(1e8).toString(),
685
+ upperPrice: new Dec(decodedData[3] as string).div(1e8).toString(),
686
+ };
687
+ },
659
688
  };
@@ -213,6 +213,12 @@ export namespace Bundles {
213
213
  COMP_V3_EOA_REPAY_ON_PRICE = 49,
214
214
  COMP_V3_EOA_BOOST_ON_PRICE = 50,
215
215
  COMP_V3_EOA_CLOSE = 51,
216
+ // TODO -> Watch out for Liquity V2 Strategy deploy, should change IDs or here or there !!!
217
+ AAVE_V3_EOA_REPAY = 52,
218
+ AAVE_V3_EOA_BOOST = 53,
219
+ AAVE_V3_EOA_REPAY_ON_PRICE = 54,
220
+ AAVE_V3_EOA_BOOST_ON_PRICE = 55,
221
+ AAVE_V3_EOA_CLOSE = 56,
216
222
  }
217
223
 
218
224
  export enum OptimismIds {
@@ -222,6 +228,11 @@ export namespace Bundles {
222
228
  AAVE_V3_CLOSE_TO_COLLATERAL = 3,
223
229
  AAVE_V3_OPEN_ORDER_FROM_COLLATERAL = 4,
224
230
  AAVE_V3_REPAY_ON_PRICE = 5,
231
+ AAVE_V3_EOA_REPAY = 6,
232
+ AAVE_V3_EOA_BOOST = 7,
233
+ AAVE_V3_EOA_REPAY_ON_PRICE = 8,
234
+ AAVE_V3_EOA_BOOST_ON_PRICE = 9,
235
+ AAVE_V3_EOA_CLOSE = 10,
225
236
  }
226
237
 
227
238
  export enum BaseIds {
@@ -246,6 +257,11 @@ export namespace Bundles {
246
257
  COMP_V3_EOA_CLOSE = 20,
247
258
  COMP_V3_EOA_REPAY = 21,
248
259
  COMP_V3_EOA_BOOST = 22,
260
+ AAVE_V3_EOA_REPAY = 23,
261
+ AAVE_V3_EOA_BOOST = 24,
262
+ AAVE_V3_EOA_REPAY_ON_PRICE = 25,
263
+ AAVE_V3_EOA_BOOST_ON_PRICE = 26,
264
+ AAVE_V3_EOA_CLOSE = 27,
249
265
  }
250
266
 
251
267
  export enum ArbitrumIds {
@@ -267,6 +283,11 @@ export namespace Bundles {
267
283
  COMP_V3_EOA_CLOSE = 15,
268
284
  COMP_V3_EOA_REPAY = 16,
269
285
  COMP_V3_EOA_BOOST = 17,
286
+ AAVE_V3_EOA_REPAY = 18,
287
+ AAVE_V3_EOA_BOOST = 19,
288
+ AAVE_V3_EOA_REPAY_ON_PRICE = 20,
289
+ AAVE_V3_EOA_BOOST_ON_PRICE = 21,
290
+ AAVE_V3_EOA_CLOSE = 22,
270
291
  }
271
292
  }
272
293
 
@@ -124,6 +124,26 @@ export declare namespace Position {
124
124
  mergeWithId?: Strategies.Identifiers,
125
125
  mergeId?: Strategies.Identifiers
126
126
  }
127
+ // TODO -> Prob should be better to type it something like this
128
+ // type RatioProtection =
129
+ // | (Base & {
130
+ // triggerRepayRatio: number
131
+ // targetRepayRatio: number
132
+ // repayEnabled: boolean
133
+
134
+ // triggerBoostRatio?: never
135
+ // targetBoostRatio?: never
136
+ // boostEnabled?: never
137
+ // })
138
+ // | (Base & {
139
+ // triggerBoostRatio: number
140
+ // targetBoostRatio: number
141
+ // boostEnabled: boolean
142
+
143
+ // triggerRepayRatio?: never
144
+ // targetRepayRatio?: never
145
+ // repayEnabled?: never
146
+ // });
127
147
  interface RatioProtection extends Base {
128
148
  triggerRepayRatio?: number,
129
149
  targetRepayRatio?: number,