@defisaver/automation-sdk 3.3.10 → 3.3.11

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 +10 -0
  2. package/cjs/services/ethereumService.test.js +2 -0
  3. package/cjs/services/strategiesService.js +25 -0
  4. package/cjs/services/strategySubService.d.ts +13 -0
  5. package/cjs/services/strategySubService.js +7 -0
  6. package/cjs/services/strategySubService.test.js +133 -0
  7. package/cjs/services/subDataService.d.ts +11 -0
  8. package/cjs/services/subDataService.js +25 -1
  9. package/cjs/services/subDataService.test.js +57 -0
  10. package/cjs/services/triggerService.d.ts +9 -0
  11. package/cjs/services/triggerService.js +16 -1
  12. package/cjs/services/triggerService.test.js +46 -0
  13. package/cjs/types/enums.d.ts +3 -1
  14. package/cjs/types/enums.js +2 -0
  15. package/cjs/types/index.d.ts +12 -1
  16. package/esm/constants/index.js +10 -0
  17. package/esm/services/ethereumService.test.js +2 -0
  18. package/esm/services/strategiesService.js +25 -0
  19. package/esm/services/strategySubService.d.ts +13 -0
  20. package/esm/services/strategySubService.js +7 -0
  21. package/esm/services/strategySubService.test.js +134 -1
  22. package/esm/services/subDataService.d.ts +11 -0
  23. package/esm/services/subDataService.js +24 -0
  24. package/esm/services/subDataService.test.js +57 -0
  25. package/esm/services/triggerService.d.ts +9 -0
  26. package/esm/services/triggerService.js +15 -0
  27. package/esm/services/triggerService.test.js +47 -1
  28. package/esm/types/enums.d.ts +3 -1
  29. package/esm/types/enums.js +2 -0
  30. package/esm/types/index.d.ts +12 -1
  31. package/package.json +2 -2
  32. package/src/constants/index.ts +10 -0
  33. package/src/services/ethereumService.test.ts +2 -0
  34. package/src/services/strategiesService.ts +31 -1
  35. package/src/services/strategySubService.test.ts +162 -0
  36. package/src/services/strategySubService.ts +22 -0
  37. package/src/services/subDataService.test.ts +67 -0
  38. package/src/services/subDataService.ts +39 -0
  39. package/src/services/triggerService.test.ts +51 -0
  40. package/src/services/triggerService.ts +23 -0
  41. package/src/types/enums.ts +2 -0
  42. package/src/types/index.ts +14 -1
@@ -473,6 +473,16 @@ exports.MAINNET_BUNDLES_INFO = {
473
473
  strategyId: enums_1.Strategies.Identifiers.CloseOnPrice,
474
474
  protocol: exports.PROTOCOLS.MorphoBlue,
475
475
  },
476
+ [enums_1.Bundles.MainnetIds.SPARK_REPAY_ON_PRICE]: {
477
+ strategyOrBundleId: enums_1.Bundles.MainnetIds.SPARK_REPAY_ON_PRICE,
478
+ strategyId: enums_1.Strategies.Identifiers.RepayOnPrice,
479
+ protocol: exports.PROTOCOLS.Spark,
480
+ },
481
+ [enums_1.Bundles.MainnetIds.SPARK_BOOST_ON_PRICE]: {
482
+ strategyOrBundleId: enums_1.Bundles.MainnetIds.SPARK_BOOST_ON_PRICE,
483
+ strategyId: enums_1.Strategies.Identifiers.BoostOnPrice,
484
+ protocol: exports.PROTOCOLS.Spark,
485
+ },
476
486
  };
