From e05e377986e0d0532225e2075d839dd2ade1c6cb Mon Sep 17 00:00:00 2001 From: Jefferson Bastos Date: Wed, 25 Jun 2025 12:50:03 -0300 Subject: [PATCH] feat(sdk): create new umbruella package --- packages/sdk/package.json | 78 +++++++++++++++++++++++ packages/sdk/src/CowSdk.ts | 126 +++++++++++++++++++++++++++++++++++++ packages/sdk/src/index.ts | 1 + packages/sdk/src/types.ts | 111 ++++++++++++++++++++++++++++++++ packages/sdk/tsconfig.json | 9 +++ 5 files changed, 325 insertions(+) create mode 100644 packages/sdk/package.json create mode 100644 packages/sdk/src/CowSdk.ts create mode 100644 packages/sdk/src/index.ts create mode 100644 packages/sdk/src/types.ts create mode 100644 packages/sdk/tsconfig.json diff --git a/packages/sdk/package.json b/packages/sdk/package.json new file mode 100644 index 000000000..4a697d000 --- /dev/null +++ b/packages/sdk/package.json @@ -0,0 +1,78 @@ +{ + "name": "@cowprotocol/sdk", + "version": "7.0.0-RC.01", + "license": "(MIT OR Apache-2.0)", + "description": "CowProtocol SDK - Complete umbrella package for CoW Protocol interactions", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "sideEffects": false, + "files": [ + "dist/**" + ], + "scripts": { + "build": "tsup src/index.ts --format esm,cjs --dts", + "lint": "eslint src/**/*.ts", + "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist" + }, + "devDependencies": { + "@repo/typescript-config": "workspace:*", + "@types/node": "^20.17.31", + "jest": "^29.7.0", + "ts-node": "^10.8.2", + "tsup": "^7.2.0", + "typescript": "^5.2.2" + }, + "dependencies": { + "@cowprotocol/sdk-common": "workspace:*", + "@cowprotocol/sdk-config": "workspace:*", + "@cowprotocol/sdk-contracts-ts": "workspace:*", + "@cowprotocol/sdk-app-data": "workspace:*", + "@cowprotocol/sdk-order-book": "workspace:*", + "@cowprotocol/sdk-subgraph": "workspace:*", + "@cowprotocol/sdk-cow-shed": "workspace:*", + "@cowprotocol/sdk-trading": "workspace:*", + "@cowprotocol/sdk-composable": "workspace:*", + "@cowprotocol/sdk-order-signing": "workspace:*" + }, + "peerDependencies": { + "cross-fetch": "^3.x", + "ipfs-only-hash": "^4.x", + "multiformats": "^9.x", + "@openzeppelin/merkle-tree": "^1.x" + }, + "peerDependenciesMeta": { + "cross-fetch": { + "optional": false + }, + "ipfs-only-hash": { + "optional": true + }, + "multiformats": { + "optional": true + }, + "@openzeppelin/merkle-tree": { + "optional": true + } + }, + "keywords": [ + "cow-protocol", + "ethereum", + "defi", + "trading", + "dex", + "mev-protection", + "batch-auctions", + "sdk", + "typescript" + ], + "repository": { + "type": "git", + "url": "https://github.com/cowprotocol/cow-sdk.git", + "directory": "packages/sdk" + }, + "bugs": { + "url": "https://github.com/cowprotocol/cow-sdk/issues" + }, + "homepage": "https://github.com/cowprotocol/cow-sdk#readme" +} diff --git a/packages/sdk/src/CowSdk.ts b/packages/sdk/src/CowSdk.ts new file mode 100644 index 000000000..870f96d56 --- /dev/null +++ b/packages/sdk/src/CowSdk.ts @@ -0,0 +1,126 @@ +import { setGlobalAdapter } from '@cowprotocol/sdk-common' +import { MetadataApi } from '@cowprotocol/sdk-app-data' +import { OrderBookApi } from '@cowprotocol/sdk-order-book' +import { ApiBaseUrls, SupportedChainId } from '@cowprotocol/sdk-config' +import { ApiContext } from '@cowprotocol/sdk-config' +import { CowSdkOptions } from './types' +import { SubgraphApi } from '@cowprotocol/sdk-subgraph' +import { ContractsTs } from '@cowprotocol/sdk-contracts-ts' +import { CowShedSdk } from '@cowprotocol/sdk-cow-shed' +import { TradingSdk } from '@cowprotocol/sdk-trading' +import { ConditionalOrderFactory, Multiplexer, ProofLocation } from '@cowprotocol/sdk-composable' +import { OrderSigningUtils } from '@cowprotocol/sdk-order-signing' + +// Re-export all components for easier access +export * from '@cowprotocol/sdk-app-data' +export * from '@cowprotocol/sdk-order-book' +export * from '@cowprotocol/sdk-subgraph' +export * from '@cowprotocol/sdk-contracts-ts' +export * from '@cowprotocol/sdk-cow-shed' +export * from '@cowprotocol/sdk-trading' +export * from '@cowprotocol/sdk-composable' +export * from '@cowprotocol/sdk-order-signing' + +/** + * CowSdk is the main entry point for interacting with the CoW Protocol. + * Provides access to all modules in a single unified interface. + */ +export class CowSdk { + public readonly orderBook: OrderBookApi + public readonly appData: MetadataApi + public readonly subgraph: SubgraphApi + public readonly contracts: ContractsTs + public readonly cowShed?: CowShedSdk + public readonly trading?: TradingSdk + public readonly composable?: { + factory: ConditionalOrderFactory + multiplexer?: Multiplexer + } + public readonly orderSigning: OrderSigningUtils + + private readonly chainId: SupportedChainId + + /** + * Creates a new instance of CowSdk + * + * @param options Configuration options for the SDK + */ + constructor(options: CowSdkOptions) { + const { + adapter, + chainId, + env = 'prod', + orderBookOptions = {}, + orderBookBaseUrl, + subgraphOptions = {}, + subgraphBaseUrl, + tradingOptions = {}, + composableOptions = {}, + cowShedOptions = {}, + } = options + + this.chainId = chainId + + setGlobalAdapter(adapter) + + const orderBookContext: ApiContext = { + chainId, + env, + ...orderBookOptions, + } + + if (orderBookBaseUrl) { + orderBookContext.baseUrls = { + ...(orderBookContext.baseUrls || {}), + [chainId]: orderBookBaseUrl, + } as ApiBaseUrls + } + + this.orderBook = new OrderBookApi(orderBookContext) + + this.appData = new MetadataApi(adapter) + + const subgraphContext = { + chainId, + env, + ...(subgraphOptions.context || {}), + ...(subgraphBaseUrl && { + baseUrls: Object.values(SupportedChainId).reduce( + (acc, chainId) => ({ + ...acc, + [chainId]: chainId === this.chainId ? subgraphBaseUrl : null, + }), + {}, + ) as Record, + }), + } + + this.subgraph = new SubgraphApi(subgraphContext, subgraphOptions.apiKey) + + this.contracts = new ContractsTs(adapter) + + this.cowShed = new CowShedSdk(adapter, cowShedOptions.factoryOptions) + + this.trading = new TradingSdk( + tradingOptions.traderParams, + { + enableLogging: tradingOptions.options?.enableLogging, + orderBookApi: this.orderBook, + ...tradingOptions.options, + }, + adapter, + ) + + this.composable = { + factory: new ConditionalOrderFactory(composableOptions.registry || {}, adapter), + multiplexer: new Multiplexer( + chainId, + composableOptions.orders, + composableOptions.root, + composableOptions.location || ProofLocation.PRIVATE, + ), + } + + this.orderSigning = new OrderSigningUtils(adapter) + } +} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts new file mode 100644 index 000000000..76a82c749 --- /dev/null +++ b/packages/sdk/src/index.ts @@ -0,0 +1 @@ +export * from './CowSdk' diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts new file mode 100644 index 000000000..f959551c6 --- /dev/null +++ b/packages/sdk/src/types.ts @@ -0,0 +1,111 @@ +import { AbstractProviderAdapter } from '@cowprotocol/sdk-common' +import { + CowEnv, + PartialApiContext, + SupportedChainId, + PartialApiContext as OrderBookModuleOptions, +} from '@cowprotocol/sdk-config' + +// Re-export constructor parameter types from individual packages +export type { ICoWShedOptions } from '@cowprotocol/sdk-cow-shed' +export type { TraderParameters } from '@cowprotocol/sdk-trading' +export type { ConditionalOrderRegistry, Orders, ProofLocation } from '@cowprotocol/sdk-composable' + +/** + * SubgraphApi constructor: (context: PartialSubgraphApiContext = {}, apiKey?: string) + */ +export interface SubgraphModuleOptions { + context?: PartialApiContext + apiKey?: string +} + +/** + * TradingSdk constructor: (traderParams: Partial = {}, options: Partial = {}, adapter: AbstractProviderAdapter) + */ +export interface TradingModuleOptions { + traderParams?: Partial + options?: Partial +} + +// Re-export TradingSdkOptions from trading package +import type { TradingSdkOptions, TraderParameters } from '@cowprotocol/sdk-trading' + +/** + * CowShedSdk constructor: (adapter: AbstractProviderAdapter, factoryOptions?: ICoWShedOptions) + */ +export interface CowShedModuleOptions { + factoryOptions?: ICoWShedOptions +} + +// Re-export types needed for CowShed +import type { ICoWShedOptions } from '@cowprotocol/sdk-cow-shed' + +/** + * ConditionalOrderFactory constructor: (registry: ConditionalOrderRegistry, adapter?: AbstractProviderAdapter) + * Multiplexer constructor: (chain: SupportedChainId, orders?: Orders, root?: string, location: ProofLocation = ProofLocation.PRIVATE) + */ +export interface ComposableModuleOptions { + registry?: ConditionalOrderRegistry + orders?: Orders + root?: string + location?: ProofLocation +} + +// Re-export types needed for Composable +import type { ConditionalOrderRegistry, Orders, ProofLocation } from '@cowprotocol/sdk-composable' + +/** + * Main CowSdk options interface + */ +export interface CowSdkOptions { + /** + * The chain ID to use for the SDK + */ + chainId: SupportedChainId + + /** + * The adapter to use for signing transactions and blockchain interactions + */ + adapter: AbstractProviderAdapter + + /** + * The environment to use (prod or staging) + * @default 'prod' + */ + env?: CowEnv + + /** + * OrderBook API configuration options + */ + orderBookOptions?: OrderBookModuleOptions + + /** + * Custom base URL for the OrderBook API + */ + orderBookBaseUrl?: string + + /** + * Subgraph API configuration options + */ + subgraphOptions?: SubgraphModuleOptions + + /** + * Custom base URL for the Subgraph API + */ + subgraphBaseUrl?: string + + /** + * Trading SDK configuration options + */ + tradingOptions?: TradingModuleOptions + + /** + * CoW Shed configuration options + */ + cowShedOptions?: CowShedModuleOptions + + /** + * Composable CoW configuration options + */ + composableOptions?: ComposableModuleOptions +} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json new file mode 100644 index 000000000..04c584564 --- /dev/null +++ b/packages/sdk/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "outDir": "./dist", + "baseUrl": "src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +}