> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/cowprotocol/cow-sdk/llms.txt
> Use this file to discover all available pages before exploring further.

# @cowprotocol/sdk-contracts-ts

> Contract interaction utilities and settlement encoding

The `@cowprotocol/sdk-contracts-ts` package provides TypeScript utilities for interacting with CoW Protocol smart contracts, encoding settlements, and managing orders.

## Installation

```bash theme={null}
npm install @cowprotocol/sdk-contracts-ts
```

## Order Types

### Order

Gnosis Protocol v2 order data structure.

```typescript theme={null}
interface Order {
  sellToken: string
  buyToken: string
  receiver?: string
  sellAmount: BigIntish
  buyAmount: BigIntish
  validTo: Timestamp
  appData: HashLike
  feeAmount: BigIntish
  kind: OrderKind
  partiallyFillable: boolean
  sellTokenBalance?: OrderBalance
  buyTokenBalance?: OrderBalance
}
```

### OrderKind

```typescript theme={null}
enum OrderKind {
  SELL = 'sell',
  BUY = 'buy'
}
```

### OrderBalance

Specifies how token balances are managed.

```typescript theme={null}
enum OrderBalance {
  ERC20 = 'erc20',
  EXTERNAL = 'external', // Balancer Vault external balances
  INTERNAL = 'internal'  // Balancer Vault internal balances
}
```

**Example:**

```typescript theme={null}
import { Order, OrderKind, OrderBalance } from '@cowprotocol/sdk-contracts-ts'

const order: Order = {
  sellToken: '0x...', // USDC
  buyToken: '0x...',  // DAI
  sellAmount: 1000000n, // 1 USDC (6 decimals)
  buyAmount: 990000000000000000n, // 0.99 DAI (18 decimals)
  validTo: Math.floor(Date.now() / 1000) + 3600, // 1 hour from now
  appData: '0x0000000000000000000000000000000000000000000000000000000000000000',
  feeAmount: 0n,
  kind: OrderKind.SELL,
  partiallyFillable: false
}
```

## Signing Schemes

### SigningScheme

```typescript theme={null}
enum SigningScheme {
  EIP712 = 0b00,   // EIP-712 typed data signing (preferred)
  ETHSIGN = 0b01,  // eth_sign RPC call
  EIP1271 = 0b10,  // Smart contract signatures (EIP-1271)
  PRESIGN = 0b11   // Pre-signed orders
}
```

### Signature Types

```typescript theme={null}
type EcdsaSigningScheme = SigningScheme.EIP712 | SigningScheme.ETHSIGN

interface EcdsaSignature {
  scheme: EcdsaSigningScheme
  data: SignatureLike
}

type Signature = EcdsaSignature | Eip1271Signature | PreSignSignature
```

## Order Utilities

### hashOrder

Computes the 32-byte signing hash for an order.

```typescript theme={null}
function hashOrder(domain: TypedDataDomain, order: Order): string
```

**Parameters:**

* `domain` - EIP-712 domain separator
* `order` - Order to hash

**Returns:** Hex-encoded 32-byte order digest

### computeOrderUid

Computes the unique order identifier.

```typescript theme={null}
function computeOrderUid(
  domain: TypedDataDomain,
  order: Order,
  owner: string
): string
```

**Returns:** 56-byte order UID

**Example:**

```typescript theme={null}
import { computeOrderUid } from '@cowprotocol/sdk-contracts-ts'

const domain = {
  name: 'Gnosis Protocol',
  version: 'v2',
  chainId: 1,
  verifyingContract: '0x9008D19f58AAbD9eD0D60971565AA8510560ab41'
}

const orderUid = computeOrderUid(domain, order, '0x...')
```

### extractOrderUidParams

Extracts parameters from an order UID.

```typescript theme={null}
function extractOrderUidParams(orderUid: string): OrderUidParams

interface OrderUidParams {
  orderDigest: string
  owner: string
  validTo: number
}
```

### normalizeOrder

Normalizes an order for EIP-712 signing.

```typescript theme={null}
function normalizeOrder(order: Order): NormalizedOrder
```

## Settlement Encoding

### SettlementEncoder

Encoder for CoW Protocol settlement transactions.

```typescript theme={null}
class SettlementEncoder {
  constructor(
    public readonly domain: TypedDataDomain,
    adapter?: AbstractProviderAdapter
  )

  get tokens(): string[]
  get trades(): Trade[]
  get interactions(): [Interaction[], Interaction[], Interaction[]]

  encodeTrade(
    order: Order,
    signature: Signature,
    tradeExecution?: Partial<TradeExecution>
  ): void

  async signEncodeTrade(
    order: Order,
    scheme: EcdsaSigningScheme,
    tradeExecution?: Partial<TradeExecution>,
    owner?: SignerLike
  ): Promise<void>

  encodeInteraction(
    interaction: InteractionLike,
    stage?: InteractionStage
  ): void

  clearingPrices(prices: Prices): BigIntish[]

  encodedSettlement(prices: Prices): EncodedSettlement

  static encodedSetup(
    ...interactions: InteractionLike[]
  ): EncodedSettlement
}
```