477
487
  exports.OPTIMISM_BUNDLES_INFO = {
478
488
  [enums_1.Bundles.OptimismIds.AAVE_V3_REPAY]: {
@@ -147,6 +147,7 @@ describe('Feature: ethereumService.ts', () => {
147
147
  'address': '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
148
148
  'blockHash': '0xacb0213af63b4c17c436f084a96d1ac385641a59a9a4cf014ae3337cbe545aa7',
149
149
  'blockNumber': 5353002,
150
+ 'blockTimestamp': '0x624c1a5b',
150
151
  'event': 'Transfer',
151
152
  'id': 'log_f49645b8',
152
153
  'logIndex': 1,
@@ -192,6 +193,7 @@ describe('Feature: ethereumService.ts', () => {
192
193
  'address': '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
193
194
  'blockHash': '0xacb0213af63b4c17c436f084a96d1ac385641a59a9a4cf014ae3337cbe545aa7',
194
195
  'blockNumber': 5353002,
196
+ 'blockTimestamp': '0x624c1a5b',
195
197
  'event': 'Transfer',
196
198
  'id': 'log_f49645b8',
197
199
  'logIndex': 1,
@@ -613,6 +613,29 @@ function parseSparkLeverageManagement(position, parseData) {
613
613
  _position.strategy.strategyId = enums_1.Strategies.IdOverrides.LeverageManagement;
614
614
  return _position;
615
615
  }
616
+ function parseSparkLeverageManagementOnPrice(position, parseData) {
617
+ const _position = (0, lodash_1.cloneDeep)(position);
618
+ const { subStruct } = parseData.subscriptionEventData;
619
+ const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
620
+ const subData = subDataService.sparkLeverageManagementOnPriceSubData.decode(subStruct.subData);
621
+ _position.strategyData.decoded.triggerData = triggerData;
622
+ _position.strategyData.decoded.subData = subData;
623
+ _position.positionId = (0, utils_1.getPositionId)(_position.chainId, _position.protocol.id, _position.owner, subData.marketAddr);
624
+ _position.specific = {
625
+ // subData
626
+ collAsset: subData.collAsset,
627
+ collAssetId: subData.collAssetId,
628
+ debtAsset: subData.debtAsset,
629
+ debtAssetId: subData.debtAssetId,
630
+ ratio: subData.targetRatio,
631
+ // triggerData
632
+ baseToken: triggerData.baseTokenAddr,
633
+ quoteToken: triggerData.quoteTokenAddr,
634
+ price: triggerData.price,
635
+ ratioState: triggerData.ratioState,
636
+ };
637
+ return _position;
638
+ }
616
639
  function parseSparkCloseOnPrice(position, parseData) {
617
640
  const _position = (0, lodash_1.cloneDeep)(position);
618
641
  const { subStruct } = parseData.subscriptionEventData;
@@ -973,6 +996,8 @@ const parsingMethodsMapping = {
973
996
  [enums_1.ProtocolIdentifiers.StrategiesAutomation.Spark]: {
974
997
  [enums_1.Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
975
998
  [enums_1.Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
999
+ [enums_1.Strategies.Identifiers.RepayOnPrice]: parseSparkLeverageManagementOnPrice,
1000
+ [enums_1.Strategies.Identifiers.BoostOnPrice]: parseSparkLeverageManagementOnPrice,
976
1001
  [enums_1.Strategies.Identifiers.CloseOnPrice]: parseSparkCloseOnPrice,
977
1002
  },
978
1003
  [enums_1.ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
@@ -86,6 +86,19 @@ export declare const exchangeEncode: {
86
86
  };
87
87
  export declare const sparkEncode: {
88
88
  leverageManagement(triggerRepayRatio: number, triggerBoostRatio: number, targetBoostRatio: number, targetRepayRatio: number, boostEnabled: boolean): string;
89
+ leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, triggerData: {
90
+ baseTokenAddr: EthereumAddress;
91
+ quoteTokenAddr: EthereumAddress;
92
+ price: number;
93
+ ratioState: RatioState;
94
+ }, subData: {
95
+ collAsset: EthereumAddress;
96
+ collAssetId: number;
97
+ debtAsset: EthereumAddress;
98
+ debtAssetId: number;
99
+ marketAddr: EthereumAddress;
100
+ targetRatio: number;
101
+ }): (number | boolean | string[])[];
89
102
  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
103
  leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
91
104
  };
@@ -272,6 +272,13 @@ exports.sparkEncode = {
272
272
  subInput = subInput.concat(boostEnabled ? '01' : '00');
273
273
  return subInput;
274
274
  },
275
+ leverageManagementOnPrice(strategyOrBundleId, isBundle = true, triggerData, subData) {
276
+ const { collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio, } = subData;
277
+ const subDataEncoded = subDataService.sparkLeverageManagementOnPriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio);
278
+ const { baseTokenAddr, quoteTokenAddr, price, ratioState, } = triggerData;
279
+ const triggerDataEncoded = triggerService.sparkQuotePriceTrigger.encode(baseTokenAddr, quoteTokenAddr, price, ratioState);
280
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
281
+ },
275
282
  closeOnPriceGeneric(strategyOrBundleId, collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, user, stopLossPrice = 0, stopLossType = enums_1.CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = enums_1.CloseToAssetType.COLLATERAL) {
276
283
  const isBundle = true;
277
284
  const closeType = (0, utils_1.getCloseStrategyType)(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);
@@ -1481,4 +1481,137 @@ describe('Feature: strategySubService.ts', () => {
1481
1481
  });
1482
1482
  });
1483
1483
  });
1484
+ describe('When testing strategySubService.sparkEncode', () => {
1485
+ describe('leverageManagement()', () => {
1486
+ const examples = [
1487
+ [
1488
+ '0x0000000000000000136dcc951d8c00000000000000000000214e8348c4f0000000000000000000001d24b2dfac52000000000000000000001a5e27eef13e000001',
1489
+ [140, 240, 210, 190, true]
1490
+ ],
1491
+ [
1492
+ '0x0000000000000000130337bdce49000000000000000000001988fe4052b800000000000000000000281b57b028e1000000000000000000002223acf76376000000',
1493
+ [137, 184, 289, 246, false]
1494
+ ]
1495
+ ];
1496
+ examples.forEach(([expected, actual]) => {
1497
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1498
+ (0, chai_1.expect)(strategySubService_1.sparkEncode.leverageManagement(...actual)).to.eql(expected);
1499
+ });
1500
+ });
1501
+ });
1502
+ describe('leverageManagementOnPrice()', () => {
1503
+ const examples = [
1504
+ [
1505
+ [
1506
+ enums_1.Bundles.MainnetIds.SPARK_REPAY_ON_PRICE,
1507
+ true,
1508
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000003a352944000000000000000000000000000000000000000000000000000000000000000001'],
1509
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
1510
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1511
+ '0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
1512
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
1513
+ '0x00000000000000000000000002c3ea4e34c0cbd694d2adfa2c690eecbc1793ee',
1514
+ '0x0000000000000000000000000000000000000000000000001bc16d674ec80000',
1515
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1516
+ ],
1517
+ ],
1518
+ [
1519
+ 59,
1520
+ true,
1521
+ {
1522
+ baseTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WETH', enums_1.ChainId.Ethereum).address),
1523
+ quoteTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDC', enums_1.ChainId.Ethereum).address),
1524
+ price: 2500,
1525
+ ratioState: enums_1.RatioState.UNDER,
1526
+ },
1527
+ {
1528
+ collAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WETH', enums_1.ChainId.Ethereum).address),
1529
+ collAssetId: 0,
1530
+ debtAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDC', enums_1.ChainId.Ethereum).address),
1531
+ debtAssetId: 1,
1532
+ marketAddr: web3Utils.toChecksumAddress('0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE'),
1533
+ targetRatio: 200,
1534
+ },
1535
+ ]
1536
+ ],
1537
+ [
1538
+ [
1539
+ enums_1.Bundles.MainnetIds.SPARK_BOOST_ON_PRICE,
1540
+ true,
1541
+ ['0x0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000417bce6c8000000000000000000000000000000000000000000000000000000000000000000'],
1542
+ [
1543
+ '0x0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599',
1544
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
1545
+ '0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f',
1546
+ '0x0000000000000000000000000000000000000000000000000000000000000004',
1547
+ '0x00000000000000000000000002c3ea4e34c0cbd694d2adfa2c690eecbc1793ee',
1548
+ '0x00000000000000000000000000000000000000000000000022b1c8c1227a0000',
1549
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
1550
+ ]
1551
+ ],
1552
+ [
1553
+ 60,
1554
+ true,
1555
+ {
1556
+ baseTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address),
1557
+ quoteTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('DAI', enums_1.ChainId.Ethereum).address),
1558
+ price: 45000,
1559
+ ratioState: enums_1.RatioState.OVER,
1560
+ },
1561
+ {
1562
+ collAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address),
1563
+ collAssetId: 2,
1564
+ debtAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('DAI', enums_1.ChainId.Ethereum).address),
1565
+ debtAssetId: 4,
1566
+ marketAddr: web3Utils.toChecksumAddress('0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE'),
1567
+ targetRatio: 250,
1568
+ },
1569
+ ]
1570
+ ]
1571
+ ];
1572
+ examples.forEach(([expected, actual]) => {
1573
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1574
+ (0, chai_1.expect)(strategySubService_1.sparkEncode.leverageManagementOnPrice(...actual)).to.eql(expected);
1575
+ });
1576
+ });
1577
+ });
1578
+ describe('closeOnPrice()', () => {
1579
+ const examples = [
1580
+ [
1581
+ [
1582
+ enums_1.Bundles.MainnetIds.SPARK_CLOSE,
1583
+ true,
1584
+ ['0x0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000000000003a35294400000000000000000000000000000000000000000000000000000000574fbde6000'],
1585
+ [
1586
+ '0x0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599',
1587
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
1588
+ '0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f',
1589
+ '0x0000000000000000000000000000000000000000000000000000000000000004',
1590
+ '0x0000000000000000000000000000000000000000000000000000000000000005',
1591
+ '0x00000000000000000000000002c3ea4e34c0cbd694d2adfa2c690eecbc1793ee',
1592
+ '0x0000000000000000000000001234567890123456789012345678901234567890',
1593
+ ]
1594
+ ],
1595
+ [
1596
+ 57,
1597
+ web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address),
1598
+ 2,
1599
+ web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('DAI', enums_1.ChainId.Ethereum).address),
1600
+ 4,
1601
+ web3Utils.toChecksumAddress('0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE'),
1602
+ web3Utils.toChecksumAddress('0x1234567890123456789012345678901234567890'),
1603
+ 40000,
1604
+ enums_1.CloseToAssetType.DEBT,
1605
+ 60000,
1606
+ enums_1.CloseToAssetType.COLLATERAL,
1607
+ ]
1608
+ ],
1609
+ ];
1610
+ examples.forEach(([expected, actual]) => {
1611
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1612
+ (0, chai_1.expect)(strategySubService_1.sparkEncode.closeOnPriceGeneric(...actual)).to.eql(expected);
1613
+ });
1614
+ });
1615
+ });
1616
+ });
1484
1617
  });
