Skip to main content

cow_rs/
lib.rs

1//! `cow-rs` — Rust SDK for the `CoW` Protocol.
2//!
3//! Organised into sub-modules mirroring the `TypeScript` SDK packages:
4//!
5//! | Module | Purpose |
6//! |--------|---------|
7//! | [`config`] | Chain IDs, contract addresses, token constants |
8//! | [`order_book`] | Orderbook HTTP client and API types |
9//! | [`order_signing`] | `EIP-712` digest and ECDSA signing |
10//! | [`trading`] | High-level [`TradingSdk`] and fee-breakdown types |
11//! | [`app_data`] | Order metadata schema and `keccak256` hashing |
12//! | [`subgraph`] | Historical trading data via `GraphQL` |
13//! | [`composable`] | Conditional orders (`TWAP`) and Merkle multiplexer |
14//! | [`onchain`] | On-chain reading via JSON-RPC `eth_call` |
15//!
16//! # Quick start — `TradingSdk`
17//!
18//! ```rust,no_run
19//! use alloy_primitives::U256;
20//! use cow_rs::{OrderKind, SupportedChainId, TradeParameters, TradingSdk, TradingSdkConfig};
21//!
22//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
23//! let sdk = TradingSdk::new(
24//!     TradingSdkConfig::prod(SupportedChainId::Sepolia, "MyApp"),
25//!     "0xdeadbeef...",
26//! )?;
27//! let result = sdk
28//!     .post_swap_order(TradeParameters {
29//!         kind: OrderKind::Sell,
30//!         sell_token: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14".parse()?,
31//!         sell_token_decimals: 18,
32//!         buy_token: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238".parse()?,
33//!         buy_token_decimals: 6,
34//!         amount: U256::from(100_000_000_000_000_u64),
35//!         slippage_bps: Some(50),
36//!         receiver: None,
37//!         valid_for: None,
38//!         valid_to: None,
39//!         partially_fillable: None,
40//!         partner_fee: None,
41//!     })
42//!     .await?;
43//! println!("order: {}", result.order_id);
44//! # Ok(())
45//! # }
46//! ```
47
48#![deny(unsafe_code)]
49#![warn(missing_docs)]
50
51pub mod app_data;
52pub mod bridging;
53pub mod common;
54pub mod composable;
55pub mod config;
56pub mod cow_shed;
57pub mod erc20;
58pub mod error;
59pub mod ethflow;
60pub mod flash_loans;
61pub mod onchain;
62pub mod order_book;
63pub mod order_signing;
64pub mod permit;
65pub mod settlement;
66pub mod subgraph;
67pub mod trading;
68pub mod traits;
69pub mod types;
70pub mod weiroll;
71
72#[cfg_attr(
73    feature = "wasm",
74    allow(unsafe_code, reason = "wasm-bindgen macro generates unsafe glue code")
75)]
76pub mod browser_wallet;
77
78#[cfg(feature = "wasm")]
79#[allow(unsafe_code, reason = "wasm-bindgen macro generates unsafe glue code")]
80pub mod wasm;
81
82// ── Convenience re-exports ────────────────────────────────────────────────────
83
84pub use app_data::{
85    AppDataDoc, AppDataInfo, CidComponents, CowHook, DEFAULT_IPFS_READ_URI, DEFAULT_IPFS_WRITE_URI,
86    Ipfs, IpfsUploadResult, LATEST_APP_DATA_VERSION, Metadata, MetadataApi, OrderClassKind,
87    OrderInteractionHooks, PartnerFee, PartnerFeeEntry, Quote, Referrer, ReplacedOrder, Utm,
88    ValidationError, ValidationResult, Widget, appdata_hex, appdata_hex_to_cid, appdata_json,
89    assert_cid, build_app_data_doc, build_app_data_doc_full, build_order_app_data,
90    cid_to_appdata_hex, decode_cid, extract_digest, fetch_doc_from_app_data_hex,
91    fetch_doc_from_cid, get_app_data_info, get_app_data_schema, get_partner_fee_bps, import_schema,
92    merge_app_data_doc, parse_cid, pin_json_in_pinata_ipfs, stringify_deterministic,
93    upload_app_data_to_pinata, validate_app_data_doc,
94};
95#[allow(
96    deprecated,
97    reason = "re-exporting deprecated legacy functions for backwards compatibility"
98)]
99pub use app_data::{
100    app_data_hex_to_cid_legacy, fetch_doc_from_app_data_hex_legacy, get_app_data_info_legacy,
101    upload_metadata_doc_to_ipfs_legacy,
102};
103pub use bridging::{
104    ACROSS_DEPOSIT_EVENT_INTERFACE, BridgeError, BridgeProvider, BridgingSdk,
105    COW_TRADE_EVENT_INTERFACE, QuoteBridgeRequest, QuoteBridgeResponse, QuoteStrategy,
106    create_strategies, get_cache_key, safe_call_best_quote_callback,
107    safe_call_progressive_callback,
108};
109pub use composable::{
110    BlockInfo, COMPOSABLE_COW_ADDRESS, CURRENT_BLOCK_TIMESTAMP_FACTORY_ADDRESS,
111    ConditionalOrderFactory, ConditionalOrderKind, ConditionalOrderParams, DurationOfPart,
112    GAT_HANDLER_ADDRESS, GatData, GatOrder, GpV2OrderStruct, IsValidResult, MAX_FREQUENCY,
113    Multiplexer, OrderProof, PollResult, ProofLocation, ProofStruct, ProofWithParams,
114    STOP_LOSS_HANDLER_ADDRESS, StopLossData, StopLossOrder, TWAP_HANDLER_ADDRESS,
115    TestConditionalOrderParams, TwapData, TwapOrder, TwapStartTime, TwapStruct, balance_to_string,
116    create_calldata, create_set_domain_verifier_tx, create_test_conditional_order,
117    create_with_context_calldata, data_to_struct, decode_gat_static_input, decode_params,
118    decode_stop_loss_static_input, decode_twap_static_input, decode_twap_struct,
119    default_token_formatter, encode_gat_struct, encode_params, encode_stop_loss_struct,
120    encode_twap_struct, format_epoch, from_struct_to_order, get_block_info, get_domain_verifier,
121    get_domain_verifier_calldata, get_is_valid_result, is_composable_cow,
122    is_extensible_fallback_handler, is_valid_abi, kind_to_string, order_id, remove_calldata,
123    set_root_calldata, set_root_with_context_calldata, struct_to_data, transform_data_to_struct,
124    transform_struct_to_data,
125};
126pub use config::{
127    AdditionalTargetChainId, AddressPerChain, ApiBaseUrls, ApiContext, BARN_ETH_FLOW,
128    BTC_CURRENCY_ADDRESS, BUY_ETH_ADDRESS, COMPOSABLE_COW, ChainContract, ChainContracts,
129    ChainInfo, ChainRpcUrls, ChainTokenInfo, CowSwapConfig, DEPLOYER_CONTRACT, ETH_FLOW_PROD,
130    ETH_FLOW_STAGING, EVM_NATIVE_CURRENCY_ADDRESS, EXTENSIBLE_FALLBACK_HANDLER, Env, EvmCall,
131    EvmChainInfo, EvmChains, IpfsConfig, MAX_VALID_TO_EPOCH, NATIVE_CURRENCY_ADDRESS,
132    NonEvmChainInfo, NonEvmChains, ProtocolOptions, RAW_CHAINS_FILES_PATH, RAW_FILES_PATH, SALT,
133    SETTLEMENT_CONTRACT, SETTLEMENT_CONTRACT_STAGING, SOL_NATIVE_CURRENCY_ADDRESS,
134    SupportedChainId, TOKEN_LIST_IMAGES_PATH, TargetChainId, ThemedImage, TokenInfo, TokenRegistry,
135    VAULT_RELAYER, VAULT_RELAYER_STAGING, WebUrl, additional_target_chain_info,
136    all_additional_target_chain_ids, all_additional_target_chains, all_chain_ids, all_chains,
137    all_supported_chain_ids, all_supported_chains, api_base_url, api_url, composable_cow,
138    composable_cow_contract_address, cow_protocol_settlement_contract_address,
139    cow_protocol_vault_relayer_address, cow_protocol_vault_relayer_address_staging,
140    deterministic_deployment_address, eth_flow_for_env, extensible_fallback_handler,
141    extensible_fallback_handler_contract_address, get_chain_info, get_wrapped_token_for_chain,
142    implementation_address_slot, is_additional_target_chain, is_btc_chain, is_chain_deprecated,
143    is_chain_under_development, is_evm_chain, is_evm_chain_info, is_non_evm_chain,
144    is_non_evm_chain_info, is_supported_chain, is_target_chain_id, is_zk_sync_chain,
145    map_address_to_supported_networks, map_all_networks, map_supported_networks,
146    order_explorer_link, owner_address_slot, settlement_contract, settlement_contract_for_env,
147    supported_chain_info, tradable_supported_chain_ids, tradable_supported_chains, vault_relayer,
148    vault_relayer_for_env, wrapped_native_currency,
149};
150pub use cow_shed::{CowShedCall, CowShedHookParams, CowShedSdk};
151pub use erc20::{
152    build_eip2612_nonces_calldata, build_eip2612_version_calldata, build_erc20_allowance_calldata,
153    build_erc20_approve_calldata, build_erc20_balance_of_calldata, build_erc20_decimals_calldata,
154    build_erc20_name_calldata, build_erc20_transfer_calldata, build_erc20_transfer_from_calldata,
155};
156pub use error::CowError;
157pub use ethflow::{
158    EthFlowOrderData, EthFlowTransaction, build_eth_flow_transaction, encode_eth_flow_create_order,
159    is_eth_flow_order_data,
160};
161pub use flash_loans::{FlashLoanParams, FlashLoanProvider, FlashLoanSdk};
162pub use onchain::{OnchainReader, permit::OnchainTokenInfo};
163// `implementation_address` and `owner_address` are methods on `OnchainReader`.
164pub use order_book::{
165    AppDataObject, Auction, CompetitionAuction, CompetitionOrderStatus, CompetitionOrderStatusKind,
166    DEFAULT_RETRY_STATUS_CODES, EthflowData, GetOrdersRequest, GetTradesRequest, InteractionData,
167    OnchainOrderData, Order, OrderBookApi, OrderCancellations, OrderClass, OrderCreation,
168    OrderInteractions, OrderQuoteRequest, OrderQuoteResponse, OrderStatus, OrderUid,
169    PartnerFeeResult, ProtocolFeeAmountParams, QuoteAmounts, QuoteAmountsAndCostsParams,
170    QuoteAmountsAndCostsResult, QuoteCosts, QuoteData, QuoteFeeComponent, QuoteNetworkFee,
171    QuoteOrderParams, QuoteSide, RateLimiter, RetryPolicy, SolverCompetition, SolverExecution,
172    SolverSettlement, TotalSurplus, Trade, get_protocol_fee_amount,
173    get_quote_amounts_after_partner_fee, get_quote_amounts_after_slippage,
174    get_quote_amounts_and_costs, is_eth_flow_order, transform_order,
175};
176pub use order_signing::{
177    EIP1271_MAGICVALUE, ORDER_PRIMARY_TYPE, ORDER_TYPE_HASH, ORDER_UID_LENGTH, OrderDomain,
178    OrderFlags, OrderTypedData, OrderUidParams, PRE_SIGNED, SignOrderCancellationParams,
179    SignOrderCancellationsParams, SignOrderParams, SigningResult, TradeFlags, UnsignedOrder,
180    build_order_typed_data, cancellations_hash, compute_order_uid, decode_order_flags,
181    decode_signature_owner, decode_signing_scheme, decode_trade_flags, domain_separator,
182    domain_separator_from, eip1271_result, encode_order_flags, encode_signing_scheme,
183    encode_trade_flags, extract_order_uid_params, generate_order_id, get_domain, hash_order,
184    hash_order_cancellation, hash_order_cancellations, hash_typed_data, hashify,
185    invalidate_order_calldata, normalize_buy_token_balance, normalize_order, order_hash,
186    pack_order_uid_params, presign_result, set_pre_signature_calldata, sign_order,
187    sign_order_cancellation, sign_order_cancellations, signing_digest,
188};
189pub use permit::{
190    Erc20PermitInfo, PERMIT_GAS_LIMIT, PermitHookData, PermitInfo, build_permit_calldata,
191    build_permit_hook, permit_digest, permit_domain_separator, permit_type_hash, sign_permit,
192};
193pub use settlement::{
194    encoder::{EncodedInteraction, InteractionStage, SettlementEncoder},
195    reader::{AllowListReader, SettlementReader},
196    refunds::{OrderRefund, RefundType, ethflow_refund_calldata, settlement_refund_calldata},
197    simulator::{SimulationResult, TradeSimulator},
198    vault::{
199        VAULT_ACTIONS, grant_role_calldata, required_vault_role_calls,
200        required_vault_role_selectors, revoke_role_calldata, vault_role_hash,
201    },
202};
203pub use subgraph::{
204    Bundle, DailyTotal, DailyVolume, HourlyTotal, HourlyVolume, LAST_DAYS_VOLUME_QUERY,
205    LAST_HOURS_VOLUME_QUERY, PairDaily, PairHourly, SubgraphApi, SubgraphBlock, SubgraphMeta,
206    SubgraphOrder, SubgraphPair, SubgraphSettlement, SubgraphToken, SubgraphTrade, SubgraphUser,
207    TOTALS_QUERY, TokenDailyTotal, TokenHourlyTotal, TokenTradingEvent, Total, Totals, UniswapPool,
208    UniswapToken,
209};
210pub use trading::{
211    Amounts, BuildAppDataParams, DEFAULT_FEE_SLIPPAGE_FACTOR_PCT, DEFAULT_QUOTE_VALIDITY,
212    DEFAULT_SLIPPAGE_BPS, DEFAULT_VOLUME_SLIPPAGE_BPS, ETH_FLOW_DEFAULT_SLIPPAGE_BPS,
213    GAS_LIMIT_DEFAULT, LimitOrderAdvancedSettings, LimitTradeParameters,
214    LimitTradeParametersFromQuote, MAX_SLIPPAGE_BPS, NetworkFee, OrderPostingResult,
215    PartnerFeeCost, PostTradeAdditionalParams, ProtocolFeeCost, QuoteAmountsAndCosts, QuoteResults,
216    QuoteResultsWithSigner, QuoterParameters, SlippageToleranceRequest, SlippageToleranceResponse,
217    SwapAdvancedSettings, TradeParameters, TradingAppDataInfo, TradingSdk, TradingSdkConfig,
218    TradingTransactionParams, adjust_eth_flow_limit_order_params, adjust_eth_flow_order_params,
219    apply_percentage, apply_settings_to_limit_trade_parameters, bps_to_percentage, build_app_data,
220    calculate_gas_margin, calculate_unique_order_id, generate_app_data_from_doc,
221    get_default_slippage_bps, get_default_utm_params, get_eth_flow_cancellation,
222    get_eth_flow_contract, get_is_eth_flow_order, get_order_deadline_from_now, get_order_to_sign,
223    get_order_typed_data, get_quote_raw, get_quote_with_signer, get_settlement_cancellation,
224    get_settlement_contract, get_slippage_percent, get_trade_parameters_after_quote, get_trader,
225    map_quote_amounts_and_costs, percentage_to_bps, post_co_w_protocol_trade,
226    post_cow_protocol_trade, post_sell_native_currency_order, resolve_order_book_api,
227    resolve_signer, resolve_slippage_suggestion, suggest_slippage_bps, suggest_slippage_from_fee,
228    suggest_slippage_from_volume, swap_params_to_limit_order_params, unsigned_order_for_signing,
229};
230pub use traits::{CowSigner, IpfsClient, OrderbookClient, RpcProvider};
231pub use types::{
232    ATTESTATION_PREFIX_CONST, ATTESTATOR_ADDRESS, ATTESTION_VERSION_BYTE, EcdsaSigningScheme,
233    HUNDRED_THOUSANDS, LIMIT_CONCURRENT_REQUESTS, MAX_UINT32, MAX_UINT256, ONE, ONE_HUNDRED_BPS,
234    OrderKind, PriceQuality, SigningScheme, TokenBalance, ZERO, ZERO_ADDRESS, ZERO_HASH,
235};
236pub use weiroll::{
237    WEIROLL_ADDRESS, WeirollCommand, WeirollCommandFlags, WeirollContractRef, WeirollPlanner,
238    WeirollScript, create_weiroll_contract, create_weiroll_delegate_call, create_weiroll_library,
239    define_read_only, get_static,
240};