flowchart LR
SDK[cow-sdk]
OrderBookApi
SubgraphApi
MetadataApi
SDK --> OrderBookApi
SDK --> SubgraphApi
SDK --> MetadataApi
The SDK has 3 main APIs
- Order Book API: Allows to get the open orders, historic orders, post new orders, etc.
- Subgraph API: Provides access to on-chain data indexed by The Graph
- Metadata API: Allows to encode/decode meta-data to be attached in orders
The orders model used for the API is organized in a hierarchy:
classDiagram
OrderParameters <|-- OrderCreation
OrderCreation <|-- Order
OrderMetaData <|-- Order
Order <|-- EnrichedOrder
classDiagram
class OrderParameters {
+ sellAmount: TokenAmount;
+ buyAmount: TokenAmount;
+ validTo: number;
+ feeAmount: TokenAmount;
+ kind: OrderKind;
+ partiallyFillable: boolean;
}
Address
class SellTokenSource {
<<enum>>
ERC20 = 'erc20'
INTERNAL = 'internal'
EXTERNAL = 'external'
}
class BuyTokenDestination{
<<enum>>
ERC20 = 'erc20',
INTERNAL = 'internal',
}
class SigningScheme{
<<enum>>
EIP712 = 'eip712',
ETHSIGN = 'ethsign',
PRESIGN = 'presign',
EIP1271 = 'eip1271',
}
class AppData {
string
}
class OrderKind {
<<enum>>
BUY = 'buy'
SELL = 'sell'
}
OrderParameters --> Address: sellToken
OrderParameters --> Address: buyToken
OrderParameters --> OrderKind: kind
OrderParameters "0..1" --> SellTokenSource: sellTokenBalance
OrderParameters "0..1" --> BuyTokenDestination: buyTokenBalance
OrderParameters --> SigningScheme: signingScheme
OrderParameters "0..1" --> Address: receiver
OrderParameters --> AppData: appData
class OrderCreation {
+ signingScheme: SigningScheme;
+ signature: Signature
+ from?: Address | null
+ quoteId?: number | null
}
class OrderMetaData {
+ creationDate: string;
+ uid: UID;
+ invalidated: boolean;
+ availableBalance?: TokenAmount | null;
+ executedSellAmount: BigUint;
+ executedSellAmountBeforeFees: BigUint;
+ executedBuyAmount: BigUint;
+ executedFeeAmount: BigUint;
+ fullFeeAmount?: TokenAmount;
+ isLiquidityOrder?: boolean;
+ onchainUser?: Address;
+ executedFee?: BigUint | null;
}
class OrderStatus {
<<enum>>
PRESIGNATURE_PENDING = 'presignaturePending'
OPEN = 'open'
FULFILLED = 'fulfilled'
CANCELLED = 'cancelled'
EXPIRED = 'expired'
}
class EthflowData {
+ refundTxHash: TransactionHash | null;
+ userValidTo: number;
+ isRefunded: boolean;
}
OrderMetaData --> OrderStatus: status
OrderMetaData --> OrderClass: class
OrderMetaData --> Address2: owner
OrderMetaData "0..1" --> EthflowData: ethflowData
OrderMetaData "0..1" --> OnchainOrderData: onchainOrderData
class OrderClass {
<<enum>>
MARKET = 'market'
LIMIT = 'limit'
LIQUIDITY = 'liquidity'
}
class EnrichedOrder{
totalFee: string
}
OrderParameters <|-- OrderCreation
OrderCreation <|-- Order
OrderMetaData <|-- Order
Order <|-- EnrichedOrder
cssClass "OrderParameters,OrderCreation,OrderMetaData, Order" important
classDiagram
class Trades {
+ orderUid: UID
+ blockNumber: number
+ logIndex: number
+ sellAmountBeforeFees: BigUint
}
Trades --> Address: sellToken
Trades --> Address: buyToken
Trades --> Address: owner
Trades --> TokenAmount: sellAmount
Trades --> TokenAmount: buyAmount
Trades "0..1" --> TransactionHash: txHash
Allows to get the open orders, historic orders, post new orders, etc.
The API allows to
classDiagram
class CowApi {
+ getTrades(params) Promise~Trades[]~
+ getOrders(parmas): Promise~EnrichedOrder[]~
+ getTxOrders(tx: string): Promise~EnrichedOrder[]~
+ getOrder(uid: UID): Promise~EnrichedOrder~
+ getQuote(quote: OrderQuoteRequest): Promise~OrderQuoteResponse~
+ sendSignedOrderCancellation(uid: UID, params): Promise~void~
+ sendOrder(order: OrderCreation): Promise~UID~
+ getOrderLink(uid: UID): string
}
class OrderQuoteRequest {
+ sellToken: Address;
+ buyToken: Address;
// ...
}
class OrderQuoteResponse{
+ id?: number
+ from?: Address
+ expiration?: string
}
OrderQuoteResponse "0..1" --> OrderParameters: quote
CowApi ..> Trade
CowApi ..> EnrichedOrder
CowApi ..> SignedOrder
CowApi ..> OrderCreation
CowApi ..> OrderQuoteResponse
CowApi ..> OrderQuoteRequest
Provides access to on-chain data indexed by The Graph
⚽️ Playground
NOTE: For details about the model, it's better to check the schema using the exported Typescript, or by reviewing the schema definition.
classDiagram
class CowSubgraphApi {
+ getTotals(): Promise~Total~
+ getLastHoursVolume(): Promise~LastHoursVolumeQuery~
+ getLastDaysVolume(): Promise~LastDaysVolumeQuery~
+ runQuery(query, variables): Promise~T~
}
class Total {
+ volumeUsd
+ volumeEth
+ feesUsd
+ feesEth
...
}
class LastHoursVolumeQuery{
volumeUsd: string
...
}
class LastDaysVolumeQuery{
volumeUsd: string
...
}
CowSubgraphApi ..> Total
CowSubgraphApi ..> LastHoursVolumeQuery
CowSubgraphApi ..> LastDaysVolumeQuery
Allows to encode/decode meta-data to be attached in orders
classDiagram
class MetadataApi {
+ generateAppDataDoc(params: GenerateAppDataDocParams): AppDataDoc
+ validateAppDataDoc(appDataDoc: AppDataDoc): ValidateResult
+ calculateAppDataHash(appDataDoc: AppDataDoc): Promise~IpfsHashInfo|void~
+ uploadMetadataDocToIpfs(appDataDoc: AppDataDoc, ipfsConfig): Promise~string|void~
+ decodeAppData(hash: string): AppDataDoc
+ appDataHexToCid(hash: string): Promise~string|void~
}
class AppDataDoc {
version: Version;
appCode?: string;
environment?: string;
}
AppDataDoc --> Metadata: metadata
class Referrer {
version: string;
address: string;
}
class Quote {
version: string;
address: string;
}
class IpfsHashInfo {
+ cidV0: string
+ appDataHash: string
}
class OrderClass {
version: string;
orderClass: string;
}
class AppDataParams {
...
}
class Metadata {
...
}
class MetadataParams {
...
}
MetadataApi ..> IpfsHashInfo
MetadataApi ..> GenerateAppDataDocParams
MetadataApi ..> AppDataDoc
GenerateAppDataDocParams --> AppDataParams: appDataParams
GenerateAppDataDocParams --> MetadataParams: metadataParams
Metadata --> Referrer: referrer
Metadata --> Quote: quote
Metadata --> OrderClass: orderClass