cow_composable/lib.rs
1//! `cow-composable` — Layer 5 `CoW` Protocol composable (conditional) orders for the `CoW`
2//! Protocol SDK.
3//!
4//! Composable orders are validated on-chain by handler contracts and managed
5//! through the `ComposableCow` factory. This module provides:
6//!
7//! - [`TwapOrder`] — Time-Weighted Average Price orders with ABI encoding
8//! - [`Multiplexer`] — manages multiple orders under a single Merkle root
9//! - [`ConditionalOrderFactory`] — decode on-chain params into typed orders
10//! - [`create_calldata`] / [`remove_calldata`] — `ComposableCow` calldata builders
11//! - [`create_with_context_calldata`] — `createWithContext` for `AtMiningTime` TWAP orders
12//!
13//! # Example — single `TWAP` order
14//!
15//! ```rust,no_run
16//! use alloy_primitives::{Address, B256, U256};
17//! use cow_composable::{DurationOfPart, TwapData, TwapOrder, TwapStartTime};
18//! use cow_types::OrderKind;
19//!
20//! # fn example() -> Result<(), Box<dyn std::error::Error>> {
21//! let data = TwapData {
22//! sell_token: Address::ZERO,
23//! buy_token: Address::ZERO,
24//! receiver: Address::ZERO,
25//! sell_amount: U256::from(24_000_000u64), // divisible by num_parts
26//! buy_amount: U256::from(21_600_000u64),
27//! start_time: TwapStartTime::AtMiningTime,
28//! part_duration: 3_600,
29//! num_parts: 24,
30//! app_data: B256::ZERO,
31//! partially_fillable: false,
32//! kind: OrderKind::Sell,
33//! duration_of_part: DurationOfPart::Auto,
34//! };
35//!
36//! let order = TwapOrder::new(data);
37//! assert!(order.is_valid());
38//! let params = order.to_params()?;
39//! let cd = cow_composable::create_calldata(¶ms, &[], &[]);
40//! println!("calldata: 0x{}", alloy_primitives::hex::encode(&cd));
41//! # Ok(())
42//! # }
43//! ```
44
45#![deny(unsafe_code)]
46#![warn(missing_docs)]
47
48pub mod calldata;
49pub mod factory;
50pub mod gat;
51pub mod multiplexer;
52pub mod stop_loss;
53pub mod twap;
54pub mod types;
55pub mod utils;
56
57pub use calldata::{
58 create_calldata, create_with_context_calldata, remove_calldata, set_root_calldata,
59 set_root_with_context_calldata,
60};
61pub use factory::{ConditionalOrderFactory, ConditionalOrderKind};
62pub use gat::{GAT_HANDLER_ADDRESS, GatData, GatOrder, decode_gat_static_input, encode_gat_struct};
63pub use multiplexer::{Multiplexer, OrderProof, ProofWithParams};
64pub use stop_loss::{
65 STOP_LOSS_HANDLER_ADDRESS, StopLossData, StopLossOrder, decode_stop_loss_static_input,
66 encode_stop_loss_struct,
67};
68pub use twap::{
69 TwapOrder, data_to_struct, decode_params, decode_twap_static_input, decode_twap_struct,
70 encode_params, encode_twap_struct, format_epoch, order_id, struct_to_data,
71};
72pub use types::{
73 BlockInfo, COMPOSABLE_COW_ADDRESS, CURRENT_BLOCK_TIMESTAMP_FACTORY_ADDRESS,
74 ConditionalOrderParams, DEFAULT_TEST_HANDLER, DEFAULT_TEST_SALT, DurationOfPart,
75 GpV2OrderStruct, IsNotValid, IsValid, IsValidResult, MAX_FREQUENCY, PollResult, ProofLocation,
76 ProofStruct, TWAP_HANDLER_ADDRESS, TestConditionalOrderParams, TwapData, TwapStartTime,
77 TwapStruct, create_test_conditional_order,
78};
79pub use utils::{
80 balance_to_string, create_set_domain_verifier_tx, default_token_formatter,
81 from_struct_to_order, get_block_info, get_domain_verifier, get_domain_verifier_calldata,
82 get_is_valid_result, is_composable_cow, is_extensible_fallback_handler, is_valid_abi,
83 kind_to_string, transform_data_to_struct, transform_struct_to_data,
84};