@cowprotocol/sdk-trading 0.2.0-beta.0 → 0.2.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.
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");
@@ -552,9 +547,50 @@ function suggestSlippageBps(params) {
552
547
  return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), getDefaultSlippageBps(trader.chainId, isEthFlow));
553
548
  }
554
549
 
550
+ // src/resolveSlippageSuggestion.ts
551
+ var import_sdk_order_book6 = require("@cowprotocol/sdk-order-book");
552
+ var import_sdk_common9 = require("@cowprotocol/sdk-common");
553
+ async function resolveSlippageSuggestion(chainId, tradeParameters, trader, quote, isEthFlow, advancedSettings) {
554
+ const suggestSlippageParams = {
555
+ isEthFlow,
556
+ quote,
557
+ tradeParameters,
558
+ trader,
559
+ advancedSettings
560
+ };
561
+ const getSlippageSuggestion = advancedSettings?.getSlippageSuggestion;
562
+ const priceQuality = advancedSettings?.quoteRequest?.priceQuality ?? import_sdk_order_book6.PriceQuality.OPTIMAL;
563
+ const defaultSuggestion = suggestSlippageBps(suggestSlippageParams);
564
+ if (priceQuality === import_sdk_order_book6.PriceQuality.FAST || !getSlippageSuggestion) {
565
+ return { slippageBps: defaultSuggestion };
566
+ }
567
+ const amountsAndCosts = (0, import_sdk_order_book6.getQuoteAmountsAndCosts)({
568
+ orderParams: quote.quote,
569
+ slippagePercentBps: 0,
570
+ partnerFeeBps: getPartnerFeeBps(tradeParameters.partnerFee),
571
+ sellDecimals: tradeParameters.sellTokenDecimals,
572
+ buyDecimals: tradeParameters.buyTokenDecimals
573
+ });
574
+ try {
575
+ const suggestedSlippage = await getSlippageSuggestion({
576
+ chainId,
577
+ sellToken: tradeParameters.sellToken,
578
+ buyToken: tradeParameters.buyToken,
579
+ sellAmount: amountsAndCosts.afterSlippage.sellAmount,
580
+ buyAmount: amountsAndCosts.afterSlippage.buyAmount
581
+ });
582
+ return {
583
+ slippageBps: Math.max(suggestedSlippage.slippageBps ?? 0, defaultSuggestion)
584
+ };
585
+ } catch (e) {
586
+ (0, import_sdk_common9.log)(`getSlippageSuggestion() error: ${e.message || String(e)}`);
587
+ return { slippageBps: defaultSuggestion };
588
+ }
589
+ }
590
+
555
591
  // src/getQuote.ts
556
592
  var ETH_FLOW_AUX_QUOTE_PARAMS = {
557
- signingScheme: import_sdk_order_book6.SigningScheme.EIP1271,
593
+ signingScheme: import_sdk_order_book7.SigningScheme.EIP1271,
558
594
  onchainOrder: true,
559
595
  // Ethflow orders are subsidized in the backend.
560
596
  // This means we can assume the verification gas costs are zero for the quote/fee estimation
@@ -574,13 +610,13 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
574
610
  slippageBps,
575
611
  env = "prod"
576
612
  } = tradeParameters;
