#![cfg(all(feature = "client", feature = "evm", feature = "solana"))]
use std::env;
use aspens::commands::trading::send_order::send_order_with_wallet;
use aspens::wallet::{load_trader_wallet, CurveType};
use aspens::AspensClient;
use eyre::{eyre, Result};
const DEFAULT_QUANTITY: &str = "0.001";
const DEFAULT_SIDE: &str = "ASK";
const ARCH_EVM: &str = "EVM";
const ARCH_SOLANA: &str = "Solana";
#[tokio::test]
#[ignore = "requires a live arborter + configured chains + deposited trader balance"]
async fn send_order_roundtrip_against_live_stack() -> Result<()> {
let client = AspensClient::builder().build()?;
let config = client.get_config().await?;
let market_id = env::var("SDK_LIVE_TEST_MARKET_ID")
.map_err(|_| eyre!("SDK_LIVE_TEST_MARKET_ID env var is required (see test doc)"))?;
let market = aspens::commands::trading::send_order::lookup_market(&config, &market_id)?.clone();
let side_s = env::var("SDK_LIVE_TEST_SIDE").unwrap_or_else(|_| DEFAULT_SIDE.to_string());
let side = match side_s.to_ascii_uppercase().as_str() {
"BID" => 1i32,
"ASK" => 2i32,
other => {
return Err(eyre!(
"unknown SDK_LIVE_TEST_SIDE {other:?} — want BID or ASK"
))
}
};
let origin_network = if side == 1 {
&market.quote_chain_network
} else {
&market.base_chain_network
};
let origin_chain = config
.get_chain(origin_network)
.ok_or_else(|| eyre!("origin chain {origin_network:?} not in config"))?;
let curve = match origin_chain.architecture.as_str() {
ARCH_EVM => CurveType::Secp256k1,
ARCH_SOLANA => CurveType::Ed25519,
other => return Err(eyre!("unsupported architecture {other:?}")),
};
let wallet = load_trader_wallet(curve)?;
let quantity =
env::var("SDK_LIVE_TEST_QUANTITY").unwrap_or_else(|_| DEFAULT_QUANTITY.to_string());
let price = env::var("SDK_LIVE_TEST_PRICE").ok();
tracing::info!(
market = %market.market_id,
%side,
%quantity,
?price,
origin = %origin_network,
arch = %origin_chain.architecture,
addr = %wallet.address(),
"submitting gasless order against live arborter"
);
let response = send_order_with_wallet(
client.stack_url().to_string(),
market_id,
side,
quantity,
price,
&wallet,
config,
)
.await?;
let tx_hashes: Vec<&str> = response
.transaction_hashes
.iter()
.map(|t| t.hash_type.as_str())
.collect();
assert!(
tx_hashes.contains(&"send_order_tx"),
"expected a send_order_tx in response.transaction_hashes, got: {tx_hashes:?}"
);
assert!(
response.order_in_book || !response.trades.is_empty(),
"order didn't land in the book and didn't match — arborter may have rejected: {response:?}"
);
Ok(())
}