@cowprotocol/sdk-trading 1.0.3 → 1.1.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
@@ -850,3 +850,137 @@ if (currentAllowance < requiredAmount) {
850
850
  console.log('Sufficient allowance already exists')
851
851
  }
852
852
  ```
853
+
854
+ ## Custom Contract Addresses
855
+
856
+ For advanced use cases such as testing, custom deployments, or chains where CoW Protocol contracts are deployed at non-standard addresses, you can override the contract addresses used by the SDK.
857
+
858
+ Both parameters accept an `AddressPerChain` object (`Record<SupportedChainId, Address>`), so they apply per-chain and persist across all operations when set in `traderParams`.
859
+
860
+ ### settlementContractOverride / ethFlowContractOverride
861
+
862
+ Overrides the address of the CoW Protocol Settlement contract. This affects:
863
+ - Order domain signing (EIP-712 `verifyingContract`)
864
+ - On-chain order cancellation via `onChainCancelOrder`
865
+ - Pre-sign transactions via `getPreSignTransaction`
866
+
867
+ ```typescript
868
+ import { SupportedChainId, OrderKind, TradeParameters, TradingSdk, COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS, ETH_FLOW_ADDRESSES } from '@cowprotocol/cow-sdk'
869
+ import { ViemAdapter } from '@cowprotocol/sdk-viem-adapter'
870
+ import { createPublicClient, http, privateKeyToAccount } from 'viem'
871
+ import { sepolia } from 'viem/chains'
872
+
873
+ const adapter = new ViemAdapter({
874
+ provider: createPublicClient({
875
+ chain: sepolia,
876
+ transport: http('YOUR_RPC_URL')
877
+ }),
878
+ signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`)
879
+ })
880
+
881
+ const sdk = new TradingSdk({
882
+ chainId: SupportedChainId.SEPOLIA,
883
+ appCode: '<YOUR_APP_CODE>',
884
+ // Override the settlement contract address for MAINNET
885
+ settlementContractOverride: {
886
+ ...COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS,
887
+ [SupportedChainId.MAINNET]: '0x<custom_settlement_contract>',
888
+ } as AddressPerChain,
889
+ // Override the eth-flow contract address for GNOSIS_CHAIN
890
+ ethFlowContractOverride: {
891
+ ...ETH_FLOW_ADDRESSES,
892
+ [SupportedChainId.GNOSIS_CHAIN]: '0x<custom_eth_flow_contract>',
893
+ } as AddressPerChain,
894
+ }, {}, adapter)
895
+
896
+ const parameters: TradeParameters = {
897
+ kind: OrderKind.BUY,
898
+ sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
899
+ sellTokenDecimals: 18,
900
+ buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
901
+ buyTokenDecimals: 18,
902
+ amount: '120000000000000000',
903
+ }
904
+
905
+ const { quoteResults, postSwapOrderFromQuote } = await sdk.getQuote(parameters)
906
+ const orderId = await postSwapOrderFromQuote()
907
+
908
+ console.log('Order created, id: ', orderId)
909
+ ```
910
+
911
+ You can also pass `settlementContractOverride` / `ethFlowContractOverride` per-call to override only for that operation:
912
+
913
+ ```typescript
914
+ const { quoteResults, postSwapOrderFromQuote } = await sdk.getQuote({
915
+ ...parameters,
916
+ settlementContractOverride: {
917
+ [SupportedChainId.MAINNET]: '0x<custom_settlement_contract>',
918
+ } as AddressPerChain,
919
+ })
920
+
921
+ // or
922
+
923
+ const { orderId } = await sdk.postSwapOrder({
924
+ ...parameters,
925
+ settlementContractOverride: {
926
+ [SupportedChainId.MAINNET]: '0x<custom_settlement_contract>',
927
+ } as AddressPerChain,
928
+ })
929
+ ```
930
+
931
+ ## Custom Order-Book API Endpoint
932
+
933
+ By default the SDK uses the public CoW Protocol API endpoints. You can point the SDK at a custom or self-hosted order-book by creating an `OrderBookApi` instance with custom `baseUrls` and passing it as the `orderBookApi` option.
934
+
935
+ This is useful for:
936
+ - Running a local order-book node during development
937
+ - Using a private/dedicated API deployment
938
+ - Connecting to a forked or testnet environment with a custom backend
939
+
940
+ ```typescript
941
+ import { SupportedChainId, TradingSdk, OrderKind, TradeParameters } from '@cowprotocol/sdk-trading'
942
+ import { OrderBookApi } from '@cowprotocol/sdk-order-book'
943
+ import { AddressPerChain } from '@cowprotocol/sdk-config'
944
+ import { ViemAdapter } from '@cowprotocol/sdk-viem-adapter'
945
+ import { createPublicClient, http, privateKeyToAccount } from 'viem'
946
+ import { mainnet } from 'viem/chains'
947
+
948
+ const adapter = new ViemAdapter({
949
+ provider: createPublicClient({ chain: mainnet, transport: http('YOUR_RPC_URL') }),
950
+ signer: privateKeyToAccount('YOUR_PRIVATE_KEY' as `0x${string}`),
951
+ })
952
+
953
+ // 1. Create an OrderBookApi instance with custom base URLs
954
+ const orderBookApi = new OrderBookApi({
955
+ chainId: SupportedChainId.MAINNET,
956
+ // Provide a base URL for each chain you intend to use
957
+ baseUrls: {
958
+ // ...
959
+ [SupportedChainId.MAINNET]: 'https://your-custom-orderbook.example.com/mainnet',
960
+ },
961
+ })
962
+
963
+ // 2. Pass it to TradingSdk via the options object
964
+ const sdk = new TradingSdk(
965
+ {
966
+ chainId: SupportedChainId.MAINNET,
967
+ appCode: '<YOUR_APP_CODE>',
968
+ },
969
+ {
970
+ orderBookApi, // All order-book requests will go to your custom endpoint
971
+ },
972
+ adapter,
973
+ )
974
+
975
+ const parameters: TradeParameters = {
976
+ kind: OrderKind.SELL,
977
+ sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
978
+ sellTokenDecimals: 18,
979
+ buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
980
+ buyTokenDecimals: 18,
981
+ amount: '100000000000000000',
982
+ }
983
+
984
+ const { orderId } = await sdk.postSwapOrder(parameters)
985
+ console.log('Order created via custom endpoint, id:', orderId)
986
+ ```
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { cowAppDataLatestScheme, AppDataParams, LatestAppDataDocVersion } from '@cowprotocol/sdk-app-data';
2
2
  import { OrderKind, OrderParameters, TokenAmount, SigningScheme, OrderQuoteRequest, QuoteAmountsAndCosts, OrderQuoteResponse, AppData, AppDataHash, Signature, OrderBookApi, EnrichedOrder } from '@cowprotocol/sdk-order-book';
3
- import { AccountAddress, AbstractSigner, Provider, SignerLike, Signer, AbstractProviderAdapter, EthFlowContract } from '@cowprotocol/sdk-common';
3
+ import { AccountAddress, AbstractSigner, Provider, SignerLike, Signer, AbstractProviderAdapter, Address, EthFlowContract } from '@cowprotocol/sdk-common';
4
4
  import { UnsignedOrder, ORDER_PRIMARY_TYPE } from '@cowprotocol/sdk-order-signing';
5
- import { CowEnv, SupportedChainId } from '@cowprotocol/sdk-config';
5
+ import { CowEnv, AddressPerChain, SupportedChainId, ProtocolOptions } from '@cowprotocol/sdk-config';
6
6
 
7
7
  /**
8
8
  * EIP-712 typed data domain.
@@ -46,6 +46,14 @@ interface TradeBaseParameters {
46
46
  */
47
47
  interface TradeOptionalParameters {
48
48
  env?: CowEnv;
49
+ /**
50
+ * Custom address of settlement contract
51
+ */
52
+ settlementContractOverride?: Partial<AddressPerChain>;
53
+ /**
54
+ * Custom address of sell native token contract
55
+ */
56
+ ethFlowContractOverride?: Partial<AddressPerChain>;
49
57
  partiallyFillable?: OrderParameters['partiallyFillable'];
50
58
  /**
51
59
  * Slippage in basis points.
@@ -69,6 +77,8 @@ interface TraderParameters {
69
77
  appCode: cowAppDataLatestScheme.AppCode;
70
78
  signer?: SignerLike;
71
79
  env?: CowEnv;
80
+ settlementContractOverride?: Partial<AddressPerChain>;
81
+ ethFlowContractOverride?: Partial<AddressPerChain>;
72
82
  }
73
83
  type QuoterParameters = Omit<TraderParameters, 'signer'> & {
74
84
  account: AccountAddress;
@@ -262,7 +272,7 @@ declare function getQuoteWithSigner(swapParameters: SwapParameters, advancedSett
262
272
 
263
273
  declare function postSellNativeCurrencyOrder(orderBookApi: OrderBookApi, appData: Pick<TradingAppDataInfo, 'fullAppData' | 'appDataKeccak256'>, _params: LimitTradeParametersFromQuote, additionalParams?: PostTradeAdditionalParams, paramSigner?: SignerLike): Promise<OrderPostingResult>;
264
274
 
265
- declare function getPreSignTransaction(signer: Signer, chainId: SupportedChainId, orderId: string): Promise<TradingTransactionParams>;
275
+ declare function getPreSignTransaction(signer: Signer, chainId: SupportedChainId, orderId: string, options?: ProtocolOptions): Promise<TradingTransactionParams>;
266
276
 
267
277
  type WithPartialTraderParams<T> = T & Partial<TraderParameters>;
268
278
  /**
@@ -371,6 +381,7 @@ declare class TradingSdk {
371
381
  getCowProtocolAllowance(params: WithPartialTraderParams<{
372
382
  tokenAddress: string;
373
383
  owner: string;
384
+ vaultRelayerAddress?: Address;
374
385
  }>): Promise<bigint>;
375
386
  /**
376
387
  * Approves the CoW Protocol Vault Relayer to spend a specified amount of an ERC-20 token.
@@ -394,6 +405,7 @@ declare class TradingSdk {
394
405
  approveCowProtocol(params: WithPartialTraderParams<{
395
406
  tokenAddress: string;
396
407
  amount: bigint;
408
+ vaultRelayerAddress?: Address;
397
409
  }>): Promise<string>;
398
410
  private resolveOrderBookApi;
399
411
  private mergeParams;
@@ -409,7 +421,7 @@ declare function getEthFlowTransaction(appDataKeccak256: string, _params: LimitT
409
421
  transaction: TradingTransactionParams;
410
422
  orderToSign: UnsignedOrder;
411
423
  }>;
412
- declare function getEthFlowContract(signer: Signer, chainId: SupportedChainId, env?: CowEnv): EthFlowContract;
424
+ declare function getEthFlowContract(signer: Signer, chainId: SupportedChainId, options?: ProtocolOptions): EthFlowContract;
413
425
 
414
426
  interface OrderToSignParams {
415
427
  chainId: SupportedChainId;
@@ -455,7 +467,7 @@ declare function buildAppData({ slippageBps, appCode, orderClass: orderClassName
455
467
  declare function generateAppDataFromDoc(doc: AppDataRootSchema): Promise<Pick<TradingAppDataInfo, 'fullAppData' | 'appDataKeccak256'>>;
456
468
  declare function mergeAppDataDoc(_doc: LatestAppDataDocVersion, appDataOverride: AppDataParams): Promise<TradingAppDataInfo>;
457
469
 
458
- declare function calculateUniqueOrderId(chainId: SupportedChainId, order: UnsignedOrder, checkEthFlowOrderExists?: EthFlowOrderExistsCallback, env?: CowEnv): Promise<string>;
470
+ declare function calculateUniqueOrderId(chainId: SupportedChainId, order: UnsignedOrder, checkEthFlowOrderExists?: EthFlowOrderExistsCallback, options?: ProtocolOptions): Promise<string>;
459
471
 
460
472
  declare function getPartnerFeeBps(partnerFee: cowAppDataLatestScheme.PartnerFee | undefined): number | undefined;
461
473
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { cowAppDataLatestScheme, AppDataParams, LatestAppDataDocVersion } from '@cowprotocol/sdk-app-data';
2
2
  import { OrderKind, OrderParameters, TokenAmount, SigningScheme, OrderQuoteRequest, QuoteAmountsAndCosts, OrderQuoteResponse, AppData, AppDataHash, Signature, OrderBookApi, EnrichedOrder } from '@cowprotocol/sdk-order-book';
3
- import { AccountAddress, AbstractSigner, Provider, SignerLike, Signer, AbstractProviderAdapter, EthFlowContract } from '@cowprotocol/sdk-common';
3
+ import { AccountAddress, AbstractSigner, Provider, SignerLike, Signer, AbstractProviderAdapter, Address, EthFlowContract } from '@cowprotocol/sdk-common';
4
4
  import { UnsignedOrder, ORDER_PRIMARY_TYPE } from '@cowprotocol/sdk-order-signing';
5
- import { CowEnv, SupportedChainId } from '@cowprotocol/sdk-config';
5
+ import { CowEnv, AddressPerChain, SupportedChainId, ProtocolOptions } from '@cowprotocol/sdk-config';
6
6
 
7
7
  /**
8
8
  * EIP-712 typed data domain.
@@ -46,6 +46,14 @@ interface TradeBaseParameters {
46
46
  */
47
47
  interface TradeOptionalParameters {
48
48
  env?: CowEnv;
49
+ /**
50
+ * Custom address of settlement contract
51
+ */
52
+ settlementContractOverride?: Partial<AddressPerChain>;
53
+ /**
54
+ * Custom address of sell native token contract
55
+ */
56
+ ethFlowContractOverride?: Partial<AddressPerChain>;
49
57
  partiallyFillable?: OrderParameters['partiallyFillable'];
50
58
  /**
51
59
  * Slippage in basis points.
@@ -69,6 +77,8 @@ interface TraderParameters {
69
77
  appCode: cowAppDataLatestScheme.AppCode;
70
78
  signer?: SignerLike;
71
79
  env?: CowEnv;
80
+ settlementContractOverride?: Partial<AddressPerChain>;
81
+ ethFlowContractOverride?: Partial<AddressPerChain>;
72
82
  }
73
83
  type QuoterParameters = Omit<TraderParameters, 'signer'> & {
74
84
  account: AccountAddress;
@@ -262,7 +272,7 @@ declare function getQuoteWithSigner(swapParameters: SwapParameters, advancedSett
262
272
 
263
273
  declare function postSellNativeCurrencyOrder(orderBookApi: OrderBookApi, appData: Pick<TradingAppDataInfo, 'fullAppData' | 'appDataKeccak256'>, _params: LimitTradeParametersFromQuote, additionalParams?: PostTradeAdditionalParams, paramSigner?: SignerLike): Promise<OrderPostingResult>;
264
274
 
265
- declare function getPreSignTransaction(signer: Signer, chainId: SupportedChainId, orderId: string): Promise<TradingTransactionParams>;
275
+ declare function getPreSignTransaction(signer: Signer, chainId: SupportedChainId, orderId: string, options?: ProtocolOptions): Promise<TradingTransactionParams>;
266
276
 
267
277
  type WithPartialTraderParams<T> = T & Partial<TraderParameters>;
268
278
  /**
@@ -371,6 +381,7 @@ declare class TradingSdk {
371
381
  getCowProtocolAllowance(params: WithPartialTraderParams<{
372
382
  tokenAddress: string;
373
383
  owner: string;
384
+ vaultRelayerAddress?: Address;
374
385
  }>): Promise<bigint>;
375
386
  /**
376
387
  * Approves the CoW Protocol Vault Relayer to spend a specified amount of an ERC-20 token.
@@ -394,6 +405,7 @@ declare class TradingSdk {
394
405
  approveCowProtocol(params: WithPartialTraderParams<{
395
406
  tokenAddress: string;
396
407
  amount: bigint;
408
+ vaultRelayerAddress?: Address;
397
409
  }>): Promise<string>;
398
410
  private resolveOrderBookApi;
399
411
  private mergeParams;
@@ -409,7 +421,7 @@ declare function getEthFlowTransaction(appDataKeccak256: string, _params: LimitT
409
421
  transaction: TradingTransactionParams;
410
422
  orderToSign: UnsignedOrder;
411
423
  }>;
412
- declare function getEthFlowContract(signer: Signer, chainId: SupportedChainId, env?: CowEnv): EthFlowContract;
424
+ declare function getEthFlowContract(signer: Signer, chainId: SupportedChainId, options?: ProtocolOptions): EthFlowContract;
413
425
 
414
426
  interface OrderToSignParams {
415
427
  chainId: SupportedChainId;
@@ -455,7 +467,7 @@ declare function buildAppData({ slippageBps, appCode, orderClass: orderClassName
455
467
  declare function generateAppDataFromDoc(doc: AppDataRootSchema): Promise<Pick<TradingAppDataInfo, 'fullAppData' | 'appDataKeccak256'>>;
456
468
  declare function mergeAppDataDoc(_doc: LatestAppDataDocVersion, appDataOverride: AppDataParams): Promise<TradingAppDataInfo>;
457
469
 
458
- declare function calculateUniqueOrderId(chainId: SupportedChainId, order: UnsignedOrder, checkEthFlowOrderExists?: EthFlowOrderExistsCallback, env?: CowEnv): Promise<string>;
470
+ declare function calculateUniqueOrderId(chainId: SupportedChainId, order: UnsignedOrder, checkEthFlowOrderExists?: EthFlowOrderExistsCallback, options?: ProtocolOptions): Promise<string>;
459
471
 
460
472
  declare function getPartnerFeeBps(partnerFee: cowAppDataLatestScheme.PartnerFee | undefined): number | undefined;
461
473
 
package/dist/index.js CHANGED
@@ -203,7 +203,8 @@ var import_sdk_order_book3 = require("@cowprotocol/sdk-order-book");
203
203
  // src/calculateUniqueOrderId.ts
204
204
  var import_sdk_order_signing = require("@cowprotocol/sdk-order-signing");
205
205
  var import_sdk_config2 = require("@cowprotocol/sdk-config");
206
- async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, env) {
206
+ async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, options) {
207
+ const { env, ethFlowContractOverride } = options ?? {};
207
208
  const { orderDigest, orderId } = await import_sdk_order_signing.OrderSigningUtils.generateOrderId(
208
209
  chainId,
209
210
  {
@@ -212,15 +213,21 @@ async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, e
212
213
  sellToken: import_sdk_config2.WRAPPED_NATIVE_CURRENCIES[chainId].address
213
214
  },
214
215
  {
215
- owner: env === "staging" ? import_sdk_config2.BARN_ETH_FLOW_ADDRESSES[chainId] : import_sdk_config2.ETH_FLOW_ADDRESSES[chainId]
216
- }
216
+ owner: ethFlowContractOverride?.[chainId] ?? (env === "staging" ? import_sdk_config2.BARN_ETH_FLOW_ADDRESSES[chainId] : import_sdk_config2.ETH_FLOW_ADDRESSES[chainId])
217
+ },
218
+ options
217
219
  );
218
220
  if (checkEthFlowOrderExists && await checkEthFlowOrderExists(orderId, orderDigest)) {
219
221
  console.error("ETH FLOW", "[calculateUniqueOrderId] \u274C Collision detected: " + orderId, {
220
222
  sellAmount: order.sellAmount,
221
223
  fee: order.feeAmount
222
224
  });
223
- return calculateUniqueOrderId(chainId, adjustAmounts(order), checkEthFlowOrderExists);
225
+ return calculateUniqueOrderId(
226
+ chainId,
227
+ adjustAmounts(order),
228
+ checkEthFlowOrderExists,
229
+ options
230
+ );
224
231
  }
225
232
  return orderId;
226
233
  }
@@ -312,7 +319,12 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
312
319
  slippageBps
313
320
  };
314
321
  const { quoteId } = params;
315
- const contract = getEthFlowContract(signer, chainId, params.env);
322
+ const protocolOptions = {
323
+ env: params.env,
324
+ settlementContractOverride: params.settlementContractOverride,
325
+ ethFlowContractOverride: params.ethFlowContractOverride
326
+ };
327
+ const contract = getEthFlowContract(signer, chainId, protocolOptions);
316
328
  const orderToSign = getOrderToSign(
317
329
  {
318
330
  chainId,
@@ -323,7 +335,7 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
323
335
  params,
324
336
  appDataKeccak256
325
337
  );
326
- const orderId = await calculateUniqueOrderId(chainId, orderToSign, checkEthFlowOrderExists, params.env);
338
+ const orderId = await calculateUniqueOrderId(chainId, orderToSign, checkEthFlowOrderExists, protocolOptions);
327
339
  const ethOrderParams = {
328
340
  buyToken: orderToSign.buyToken,
329
341
  receiver: orderToSign.receiver,
@@ -353,8 +365,9 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
353
365
  }
354
366
  };
355
367
  }
356
- function getEthFlowContract(signer, chainId, env) {
357
- const address = env === "staging" ? import_sdk_config4.BARN_ETH_FLOW_ADDRESSES[chainId] : import_sdk_config4.ETH_FLOW_ADDRESSES[chainId];
368
+ function getEthFlowContract(signer, chainId, options) {
369
+ const { env, ethFlowContractOverride } = options ?? {};
370
+ const address = ethFlowContractOverride?.[chainId] ?? (env === "staging" ? import_sdk_config4.BARN_ETH_FLOW_ADDRESSES[chainId] : import_sdk_config4.ETH_FLOW_ADDRESSES[chainId]);
358
371
  return import_sdk_common.ContractFactory.createEthFlowContract(address, signer);
359
372
  }
360
373
 
@@ -365,7 +378,11 @@ async function postSellNativeCurrencyOrder(orderBookApi, appData, _params, addit
365
378
  const { appDataKeccak256, fullAppData } = appData;
366
379
  const { orderId, transaction, orderToSign } = await getEthFlowTransaction(
367
380
  appDataKeccak256,
368
- _params,
381
+ {
382
+ ..._params,
383
+ env: _params.env ?? orderBookApi.context.env,
384
+ ethFlowContractOverride: _params.ethFlowContractOverride
385
+ },
369
386
  orderBookApi.context.chainId,
370
387
  additionalParams,
371
388
  signer
@@ -408,6 +425,8 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
408
425
  }
409
426
  const { quoteId = null, owner } = params;
410
427
  const { appDataKeccak256, fullAppData } = appData;
428
+ const env = params.env ?? orderBookApi.context.env;
429
+ const settlementContractOverride = params.settlementContractOverride;
411
430
  const chainId = orderBookApi.context.chainId;
412
431
  const from = owner || await signer.getAddress();
413
432
  const orderToSign = getOrderToSign(
@@ -429,7 +448,12 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
429
448
  signingScheme: _signingScheme
430
449
  };
431
450
  }
432
- const signingResult = await import_sdk_order_signing2.OrderSigningUtils.signOrder(orderToSign, chainId, signer);
451
+ const signingResult = await import_sdk_order_signing2.OrderSigningUtils.signOrder(
452
+ orderToSign,
453
+ chainId,
454
+ signer,
455
+ { env, settlementContractOverride }
456
+ );
433
457
  if (isEip1271) {
434
458
  return {
435
459
  signature: import_sdk_order_signing2.OrderSigningUtils.getEip1271Signature(orderToSign, signingResult.signature),
@@ -466,9 +490,14 @@ var import_deepmerge = __toESM(require("deepmerge"));
466
490
  // ../sdk/package.json
467
491
  var package_default = {
468
492
  name: "@cowprotocol/cow-sdk",
469
- version: "7.4.2",
493
+ version: "8.0.1",
470
494
  license: "(MIT OR Apache-2.0)",
471
495
  description: "CoW Protocol SDK - get quote, configure your order, and trade",
496
+ repository: {
497
+ type: "git",
498
+ url: "https://github.com/cowprotocol/cow-sdk.git",
499
+ directory: "packages/sdk"
500
+ },
472
501
  main: "./dist/index.js",
473
502
  module: "./dist/index.mjs",
474
503
  types: "./dist/index.d.ts",
@@ -542,11 +571,6 @@ var package_default = {
542
571
  "typescript",
543
572
  "subgraph"
544
573
  ],
545
- repository: {
546
- type: "git",
547
- url: "https://github.com/cowprotocol/cow-sdk.git",
548
- directory: "packages/sdk"
549
- },
550
574
  bugs: {
551
575
  url: "https://github.com/cowprotocol/cow-sdk/issues"
552
576
  },
@@ -618,8 +642,8 @@ var EIP712DomainTypes = [
618
642
  { name: "chainId", type: "uint256" },
619
643
  { name: "verifyingContract", type: "address" }
620
644
  ];
621
- async function getOrderTypedData(chainId, orderToSign) {
622
- const domain = await import_sdk_order_signing3.OrderSigningUtils.getDomain(chainId);
645
+ async function getOrderTypedData(chainId, orderToSign, options) {
646
+ const domain = await import_sdk_order_signing3.OrderSigningUtils.getDomain(chainId, options);
623
647
  return {
624
648
  domain,
625
649
  primaryType: import_sdk_order_signing3.ORDER_PRIMARY_TYPE,
@@ -871,6 +895,8 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
871
895
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
872
896
  const { partnerFee } = tradeParameters;
873
897
  const { chainId, account: from } = trader;
898
+ const env = _tradeParameters.env ?? trader.env;
899
+ const settlementContractOverride = _tradeParameters.settlementContractOverride ?? trader.settlementContractOverride;
874
900
  const amountsAndCosts = (0, import_sdk_order_book7.getQuoteAmountsAndCosts)({
875
901
  orderParams: quote.quote,
876
902
  slippagePercentBps: slippageBps,
@@ -888,7 +914,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
888
914
  swapParamsToLimitOrderParams(tradeParameters, quote),
889
915
  appDataInfo.appDataKeccak256
890
916
  );
891
- const orderTypedData = await getOrderTypedData(chainId, orderToSign);
917
+ const orderTypedData = await getOrderTypedData(chainId, orderToSign, { env, settlementContractOverride });
892
918
  return {
893
919
  result: {
894
920
  tradeParameters,
@@ -908,7 +934,8 @@ async function getTrader(swapParameters) {
908
934
  return {
909
935
  chainId: swapParameters.chainId,
910
936
  appCode: swapParameters.appCode,
911
- account
937
+ account,
938
+ settlementContractOverride: swapParameters.settlementContractOverride
912
939
  };
913
940
  }
914
941
  async function getQuoteWithSigner(swapParameters, advancedSettings, orderBookApi) {
@@ -1013,13 +1040,17 @@ async function postLimitOrder(_params, advancedSettings, _orderBookApi) {
1013
1040
  // src/getSettlementContract.ts
1014
1041
  var import_sdk_common13 = require("@cowprotocol/sdk-common");
1015
1042
  var import_sdk_config5 = require("@cowprotocol/sdk-config");
1016
- function getSettlementContract(chainId, signer) {
1017
- return import_sdk_common13.ContractFactory.createSettlementContract(import_sdk_config5.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId], signer);
1043
+ function getSettlementContract(chainId, signer, options) {
1044
+ const { env, settlementContractOverride } = options ?? {};
1045
+ return import_sdk_common13.ContractFactory.createSettlementContract(
1046
+ settlementContractOverride?.[chainId] ?? (env === "staging" ? import_sdk_config5.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS_STAGING[chainId] : import_sdk_config5.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]),
1047
+ signer
1048
+ );
1018
1049
  }
1019
1050
 
1020
1051
  // src/getPreSignTransaction.ts
1021
- async function getPreSignTransaction(signer, chainId, orderId) {
1022
- const contract = getSettlementContract(chainId, signer);
1052
+ async function getPreSignTransaction(signer, chainId, orderId, options) {
1053
+ const contract = getSettlementContract(chainId, signer, options);
1023
1054
  const preSignatureCall = contract.interface.encodeFunctionData("setPreSignature", [orderId, true]);
1024
1055
  const gas = await contract.estimateGas.setPreSignature?.(orderId, true).catch(() => GAS_LIMIT_DEFAULT) || GAS_LIMIT_DEFAULT;
1025
1056
  return {
@@ -1128,7 +1159,11 @@ var TradingSdk = class {
1128
1159
  return this;
1129
1160
  }
1130
1161
  async getQuote(params, advancedSettings) {
1131
- const quoteResults = await getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1162
+ const quoteResults = await getQuoteWithSigner(
1163
+ this.mergeParams(params),
1164
+ advancedSettings,
1165
+ this.resolveOrderBookApi(params)
1166
+ );
1132
1167
  return {
1133
1168
  quoteResults: quoteResults.result,
1134
1169
  postSwapOrderFromQuote: async (advancedSettings2, signingStepManager) => {
@@ -1197,19 +1232,21 @@ var TradingSdk = class {
1197
1232
  chainId: quoterParams.chainId,
1198
1233
  appCode: quoterParams.appCode,
1199
1234
  env: quoterParams.env,
1200
- account: quoterParams.owner
1235
+ account: quoterParams.owner,
1236
+ settlementContractOverride: quoterParams.settlementContractOverride,
1237
+ ethFlowContractOverride: quoterParams.ethFlowContractOverride
1201
1238
  };
1202
- const result = await getQuote(quoterParams, trader, advancedSettings, this.options.orderBookApi);
1239
+ const result = await getQuote(quoterParams, trader, advancedSettings, this.resolveOrderBookApi(params));
1203
1240
  return result.result;
1204
1241
  }
1205
1242
  async getQuoteResults(params, advancedSettings) {
1206
- return getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1243
+ return getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1207
1244
  }
1208
1245
  async postSwapOrder(params, advancedSettings) {
1209
- return postSwapOrder(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1246
+ return postSwapOrder(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1210
1247
  }
1211
1248
  async postLimitOrder(params, advancedSettings) {
1212
- return postLimitOrder(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1249
+ return postLimitOrder(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1213
1250
  }
1214
1251
  /**
1215
1252
  * Posts a sell order for native currency (e.g., ETH) using the EthFlow contract.
@@ -1234,7 +1271,11 @@ var TradingSdk = class {
1234
1271
  * ```
1235
1272
  */
1236
1273
  async postSellNativeCurrencyOrder(params, advancedSettings) {
1237
- const quoteResults = await getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1274
+ const quoteResults = await getQuoteWithSigner(
1275
+ this.mergeParams(params),
1276
+ advancedSettings,
1277
+ this.resolveOrderBookApi(params)
1278
+ );
1238
1279
  const { tradeParameters, quoteResponse } = quoteResults.result;
1239
1280
  return postSellNativeCurrencyOrder(
1240
1281
  quoteResults.orderBookApi,
@@ -1249,9 +1290,12 @@ var TradingSdk = class {
1249
1290
  );
1250
1291
  }
1251
1292
  async getPreSignTransaction(params) {
1252
- const traderParams = this.mergeParams(params);
1253
- const signer = resolveSigner(traderParams.signer);
1254
- return getPreSignTransaction(signer, traderParams.chainId, params.orderUid);
1293
+ const { chainId, env, settlementContractOverride, orderUid, signer: signerLike } = this.mergeParams(params);
1294
+ const signer = resolveSigner(signerLike);
1295
+ return getPreSignTransaction(signer, chainId, orderUid, {
1296
+ env,
1297
+ settlementContractOverride
1298
+ });
1255
1299
  }
1256
1300
  async getOrder(params) {
1257
1301
  const orderBookApi = this.resolveOrderBookApi(params);
@@ -1259,13 +1303,13 @@ var TradingSdk = class {
1259
1303
  }
1260
1304
  async offChainCancelOrder(params) {
1261
1305
  const orderBookApi = this.resolveOrderBookApi(params);
1262
- const signer = resolveSigner(params.signer);
1306
+ const { env, chainId, settlementContractOverride, signer: signerLike } = this.mergeParams(params);
1307
+ const signer = resolveSigner(signerLike);
1263
1308
  const { orderUid } = params;
1264
- const chainId = params.chainId || this.traderParams.chainId;
1265
- if (!chainId) {
1266
- throw new Error("Chain ID is missing in offChainCancelOrder() call");
1267
- }
1268
- const orderCancellationSigning = await import_sdk_order_signing4.OrderSigningUtils.signOrderCancellations([orderUid], chainId, signer);
1309
+ const orderCancellationSigning = await import_sdk_order_signing4.OrderSigningUtils.signOrderCancellations([orderUid], chainId, signer, {
1310
+ env,
1311
+ settlementContractOverride
1312
+ });
1269
1313
  await orderBookApi.sendSignedOrderCancellations({
1270
1314
  ...orderCancellationSigning,
1271
1315
  orderUids: [orderUid]
@@ -1273,14 +1317,11 @@ var TradingSdk = class {
1273
1317
  return true;
1274
1318
  }
1275
1319
  async onChainCancelOrder(params, _order) {
1276
- const chainId = params.chainId || this.traderParams.chainId;
1277
- if (!chainId) {
1278
- throw new Error("Chain ID is missing in offChainCancelOrder() call");
1279
- }
1320
+ const { env, chainId, settlementContractOverride, ethFlowContractOverride } = this.mergeParams(params);
1280
1321
  const order = _order ?? await this.getOrder(params);
1281
1322
  const isEthFlowOrder = !!order.onchainOrderData;
1282
1323
  const signer = params.signer ? (0, import_sdk_common14.getGlobalAdapter)().createSigner(params.signer) : (0, import_sdk_common14.getGlobalAdapter)().signer;
1283
- const { transaction } = await (isEthFlowOrder ? getEthFlowCancellation(getEthFlowContract(signer, chainId, params.env ?? this.traderParams.env), order) : getSettlementCancellation(getSettlementContract(chainId, signer), order));
1324
+ const { transaction } = await (isEthFlowOrder ? getEthFlowCancellation(getEthFlowContract(signer, chainId, { env, ethFlowContractOverride }), order) : getSettlementCancellation(getSettlementContract(chainId, signer, { env, settlementContractOverride }), order));
1284
1325
  const txReceipt = await signer.sendTransaction(transaction);
1285
1326
  return txReceipt.hash;
1286
1327
  }
@@ -1303,12 +1344,9 @@ var TradingSdk = class {
1303
1344
  * ```
1304
1345
  */
1305
1346
  async getCowProtocolAllowance(params) {
1306
- const chainId = params.chainId || this.traderParams.chainId;
1307
- if (!chainId) {
1308
- throw new Error("Chain ID is missing in getCowProtocolAllowance() call");
1309
- }
1347
+ const { env, chainId } = this.mergeParams(params);
1310
1348
  const adapter = (0, import_sdk_common14.getGlobalAdapter)();
1311
- const vaultRelayerAddress = import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId];
1349
+ const vaultRelayerAddress = params.vaultRelayerAddress ?? (env === "staging" ? import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS_STAGING[chainId] : import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId]);
1312
1350
  return await adapter.readContract({
1313
1351
  address: params.tokenAddress,
1314
1352
  abi: import_sdk_common14.ERC20_ALLOWANCE_ABI,
@@ -1336,13 +1374,10 @@ var TradingSdk = class {
1336
1374
  * ```
1337
1375
  */
1338
1376
  async approveCowProtocol(params) {
1339
- const chainId = params.chainId || this.traderParams.chainId;
1340
- if (!chainId) {
1341
- throw new Error("Chain ID is missing in approveCowProtocol() call");
1342
- }
1377
+ const { env, chainId, signer: signerLike } = this.mergeParams(params);
1343
1378
  const adapter = (0, import_sdk_common14.getGlobalAdapter)();
1344
- const signer = resolveSigner(params.signer);
1345
- const vaultRelayerAddress = import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId];
1379
+ const signer = resolveSigner(signerLike);
1380
+ const vaultRelayerAddress = params.vaultRelayerAddress ?? (env === "staging" ? import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS_STAGING[chainId] : import_sdk_config6.COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId]);
1346
1381
  const txParams = {
1347
1382
  to: params.tokenAddress,
1348
1383
  data: adapter.utils.encodeFunction(import_sdk_common14.ERC20_APPROVE_ABI, "approve", [
@@ -1355,19 +1390,22 @@ var TradingSdk = class {
1355
1390
  }
1356
1391
  resolveOrderBookApi(params) {
1357
1392
  const chainId = params.chainId ?? this.traderParams.chainId;
1358
- const env = params.env ?? this.traderParams.env ?? "prod";
1393
+ const env = params.env ?? this.traderParams.env ?? this.options.orderBookApi?.context?.env ?? "prod";
1359
1394
  if (!chainId) {
1360
1395
  throw new Error("Chain ID is missing in getOrder() call");
1361
1396
  }
1362
- return resolveOrderBookApi(chainId, env);
1397
+ return resolveOrderBookApi(chainId, env, this.options.orderBookApi);
1363
1398
  }
1364
1399
  mergeParams(params) {
1365
- const { chainId, signer, appCode, env } = params;
1400
+ const { chainId, signer, appCode, env, settlementContractOverride, ethFlowContractOverride } = params;
1401
+ const orderBookContext = this.options.orderBookApi?.context;
1366
1402
  const traderParams = {
1367
- chainId: chainId || this.traderParams.chainId,
1368
- signer: signer || this.traderParams.signer || (0, import_sdk_common14.getGlobalAdapter)().signer,
1369
- appCode: appCode || this.traderParams.appCode,
1370
- env: env || this.traderParams.env
1403
+ chainId: chainId ?? this.traderParams.chainId ?? orderBookContext?.chainId,
1404
+ signer: signer ?? this.traderParams.signer ?? (0, import_sdk_common14.getGlobalAdapter)().signer,
1405
+ appCode: appCode ?? this.traderParams.appCode,
1406
+ env: env ?? this.traderParams.env ?? orderBookContext?.env,
1407
+ settlementContractOverride: settlementContractOverride ?? this.traderParams.settlementContractOverride,
1408
+ ethFlowContractOverride: ethFlowContractOverride ?? this.traderParams.ethFlowContractOverride
1371
1409
  };
1372
1410
  assertTraderParams(traderParams);
1373
1411
  return {
@@ -1380,9 +1418,11 @@ var TradingSdk = class {
1380
1418
  * Used by quote-only operations that don't need signing capability.
1381
1419
  */
1382
1420
  mergeQuoterParams(params) {
1383
- const chainId = params.chainId || this.traderParams.chainId;
1384
- const appCode = params.appCode || this.traderParams.appCode;
1385
- const env = params.env || this.traderParams.env || "prod";
1421
+ const chainId = params.chainId ?? this.traderParams.chainId;
1422
+ const appCode = params.appCode ?? this.traderParams.appCode;
1423
+ const env = params.env ?? this.traderParams.env ?? this.options.orderBookApi?.context?.env ?? "prod";
1424
+ const settlementContractOverride = params.settlementContractOverride ?? this.traderParams.settlementContractOverride;
1425
+ const ethFlowContractOverride = params.ethFlowContractOverride ?? this.traderParams.ethFlowContractOverride;
1386
1426
  if (!chainId) {
1387
1427
  throw new Error("Missing quoter parameters: chainId");
1388
1428
  }
@@ -1393,7 +1433,9 @@ var TradingSdk = class {
1393
1433
  ...params,
1394
1434
  chainId,
1395
1435
  appCode,
1396
- env
1436
+ env,
1437
+ settlementContractOverride,
1438
+ ethFlowContractOverride
1397
1439
  };
1398
1440
  }
1399
1441
  };
package/dist/index.mjs CHANGED
@@ -154,7 +154,8 @@ import {
154
154
  MAX_VALID_TO_EPOCH,
155
155
  WRAPPED_NATIVE_CURRENCIES
156
156
  } from "@cowprotocol/sdk-config";
157
- async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, env) {
157
+ async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, options) {
158
+ const { env, ethFlowContractOverride } = options ?? {};
158
159
  const { orderDigest, orderId } = await OrderSigningUtils.generateOrderId(
159
160
  chainId,
160
161
  {
@@ -163,15 +164,21 @@ async function calculateUniqueOrderId(chainId, order, checkEthFlowOrderExists, e
163
164
  sellToken: WRAPPED_NATIVE_CURRENCIES[chainId].address
164
165
  },
165
166
  {
166
- owner: env === "staging" ? BARN_ETH_FLOW_ADDRESSES[chainId] : ETH_FLOW_ADDRESSES[chainId]
167
- }
167
+ owner: ethFlowContractOverride?.[chainId] ?? (env === "staging" ? BARN_ETH_FLOW_ADDRESSES[chainId] : ETH_FLOW_ADDRESSES[chainId])
168
+ },
169
+ options
168
170
  );
169
171
  if (checkEthFlowOrderExists && await checkEthFlowOrderExists(orderId, orderDigest)) {
170
172
  console.error("ETH FLOW", "[calculateUniqueOrderId] \u274C Collision detected: " + orderId, {
171
173
  sellAmount: order.sellAmount,
172
174
  fee: order.feeAmount
173
175
  });
174
- return calculateUniqueOrderId(chainId, adjustAmounts(order), checkEthFlowOrderExists);
176
+ return calculateUniqueOrderId(
177
+ chainId,
178
+ adjustAmounts(order),
179
+ checkEthFlowOrderExists,
180
+ options
181
+ );
175
182
  }
176
183
  return orderId;
177
184
  }
@@ -181,7 +188,10 @@ function adjustAmounts(order) {
181
188
  }
182
189
 
183
190
  // src/getEthFlowTransaction.ts
184
- import { BARN_ETH_FLOW_ADDRESSES as BARN_ETH_FLOW_ADDRESSES2, ETH_FLOW_ADDRESSES as ETH_FLOW_ADDRESSES2 } from "@cowprotocol/sdk-config";
191
+ import {
192
+ BARN_ETH_FLOW_ADDRESSES as BARN_ETH_FLOW_ADDRESSES2,
193
+ ETH_FLOW_ADDRESSES as ETH_FLOW_ADDRESSES2
194
+ } from "@cowprotocol/sdk-config";
185
195
 
186
196
  // src/utils/misc.ts
187
197
  import { ETH_ADDRESS, WRAPPED_NATIVE_CURRENCIES as WRAPPED_NATIVE_CURRENCIES2 } from "@cowprotocol/sdk-config";
@@ -266,7 +276,12 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
266
276
  slippageBps
267
277
  };
268
278
  const { quoteId } = params;
269
- const contract = getEthFlowContract(signer, chainId, params.env);
279
+ const protocolOptions = {
280
+ env: params.env,
281
+ settlementContractOverride: params.settlementContractOverride,
282
+ ethFlowContractOverride: params.ethFlowContractOverride
283
+ };
284
+ const contract = getEthFlowContract(signer, chainId, protocolOptions);
270
285
  const orderToSign = getOrderToSign(
271
286
  {
272
287
  chainId,
@@ -277,7 +292,7 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
277
292
  params,
278
293
  appDataKeccak256
279
294
  );
280
- const orderId = await calculateUniqueOrderId(chainId, orderToSign, checkEthFlowOrderExists, params.env);
295
+ const orderId = await calculateUniqueOrderId(chainId, orderToSign, checkEthFlowOrderExists, protocolOptions);
281
296
  const ethOrderParams = {
282
297
  buyToken: orderToSign.buyToken,
283
298
  receiver: orderToSign.receiver,
@@ -307,8 +322,9 @@ async function getEthFlowTransaction(appDataKeccak256, _params, chainId, additio
307
322
  }
308
323
  };
309
324
  }
310
- function getEthFlowContract(signer, chainId, env) {
311
- const address = env === "staging" ? BARN_ETH_FLOW_ADDRESSES2[chainId] : ETH_FLOW_ADDRESSES2[chainId];
325
+ function getEthFlowContract(signer, chainId, options) {
326
+ const { env, ethFlowContractOverride } = options ?? {};
327
+ const address = ethFlowContractOverride?.[chainId] ?? (env === "staging" ? BARN_ETH_FLOW_ADDRESSES2[chainId] : ETH_FLOW_ADDRESSES2[chainId]);
312
328
  return ContractFactory.createEthFlowContract(address, signer);
313
329
  }
314
330
 
@@ -319,7 +335,11 @@ async function postSellNativeCurrencyOrder(orderBookApi, appData, _params, addit
319
335
  const { appDataKeccak256, fullAppData } = appData;
320
336
  const { orderId, transaction, orderToSign } = await getEthFlowTransaction(
321
337
  appDataKeccak256,
322
- _params,
338
+ {
339
+ ..._params,
340
+ env: _params.env ?? orderBookApi.context.env,
341
+ ethFlowContractOverride: _params.ethFlowContractOverride
342
+ },
323
343
  orderBookApi.context.chainId,
324
344
  additionalParams,
325
345
  signer
@@ -362,6 +382,8 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
362
382
  }
363
383
  const { quoteId = null, owner } = params;
364
384
  const { appDataKeccak256, fullAppData } = appData;
385
+ const env = params.env ?? orderBookApi.context.env;
386
+ const settlementContractOverride = params.settlementContractOverride;
365
387
  const chainId = orderBookApi.context.chainId;
366
388
  const from = owner || await signer.getAddress();
367
389
  const orderToSign = getOrderToSign(
@@ -383,7 +405,12 @@ async function postCoWProtocolTrade(orderBookApi, appData, params, additionalPar
383
405
  signingScheme: _signingScheme
384
406
  };
385
407
  }
386
- const signingResult = await OrderSigningUtils2.signOrder(orderToSign, chainId, signer);
408
+ const signingResult = await OrderSigningUtils2.signOrder(
409
+ orderToSign,
410
+ chainId,
411
+ signer,
412
+ { env, settlementContractOverride }
413
+ );
387
414
  if (isEip1271) {
388
415
  return {
389
416
  signature: OrderSigningUtils2.getEip1271Signature(orderToSign, signingResult.signature),
@@ -430,9 +457,14 @@ import deepmerge from "deepmerge";
430
457
  // ../sdk/package.json
431
458
  var package_default = {
432
459
  name: "@cowprotocol/cow-sdk",
433
- version: "7.4.2",
460
+ version: "8.0.1",
434
461
  license: "(MIT OR Apache-2.0)",
435
462
  description: "CoW Protocol SDK - get quote, configure your order, and trade",
463
+ repository: {
464
+ type: "git",
465
+ url: "https://github.com/cowprotocol/cow-sdk.git",
466
+ directory: "packages/sdk"
467
+ },
436
468
  main: "./dist/index.js",
437
469
  module: "./dist/index.mjs",
438
470
  types: "./dist/index.d.ts",
@@ -506,11 +538,6 @@ var package_default = {
506
538
  "typescript",
507
539
  "subgraph"
508
540
  ],
509
- repository: {
510
- type: "git",
511
- url: "https://github.com/cowprotocol/cow-sdk.git",
512
- directory: "packages/sdk"
513
- },
514
541
  bugs: {
515
542
  url: "https://github.com/cowprotocol/cow-sdk/issues"
516
543
  },
@@ -582,8 +609,8 @@ var EIP712DomainTypes = [
582
609
  { name: "chainId", type: "uint256" },
583
610
  { name: "verifyingContract", type: "address" }
584
611
  ];
585
- async function getOrderTypedData(chainId, orderToSign) {
586
- const domain = await OrderSigningUtils3.getDomain(chainId);
612
+ async function getOrderTypedData(chainId, orderToSign, options) {
613
+ const domain = await OrderSigningUtils3.getDomain(chainId, options);
587
614
  return {
588
615
  domain,
589
616
  primaryType: ORDER_PRIMARY_TYPE,
@@ -835,6 +862,8 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
835
862
  const { quote, orderBookApi, tradeParameters, slippageBps, suggestedSlippageBps, appDataInfo, isEthFlow } = await getQuoteRaw(_tradeParameters, trader, advancedSettings, _orderBookApi);
836
863
  const { partnerFee } = tradeParameters;
837
864
  const { chainId, account: from } = trader;
865
+ const env = _tradeParameters.env ?? trader.env;
866
+ const settlementContractOverride = _tradeParameters.settlementContractOverride ?? trader.settlementContractOverride;
838
867
  const amountsAndCosts = getQuoteAmountsAndCosts4({
839
868
  orderParams: quote.quote,
840
869
  slippagePercentBps: slippageBps,
@@ -852,7 +881,7 @@ async function getQuote(_tradeParameters, trader, advancedSettings, _orderBookAp
852
881
  swapParamsToLimitOrderParams(tradeParameters, quote),
853
882
  appDataInfo.appDataKeccak256
854
883
  );
855
- const orderTypedData = await getOrderTypedData(chainId, orderToSign);
884
+ const orderTypedData = await getOrderTypedData(chainId, orderToSign, { env, settlementContractOverride });
856
885
  return {
857
886
  result: {
858
887
  tradeParameters,
@@ -872,7 +901,8 @@ async function getTrader(swapParameters) {
872
901
  return {
873
902
  chainId: swapParameters.chainId,
874
903
  appCode: swapParameters.appCode,
875
- account
904
+ account,
905
+ settlementContractOverride: swapParameters.settlementContractOverride
876
906
  };
877
907
  }
878
908
  async function getQuoteWithSigner(swapParameters, advancedSettings, orderBookApi) {
@@ -976,14 +1006,21 @@ async function postLimitOrder(_params, advancedSettings, _orderBookApi) {
976
1006
 
977
1007
  // src/getSettlementContract.ts
978
1008
  import { ContractFactory as ContractFactory2 } from "@cowprotocol/sdk-common";
979
- import { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from "@cowprotocol/sdk-config";
980
- function getSettlementContract(chainId, signer) {
981
- return ContractFactory2.createSettlementContract(COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId], signer);
1009
+ import {
1010
+ COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS,
1011
+ COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS_STAGING
1012
+ } from "@cowprotocol/sdk-config";
1013
+ function getSettlementContract(chainId, signer, options) {
1014
+ const { env, settlementContractOverride } = options ?? {};
1015
+ return ContractFactory2.createSettlementContract(
1016
+ settlementContractOverride?.[chainId] ?? (env === "staging" ? COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS_STAGING[chainId] : COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]),
1017
+ signer
1018
+ );
982
1019
  }
983
1020
 
984
1021
  // src/getPreSignTransaction.ts
985
- async function getPreSignTransaction(signer, chainId, orderId) {
986
- const contract = getSettlementContract(chainId, signer);
1022
+ async function getPreSignTransaction(signer, chainId, orderId, options) {
1023
+ const contract = getSettlementContract(chainId, signer, options);
987
1024
  const preSignatureCall = contract.interface.encodeFunctionData("setPreSignature", [orderId, true]);
988
1025
  const gas = await contract.estimateGas.setPreSignature?.(orderId, true).catch(() => GAS_LIMIT_DEFAULT) || GAS_LIMIT_DEFAULT;
989
1026
  return {
@@ -1073,7 +1110,10 @@ function resolveOrderBookApi(chainId, env, existingOrderBookApi) {
1073
1110
  }
1074
1111
 
1075
1112
  // src/tradingSdk.ts
1076
- import { COW_PROTOCOL_VAULT_RELAYER_ADDRESS } from "@cowprotocol/sdk-config";
1113
+ import {
1114
+ COW_PROTOCOL_VAULT_RELAYER_ADDRESS,
1115
+ COW_PROTOCOL_VAULT_RELAYER_ADDRESS_STAGING
1116
+ } from "@cowprotocol/sdk-config";
1077
1117
  var TradingSdk = class {
1078
1118
  constructor(traderParams = {}, options = {}, adapter) {
1079
1119
  this.traderParams = traderParams;
@@ -1098,7 +1138,11 @@ var TradingSdk = class {
1098
1138
  return this;
1099
1139
  }
1100
1140
  async getQuote(params, advancedSettings) {
1101
- const quoteResults = await getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1141
+ const quoteResults = await getQuoteWithSigner(
1142
+ this.mergeParams(params),
1143
+ advancedSettings,
1144
+ this.resolveOrderBookApi(params)
1145
+ );
1102
1146
  return {
1103
1147
  quoteResults: quoteResults.result,
1104
1148
  postSwapOrderFromQuote: async (advancedSettings2, signingStepManager) => {
@@ -1167,19 +1211,21 @@ var TradingSdk = class {
1167
1211
  chainId: quoterParams.chainId,
1168
1212
  appCode: quoterParams.appCode,
1169
1213
  env: quoterParams.env,
1170
- account: quoterParams.owner
1214
+ account: quoterParams.owner,
1215
+ settlementContractOverride: quoterParams.settlementContractOverride,
1216
+ ethFlowContractOverride: quoterParams.ethFlowContractOverride
1171
1217
  };
1172
- const result = await getQuote(quoterParams, trader, advancedSettings, this.options.orderBookApi);
1218
+ const result = await getQuote(quoterParams, trader, advancedSettings, this.resolveOrderBookApi(params));
1173
1219
  return result.result;
1174
1220
  }
1175
1221
  async getQuoteResults(params, advancedSettings) {
1176
- return getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1222
+ return getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1177
1223
  }
1178
1224
  async postSwapOrder(params, advancedSettings) {
1179
- return postSwapOrder(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1225
+ return postSwapOrder(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1180
1226
  }
1181
1227
  async postLimitOrder(params, advancedSettings) {
1182
- return postLimitOrder(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1228
+ return postLimitOrder(this.mergeParams(params), advancedSettings, this.resolveOrderBookApi(params));
1183
1229
  }
1184
1230
  /**
1185
1231
  * Posts a sell order for native currency (e.g., ETH) using the EthFlow contract.
@@ -1204,7 +1250,11 @@ var TradingSdk = class {
1204
1250
  * ```
1205
1251
  */
1206
1252
  async postSellNativeCurrencyOrder(params, advancedSettings) {
1207
- const quoteResults = await getQuoteWithSigner(this.mergeParams(params), advancedSettings, this.options.orderBookApi);
1253
+ const quoteResults = await getQuoteWithSigner(
1254
+ this.mergeParams(params),
1255
+ advancedSettings,
1256
+ this.resolveOrderBookApi(params)
1257
+ );
1208
1258
  const { tradeParameters, quoteResponse } = quoteResults.result;
1209
1259
  return postSellNativeCurrencyOrder(
1210
1260
  quoteResults.orderBookApi,
@@ -1219,9 +1269,12 @@ var TradingSdk = class {
1219
1269
  );
1220
1270
  }
1221
1271
  async getPreSignTransaction(params) {
1222
- const traderParams = this.mergeParams(params);
1223
- const signer = resolveSigner(traderParams.signer);
1224
- return getPreSignTransaction(signer, traderParams.chainId, params.orderUid);
1272
+ const { chainId, env, settlementContractOverride, orderUid, signer: signerLike } = this.mergeParams(params);
1273
+ const signer = resolveSigner(signerLike);
1274
+ return getPreSignTransaction(signer, chainId, orderUid, {
1275
+ env,
1276
+ settlementContractOverride
1277
+ });
1225
1278
  }
1226
1279
  async getOrder(params) {
1227
1280
  const orderBookApi = this.resolveOrderBookApi(params);
@@ -1229,13 +1282,13 @@ var TradingSdk = class {
1229
1282
  }
1230
1283
  async offChainCancelOrder(params) {
1231
1284
  const orderBookApi = this.resolveOrderBookApi(params);
1232
- const signer = resolveSigner(params.signer);
1285
+ const { env, chainId, settlementContractOverride, signer: signerLike } = this.mergeParams(params);
1286
+ const signer = resolveSigner(signerLike);
1233
1287
  const { orderUid } = params;
1234
- const chainId = params.chainId || this.traderParams.chainId;
1235
- if (!chainId) {
1236
- throw new Error("Chain ID is missing in offChainCancelOrder() call");
1237
- }
1238
- const orderCancellationSigning = await OrderSigningUtils4.signOrderCancellations([orderUid], chainId, signer);
1288
+ const orderCancellationSigning = await OrderSigningUtils4.signOrderCancellations([orderUid], chainId, signer, {
1289
+ env,
1290
+ settlementContractOverride
1291
+ });
1239
1292
  await orderBookApi.sendSignedOrderCancellations({
1240
1293
  ...orderCancellationSigning,
1241
1294
  orderUids: [orderUid]
@@ -1243,14 +1296,11 @@ var TradingSdk = class {
1243
1296
  return true;
1244
1297
  }
1245
1298
  async onChainCancelOrder(params, _order) {
1246
- const chainId = params.chainId || this.traderParams.chainId;
1247
- if (!chainId) {
1248
- throw new Error("Chain ID is missing in offChainCancelOrder() call");
1249
- }
1299
+ const { env, chainId, settlementContractOverride, ethFlowContractOverride } = this.mergeParams(params);
1250
1300
  const order = _order ?? await this.getOrder(params);
1251
1301
  const isEthFlowOrder = !!order.onchainOrderData;
1252
1302
  const signer = params.signer ? getGlobalAdapter6().createSigner(params.signer) : getGlobalAdapter6().signer;
1253
- const { transaction } = await (isEthFlowOrder ? getEthFlowCancellation(getEthFlowContract(signer, chainId, params.env ?? this.traderParams.env), order) : getSettlementCancellation(getSettlementContract(chainId, signer), order));
1303
+ const { transaction } = await (isEthFlowOrder ? getEthFlowCancellation(getEthFlowContract(signer, chainId, { env, ethFlowContractOverride }), order) : getSettlementCancellation(getSettlementContract(chainId, signer, { env, settlementContractOverride }), order));
1254
1304
  const txReceipt = await signer.sendTransaction(transaction);
1255
1305
  return txReceipt.hash;
1256
1306
  }
@@ -1273,12 +1323,9 @@ var TradingSdk = class {
1273
1323
  * ```
1274
1324
  */
1275
1325
  async getCowProtocolAllowance(params) {
1276
- const chainId = params.chainId || this.traderParams.chainId;
1277
- if (!chainId) {
1278
- throw new Error("Chain ID is missing in getCowProtocolAllowance() call");
1279
- }
1326
+ const { env, chainId } = this.mergeParams(params);
1280
1327
  const adapter = getGlobalAdapter6();
1281
- const vaultRelayerAddress = COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId];
1328
+ const vaultRelayerAddress = params.vaultRelayerAddress ?? (env === "staging" ? COW_PROTOCOL_VAULT_RELAYER_ADDRESS_STAGING[chainId] : COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId]);
1282
1329
  return await adapter.readContract({
1283
1330
  address: params.tokenAddress,
1284
1331
  abi: ERC20_ALLOWANCE_ABI,
@@ -1306,13 +1353,10 @@ var TradingSdk = class {
1306
1353
  * ```
1307
1354
  */
1308
1355
  async approveCowProtocol(params) {
1309
- const chainId = params.chainId || this.traderParams.chainId;
1310
- if (!chainId) {
1311
- throw new Error("Chain ID is missing in approveCowProtocol() call");
1312
- }
1356
+ const { env, chainId, signer: signerLike } = this.mergeParams(params);
1313
1357
  const adapter = getGlobalAdapter6();
1314
- const signer = resolveSigner(params.signer);
1315
- const vaultRelayerAddress = COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId];
1358
+ const signer = resolveSigner(signerLike);
1359
+ const vaultRelayerAddress = params.vaultRelayerAddress ?? (env === "staging" ? COW_PROTOCOL_VAULT_RELAYER_ADDRESS_STAGING[chainId] : COW_PROTOCOL_VAULT_RELAYER_ADDRESS[chainId]);
1316
1360
  const txParams = {
1317
1361
  to: params.tokenAddress,
1318
1362
  data: adapter.utils.encodeFunction(ERC20_APPROVE_ABI, "approve", [
@@ -1325,19 +1369,22 @@ var TradingSdk = class {
1325
1369
  }
1326
1370
  resolveOrderBookApi(params) {
1327
1371
  const chainId = params.chainId ?? this.traderParams.chainId;
1328
- const env = params.env ?? this.traderParams.env ?? "prod";
1372
+ const env = params.env ?? this.traderParams.env ?? this.options.orderBookApi?.context?.env ?? "prod";
1329
1373
  if (!chainId) {
1330
1374
  throw new Error("Chain ID is missing in getOrder() call");
1331
1375
  }
1332
- return resolveOrderBookApi(chainId, env);
1376
+ return resolveOrderBookApi(chainId, env, this.options.orderBookApi);
1333
1377
  }
1334
1378
  mergeParams(params) {
1335
- const { chainId, signer, appCode, env } = params;
1379
+ const { chainId, signer, appCode, env, settlementContractOverride, ethFlowContractOverride } = params;
1380
+ const orderBookContext = this.options.orderBookApi?.context;
1336
1381
  const traderParams = {
1337
- chainId: chainId || this.traderParams.chainId,
1338
- signer: signer || this.traderParams.signer || getGlobalAdapter6().signer,
1339
- appCode: appCode || this.traderParams.appCode,
1340
- env: env || this.traderParams.env
1382
+ chainId: chainId ?? this.traderParams.chainId ?? orderBookContext?.chainId,
1383
+ signer: signer ?? this.traderParams.signer ?? getGlobalAdapter6().signer,
1384
+ appCode: appCode ?? this.traderParams.appCode,
1385
+ env: env ?? this.traderParams.env ?? orderBookContext?.env,
1386
+ settlementContractOverride: settlementContractOverride ?? this.traderParams.settlementContractOverride,
1387
+ ethFlowContractOverride: ethFlowContractOverride ?? this.traderParams.ethFlowContractOverride
1341
1388
  };
1342
1389
  assertTraderParams(traderParams);
1343
1390
  return {
@@ -1350,9 +1397,11 @@ var TradingSdk = class {
1350
1397
  * Used by quote-only operations that don't need signing capability.
1351
1398
  */
1352
1399
  mergeQuoterParams(params) {
1353
- const chainId = params.chainId || this.traderParams.chainId;
1354
- const appCode = params.appCode || this.traderParams.appCode;
1355
- const env = params.env || this.traderParams.env || "prod";
1400
+ const chainId = params.chainId ?? this.traderParams.chainId;
1401
+ const appCode = params.appCode ?? this.traderParams.appCode;
1402
+ const env = params.env ?? this.traderParams.env ?? this.options.orderBookApi?.context?.env ?? "prod";
1403
+ const settlementContractOverride = params.settlementContractOverride ?? this.traderParams.settlementContractOverride;
1404
+ const ethFlowContractOverride = params.ethFlowContractOverride ?? this.traderParams.ethFlowContractOverride;
1356
1405
  if (!chainId) {
1357
1406
  throw new Error("Missing quoter parameters: chainId");
1358
1407
  }
@@ -1363,7 +1412,9 @@ var TradingSdk = class {
1363
1412
  ...params,
1364
1413
  chainId,
1365
1414
  appCode,
1366
- env
1415
+ env,
1416
+ settlementContractOverride,
1417
+ ethFlowContractOverride
1367
1418
  };
1368
1419
  }
1369
1420
  };
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "@cowprotocol/sdk-trading",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "CowProtocol trading",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/cowprotocol/cow-sdk.git",
8
+ "directory": "packages/trading"
9
+ },
5
10
  "main": "./dist/index.js",
6
11
  "module": "./dist/index.mjs",
7
12
  "types": "./dist/index.d.ts",
@@ -13,7 +18,22 @@
13
18
  "publishConfig": {
14
19
  "access": "public"
15
20
  },
21
+ "scripts": {
22
+ "build": "tsup src/index.ts --format esm,cjs --dts",
23
+ "lint": "eslint src/**/*.ts",
24
+ "test": "jest",
25
+ "test:watch": "jest --watch",
26
+ "test:coverage": "jest --coverage --json --outputFile=jest.results.json && npx coveralls < ./coverage/lcov.info",
27
+ "test:coverage:html": "jest --silent=false --coverage --coverageReporters html",
28
+ "typecheck": "tsc --noEmit",
29
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
30
+ "prepublishOnly": "npm run build"
31
+ },
16
32
  "devDependencies": {
33
+ "@cow-sdk/typescript-config": "workspace:*",
34
+ "@cowprotocol/sdk-ethers-v5-adapter": "workspace:*",
35
+ "@cowprotocol/sdk-ethers-v6-adapter": "workspace:*",
36
+ "@cowprotocol/sdk-viem-adapter": "workspace:*",
17
37
  "@ethersproject/constants": "^5.7.0",
18
38
  "@types/jest": "^29.5.12",
19
39
  "@types/node": "^20.17.31",
@@ -27,29 +47,15 @@
27
47
  "ethers-v6": "npm:ethers@^6.13.7",
28
48
  "viem": "^2.28.4",
29
49
  "ts-jest": "^29.0.0",
30
- "tsx": "^4.19.4",
31
- "@cow-sdk/typescript-config": "0.0.0-beta.0",
32
- "@cowprotocol/sdk-ethers-v6-adapter": "0.3.10",
33
- "@cowprotocol/sdk-ethers-v5-adapter": "0.3.10",
34
- "@cowprotocol/sdk-viem-adapter": "0.3.10"
50
+ "tsx": "^4.19.4"
35
51
  },
36
52
  "dependencies": {
37
- "deepmerge": "^4.3.1",
38
- "@cowprotocol/sdk-config": "0.10.0",
39
- "@cowprotocol/sdk-common": "0.7.0",
40
- "@cowprotocol/sdk-order-book": "1.1.2",
41
- "@cowprotocol/sdk-app-data": "4.6.7",
42
- "@cowprotocol/sdk-order-signing": "0.1.37",
43
- "@cowprotocol/sdk-contracts-ts": "1.8.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"
53
+ "@cowprotocol/sdk-common": "workspace:*",
54
+ "@cowprotocol/sdk-config": "workspace:*",
55
+ "@cowprotocol/sdk-app-data": "workspace:*",
56
+ "@cowprotocol/sdk-order-book": "workspace:*",
57
+ "@cowprotocol/sdk-order-signing": "workspace:*",
58
+ "@cowprotocol/sdk-contracts-ts": "workspace:*",
59
+ "deepmerge": "^4.3.1"
54
60
  }
55
- }
61
+ }