577
- (0, import_sdk_common9.log)(
613
+ (0, import_sdk_common10.log)(
578
614
  `getQuote for: Swap ${amount} ${sellToken} for ${buyToken} on chain ${chainId} with ${slippageBps !== void 0 ? `${slippageBps} BPS` : "AUTO"} slippage`
579
615
  );
580
- const orderBookApi = _orderBookApi || new import_sdk_order_book6.OrderBookApi({ chainId, env });
616
+ const orderBookApi = _orderBookApi || new import_sdk_order_book7.OrderBookApi({ chainId, env });
581
617
  const receiver = tradeParameters.receiver || from;
582
618
  const isSell = kind === "sell";
583
- (0, import_sdk_common9.log)("Building app data...");
619
+ (0, import_sdk_common10.log)("Building app data...");
584
620
  const defaultSlippageBps = getDefaultSlippageBps(chainId, isEthFlow);
585
621
  const slippageBpsOrDefault = slippageBps ?? defaultSlippageBps;
586
622
  const buildAppDataParams = {
@@ -591,7 +627,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
591
627
  };
592
628
  const appDataInfo = await buildAppData(buildAppDataParams, advancedSettings?.appData);
593
629
  const { appDataKeccak256, fullAppData } = appDataInfo;
594
- (0, import_sdk_common9.log)(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
630
+ (0, import_sdk_common10.log)(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
595
631
  const quoteRequest = {
596
632
  from,
597
633
  sellToken,
@@ -600,31 +636,32 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
600
636
  validFor,
601
637
  appData: fullAppData,
602
638
  appDataHash: appDataKeccak256,
603
- priceQuality: import_sdk_order_book6.PriceQuality.OPTIMAL,
639
+ priceQuality: import_sdk_order_book7.PriceQuality.OPTIMAL,
604
640
  // Do not change this parameter because we rely on the fact that quote has id
605
- signingScheme: import_sdk_order_book6.SigningScheme.EIP712,
641
+ signingScheme: import_sdk_order_book7.SigningScheme.EIP712,
606
642
  ...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 },
643
+ ...isSell ? { kind: import_sdk_order_book7.OrderQuoteSideKindSell.SELL, sellAmountBeforeFee: amount } : { kind: import_sdk_order_book7.OrderQuoteSideKindBuy.BUY, buyAmountAfterFee: amount },
608
644
  ...advancedSettings?.quoteRequest
609
645
  };
610
- (0, import_sdk_common9.log)("Getting quote...");
646
+ (0, import_sdk_common10.log)("Getting quote...");
611
647
  const quote = await orderBookApi.getQuote(quoteRequest);
612
- const suggestedSlippageBps = suggestSlippageBps({
613
- isEthFlow,
614
- quote,
648
+ const { slippageBps: suggestedSlippageBps } = await resolveSlippageSuggestion(
649
+ chainId,
615
650
  tradeParameters,
616
651
  trader,
652
+ quote,
653
+ isEthFlow,
617
654
  advancedSettings
618
- });
655
+ );
619
656
  const commonResult = {
620
657
  isEthFlow,
621
658
  quote,
622
659
  orderBookApi,
623
- suggestedSlippageBps
660
+ suggestedSlippageBps: suggestedSlippageBps || defaultSlippageBps
624
661
  };
625
662
  if (slippageBps === void 0) {
626
- if (suggestedSlippageBps > defaultSlippageBps) {
627
- (0, import_sdk_common9.log)(
663
+ if (suggestedSlippageBps) {
664
+ (0, import_sdk_common10.log)(
628
665
  `Suggested slippage is greater than ${defaultSlippageBps} BPS (default), using the suggested slippage (${suggestedSlippageBps} BPS)`
629
666
  );
630
667
  const newAppDataInfo = await buildAppData(
@@ -634,7 +671,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
634
671
  },
635
672
  advancedSettings?.appData
636
673
  );
637
- (0, import_sdk_common9.log)(
674
+ (0, import_sdk_common10.log)(
638
675
  `App data with new suggested slippage: appDataKeccak256=${newAppDataInfo.appDataKeccak256} fullAppData=${newAppDataInfo.fullAppData}`
639
676
  );
640
677
  return {
@@ -644,9 +681,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
644
681
  slippageBps: suggestedSlippageBps
645
682
  };
646
683
  } else {
647
- (0, import_sdk_common9.log)(
648
- `Suggested slippage is only ${suggestedSlippageBps} BPS. Using the default slippage (${defaultSlippageBps} BPS)`
649
- );
684
+ (0, import_sdk_common10.log)(`No suggested slippage. Using the default slippage (${defaultSlippageBps} BPS)`);
650
685
  }
651
686
  }
652
687
  return {
@@ -661,7 +696,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
661
696
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
662
697
  const { partnerFee, sellTokenDecimals, buyTokenDecimals } = tradeParameters;
663
698
  const { chainId, account: from } = trader;
664
- const amountsAndCosts = (0, import_sdk_order_book6.getQuoteAmountsAndCosts)({
699
+ const amountsAndCosts = (0, import_sdk_order_book7.getQuoteAmountsAndCosts)({
665
700
  orderParams: quote.quote,
666
701
  slippagePercentBps: slippageBps,
667
702
  partnerFeeBps: getPartnerFeeBps(partnerFee),
@@ -688,7 +723,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
688
723
  };
689
724
  }
690
725
  async function getTrader(swapParameters) {
691
- const signer = (0, import_sdk_common9.getGlobalAdapter)().signerOrNull();
726
+ const signer = (0, import_sdk_common10.getGlobalAdapter)().signerOrNull();
692
727
  const account = swapParameters.owner || await signer?.getAddress();
693
728
  return {
694
729
  chainId: swapParameters.chainId,
@@ -697,7 +732,7 @@ async function getTrader(swapParameters) {
697
732
  };
698
733
  }
699
734
  async function getQuoteWithSigner(swapParameters, advancedSettings, orderBookApi) {
700
- const adapter = (0, import_sdk_common9.getGlobalAdapter)();
735
+ const adapter = (0, import_sdk_common10.getGlobalAdapter)();
701
736
  const signer = swapParameters.signer ? adapter.createSigner(swapParameters.signer) : adapter.signer;
702
737
  const trader = await getTrader(swapParameters);
703
738
  const result = await getQuote(swapParameters, trader, advancedSettings, orderBookApi);
@@ -754,8 +789,8 @@ async function postSwapOrderFromQuote({
754
789
  }
755
790
 
756
791
  // src/postLimitOrder.ts
757
- var import_sdk_order_book7 = require("@cowprotocol/sdk-order-book");
758
- var import_sdk_common10 = require("@cowprotocol/sdk-common");
792
+ var import_sdk_order_book8 = require("@cowprotocol/sdk-order-book");
793
+ var import_sdk_common11 = require("@cowprotocol/sdk-common");
759
794
  async function postLimitOrder(params, advancedSettings, _orderBookApi) {
760
795
  const appDataSlippage = advancedSettings?.appData?.metadata?.quote?.slippageBips;
761
796
  const partnerFeeOverride = advancedSettings?.appData?.metadata?.partnerFee;
@@ -772,9 +807,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
772
807
  params.env = "prod";
773
808
  }
774
809
  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...");
810
+ (0, import_sdk_common11.log)(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
811
+ const orderBookApi = _orderBookApi || new import_sdk_order_book8.OrderBookApi({ chainId, env: params.env });
812
+ (0, import_sdk_common11.log)("Building app data...");
778
813
  const appDataInfo = await buildAppData(
779
814
  {
780
815
  slippageBps: params.slippageBps,
@@ -789,9 +824,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
789
824
 
790
825
  // src/getPreSignTransaction.ts
791
826
  var import_sdk_config5 = require("@cowprotocol/sdk-config");
792
- var import_sdk_common11 = require("@cowprotocol/sdk-common");
827
+ var import_sdk_common12 = require("@cowprotocol/sdk-common");
793
828
  async function getPreSignTransaction(signer, chainId, account, orderId) {
794
- const contract = import_sdk_common11.ContractFactory.createSettlementContract(account, signer);
829
+ const contract = import_sdk_common12.ContractFactory.createSettlementContract(account, signer);
795
830
  const settlementContractAddress = import_sdk_config5.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId];
796
831
  const preSignatureCall = contract.interface.encodeFunctionData("setPreSignature", [orderId, true]);
797
832
  const gas = await contract.estimateGas.setPreSignature?.(orderId, true).catch(() => GAS_LIMIT_DEFAULT) || GAS_LIMIT_DEFAULT;
@@ -805,21 +840,29 @@ async function getPreSignTransaction(signer, chainId, account, orderId) {
805
840
  }
806
841
 
807
842
  // src/tradingSdk.ts
808
- var import_sdk_common12 = require("@cowprotocol/sdk-common");
809
843
  var import_sdk_common13 = require("@cowprotocol/sdk-common");
844
+ var import_sdk_common14 = require("@cowprotocol/sdk-common");
810
845
  var TradingSdk = class {
811
846
  constructor(traderParams = {}, options = {}, adapter) {
812
847
  this.traderParams = traderParams;
813
848
  this.options = options;
814
849
  if (options.enableLogging !== void 0) {
815
- (0, import_sdk_common12.enableLogging)(options.enableLogging);
850
+ (0, import_sdk_common13.enableLogging)(options.enableLogging);
816
851
  }
817
852
  if (adapter) {
818
- (0, import_sdk_common13.setGlobalAdapter)(adapter);
853
+ (0, import_sdk_common14.setGlobalAdapter)(adapter);
819
854
  }
820
855
  }
821
856
  setTraderParams(params) {
822
857
  this.traderParams = { ...this.traderParams, ...params };
858
+ if (this.options.orderBookApi) {
859
+ if (params.chainId) {
860
+ this.options.orderBookApi.context.chainId = params.chainId;
861
+ }
862
+ if (params.env) {
863
+ this.options.orderBookApi.context.env = params.env;
864
+ }
865
+ }
823
866
  return this;
824
867
  }
825
868
  async getQuote(params, advancedSettings) {
@@ -839,7 +882,7 @@ var TradingSdk = class {
839
882
  }),
840
883
  // It's important to get a fresh instance of the signer
841
884
  // Because quote might be called with another signer
842
- signer: (0, import_sdk_common12.getGlobalAdapter)().signer
885
+ signer: (0, import_sdk_common13.getGlobalAdapter)().signer
843
886
  }
844
887
  },
845
888
  advancedSettings2
@@ -900,7 +943,7 @@ var TradingSdk = class {
900
943
  );
901
944
  }
902
945
  async getPreSignTransaction(params) {
903
- const adapter = (0, import_sdk_common12.getGlobalAdapter)();
946
+ const adapter = (0, import_sdk_common13.getGlobalAdapter)();
904
947
  const traderParams = this.mergeParams(params);
905
948
  const signer = traderParams.signer ? adapter.createSigner(traderParams.signer) : adapter.signer;
906
949
  return getPreSignTransaction(signer, traderParams.chainId, params.account, params.orderId);
@@ -909,7 +952,7 @@ var TradingSdk = class {
909
952
  const { chainId, signer, appCode, env } = params;
910
953
  const traderParams = {
911
954
  chainId: chainId || this.traderParams.chainId,
912
- signer: signer || this.traderParams.signer,
955
+ signer: signer || this.traderParams.signer || (0, import_sdk_common13.getGlobalAdapter)().signer,
913
956
  appCode: appCode || this.traderParams.appCode,
914
957
  env: env || this.traderParams.env
915
958
  };
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
 
@@ -517,6 +512,47 @@ function suggestSlippageBps(params) {
517
512
  return Math.max(Math.min(slippageBps, MAX_SLIPPAGE_BPS), getDefaultSlippageBps(trader.chainId, isEthFlow));
518
513
  }
519
514
 
515
+ // src/resolveSlippageSuggestion.ts
516
+ import { getQuoteAmountsAndCosts as getQuoteAmountsAndCosts2, PriceQuality } from "@cowprotocol/sdk-order-book";
517
+ import { log as log3 } from "@cowprotocol/sdk-common";
518
+ async function resolveSlippageSuggestion(chainId, tradeParameters, trader, quote, isEthFlow, advancedSettings) {
519
+ const suggestSlippageParams = {
520
+ isEthFlow,
521
+ quote,
522
+ tradeParameters,
523
+ trader,
524
+ advancedSettings
525
+ };
526
+ const getSlippageSuggestion = advancedSettings?.getSlippageSuggestion;
527
+ const priceQuality = advancedSettings?.quoteRequest?.priceQuality ?? PriceQuality.OPTIMAL;
528
+ const defaultSuggestion = suggestSlippageBps(suggestSlippageParams);
529
+ if (priceQuality === PriceQuality.FAST || !getSlippageSuggestion) {
530
+ return { slippageBps: defaultSuggestion };
531
+ }
532
+ const amountsAndCosts = getQuoteAmountsAndCosts2({
533
+ orderParams: quote.quote,
534
+ slippagePercentBps: 0,
535
+ partnerFeeBps: getPartnerFeeBps(tradeParameters.partnerFee),
536
+ sellDecimals: tradeParameters.sellTokenDecimals,
537
+ buyDecimals: tradeParameters.buyTokenDecimals
538
+ });
539
+ try {
540
+ const suggestedSlippage = await getSlippageSuggestion({
541
+ chainId,
542
+ sellToken: tradeParameters.sellToken,
543
+ buyToken: tradeParameters.buyToken,
544
+ sellAmount: amountsAndCosts.afterSlippage.sellAmount,
545
+ buyAmount: amountsAndCosts.afterSlippage.buyAmount
546
+ });
547
+ return {
548
+ slippageBps: Math.max(suggestedSlippage.slippageBps ?? 0, defaultSuggestion)
549
+ };
550
+ } catch (e) {
551
+ log3(`getSlippageSuggestion() error: ${e.message || String(e)}`);
552
+ return { slippageBps: defaultSuggestion };
553
+ }
554
+ }
555
+
520
556
  // src/getQuote.ts
521
557
  var ETH_FLOW_AUX_QUOTE_PARAMS = {
522
558
  signingScheme: SigningScheme4.EIP1271,
@@ -539,13 +575,13 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
539
575
  slippageBps,
540
576
  env = "prod"
541
577
  } = tradeParameters;
542
- log3(
578
+ log4(
543
579
  `getQuote for: Swap ${amount} ${sellToken} for ${buyToken} on chain ${chainId} with ${slippageBps !== void 0 ? `${slippageBps} BPS` : "AUTO"} slippage`
544
580
  );
545
581
  const orderBookApi = _orderBookApi || new OrderBookApi3({ chainId, env });
546
582
  const receiver = tradeParameters.receiver || from;
547
583
  const isSell = kind === "sell";
548
- log3("Building app data...");
584
+ log4("Building app data...");
549
585
  const defaultSlippageBps = getDefaultSlippageBps(chainId, isEthFlow);
550
586
  const slippageBpsOrDefault = slippageBps ?? defaultSlippageBps;
551
587
  const buildAppDataParams = {
@@ -556,7 +592,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
556
592
  };
557
593
  const appDataInfo = await buildAppData(buildAppDataParams, advancedSettings?.appData);
558
594
  const { appDataKeccak256, fullAppData } = appDataInfo;
559
- log3(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
595
+ log4(`App data: appDataKeccak256=${appDataKeccak256} fullAppData=${fullAppData}`);
560
596
  const quoteRequest = {
561
597
  from,
562
598
  sellToken,
@@ -565,31 +601,32 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
565
601
  validFor,
566
602
  appData: fullAppData,
567
603
  appDataHash: appDataKeccak256,
568
- priceQuality: PriceQuality.OPTIMAL,
604
+ priceQuality: PriceQuality2.OPTIMAL,
569
605
  // Do not change this parameter because we rely on the fact that quote has id
570
606
  signingScheme: SigningScheme4.EIP712,
571
607
  ...isEthFlow ? ETH_FLOW_AUX_QUOTE_PARAMS : {},
572
608
  ...isSell ? { kind: OrderQuoteSideKindSell.SELL, sellAmountBeforeFee: amount } : { kind: OrderQuoteSideKindBuy.BUY, buyAmountAfterFee: amount },
573
609
  ...advancedSettings?.quoteRequest
574
610
  };
575
- log3("Getting quote...");
611
+ log4("Getting quote...");
576
612
  const quote = await orderBookApi.getQuote(quoteRequest);
577
- const suggestedSlippageBps = suggestSlippageBps({
578
- isEthFlow,
579
- quote,
613
+ const { slippageBps: suggestedSlippageBps } = await resolveSlippageSuggestion(
614
+ chainId,
580
615
  tradeParameters,
581
616
  trader,
617
+ quote,
618
+ isEthFlow,
582
619
  advancedSettings
583
- });
620
+ );
584
621
  const commonResult = {
585
622
  isEthFlow,
586
623
  quote,
587
624
  orderBookApi,
588
- suggestedSlippageBps
625
+ suggestedSlippageBps: suggestedSlippageBps || defaultSlippageBps
589
626
  };
590
627
  if (slippageBps === void 0) {
591
- if (suggestedSlippageBps > defaultSlippageBps) {
592
- log3(
628
+ if (suggestedSlippageBps) {
629
+ log4(
593
630
  `Suggested slippage is greater than ${defaultSlippageBps} BPS (default), using the suggested slippage (${suggestedSlippageBps} BPS)`
594
631
  );
595
632
  const newAppDataInfo = await buildAppData(
@@ -599,7 +636,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
599
636
  },
600
637
  advancedSettings?.appData
601
638
  );
602
- log3(
639
+ log4(
603
640
  `App data with new suggested slippage: appDataKeccak256=${newAppDataInfo.appDataKeccak256} fullAppData=${newAppDataInfo.fullAppData}`
604
641
  );
605
642
  return {
@@ -609,9 +646,7 @@ async function getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBoo
609
646
  slippageBps: suggestedSlippageBps
610
647
  };
611
648
  } else {
612
- log3(
613
- `Suggested slippage is only ${suggestedSlippageBps} BPS. Using the default slippage (${defaultSlippageBps} BPS)`
614
- );
649
+ log4(`No suggested slippage. Using the default slippage (${defaultSlippageBps} BPS)`);
615
650
  }
616
651
  }
617
652
  return {
@@ -626,7 +661,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
626
661
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
627
662
  const { partnerFee, sellTokenDecimals, buyTokenDecimals } = tradeParameters;
628
663
  const { chainId, account: from } = trader;
629
- const amountsAndCosts = getQuoteAmountsAndCosts2({
664
+ const amountsAndCosts = getQuoteAmountsAndCosts3({
630
665
  orderParams: quote.quote,
631
666
  slippagePercentBps: slippageBps,
632
667
  partnerFeeBps: getPartnerFeeBps(partnerFee),
@@ -720,7 +755,7 @@ async function postSwapOrderFromQuote({
720
755
 
721
756
  // src/postLimitOrder.ts
722
757
  import { OrderBookApi as OrderBookApi4 } from "@cowprotocol/sdk-order-book";
723
- import { log as log4 } from "@cowprotocol/sdk-common";
758
+ import { log as log5 } from "@cowprotocol/sdk-common";
724
759
  async function postLimitOrder(params, advancedSettings, _orderBookApi) {
725
760
  const appDataSlippage = advancedSettings?.appData?.metadata?.quote?.slippageBips;
726
761
  const partnerFeeOverride = advancedSettings?.appData?.metadata?.partnerFee;
@@ -737,9 +772,9 @@ async function postLimitOrder(params, advancedSettings, _orderBookApi) {
737
772
  params.env = "prod";
738
773
  }
739
774
  const { appCode, chainId, sellToken, buyToken, sellAmount, buyAmount, partnerFee } = params;
740
- log4(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
775
+ log5(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`);
741
776
  const orderBookApi = _orderBookApi || new OrderBookApi4({ chainId, env: params.env });
742
- log4("Building app data...");
777
+ log5("Building app data...");
743
778
  const appDataInfo = await buildAppData(
744
779
  {
745
780
  slippageBps: params.slippageBps,
@@ -785,6 +820,14 @@ var TradingSdk = class {
785
820
  }
786
821
  setTraderParams(params) {
787
822
  this.traderParams = { ...this.traderParams, ...params };
823
+ if (this.options.orderBookApi) {
824
+ if (params.chainId) {
825
+ this.options.orderBookApi.context.chainId = params.chainId;
826
+ }
827
+ if (params.env) {
828
+ this.options.orderBookApi.context.env = params.env;
829
+ }
830
+ }
788
831
  return this;
789
832
  }
790
833
  async getQuote(params, advancedSettings) {
@@ -874,7 +917,7 @@ var TradingSdk = class {
874
917
  const { chainId, signer, appCode, env } = params;
875
918
  const traderParams = {
876
919
  chainId: chainId || this.traderParams.chainId,
877
- signer: signer || this.traderParams.signer,
920
+ signer: signer || this.traderParams.signer || getGlobalAdapter6().signer,
878
921
  appCode: appCode || this.traderParams.appCode,
879
922
  env: env || this.traderParams.env
880
923
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/sdk-trading",
3
- "version": "0.2.0-beta.0",
3
+ "version": "0.2.0",
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-app-data": "4.0.1",
39
+ "@cowprotocol/sdk-config": "0.1.0",
40
+ "@cowprotocol/sdk-order-book": "0.1.1",
41
+ "@cowprotocol/sdk-order-signing": "0.1.4",
42
+ "@cowprotocol/sdk-common": "0.2.0",
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
+ }