@@ -345,3 +345,14 @@ export declare const morphoBlueCloseOnPriceSubData: {
345
345
  closeType: CloseStrategyType;
346
346
  };
347
347
  };
348
+ export declare const sparkLeverageManagementOnPriceSubData: {
349
+ encode(collAsset: EthereumAddress, collAssetId: number, debtAsset: EthereumAddress, debtAssetId: number, marketAddr: EthereumAddress, targetRatio: number): string[];
350
+ decode(subData: string[]): {
351
+ collAsset: EthereumAddress;
352
+ collAssetId: number;
353
+ debtAsset: EthereumAddress;
354
+ debtAssetId: number;
355
+ marketAddr: EthereumAddress;
356
+ targetRatio: number;
357
+ };
358
+ };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.morphoBlueCloseOnPriceSubData = exports.sparkCloseGenericSubData = exports.compoundV3CloseSubData = exports.compoundV3LeverageManagementOnPriceSubData = exports.fluidLeverageManagementSubData = exports.liquityV2PaybackSubData = exports.morphoBlueLeverageManagementOnPriceSubData = exports.liquityV2LeverageManagementOnPriceSubData = exports.liquityV2CloseSubData = exports.liquityV2LeverageManagementSubData = exports.aaveV3LeverageManagementOnPriceSubData = exports.morphoBlueLeverageManagementSubData = exports.crvUSDPaybackSubData = exports.crvUSDLeverageManagementSubData = exports.liquityDebtInFrontRepaySubData = exports.liquityDsrSupplySubData = exports.liquityDsrPaybackSubData = exports.sparkLeverageManagementSubDataWithoutSubProxy = exports.sparkLeverageManagementSubData = exports.exchangeLimitOrderSubData = exports.exchangeDcaSubData = exports.liquityPaybackUsingChickenBondSubData = exports.cBondsRebondSubData = exports.morphoAaveV2LeverageManagementSubData = exports.compoundV3L2LeverageManagementSubData = exports.compoundV3LeverageManagementSubData = exports.compoundV2LeverageManagementSubData = exports.aaveV3QuotePriceSubData = exports.aaveV3CollateralSwitchSubData = exports.aaveV3CloseGenericSubData = exports.aaveV3LeverageManagementOnPriceGeneric = exports.aaveV3LeverageManagementSubDataWithoutSubProxy = exports.aaveV3LeverageManagementSubData = exports.aaveV2LeverageManagementSubData = exports.liquityCloseSubData = exports.liquityLeverageManagementSubData = exports.makerLeverageManagementWithoutSubProxy = exports.makerLeverageManagementSubData = exports.makerCloseSubData = exports.liquityRepayFromSavingsSubData = exports.makerRepayFromSavingsSubData = void 0;
6
+ exports.sparkLeverageManagementOnPriceSubData = exports.morphoBlueCloseOnPriceSubData = exports.sparkCloseGenericSubData = exports.compoundV3CloseSubData = exports.compoundV3LeverageManagementOnPriceSubData = exports.fluidLeverageManagementSubData = exports.liquityV2PaybackSubData = exports.morphoBlueLeverageManagementOnPriceSubData = exports.liquityV2LeverageManagementOnPriceSubData = exports.liquityV2CloseSubData = exports.liquityV2LeverageManagementSubData = exports.aaveV3LeverageManagementOnPriceSubData = exports.morphoBlueLeverageManagementSubData = exports.crvUSDPaybackSubData = exports.crvUSDLeverageManagementSubData = exports.liquityDebtInFrontRepaySubData = exports.liquityDsrSupplySubData = exports.liquityDsrPaybackSubData = exports.sparkLeverageManagementSubDataWithoutSubProxy = exports.sparkLeverageManagementSubData = exports.exchangeLimitOrderSubData = exports.exchangeDcaSubData = exports.liquityPaybackUsingChickenBondSubData = exports.cBondsRebondSubData = exports.morphoAaveV2LeverageManagementSubData = exports.compoundV3L2LeverageManagementSubData = exports.compoundV3LeverageManagementSubData = exports.compoundV2LeverageManagementSubData = exports.aaveV3QuotePriceSubData = exports.aaveV3CollateralSwitchSubData = exports.aaveV3CloseGenericSubData = exports.aaveV3LeverageManagementOnPriceGeneric = exports.aaveV3LeverageManagementSubDataWithoutSubProxy = exports.aaveV3LeverageManagementSubData = exports.aaveV2LeverageManagementSubData = exports.liquityCloseSubData = exports.liquityLeverageManagementSubData = exports.makerLeverageManagementWithoutSubProxy = exports.makerLeverageManagementSubData = exports.makerCloseSubData = exports.liquityRepayFromSavingsSubData = exports.makerRepayFromSavingsSubData = void 0;
7
7
  const decimal_js_1 = __importDefault(require("decimal.js"));
8
8
  const web3_eth_abi_1 = __importDefault(require("web3-eth-abi"));
9
9
  const web3_utils_1 = require("web3-utils");
@@ -916,3 +916,27 @@ exports.morphoBlueCloseOnPriceSubData = {
916
916
  };
917
917
  },
918
918
  };
919
+ exports.sparkLeverageManagementOnPriceSubData = {
920
+ encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio) {
921
+ const encodedColl = web3_eth_abi_1.default.encodeParameter('address', collAsset);
922
+ const encodedCollId = web3_eth_abi_1.default.encodeParameter('uint16', collAssetId);
923
+ const encodedDebt = web3_eth_abi_1.default.encodeParameter('address', debtAsset);
924
+ const encodedDebtId = web3_eth_abi_1.default.encodeParameter('uint16', debtAssetId);
925
+ const encodedMarket = web3_eth_abi_1.default.encodeParameter('address', marketAddr);
926
+ const encodedTargetRatio = web3_eth_abi_1.default.encodeParameter('uint256', (0, utils_1.ratioPercentageToWei)(targetRatio));
927
+ const useOnBehalfEncoded = web3_eth_abi_1.default.encodeParameter('bool', false);
928
+ return [encodedColl, encodedCollId, encodedDebt, encodedDebtId, encodedMarket, encodedTargetRatio, useOnBehalfEncoded];
929
+ },
930
+ decode(subData) {
931
+ const collAsset = web3_eth_abi_1.default.decodeParameter('address', subData[0]);
932
+ const collAssetId = Number(web3_eth_abi_1.default.decodeParameter('uint16', subData[1]));
933
+ const debtAsset = web3_eth_abi_1.default.decodeParameter('address', subData[2]);
934
+ const debtAssetId = Number(web3_eth_abi_1.default.decodeParameter('uint16', subData[3]));
935
+ const marketAddr = web3_eth_abi_1.default.decodeParameter('address', subData[4]);
936
+ const weiRatio = web3_eth_abi_1.default.decodeParameter('uint256', subData[5]);
937
+ const targetRatio = (0, utils_1.weiToRatioPercentage)(weiRatio);
938
+ return {
939
+ collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio,
940
+ };
941
+ },
942
+ };
@@ -2089,4 +2089,61 @@ describe('Feature: subDataService.ts', () => {
2089
2089
  });
