pub mod bond;
pub mod client;
pub mod error;
pub mod intent;
pub mod mesh;
pub mod oracle;
pub mod policy;
pub mod primitives;
pub mod route;
pub mod venue;
#[cfg(feature = "scematica")]
pub mod integration;
#[cfg(feature = "ai")]
pub mod ai;
#[cfg(feature = "net")]
pub mod net;
pub use bond::{
Bond, BondConfig, BondEngine, BondLedger, BondOutcome, EscrowBondEngine, NoBondEngine,
};
pub use client::ScemaDex;
pub use error::{Result, ScemaDexError};
pub use intent::{Constraints, Intent, Objective, Side};
pub use mesh::{ExperienceBatch, InferenceOffer, LocalPeerMarket, PeerMarket};
pub use oracle::{Advice, PoolScore, Reputation, SignalSource};
pub use policy::{Conviction, ReferenceRoutePolicy, RoutePolicy, Solution};
pub use primitives::{Address, Amount, Usdc};
pub use route::{Fill, Route, RouteLeg, Venue};
pub use venue::{SimVenueExecutor, SwapInstructions, VenueExecutor};
pub fn reference_client() -> ScemaDex<ReferenceRoutePolicy, NoBondEngine, SimVenueExecutor> {
ScemaDex::new(ReferenceRoutePolicy, NoBondEngine, SimVenueExecutor)
}
pub fn demo_intent() -> Intent {
Intent {
input_mint: Address::new("So11111111111111111111111111111111111111112")
.expect("valid WSOL mint"),
output_mint: Address::new("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
.expect("valid USDC mint"),
amount_in: Amount::new(1_000_000_000, 9), side: Side::Sell,
objective: Objective::Price,
constraints: Constraints {
max_slippage_bps: 150,
deadline_unix: 0,
max_legs: Some(3),
},
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn quote_produces_valid_bonded_solution() {
let dex = reference_client();
let (solution, bond) = dex.quote(&demo_intent()).await.unwrap();
assert!(solution.route.splits_valid(), "splits must sum to 10_000 bps");
assert!((0.0..=1.0).contains(&solution.conviction.0));
assert_eq!(bond.intent_digest, solution.intent_digest);
}
#[tokio::test]
async fn execute_honors_bond_when_fill_meets_promise() {
let dex = reference_client();
let (fill, outcome) = dex.execute(&demo_intent()).await.unwrap();
assert!(fill.amount_out.raw > 0);
assert_eq!(outcome, BondOutcome::Honored);
}
#[test]
fn intent_digest_is_stable() {
let a = demo_intent().digest();
let b = demo_intent().digest();
assert_eq!(a, b);
}
}