**Example:**

```typescript theme={null}
import {
  SettlementEncoder,
  SigningScheme,
  InteractionStage
} from '@cowprotocol/sdk-contracts-ts'

const encoder = new SettlementEncoder(domain)

// Add a trade
await encoder.signEncodeTrade(
  order,
  SigningScheme.EIP712,
  { executedAmount: order.sellAmount }
)

// Add a pre-interaction (e.g., approve)
encoder.encodeInteraction(
  {
    target: '0x...',
    callData: '0x...'
  },
  InteractionStage.PRE
)

// Get encoded settlement
const prices = {
  '0x...': 1000000n, // USDC price
  '0x...': 1000000000000000000n // DAI price
}
const settlement = encoder.encodedSettlement(prices)
```

### InteractionStage

```typescript theme={null}
enum InteractionStage {
  PRE = 0,   // Before trading (e.g., approvals, permits)
  INTRA = 1, // During trading (e.g., AMM interactions)
  POST = 2   // After trading
}
```

### TokenRegistry

Tracks tokens for settlement encoding.

```typescript theme={null}
class TokenRegistry {
  constructor(adapter?: AbstractProviderAdapter)

  get addresses(): string[]

  index(token: string): number
}
```

## Trade Encoding

### Trade

```typescript theme={null}
type Trade = TradeExecution & Omit<
  NormalizedOrder,
  'sellToken' | 'buyToken' | 'kind' | 'partiallyFillable' |
  'sellTokenBalance' | 'buyTokenBalance'
> & {
  sellTokenIndex: BigIntish
  buyTokenIndex: BigIntish
  flags: BigIntish
  signature: Bytes
}

interface TradeExecution {
  executedAmount: BigIntish
}
```

### encodeTradeFlags

Encodes trade flags as a bitfield.

```typescript theme={null}
function encodeTradeFlags(flags: TradeFlags): number

interface TradeFlags extends OrderFlags {
  signingScheme: SigningScheme
}
```

### decodeTradeFlags

Decodes trade flags from a bitfield.

```typescript theme={null}
function decodeTradeFlags(flags: BigIntish): TradeFlags
```

### decodeOrder

Decodes an order from a settlement trade.

```typescript theme={null}
function decodeOrder(trade: Trade, tokens: string[]): Order
```

## Order Cancellations

### OrderCancellations

```typescript theme={null}
interface OrderCancellations {
  orderUids: Bytes[]
}
```

### hashOrderCancellation

Computes the hash for a single order cancellation.

```typescript theme={null}
function hashOrderCancellation(
  domain: TypedDataDomain,
  orderUid: Bytes
): string
```

### hashOrderCancellations

Computes the hash for multiple order cancellations.

```typescript theme={null}
function hashOrderCancellations(
  domain: TypedDataDomain,
  orderUids: Bytes[]
): string
```

## Settlement Types

### EncodedSettlement

```typescript theme={null}
type EncodedSettlement = [
  tokens: string[],
  clearingPrices: BigIntish[],
  trades: Trade[],
  interactions: [Interaction[], Interaction[], Interaction[]]
]
```

### Prices

```typescript theme={null}
type Prices = Record<string, BigIntish | undefined>
```

**Example:**

```typescript theme={null}
const prices: Prices = {
  '0x...USDC': 1000000n,
  '0x...DAI': 1000000000000000000n
}
```

### Interaction

```typescript theme={null}
interface Interaction {
  target: string
  callData: string
}
```

## Constants

```typescript theme={null}
// Special marker address for buying ETH
const BUY_ETH_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'

// Order UID byte length
const ORDER_UID_LENGTH = 56

// EIP-712 type fields for orders
const ORDER_TYPE_FIELDS = [
  { name: 'sellToken', type: 'address' },
  { name: 'buyToken', type: 'address' },
  { name: 'receiver', type: 'address' },
  { name: 'sellAmount', type: 'uint256' },
  { name: 'buyAmount', type: 'uint256' },
  { name: 'validTo', type: 'uint32' },
  { name: 'appData', type: 'bytes32' },
  { name: 'feeAmount', type: 'uint256' },
  { name: 'kind', type: 'string' },
  { name: 'partiallyFillable', type: 'bool' },
  { name: 'sellTokenBalance', type: 'string' },
  { name: 'buyTokenBalance', type: 'string' }
]

// EIP-712 type hash
const ORDER_TYPE_HASH = '0xd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489'
```

## Package Version

```typescript theme={null}
import { CONTRACTS_PKG_VERSION } from '@cowprotocol/sdk-contracts-ts'

console.log(CONTRACTS_PKG_VERSION)
```