2090
2090
  });
2091
2091
  });
2092
+ describe('When testing subDataService.sparkLeverageManagementOnPriceSubData', () => {
2093
+ describe('encode()', () => {
2094
+ const examples = [
2095
+ [
2096
+ [
2097
+ '0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
2098
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
2099
+ '0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
2100
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
2101
+ '0x00000000000000000000000002c3ea4e34c0cbd694d2adfa2c690eecbc1793ee',
2102
+ '0x0000000000000000000000000000000000000000000000001bc16d674ec80000',
2103
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
2104
+ ],
2105
+ [
2106
+ web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WETH', enums_1.ChainId.Ethereum).address),
2107
+ 0,
2108
+ web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDC', enums_1.ChainId.Ethereum).address),
2109
+ 1,
2110
+ web3Utils.toChecksumAddress('0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE'),
2111
+ 200,
2112
+ ]
2113
+ ]
2114
+ ];
2115
+ examples.forEach(([expected, actual]) => {
2116
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
2117
+ (0, chai_1.expect)(subDataService.sparkLeverageManagementOnPriceSubData.encode(...actual)).to.eql(expected);
2118
+ });
2119
+ });
2120
+ });
2121
+ describe('decode()', () => {
2122
+ const examples = [
2123
+ [
2124
+ {
2125
+ collAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address),
2126
+ collAssetId: 2,
2127
+ debtAsset: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('DAI', enums_1.ChainId.Ethereum).address),
2128
+ debtAssetId: 4,
2129
+ marketAddr: web3Utils.toChecksumAddress('0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE'),
2130
+ targetRatio: 175
2131
+ },
2132
+ [
2133
+ '0x0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599',
2134
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
2135
+ '0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f',
2136
+ '0x0000000000000000000000000000000000000000000000000000000000000004',
2137
+ '0x00000000000000000000000002c3ea4e34c0cbd694d2adfa2c690eecbc1793ee',
2138
+ '0x00000000000000000000000000000000000000000000000018493fba64ef0000'
2139
+ ]
2140
+ ]
2141
+ ];
2142
+ examples.forEach(([expected, actual]) => {
2143
+ it(`Given ${JSON.stringify(actual)} should return expected value: ${JSON.stringify(expected)}`, () => {
2144
+ (0, chai_1.expect)(subDataService.sparkLeverageManagementOnPriceSubData.decode(actual)).to.eql(expected);
2145
+ });
2146
+ });
2147
+ });
2148
+ });
2092
2149
  });
@@ -285,3 +285,12 @@ export declare const morphoBluePriceRangeTrigger: {
285
285
  upperPrice: string;
286
286
  };
287
287
  };
288
+ export declare const sparkQuotePriceTrigger: {
289
+ encode(baseTokenAddr: EthereumAddress, quoteTokenAddr: EthereumAddress, price: number, ratioState: RatioState): string[];
290
+ decode(triggerData: string[]): {
291
+ baseTokenAddr: string;
292
+ quoteTokenAddr: string;
293
+ price: string;
294
+ ratioState: number;
295
+ };
296
+ };
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.morphoBluePriceRangeTrigger = exports.sparkQuotePriceRangeTrigger = exports.aaveV3QuotePriceRangeTrigger = exports.compoundV3PriceRangeTrigger = exports.compoundV3PriceTrigger = exports.fluidRatioTrigger = exports.morphoBluePriceTrigger = exports.closePriceTrigger = exports.liquityV2QuotePriceTrigger = exports.liquityV2RatioTrigger = exports.morphoBlueRatioTrigger = exports.crvUsdHealthRatioTrigger = exports.crvUSDRatioTrigger = exports.curveUsdSoftLiquidationTrigger = exports.curveUsdBorrowRateTrigger = exports.sparkRatioTrigger = exports.exchangeOffchainPriceTrigger = exports.exchangeTimestampTrigger = exports.compoundV3RatioTrigger = exports.cBondsRebondTrigger = exports.aaveV2RatioTrigger = exports.liquityV2AdjustTimeTrigger = exports.liquityV2DebtInFrontTrigger = exports.liquityDebtInFrontWithLimitTrigger = exports.liquityDebtInFrontTrigger = exports.liquityRatioTrigger = exports.compoundV2RatioTrigger = exports.aaveV3QuotePriceWithMaximumGasPriceTrigger = exports.aaveV3QuotePriceTrigger = exports.morphoAaveV2RatioTrigger = exports.aaveV3RatioTrigger = exports.makerRatioTrigger = exports.trailingStopTrigger = exports.chainlinkPriceTrigger = void 0;
29
+ exports.sparkQuotePriceTrigger = exports.morphoBluePriceRangeTrigger = exports.sparkQuotePriceRangeTrigger = exports.aaveV3QuotePriceRangeTrigger = exports.compoundV3PriceRangeTrigger = exports.compoundV3PriceTrigger = exports.fluidRatioTrigger = exports.morphoBluePriceTrigger = exports.closePriceTrigger = exports.liquityV2QuotePriceTrigger = exports.liquityV2RatioTrigger = exports.morphoBlueRatioTrigger = exports.crvUsdHealthRatioTrigger = exports.crvUSDRatioTrigger = exports.curveUsdSoftLiquidationTrigger = exports.curveUsdBorrowRateTrigger = exports.sparkRatioTrigger = exports.exchangeOffchainPriceTrigger = exports.exchangeTimestampTrigger = exports.compoundV3RatioTrigger = exports.cBondsRebondTrigger = exports.aaveV2RatioTrigger = exports.liquityV2AdjustTimeTrigger = exports.liquityV2DebtInFrontTrigger = exports.liquityDebtInFrontWithLimitTrigger = exports.liquityDebtInFrontTrigger = exports.liquityRatioTrigger = exports.compoundV2RatioTrigger = exports.aaveV3QuotePriceWithMaximumGasPriceTrigger = exports.aaveV3QuotePriceTrigger = exports.morphoAaveV2RatioTrigger = exports.aaveV3RatioTrigger = exports.makerRatioTrigger = exports.trailingStopTrigger = exports.chainlinkPriceTrigger = void 0;
30
30
  const decimal_js_1 = __importDefault(require("decimal.js"));
