@cowprotocol/sdk-trading 0.2.1-beta.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,6 +75,7 @@ const adapter = new ViemAdapter({
75
75
  chain: sepolia,
76
76
  transport: http('YOUR_RPC_URL')
77
77
  }),
78
+ // You also can set `walletClient` instead of `signer` using `useWalletClient` from wagmi
78
79
  signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
79
80
  })
80
81
 
@@ -104,63 +105,6 @@ const orderId = await sdk.postSwapOrder(parameters)
104
105
  console.log('Order created, id: ', orderId)
105
106
  ```
106
107
 
107
- ### Usage with Umbrella SDK
108
-
109
- ```typescript
110
- import { CowSdk, SupportedChainId, OrderKind, TradeParameters } from '@cowprotocol/cow-sdk'
111
- import { ViemAdapter } from '@cowprotocol/sdk-viem-adapter'
112
- import { createPublicClient, http, privateKeyToAccount } from 'viem'
113
- import { sepolia } from 'viem/chains'
114
-
115
- const adapter = new ViemAdapter({
116
- provider: createPublicClient({
117
- chain: sepolia,
118
- transport: http('YOUR_RPC_URL')
119
- }),
120
- signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
121
- })
122
-
123
- // Initialize the unified SDK
124
- const sdk = new CowSdk({
125
- chainId: SupportedChainId.SEPOLIA,
126
- adapter,
127
- tradingOptions: {
128
- traderParams: {
129
- appCode: 'YOUR_APP_CODE',
130
- },
131
- options: {
132
- chainId: SupportedChainId.SEPOLIA,
133
- },
134
- },
135
- })
136
-
137
- // Define trade parameters
138
- const parameters: TradeParameters = {
139
- kind: OrderKind.BUY,
140
- sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
141
- sellTokenDecimals: 18,
142
- buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
143
- buyTokenDecimals: 18,
144
- amount: '120000000000000000',
145
- }
146
-
147
- // Post the order
148
- const orderId = await sdk.trading.postSwapOrder(parameters)
149
- console.log('Order created, id: ', orderId)
150
-
151
- // Or you can just initialize the SDK and import the trading class in another file:
152
- // you don't necessarily need to use the trading from inside of CowSdk:
153
- //...
154
- const sdk = new CowSdk({
155
- chainId: SupportedChainId.SEPOLIA,
156
- adapter,
157
- })
158
- // Other file:
159
- import { TradingSdk } from '@cowprotocol/cow-sdk'
160
- // parameters without passing the adapter. the adapter will be controlled by the umbrella
161
- const trading = new TradingSdk(...)
162
- ```
163
-
164
108
  ### Options
165
109
 
166
110
  For detailed information about trading steps you can enable the SDK logging:
@@ -176,6 +120,7 @@ const adapter = new ViemAdapter({
176
120
  chain: sepolia,
177
121
  transport: http('YOUR_RPC_URL')
178
122
  }),
123
+ // You also can set `walletClient` instead of `signer` using `useWalletClient` from wagmi
179
124
  signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
180
125
  })
181
126
 
@@ -224,6 +169,7 @@ const adapter = new ViemAdapter({
224
169
  chain: sepolia,
225
170
  transport: http('YOUR_RPC_URL')
226
171
  }),
172
+ // You also can set `walletClient` instead of `signer` using `useWalletClient` from wagmi
227
173
  signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
228
174
  })
229
175
 
@@ -281,6 +227,7 @@ const adapter = new ViemAdapter({
281
227
  chain: sepolia,
282
228
  transport: http('YOUR_RPC_URL')
283
229
  }),
230
+ // You also can set `walletClient` instead of `signer` using `useWalletClient` from wagmi
284
231
  signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
285
232
  })
286
233
 
@@ -334,6 +281,7 @@ const adapter = new ViemAdapter({
334
281
  chain: sepolia,
335
282
  transport: http('YOUR_RPC_URL')
336
283
  }),
284
+ // You also can set `walletClient` instead of `signer` using `useWalletClient` from wagmi
337
285
  signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
338
286
  })
339
287
 
package/dist/index.d.mts CHANGED
@@ -69,6 +69,16 @@ interface TraderParameters {
69
69
  type QuoterParameters = Omit<TraderParameters, 'signer'> & {
70
70
  account: AccountAddress;
71
71
  };
72
+ interface SlippageToleranceResponse {
73
+ slippageBps: number | null;
74
+ }
75
+ interface SlippageToleranceRequest {
76
+ chainId: SupportedChainId;
77
+ sellToken: OrderParameters['sellToken'];
78
+ buyToken: OrderParameters['buyToken'];
79
+ sellAmount?: bigint;
80
+ buyAmount?: bigint;
81
+ }
72
82
  /**
73
83
  * Trade type, assets, amounts, and optional parameters.
74
84
  */
@@ -108,6 +118,10 @@ interface SwapAdvancedSettings {
108
118
  appData?: AppDataParams;
109
119
  additionalParams?: PostTradeAdditionalParams;
110
120
  quoteSigner?: SignerLike;
121
+ /**
122
+ * An optional callback to use custom logic for slippage suggestion
123
+ */
124
+ getSlippageSuggestion?(request: SlippageToleranceRequest): Promise<SlippageToleranceResponse>;
111
125
  }
112
126
  interface LimitOrderAdvancedSettings {
113
127
  appData?: AppDataParams;
@@ -240,8 +254,6 @@ type WithPartialTraderParams<T> = T & Partial<TraderParameters>;
240
254
  interface TradingSdkOptions {
241
255
  enableLogging: boolean;
242
256
  orderBookApi: OrderBookApi;
243
- utmContent?: string;
244
- disableUtm?: boolean;
245
257
  }
246
258
  declare class TradingSdk {
247
259
  traderParams: Partial<TraderParameters>;
@@ -335,4 +347,4 @@ declare function getTradeParametersAfterQuote({ quoteParameters, sellToken, }: {
335
347
  sellToken: string;
336
348
  }): TradeParameters;
337
349
 
338
- export { type AppDataRootSchema, type BuildAppDataParams, type EthFlowOrderExistsCallback, type LimitOrderAdvancedSettings, type LimitOrderParameters, type LimitTradeParameters, type LimitTradeParametersFromQuote, ORDER_PRIMARY_TYPE, type OrderPostingResult, type OrderTypedData, type PostTradeAdditionalParams, type QuoteAndPost, type QuoteResults, type QuoteResultsSerialized, type QuoteResultsWithSigner, type QuoterParameters, type SigningStepManager, type SwapAdvancedSettings, type SwapParameters, type TradeBaseParameters, type TradeOptionalParameters, type TradeParameters, type TraderParameters, type TradingAppDataInfo, TradingSdk, type TradingSdkOptions, type TradingTransactionParams, type WithPartialTraderParams, buildAppData, calculateUniqueOrderId, generateAppDataFromDoc, getEthFlowContract, getEthFlowTransaction, getOrderToSign, getPartnerFeeBps, getPreSignTransaction, getQuote, getQuoteWithSigner, getTradeParametersAfterQuote, mapQuoteAmountsAndCosts, mergeAppDataDoc, postCoWProtocolTrade, postLimitOrder, postSellNativeCurrencyOrder, postSwapOrder, postSwapOrderFromQuote, suggestSlippageBps, swapParamsToLimitOrderParams };
350
+ export { type AppDataRootSchema, type BuildAppDataParams, type EthFlowOrderExistsCallback, type LimitOrderAdvancedSettings, type LimitOrderParameters, type LimitTradeParameters, type LimitTradeParametersFromQuote, ORDER_PRIMARY_TYPE, type OrderPostingResult, type OrderTypedData, type PostTradeAdditionalParams, type QuoteAndPost, type QuoteResults, type QuoteResultsSerialized, type QuoteResultsWithSigner, type QuoterParameters, type SigningStepManager, type SlippageToleranceRequest, type SlippageToleranceResponse, type SwapAdvancedSettings, type SwapParameters, type TradeBaseParameters, type TradeOptionalParameters, type TradeParameters, type TraderParameters, type TradingAppDataInfo, TradingSdk, type TradingSdkOptions, type TradingTransactionParams, type WithPartialTraderParams, buildAppData, calculateUniqueOrderId, generateAppDataFromDoc, getEthFlowContract, getEthFlowTransaction, getOrderToSign, getPartnerFeeBps, getPreSignTransaction, getQuote, getQuoteWithSigner, getTradeParametersAfterQuote, mapQuoteAmountsAndCosts, mergeAppDataDoc, postCoWProtocolTrade, postLimitOrder, postSellNativeCurrencyOrder, postSwapOrder, postSwapOrderFromQuote, suggestSlippageBps, swapParamsToLimitOrderParams };
package/dist/index.d.ts CHANGED
@@ -69,6 +69,16 @@ interface TraderParameters {
69
69
  type QuoterParameters = Omit<TraderParameters, 'signer'> & {
70
70
  account: AccountAddress;
71
71
  };
72
+ interface SlippageToleranceResponse {
73
+ slippageBps: number | null;
74
+ }
75
+ interface SlippageToleranceRequest {
76
+ chainId: SupportedChainId;
77
+ sellToken: OrderParameters['sellToken'];
78
+ buyToken: OrderParameters['buyToken'];
79
+ sellAmount?: bigint;
80
+ buyAmount?: bigint;
81
+ }
72
82
  /**
73
83
  * Trade type, assets, amounts, and optional parameters.
74
84
  */
@@ -108,6 +118,10 @@ interface SwapAdvancedSettings {
108
118
  appData?: AppDataParams;
109
119
  additionalParams?: PostTradeAdditionalParams;
110
120
  quoteSigner?: SignerLike;
121
+ /**
122
+ * An optional callback to use custom logic for slippage suggestion
123
+ */
124
+ getSlippageSuggestion?(request: SlippageToleranceRequest): Promise<SlippageToleranceResponse>;
111
125
  }
112
126
  interface LimitOrderAdvancedSettings {
113
127
  appData?: AppDataParams;
@@ -240,8 +254,6 @@ type WithPartialTraderParams<T> = T & Partial<TraderParameters>;
240
254
  interface TradingSdkOptions {
241
255
  enableLogging: boolean;
242
256
  orderBookApi: OrderBookApi;
243
- utmContent?: string;
244
- disableUtm?: boolean;
245
257
  }
246
258
  declare class TradingSdk {
247
259
  traderParams: Partial<TraderParameters>;
@@ -335,4 +347,4 @@ declare function getTradeParametersAfterQuote({ quoteParameters, sellToken, }: {
335
347
  sellToken: string;
336
348
  }): TradeParameters;
337
349
 
338
- export { type AppDataRootSchema, type BuildAppDataParams, type EthFlowOrderExistsCallback, type LimitOrderAdvancedSettings, type LimitOrderParameters, type LimitTradeParameters, type LimitTradeParametersFromQuote, ORDER_PRIMARY_TYPE, type OrderPostingResult, type OrderTypedData, type PostTradeAdditionalParams, type QuoteAndPost, type QuoteResults, type QuoteResultsSerialized, type QuoteResultsWithSigner, type QuoterParameters, type SigningStepManager, type SwapAdvancedSettings, type SwapParameters, type TradeBaseParameters, type TradeOptionalParameters, type TradeParameters, type TraderParameters, type TradingAppDataInfo, TradingSdk, type TradingSdkOptions, type TradingTransactionParams, type WithPartialTraderParams, buildAppData, calculateUniqueOrderId, generateAppDataFromDoc, getEthFlowContract, getEthFlowTransaction, getOrderToSign, getPartnerFeeBps, getPreSignTransaction, getQuote, getQuoteWithSigner, getTradeParametersAfterQuote, mapQuoteAmountsAndCosts, mergeAppDataDoc, postCoWProtocolTrade, postLimitOrder, postSellNativeCurrencyOrder, postSwapOrder, postSwapOrderFromQuote, suggestSlippageBps, swapParamsToLimitOrderParams };
350
+ export { type AppDataRootSchema, type BuildAppDataParams, type EthFlowOrderExistsCallback, type LimitOrderAdvancedSettings, type LimitOrderParameters, type LimitTradeParameters, type LimitTradeParametersFromQuote, ORDER_PRIMARY_TYPE, type OrderPostingResult, type OrderTypedData, type PostTradeAdditionalParams, type QuoteAndPost, type QuoteResults, type QuoteResultsSerialized, type QuoteResultsWithSigner, type QuoterParameters, type SigningStepManager, type SlippageToleranceRequest, type SlippageToleranceResponse, type SwapAdvancedSettings, type SwapParameters, type TradeBaseParameters, type TradeOptionalParameters, type TradeParameters, type TraderParameters, type TradingAppDataInfo, TradingSdk, type TradingSdkOptions, type TradingTransactionParams, type WithPartialTraderParams, buildAppData, calculateUniqueOrderId, generateAppDataFromDoc, getEthFlowContract, getEthFlowTransaction, getOrderToSign, getPartnerFeeBps, getPreSignTransaction, getQuote, getQuoteWithSigner, getTradeParametersAfterQuote, mapQuoteAmountsAndCosts, mergeAppDataDoc, postCoWProtocolTrade, postLimitOrder, postSellNativeCurrencyOrder, postSwapOrder, postSwapOrderFromQuote, suggestSlippageBps, swapParamsToLimitOrderParams };
package/dist/index.js CHANGED
@@ -63,12 +63,7 @@ var import_sdk_order_book = require("@cowprotocol/sdk-order-book");
63
63
  var import_sdk_config = require("@cowprotocol/sdk-config");
64
64
  var DEFAULT_QUOTE_VALIDITY = 60 * 30;
65
65
  var DEFAULT_SLIPPAGE_BPS = 50;
66
- var ETH_FLOW_DEFAULT_SLIPPAGE_BPS = {
67
- ...(0, import_sdk_config.mapSupportedNetworks)(DEFAULT_SLIPPAGE_BPS),
68
- // 0.5% by default for most chains
69
- [import_sdk_config.SupportedChainId.MAINNET]: 200
70
- // 2% for mainnet
71
- };
66
+ var ETH_FLOW_DEFAULT_SLIPPAGE_BPS = (0, import_sdk_config.mapSupportedNetworks)(DEFAULT_SLIPPAGE_BPS);
72
67
  var SIGN_SCHEME_MAP = {
73
68
  [import_sdk_order_book.EcdsaSigningScheme.EIP712]: import_sdk_order_book.SigningScheme.EIP712,
74
69
  [import_sdk_order_book.EcdsaSigningScheme.ETHSIGN]: import_sdk_order_book.SigningScheme.ETHSIGN
@@ -409,8 +404,8 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
409
404
  }
410
405
 
411
406
  // src/getQuote.ts
412
- var import_sdk_common9 = require("@cowprotocol/sdk-common");
413
- var import_sdk_order_book6 = require("@cowprotocol/sdk-order-book");
407
+ var import_sdk_common10 = require("@cowprotocol/sdk-common");
408
+ var import_sdk_order_book7 = require("@cowprotocol/sdk-order-book");
414
409
 
415
410
  // src/appDataUtils.ts
416
411
  var import_sdk_app_data = require("@cowprotocol/sdk-app-data");
@@ -549,12 +544,54 @@ function suggestSlippageBps(params) {
549
544
  slippage: totalSlippageBps
550
545
  });
551
546
  const slippageBps = (0, import_sdk_common8.percentageToBps)(slippagePercent);
552
- return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), getDefaultSlippageBps(trader.chainId, isEthFlow));
547
+ const lowerCap = isEthFlow ? ETH_FLOW_DEFAULT_SLIPPAGE_BPS[trader.chainId] : 0;
548
+ return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), lowerCap);
549
+ }
550
+
551
+ // src/resolveSlippageSuggestion.ts
552
+ var import_sdk_order_book6 = require("@cowprotocol/sdk-order-book");
553
+ var import_sdk_common9 = require("@cowprotocol/sdk-common");
554
+ async function resolveSlippageSuggestion(chainId, tradeParameters, trader, quote, isEthFlow, advancedSettings) {
555
+ const suggestSlippageParams = {
556
+ isEthFlow,
557
+ quote,
558
+ tradeParameters,
559
+ trader,
560
+ advancedSettings
561
+ };
562
+ const getSlippageSuggestion = advancedSettings?.getSlippageSuggestion;
563
+ const priceQuality = advancedSettings?.quoteRequest?.priceQuality ?? import_sdk_order_book6.PriceQuality.OPTIMAL;
564
+ const defaultSuggestion = suggestSlippageBps(suggestSlippageParams);
565
+ if (priceQuality === import_sdk_order_book6.PriceQuality.FAST || !getSlippageSuggestion) {
566
+ return { slippageBps: defaultSuggestion };
567
+ }
568
+ const amountsAndCosts = (0, import_sdk_order_book6.getQuoteAmountsAndCosts)({
569
+ orderParams: quote.quote,
570
+ slippagePercentBps: 0,
571
+ partnerFeeBps: getPartnerFeeBps(tradeParameters.partnerFee),
572
+ sellDecimals: tradeParameters.sellTokenDecimals,
573
+ buyDecimals: tradeParameters.buyTokenDecimals
574
+ });
575
+ try {
576
+ const suggestedSlippage = await getSlippageSuggestion({
577
+ chainId,
578
+ sellToken: tradeParameters.sellToken,
579
+ buyToken: tradeParameters.buyToken,
580
+ sellAmount: amountsAndCosts.afterSlippage.sellAmount,
581
+ buyAmount: amountsAndCosts.afterSlippage.buyAmount
582
+ });
583
+ return {
584
+ slippageBps: Math.max(suggestedSlippage.slippageBps ?? 0, defaultSuggestion)
585
+ };
586
+ } catch (e) {
587
+ (0, import_sdk_common9.log)(`getSlippageSuggestion() error: ${e.message || String(e)}`);
588
+ return { slippageBps: defaultSuggestion };
589
+ }
553
590
  }
554
591
 
555
592
  // src/getQuote.ts
556
593
  var ETH_FLOW_AUX_QUOTE_PARAMS = {
557
- signingScheme: import_sdk_order_book6.SigningScheme.EIP1271,
594
+ signingScheme: import_sdk_order_book7.SigningScheme.EIP1271,
558
595
  onchainOrder: true,
559
596
  // Ethflow orders are subsidized in the backend.
560
597
  // This means we can assume the verification gas costs are zero for the quote/fee estimation
@@ -574,13 +611,13 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
574
611
  slippageBps,
575
612
  env = "prod"
576
613
  } = tradeParameters;
577
- (0, import_sdk_common9.log)(
614
+ (0, import_sdk_common10.log)(
578
615
  `getQuote for: Swap ${amount} ${sellToken} for ${buyToken} on chain ${chainId} with ${slippageBps !== void 0 ? `${slippageBps} BPS` : "AUTO"} slippage`
579
616
  );
580
- const orderBookApi = _orderBookApi || new import_sdk_order_book6.OrderBookApi({ chainId, env });
617
+ const orderBookApi = _orderBookApi || new import_sdk_order_book7.OrderBookApi({ chainId, env });
581
618
  const receiver = tradeParameters.receiver || from;
582
619
  const isSell = kind === "sell";
583
- (0, import_sdk_common9.log)("Building app data...");
620
+ (0, import_sdk_common10.log)("Building app data...");
584
621
  const defaultSlippageBps = getDefaultSlippageBps(chainId, isEthFlow);
585
622
  const slippageBpsOrDefault = slippageBps ?? defaultSlippageBps;
586
623
  const buildAppDataParams = {
@@ -591,7 +628,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
591
628
  };
592
629
  const appDataInfo = await buildAppData(buildAppDataParams, advancedSettings?.appData);
593
630
  const { appDataKeccak256, fullAppData } = appDataInfo;
594
- (0, import_sdk_common9.log)(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
631
+ (0, import_sdk_common10.log)(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
595
632
  const quoteRequest = {
596
633
  from,
597
634
  sellToken,
@@ -600,31 +637,32 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
600
637
  validFor,
601
638
  appData: fullAppData,
602
639
  appDataHash: appDataKeccak256,
603
- priceQuality: import_sdk_order_book6.PriceQuality.OPTIMAL,
640
+ priceQuality: import_sdk_order_book7.PriceQuality.OPTIMAL,
604
641
  // Do not change this parameter because we rely on the fact that quote has id
605
- signingScheme: import_sdk_order_book6.SigningScheme.EIP712,
642
+ signingScheme: import_sdk_order_book7.SigningScheme.EIP712,
606
643
  ...isEthFlow ? ETH_FLOW_AUX_QUOTE_PARAMS : {},
607
- ...isSell ? { kind: import_sdk_order_book6.OrderQuoteSideKindSell.SELL, sellAmountBeforeFee: amount } : { kind: import_sdk_order_book6.OrderQuoteSideKindBuy.BUY, buyAmountAfterFee: amount },
644
+ ...isSell ? { kind: import_sdk_order_book7.OrderQuoteSideKindSell.SELL, sellAmountBeforeFee: amount } : { kind: import_sdk_order_book7.OrderQuoteSideKindBuy.BUY, buyAmountAfterFee: amount },
608
645
  ...advancedSettings?.quoteRequest
609
646
  };
610
- (0, import_sdk_common9.log)("Getting quote...");
647
+ (0, import_sdk_common10.log)("Getting quote...");
611
648
  const quote = await orderBookApi.getQuote(quoteRequest);
612
- const suggestedSlippageBps = suggestSlippageBps({
613
- isEthFlow,
614
- quote,
649
+ const { slippageBps: suggestedSlippageBps } = await resolveSlippageSuggestion(
650
+ chainId,
615
651
  tradeParameters,
616
652
  trader,
653
+ quote,
654
+ isEthFlow,
617
655
  advancedSettings
618
- });
656
+ );
619
657
  const commonResult = {
620
658
  isEthFlow,
621
659
  quote,
622
660
  orderBookApi,
623
- suggestedSlippageBps
661
+ suggestedSlippageBps: suggestedSlippageBps || defaultSlippageBps
624
662
  };
625
663
  if (slippageBps === void 0) {
626
- if (suggestedSlippageBps > defaultSlippageBps) {
627
- (0, import_sdk_common9.log)(
664
+ if (suggestedSlippageBps) {
665
+ (0, import_sdk_common10.log)(
628
666
  `Suggested slippage is greater than ${defaultSlippageBps} BPS (default), using the suggested slippage (${suggestedSlippageBps} BPS)`
629
667
  );
630
668
  const newAppDataInfo = await buildAppData(
@@ -634,7 +672,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
634
672
  },
635
673
  advancedSettings?.appData
636
674
  );
637
- (0, import_sdk_common9.log)(
675
+ (0, import_sdk_common10.log)(
638
676
  `App data with new suggested slippage: appDataKeccak256=${newAppDataInfo.appDataKeccak256} fullAppData=${newAppDataInfo.fullAppData}`
639
677
  );
640
678
  return {
@@ -644,9 +682,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
644
682
  slippageBps: suggestedSlippageBps
645
683
  };
646
684
  } else {
647
- (0, import_sdk_common9.log)(
648
- `Suggested slippage is only ${suggestedSlippageBps} BPS. Using the default slippage (${defaultSlippageBps} BPS)`
649
- );
685
+ (0, import_sdk_common10.log)(`No suggested slippage. Using the default slippage (${defaultSlippageBps} BPS)`);
650
686
  }
651
687
  }
652
688
  return {
@@ -661,7 +697,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
661
697
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
662
698
  const { partnerFee, sellTokenDecimals, buyTokenDecimals } = tradeParameters;
663
699
  const { chainId, account: from } = trader;
664
- const amountsAndCosts = (0, import_sdk_order_book6.getQuoteAmountsAndCosts)({
700
+ const amountsAndCosts = (0, import_sdk_order_book7.getQuoteAmountsAndCosts)({
665
701
  orderParams: quote.quote,
666
702
  slippagePercentBps: slippageBps,
667
703
  partnerFeeBps: getPartnerFeeBps(partnerFee),
@@ -688,7 +724,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
688
724
  };
689
725
  }
690
726
  async function getTrader(swapParameters) {
691
- const signer = (0, import_sdk_common9.getGlobalAdapter)().signerOrNull();
727
+ const signer = (0, import_sdk_common10.getGlobalAdapter)().signerOrNull();
692
728
  const account = swapParameters.owner || await signer?.getAddress();
693
729
  return {
694
730
  chainId: swapParameters.chainId,
@@ -697,7 +733,7 @@ async function getTrader(swapParameters) {
697
733
  };
698
734
  }
699
735
  async function getQuoteWithSigner(swapParameters, advancedSettings, orderBookApi) {
700
- const adapter = (0, import_sdk_common9.getGlobalAdapter)();
736
+ const adapter = (0, import_sdk_common10.getGlobalAdapter)();
701
737
  const signer = swapParameters.signer ? adapter.createSigner(swapParameters.signer) : adapter.signer;
702
738
  const trader = await getTrader(swapParameters);
703
739
  const result = await getQuote(swapParameters, trader, advancedSettings, orderBookApi);
@@ -754,8 +790,8 @@ async function postSwapOrderFromQuote({
754
790
  }
755
791
 
756
792
  // src/postLimitOrder.ts
757
- var import_sdk_order_book7 = require("@cowprotocol/sdk-order-book");
758
- var import_sdk_common10 = require("@cowprotocol/sdk-common");
793
+ var import_sdk_order_book8 = require("@cowprotocol/sdk-order-book");
794
+ var import_sdk_common11 = require("@cowprotocol/sdk-common");
759
795
  async function postLimitOrder(params, advancedSettings, _orderBookApi) {
760
796
  const appDataSlippage = advancedSettings?.appData?.metadata?.quote?.slippageBips;
761
797
  const partnerFeeOverride = advancedSettings?.appData?.metadata?.partnerFee;
@@ -772,9 +808,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
772
808
  params.env = "prod";
773
809
  }
774
810
  const { appCode, chainId, sellToken, buyToken, sellAmount, buyAmount, partnerFee } = params;
775
- (0, import_sdk_common10.log)(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
776
- const orderBookApi = _orderBookApi || new import_sdk_order_book7.OrderBookApi({ chainId, env: params.env });
777
- (0, import_sdk_common10.log)("Building app data...");
811
+ (0, import_sdk_common11.log)(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
812
+ const orderBookApi = _orderBookApi || new import_sdk_order_book8.OrderBookApi({ chainId, env: params.env });
813
+ (0, import_sdk_common11.log)("Building app data...");
778
814
  const appDataInfo = await buildAppData(
779
815
  {
780
816
  slippageBps: params.slippageBps,
@@ -789,9 +825,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
789
825
 
790
826
  // src/getPreSignTransaction.ts
791
827
  var import_sdk_config5 = require("@cowprotocol/sdk-config");
792
- var import_sdk_common11 = require("@cowprotocol/sdk-common");
828
+ var import_sdk_common12 = require("@cowprotocol/sdk-common");
793
829
  async function getPreSignTransaction(signer, chainId, account, orderId) {
794
- const contract = import_sdk_common11.ContractFactory.createSettlementContract(account, signer);
830
+ const contract = import_sdk_common12.ContractFactory.createSettlementContract(account, signer);
795
831
  const settlementContractAddress = import_sdk_config5.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId];
796
832
  const preSignatureCall = contract.interface.encodeFunctionData("setPreSignature", [orderId, true]);
797
833
  const gas = await contract.estimateGas.setPreSignature?.(orderId, true).catch(() => GAS_LIMIT_DEFAULT) || GAS_LIMIT_DEFAULT;
@@ -805,21 +841,29 @@ async function getPreSignTransaction(signer, chainId, account, orderId) {
805
841
  }
806
842
 
807
843
  // src/tradingSdk.ts
808
- var import_sdk_common12 = require("@cowprotocol/sdk-common");
809
844
  var import_sdk_common13 = require("@cowprotocol/sdk-common");
845
+ var import_sdk_common14 = require("@cowprotocol/sdk-common");
810
846
  var TradingSdk = class {
811
847
  constructor(traderParams = {}, options = {}, adapter) {
812
848
  this.traderParams = traderParams;
813
849
  this.options = options;
814
850
  if (options.enableLogging !== void 0) {
815
- (0, import_sdk_common12.enableLogging)(options.enableLogging);
851
+ (0, import_sdk_common13.enableLogging)(options.enableLogging);
816
852
  }
817
853
  if (adapter) {
818
- (0, import_sdk_common13.setGlobalAdapter)(adapter);
854
+ (0, import_sdk_common14.setGlobalAdapter)(adapter);
819
855
  }
820
856
  }
821
857
  setTraderParams(params) {
822
858
  this.traderParams = { ...this.traderParams, ...params };
859
+ if (this.options.orderBookApi) {
860
+ if (params.chainId) {
861
+ this.options.orderBookApi.context.chainId = params.chainId;
862
+ }
863
+ if (params.env) {
864
+ this.options.orderBookApi.context.env = params.env;
865
+ }
866
+ }
823
867
  return this;
824
868
  }
825
869
  async getQuote(params, advancedSettings) {
@@ -839,7 +883,7 @@ var TradingSdk = class {
839
883
  }),
840
884
  // It's important to get a fresh instance of the signer
841
885
  // Because quote might be called with another signer
842
- signer: (0, import_sdk_common12.getGlobalAdapter)().signer
886
+ signer: (0, import_sdk_common13.getGlobalAdapter)().signer
843
887
  }
844
888
  },
845
889
  advancedSettings2
@@ -900,7 +944,7 @@ var TradingSdk = class {
900
944
  );
901
945
  }
902
946
  async getPreSignTransaction(params) {
903
- const adapter = (0, import_sdk_common12.getGlobalAdapter)();
947
+ const adapter = (0, import_sdk_common13.getGlobalAdapter)();
904
948
  const traderParams = this.mergeParams(params);
905
949
  const signer = traderParams.signer ? adapter.createSigner(traderParams.signer) : adapter.signer;
906
950
  return getPreSignTransaction(signer, traderParams.chainId, params.account, params.orderId);
@@ -909,7 +953,7 @@ var TradingSdk = class {
909
953
  const { chainId, signer, appCode, env } = params;
910
954
  const traderParams = {
911
955
  chainId: chainId || this.traderParams.chainId,
912
- signer: signer || this.traderParams.signer,
956
+ signer: signer || this.traderParams.signer || (0, import_sdk_common13.getGlobalAdapter)().signer,
913
957
  appCode: appCode || this.traderParams.appCode,
914
958
  env: env || this.traderParams.env
915
959
  };
package/dist/index.mjs CHANGED
@@ -3,15 +3,10 @@ import { SigningScheme as SigningScheme3 } from "@cowprotocol/sdk-order-book";
3
3
 
4
4
  // src/consts.ts
5
5
  import { EcdsaSigningScheme, SigningScheme } from "@cowprotocol/sdk-order-book";
6
- import { mapSupportedNetworks, SupportedChainId } from "@cowprotocol/sdk-config";
6
+ import { mapSupportedNetworks } from "@cowprotocol/sdk-config";
7
7
  var DEFAULT_QUOTE_VALIDITY = 60 * 30;
8
8
  var DEFAULT_SLIPPAGE_BPS = 50;
9
- var ETH_FLOW_DEFAULT_SLIPPAGE_BPS = {
10
- ...mapSupportedNetworks(DEFAULT_SLIPPAGE_BPS),
11
- // 0.5% by default for most chains
12
- [SupportedChainId.MAINNET]: 200
13
- // 2% for mainnet
14
- };
9
+ var ETH_FLOW_DEFAULT_SLIPPAGE_BPS = mapSupportedNetworks(DEFAULT_SLIPPAGE_BPS);
15
10
  var SIGN_SCHEME_MAP = {
16
11
  [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,
17
12
  [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN
@@ -364,13 +359,13 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
364
359
  }
365
360
 
366
361
  // src/getQuote.ts
367
- import { getGlobalAdapter as getGlobalAdapter5, log as log3 } from "@cowprotocol/sdk-common";
362
+ import { getGlobalAdapter as getGlobalAdapter5, log as log4 } from "@cowprotocol/sdk-common";
368
363
  import {
369
- getQuoteAmountsAndCosts as getQuoteAmountsAndCosts2,
364
+ getQuoteAmountsAndCosts as getQuoteAmountsAndCosts3,
370
365
  OrderBookApi as OrderBookApi3,
371
366
  OrderQuoteSideKindBuy,
372
367
  OrderQuoteSideKindSell,
373
- PriceQuality,
368
+ PriceQuality as PriceQuality2,
374
369
  SigningScheme as SigningScheme4
375
370
  } from "@cowprotocol/sdk-order-book";
376
371
 
@@ -514,7 +509,49 @@ function suggestSlippageBps(params) {
514
509
  slippage: totalSlippageBps
515
510
  });
516
511
  const slippageBps = percentageToBps(slippagePercent);
517
- return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), getDefaultSlippageBps(trader.chainId, isEthFlow));
512
+ const lowerCap = isEthFlow ? ETH_FLOW_DEFAULT_SLIPPAGE_BPS[trader.chainId] : 0;
513
+ return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), lowerCap);
514
+ }
515
+
516
+ // src/resolveSlippageSuggestion.ts
517
+ import { getQuoteAmountsAndCosts as getQuoteAmountsAndCosts2, PriceQuality } from "@cowprotocol/sdk-order-book";
518
+ import { log as log3 } from "@cowprotocol/sdk-common";
519
+ async function resolveSlippageSuggestion(chainId, tradeParameters, trader, quote, isEthFlow, advancedSettings) {
520
+ const suggestSlippageParams = {
521
+ isEthFlow,
522
+ quote,
523
+ tradeParameters,
524
+ trader,
525
+ advancedSettings
526
+ };
527
+ const getSlippageSuggestion = advancedSettings?.getSlippageSuggestion;
528
+ const priceQuality = advancedSettings?.quoteRequest?.priceQuality ?? PriceQuality.OPTIMAL;
529
+ const defaultSuggestion = suggestSlippageBps(suggestSlippageParams);
530
+ if (priceQuality === PriceQuality.FAST || !getSlippageSuggestion) {
531
+ return { slippageBps: defaultSuggestion };
532
+ }
533
+ const amountsAndCosts = getQuoteAmountsAndCosts2({
534
+ orderParams: quote.quote,
535
+ slippagePercentBps: 0,
536
+ partnerFeeBps: getPartnerFeeBps(tradeParameters.partnerFee),
537
+ sellDecimals: tradeParameters.sellTokenDecimals,
538
+ buyDecimals: tradeParameters.buyTokenDecimals
539
+ });
540
+ try {
541
+ const suggestedSlippage = await getSlippageSuggestion({
542
+ chainId,
543
+ sellToken: tradeParameters.sellToken,
544
+ buyToken: tradeParameters.buyToken,
545
+ sellAmount: amountsAndCosts.afterSlippage.sellAmount,
546
+ buyAmount: amountsAndCosts.afterSlippage.buyAmount
547
+ });
548
+ return {
549
+ slippageBps: Math.max(suggestedSlippage.slippageBps ?? 0, defaultSuggestion)
550
+ };
551
+ } catch (e) {
552
+ log3(`getSlippageSuggestion() error: ${e.message || String(e)}`);
553
+ return { slippageBps: defaultSuggestion };
554
+ }
518
555
  }
519
556
 
520
557
  // src/getQuote.ts
@@ -539,13 +576,13 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
539
576
  slippageBps,
540
577
  env = "prod"
541
578
  } = tradeParameters;
542
- log3(
579
+ log4(
543
580
  `getQuote for: Swap ${amount} ${sellToken} for ${buyToken} on chain ${chainId} with ${slippageBps !== void 0 ? `${slippageBps} BPS` : "AUTO"} slippage`
544
581
  );
545
582
  const orderBookApi = _orderBookApi || new OrderBookApi3({ chainId, env });
546
583
  const receiver = tradeParameters.receiver || from;
547
584
  const isSell = kind === "sell";
548
- log3("Building app data...");
585
+ log4("Building app data...");
549
586
  const defaultSlippageBps = getDefaultSlippageBps(chainId, isEthFlow);
550
587
  const slippageBpsOrDefault = slippageBps ?? defaultSlippageBps;
551
588
  const buildAppDataParams = {
@@ -556,7 +593,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
556
593
  };
557
594
  const appDataInfo = await buildAppData(buildAppDataParams, advancedSettings?.appData);
558
595
  const { appDataKeccak256, fullAppData } = appDataInfo;
559
- log3(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
596
+ log4(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
560
597
  const quoteRequest = {
561
598
  from,
562
599
  sellToken,
@@ -565,31 +602,32 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
565
602
  validFor,
566
603
  appData: fullAppData,
567
604
  appDataHash: appDataKeccak256,
568
- priceQuality: PriceQuality.OPTIMAL,
605
+ priceQuality: PriceQuality2.OPTIMAL,
569
606
  // Do not change this parameter because we rely on the fact that quote has id
570
607
  signingScheme: SigningScheme4.EIP712,
571
608
  ...isEthFlow ? ETH_FLOW_AUX_QUOTE_PARAMS : {},
572
609
  ...isSell ? { kind: OrderQuoteSideKindSell.SELL, sellAmountBeforeFee: amount } : { kind: OrderQuoteSideKindBuy.BUY, buyAmountAfterFee: amount },
573
610
  ...advancedSettings?.quoteRequest
574
611
  };
575
- log3("Getting quote...");
612
+ log4("Getting quote...");
576
613
  const quote = await orderBookApi.getQuote(quoteRequest);
577
- const suggestedSlippageBps = suggestSlippageBps({
578
- isEthFlow,
579
- quote,
614
+ const { slippageBps: suggestedSlippageBps } = await resolveSlippageSuggestion(
615
+ chainId,
580
616
  tradeParameters,
581
617
  trader,
618
+ quote,
619
+ isEthFlow,
582
620
  advancedSettings
583
- });
621
+ );
584
622
  const commonResult = {
585
623
  isEthFlow,
586
624
  quote,
587
625
  orderBookApi,
588
- suggestedSlippageBps
626
+ suggestedSlippageBps: suggestedSlippageBps || defaultSlippageBps
589
627
  };
590
628
  if (slippageBps === void 0) {
591
- if (suggestedSlippageBps > defaultSlippageBps) {
592
- log3(
629
+ if (suggestedSlippageBps) {
630
+ log4(
593
631
  `Suggested slippage is greater than ${defaultSlippageBps} BPS (default), using the suggested slippage (${suggestedSlippageBps} BPS)`
594
632
  );
595
633
  const newAppDataInfo = await buildAppData(
@@ -599,7 +637,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
599
637
  },
600
638
  advancedSettings?.appData
601
639
  );
602
- log3(
640
+ log4(
603
641
  `App data with new suggested slippage: appDataKeccak256=${newAppDataInfo.appDataKeccak256} fullAppData=${newAppDataInfo.fullAppData}`
604
642
  );
605
643
  return {
@@ -609,9 +647,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
609
647
  slippageBps: suggestedSlippageBps
610
648
  };
611
649
  } else {
612
- log3(
613
- `Suggested slippage is only ${suggestedSlippageBps} BPS. Using the default slippage (${defaultSlippageBps} BPS)`
614
- );
650
+ log4(`No suggested slippage. Using the default slippage (${defaultSlippageBps} BPS)`);
615
651
  }
616
652
  }
617
653
  return {
@@ -626,7 +662,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
626
662
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
627
663
  const { partnerFee, sellTokenDecimals, buyTokenDecimals } = tradeParameters;
628
664
  const { chainId, account: from } = trader;
629
- const amountsAndCosts = getQuoteAmountsAndCosts2({
665
+ const amountsAndCosts = getQuoteAmountsAndCosts3({
630
666
  orderParams: quote.quote,
631
667
  slippagePercentBps: slippageBps,
632
668
  partnerFeeBps: getPartnerFeeBps(partnerFee),
@@ -720,7 +756,7 @@ async function postSwapOrderFromQuote({
720
756
 
721
757
  // src/postLimitOrder.ts
722
758
  import { OrderBookApi as OrderBookApi4 } from "@cowprotocol/sdk-order-book";
723
- import { log as log4 } from "@cowprotocol/sdk-common";
759
+ import { log as log5 } from "@cowprotocol/sdk-common";
724
760
  async function postLimitOrder(params, advancedSettings, _orderBookApi) {
725
761
  const appDataSlippage = advancedSettings?.appData?.metadata?.quote?.slippageBips;
726
762
  const partnerFeeOverride = advancedSettings?.appData?.metadata?.partnerFee;
@@ -737,9 +773,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
737
773
  params.env = "prod";
738
774
  }
739
775
  const { appCode, chainId, sellToken, buyToken, sellAmount, buyAmount, partnerFee } = params;
740
- log4(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
776
+ log5(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
741
777
  const orderBookApi = _orderBookApi || new OrderBookApi4({ chainId, env: params.env });
742
- log4("Building app data...");
778
+ log5("Building app data...");
743
779
  const appDataInfo = await buildAppData(
744
780
  {
745
781
  slippageBps: params.slippageBps,
@@ -785,6 +821,14 @@ var TradingSdk = class {
785
821
  }
786
822
  setTraderParams(params) {
787
823
  this.traderParams = { ...this.traderParams, ...params };
824
+ if (this.options.orderBookApi) {
825
+ if (params.chainId) {
826
+ this.options.orderBookApi.context.chainId = params.chainId;
827
+ }
828
+ if (params.env) {
829
+ this.options.orderBookApi.context.env = params.env;
830
+ }
831
+ }
788
832
  return this;
789
833
  }
790
834
  async getQuote(params, advancedSettings) {
@@ -874,7 +918,7 @@ var TradingSdk = class {
874
918
  const { chainId, signer, appCode, env } = params;
875
919
  const traderParams = {
876
920
  chainId: chainId || this.traderParams.chainId,
877
- signer: signer || this.traderParams.signer,
921
+ signer: signer || this.traderParams.signer || getGlobalAdapter6().signer,
878
922
  appCode: appCode || this.traderParams.appCode,
879
923
  env: env || this.traderParams.env
880
924
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/sdk-trading",
3
- "version": "0.2.1-beta.0",
3
+ "version": "0.2.1",
4
4
  "description": "CowProtocol trading",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -13,22 +13,7 @@
13
13
  "publishConfig": {
14
14
  "access": "public"
15
15
  },
16
- "scripts": {
17
- "build": "tsup src/index.ts --format esm,cjs --dts",
18
- "lint": "eslint src/**/*.ts",
19
- "test": "jest",
20
- "test:watch": "jest --watch",
21
- "test:coverage": "jest --coverage --json --outputFile=jest.results.json && npx coveralls < ./coverage/lcov.info",
22
- "test:coverage:html": "jest --silent=false --coverage --coverageReporters html",
23
- "typecheck": "tsc --noEmit",
24
- "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
25
- "prepublishOnly": "npm run build"
26
- },
27
16
  "devDependencies": {
28
- "@cow-sdk/typescript-config": "workspace:*",
29
- "@cowprotocol/sdk-ethers-v5-adapter": "workspace:*",
30
- "@cowprotocol/sdk-ethers-v6-adapter": "workspace:*",
31
- "@cowprotocol/sdk-viem-adapter": "workspace:*",
32
17
  "@ethersproject/constants": "^5.7.0",
33
18
  "@types/jest": "^29.5.12",
34
19
  "@types/node": "^20.17.31",
@@ -42,15 +27,29 @@
42
27
  "ethers-v6": "npm:ethers@^6.13.7",
43
28
  "viem": "^2.28.4",
44
29
  "ts-jest": "^29.0.0",
45
- "tsx": "^4.19.4"
30
+ "tsx": "^4.19.4",
31
+ "@cow-sdk/typescript-config": "0.0.0-beta.0",
32
+ "@cowprotocol/sdk-ethers-v5-adapter": "0.1.1",
33
+ "@cowprotocol/sdk-ethers-v6-adapter": "0.1.1",
34
+ "@cowprotocol/sdk-viem-adapter": "0.1.1"
46
35
  },
47
36
  "dependencies": {
48
- "@cowprotocol/sdk-common": "workspace:*",
49
- "@cowprotocol/sdk-config": "workspace:*",
50
- "@cowprotocol/sdk-app-data": "workspace:*",
51
- "@cowprotocol/sdk-order-book": "workspace:*",
52
- "@cowprotocol/sdk-order-signing": "workspace:*",
53
- "@cowprotocol/sdk-contracts-ts": "workspace:*",
54
- "deepmerge": "^4.3.1"
37
+ "deepmerge": "^4.3.1",
38
+ "@cowprotocol/sdk-common": "0.2.0",
39
+ "@cowprotocol/sdk-config": "0.1.0",
40
+ "@cowprotocol/sdk-order-signing": "0.1.4",
41
+ "@cowprotocol/sdk-app-data": "4.0.1",
42
+ "@cowprotocol/sdk-order-book": "0.1.1",
43
+ "@cowprotocol/sdk-contracts-ts": "0.3.0"
44
+ },
45
+ "scripts": {
46
+ "build": "tsup src/index.ts --format esm,cjs --dts",
47
+ "lint": "eslint src/**/*.ts",
48
+ "test": "jest",
49
+ "test:watch": "jest --watch",
50
+ "test:coverage": "jest --coverage --json --outputFile=jest.results.json && npx coveralls < ./coverage/lcov.info",
51
+ "test:coverage:html": "jest --silent=false --coverage --coverageReporters html",
52
+ "typecheck": "tsc --noEmit",
53
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
55
54
  }
56
- }
55
+ }