31
31
  const tokens_1 = require("@defisaver/tokens");
32
32
  const web3_eth_abi_1 = __importDefault(require("web3-eth-abi"));
@@ -547,3 +547,18 @@ exports.morphoBluePriceRangeTrigger = {
547
547
  };
548
548
  },
549
549
  };
550
+ exports.sparkQuotePriceTrigger = {
551
+ encode(baseTokenAddr, quoteTokenAddr, price, ratioState) {
552
+ const _price = new decimal_js_1.default(price.toString()).mul(1e8).floor().toString();
553
+ return [web3_eth_abi_1.default.encodeParameters(['address', 'address', 'uint256', 'uint8'], [baseTokenAddr, quoteTokenAddr, _price, ratioState])];
554
+ },
555
+ decode(triggerData) {
556
+ const decodedData = web3_eth_abi_1.default.decodeParameters(['address', 'address', 'uint256', 'uint8'], triggerData[0]);
557
+ return {
558
+ baseTokenAddr: decodedData[0],
559
+ quoteTokenAddr: decodedData[1],
560
+ price: new decimal_js_1.default(decodedData[2]).div(1e8).toString(),
561
+ ratioState: Number(decodedData[3]),
562
+ };
563
+ },
564
+ };
@@ -1184,4 +1184,50 @@ describe('Feature: triggerService.ts', () => {
1184
1184
  });
1185
1185
  });
1186
1186
  });
1187
+ describe('When testing triggerService.sparkQuotePriceTrigger', () => {
1188
+ describe('encode()', () => {
1189
+ const examples = [
1190
+ [
1191
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000003a352944000000000000000000000000000000000000000000000000000000000000000001'],
1192
+ [web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WETH', enums_1.ChainId.Ethereum).address), web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDC', enums_1.ChainId.Ethereum).address), 2500, enums_1.RatioState.UNDER]
1193
+ ],
1194
+ [
1195
+ ['0x000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000000000000000000000000000000c1c0000000000000000000000000000000000000000000000000000000000000000'],
1196
+ [web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDT', enums_1.ChainId.Ethereum).address), web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address), 0.000031, enums_1.RatioState.OVER]
1197
+ ],
1198
+ ];
1199
+ examples.forEach(([expected, actual]) => {
1200
+ it(`Given ${actual} should return expected value: ${expected}`, () => {
1201
+ (0, chai_1.expect)(triggerService_1.sparkQuotePriceTrigger.encode(...actual)).to.eql(expected);
1202
+ });
1203
+ });
1204
+ });
1205
+ describe('decode()', () => {
1206
+ const examples = [
1207
+ [
1208
+ {
1209
+ baseTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WETH', enums_1.ChainId.Ethereum).address),
1210
+ quoteTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDC', enums_1.ChainId.Ethereum).address),
1211
+ price: '2500',
1212
+ ratioState: enums_1.RatioState.UNDER
1213
+ },
1214
+ ['0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000003a352944000000000000000000000000000000000000000000000000000000000000000001']
1215
+ ],
1216
+ [
1217
+ {
1218
+ baseTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('USDT', enums_1.ChainId.Ethereum).address),
1219
+ quoteTokenAddr: web3Utils.toChecksumAddress((0, tokens_1.getAssetInfo)('WBTC', enums_1.ChainId.Ethereum).address),
1220
+ price: '0.000031',
1221
+ ratioState: enums_1.RatioState.OVER
1222
+ },
1223
+ ['0x000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000000000000000000000000000000c1c0000000000000000000000000000000000000000000000000000000000000000']
1224
+ ]
1225
+ ];
1226
+ examples.forEach(([expected, actual]) => {
1227
+ it(`Given ${actual} should return expected value: ${JSON.stringify(expected)}`, () => {
1228
+ (0, chai_1.expect)(triggerService_1.sparkQuotePriceTrigger.decode(actual)).to.eql(expected);
1229
+ });
1230
+ });
1231
+ });
1232
+ });
1187
1233
  });
@@ -207,7 +207,9 @@ export declare namespace Bundles {
207
207
  AAVE_V3_EOA_BOOST_ON_PRICE = 55,
208
208
  AAVE_V3_EOA_CLOSE = 56,
209
209
  SPARK_CLOSE = 57,
210
- MORPHO_BLUE_CLOSE = 58
210
+ MORPHO_BLUE_CLOSE = 58,
211
+ SPARK_REPAY_ON_PRICE = 59,
212
+ SPARK_BOOST_ON_PRICE = 60
211
213
  }
212
214
  enum OptimismIds {
213
215
  AAVE_V3_REPAY = 0,
@@ -231,6 +231,8 @@ var Bundles;
231
231
  MainnetIds[MainnetIds["AAVE_V3_EOA_CLOSE"] = 56] = "AAVE_V3_EOA_CLOSE";
232
232
  MainnetIds[MainnetIds["SPARK_CLOSE"] = 57] = "SPARK_CLOSE";
233
233
  MainnetIds[MainnetIds["MORPHO_BLUE_CLOSE"] = 58] = "MORPHO_BLUE_CLOSE";
234
+ MainnetIds[MainnetIds["SPARK_REPAY_ON_PRICE"] = 59] = "SPARK_REPAY_ON_PRICE";
235
+ MainnetIds[MainnetIds["SPARK_BOOST_ON_PRICE"] = 60] = "SPARK_BOOST_ON_PRICE";
234
236
  })(MainnetIds = Bundles.MainnetIds || (Bundles.MainnetIds = {}));
235
237
  let OptimismIds;
236
238
  (function (OptimismIds) {
@@ -197,8 +197,19 @@ export declare namespace Position {
197
197
  stopLossType: CloseToAssetType | undefined;
198
198
  takeProfitType: CloseToAssetType | undefined;
199
199
  }
200
+ interface SparkOnPrice extends Base {
201
+ collAsset: EthereumAddress;
202
+ collAssetId: number;
203
+ debtAsset: EthereumAddress;
204
+ debtAssetId: number;
205
+ baseToken: EthereumAddress;
206
+ quoteToken: EthereumAddress;
207
+ price: string;
208
+ ratioState: RatioState;
209
+ ratio: number;
210
+ }
200
211
  }
201
- type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD | Specific.CloseOnPriceLiquityV2 | Specific.BoostOnPriceMorpho | Specific.BoostOnPriceLiquityV2 | Specific.PaybackLiquityV2 | Specific.CompoundV3LeverageManagementOnPrice | Specific.CompoundV3CloseOnPrice | Specific.AaveV3CloseOnPriceGeneric;
212
+ type SpecificAny = Specific.CloseOnPrice | Specific.TrailingStop | Specific.RatioProtection | Specific.CloseOnPriceAave | Specific.BoostOnPriceAave | Specific.CloseOnPriceWithMaximumGasPriceAave | Specific.DebtInFrontRepay | Specific.LeverageManagementCrvUSD | Specific.CloseOnPriceLiquityV2 | Specific.BoostOnPriceMorpho | Specific.BoostOnPriceLiquityV2 | Specific.PaybackLiquityV2 | Specific.CompoundV3LeverageManagementOnPrice | Specific.CompoundV3CloseOnPrice | Specific.AaveV3CloseOnPriceGeneric | Specific.SparkOnPrice;
202
213
  interface Automated {
203
214
  chainId: ChainId;
204
215
  positionId: string;
@@ -467,6 +467,16 @@ export const MAINNET_BUNDLES_INFO = {
467
467
  strategyId: Strategies.Identifiers.CloseOnPrice,
468
468
  protocol: PROTOCOLS.MorphoBlue,
469
469
  },
470
+ [Bundles.MainnetIds.SPARK_REPAY_ON_PRICE]: {
471
+ strategyOrBundleId: Bundles.MainnetIds.SPARK_REPAY_ON_PRICE,
472
+ strategyId: Strategies.Identifiers.RepayOnPrice,
473
+ protocol: PROTOCOLS.Spark,
474
+ },
475
+ [Bundles.MainnetIds.SPARK_BOOST_ON_PRICE]: {
476
+ strategyOrBundleId: Bundles.MainnetIds.SPARK_BOOST_ON_PRICE,
477
+ strategyId: Strategies.Identifiers.BoostOnPrice,
478
+ protocol: PROTOCOLS.Spark,
479
+ },
470
480
  };
471
481
  export const OPTIMISM_BUNDLES_INFO = {
472
482
  [Bundles.OptimismIds.AAVE_V3_REPAY]: {
@@ -142,6 +142,7 @@ describe('Feature: ethereumService.ts', () => {
142
142
  'address': '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
143
143
  'blockHash': '0xacb0213af63b4c17c436f084a96d1ac385641a59a9a4cf014ae3337cbe545aa7',
144
144
  'blockNumber': 5353002,
145
+ 'blockTimestamp': '0x624c1a5b',
145
146
  'event': 'Transfer',
146
147
  'id': 'log_f49645b8',
147
148
  'logIndex': 1,
@@ -187,6 +188,7 @@ describe('Feature: ethereumService.ts', () => {
187
188
  'address': '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
188
189
  'blockHash': '0xacb0213af63b4c17c436f084a96d1ac385641a59a9a4cf014ae3337cbe545aa7',
189
190
  'blockNumber': 5353002,
191
+ 'blockTimestamp': '0x624c1a5b',
190
192
  'event': 'Transfer',
191
193
  'id': 'log_f49645b8',
192
194
  'logIndex': 1,
@@ -584,6 +584,29 @@ function parseSparkLeverageManagement(position, parseData) {
584
584
  _position.strategy.strategyId = Strategies.IdOverrides.LeverageManagement;
585
585
  return _position;
586
586
  }
587
+ function parseSparkLeverageManagementOnPrice(position, parseData) {
588
+ const _position = cloneDeep(position);
589
+ const { subStruct } = parseData.subscriptionEventData;
590
+ const triggerData = triggerService.sparkQuotePriceTrigger.decode(subStruct.triggerData);
591
+ const subData = subDataService.sparkLeverageManagementOnPriceSubData.decode(subStruct.subData);
592
+ _position.strategyData.decoded.triggerData = triggerData;
593
+ _position.strategyData.decoded.subData = subData;
594
+ _position.positionId = getPositionId(_position.chainId, _position.protocol.id, _position.owner, subData.marketAddr);
595
+ _position.specific = {
596
+ // subData
597
+ collAsset: subData.collAsset,
598
+ collAssetId: subData.collAssetId,
599
+ debtAsset: subData.debtAsset,
600
+ debtAssetId: subData.debtAssetId,
601
+ ratio: subData.targetRatio,
602
+ // triggerData
603
+ baseToken: triggerData.baseTokenAddr,
604
+ quoteToken: triggerData.quoteTokenAddr,
605
+ price: triggerData.price,
606
+ ratioState: triggerData.ratioState,
607
+ };
608
+ return _position;
609
+ }
587
610
  function parseSparkCloseOnPrice(position, parseData) {
588
611
  const _position = cloneDeep(position);
589
612
  const { subStruct } = parseData.subscriptionEventData;
@@ -944,6 +967,8 @@ const parsingMethodsMapping = {
944
967
  [ProtocolIdentifiers.StrategiesAutomation.Spark]: {
945
968
  [Strategies.Identifiers.Repay]: parseSparkLeverageManagement,
946
969
  [Strategies.Identifiers.Boost]: parseSparkLeverageManagement,
970
+ [Strategies.Identifiers.RepayOnPrice]: parseSparkLeverageManagementOnPrice,
971
+ [Strategies.Identifiers.BoostOnPrice]: parseSparkLeverageManagementOnPrice,
947
972
  [Strategies.Identifiers.CloseOnPrice]: parseSparkCloseOnPrice,
948
973
  },
949
974
  [ProtocolIdentifiers.StrategiesAutomation.CrvUSD]: {
@@ -86,6 +86,19 @@ export declare const exchangeEncode: {
86
86
  };
87
87
  export declare const sparkEncode: {
88
88
  leverageManagement(triggerRepayRatio: number, triggerBoostRatio: number, targetBoostRatio: number, targetRepayRatio: number, boostEnabled: boolean): string;
89
+ leverageManagementOnPrice(strategyOrBundleId: number, isBundle: boolean | undefined, triggerData: {
90
+ baseTokenAddr: EthereumAddress;
91
+ quoteTokenAddr: EthereumAddress;
92
+ price: number;
93
+ ratioState: RatioState;
94
+ }, subData: {
95
+ collAsset: EthereumAddress;
96
+ collAssetId: number;
97
+ debtAsset: EthereumAddress;
98
+ debtAssetId: number;
99
+ marketAddr: EthereumAddress;
100
+ targetRatio: number;
101
+ }): (number | boolean | string[])[];
89
102
  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
103
  leverageManagementWithoutSubProxy(strategyOrBundleId: number, market: EthereumAddress, user: EthereumAddress, ratioState: RatioState, targetRatio: number, triggerRatio: number): (number | boolean | string[])[];
91
104
  };
@@ -243,6 +243,13 @@ export const sparkEncode = {
243
243
  subInput = subInput.concat(boostEnabled ? '01' : '00');
244
244
  return subInput;
245
245
  },
246
+ leverageManagementOnPrice(strategyOrBundleId, isBundle = true, triggerData, subData) {
247
+ const { collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio, } = subData;
248
+ const subDataEncoded = subDataService.sparkLeverageManagementOnPriceSubData.encode(collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, targetRatio);
249
+ const { baseTokenAddr, quoteTokenAddr, price, ratioState, } = triggerData;
250
+ const triggerDataEncoded = triggerService.sparkQuotePriceTrigger.encode(baseTokenAddr, quoteTokenAddr, price, ratioState);
251
+ return [strategyOrBundleId, isBundle, triggerDataEncoded, subDataEncoded];
252
+ },
246
253
  closeOnPriceGeneric(strategyOrBundleId, collAsset, collAssetId, debtAsset, debtAssetId, marketAddr, user, stopLossPrice = 0, stopLossType = CloseToAssetType.DEBT, takeProfitPrice = 0, takeProfitType = CloseToAssetType.COLLATERAL) {
247
254
  const isBundle = true;
248
255
  const closeType = getCloseStrategyType(stopLossPrice, stopLossType, takeProfitPrice, takeProfitType);