agentswap 0.11.2

AgentSwap CLI for requesting quotes, inspecting tokens and pools, managing intents, and registering an API key against the AgentSwap service.
// Net-proceeds reporting from actual decoded RPC logs.
// Fee-bearing intent fills and market receipts never substitute a quote for received value.
use super::*;
use alloy::{primitives::U256, sol_types::SolEvent};
use crate::service::test_rpc::{TestRpc, ok};
use serde_json::json;

#[tokio::test]
async fn batch_sell_received_decodes_net_fill_and_market_receipt() {
    let config = evm::chain_config("8453").unwrap();
    let proxy = Address::repeat_byte(6);
    let receive = Address::repeat_byte(3);
    let id = B256::repeat_byte(1);
    let fill = IntentSettlerV3::IntentFilled { id, owner:Address::repeat_byte(4), solver:Address::repeat_byte(5),
        recipient:Address::repeat_byte(4), caller:Address::repeat_byte(5), amountIn:U256::from(100), requiredOut:U256::from(90),
        fee:U256::from(3), receivedOut:U256::from(98), aboveFloor:U256::from(8) }.encode_log_data();
    let market = ExecutedAsAgent { agent:Address::repeat_byte(2), router:Address::repeat_byte(5), relayer:Address::repeat_byte(2),
        tokenIn:Address::repeat_byte(1), tokenOut:receive, amountIn:U256::from(100), amountOut:U256::from(97) }.encode_log_data();
    let rpc = TestRpc::start(move |body| Some(ok(body, match body["method"].as_str().unwrap() {
        "eth_blockNumber" => json!("0x2"),
        "eth_getLogs" => json!([{"address":config.settler,"topics":fill.topics(),"data":fill.data,"blockNumber":"0x1","logIndex":"0x0","transactionIndex":"0x0"}]),
        "eth_getTransactionReceipt" => json!({"type":"0x2","status":"0x1","cumulativeGasUsed":"0x5208",
            "logs":[{"address":proxy,"topics":market.topics(),"data":market.data,"blockNumber":"0x1","logIndex":"0x0","transactionIndex":"0x0"}],
            "logsBloom":format!("0x{}","0".repeat(512)),"transactionHash":id,"transactionIndex":"0x0", "blockHash":B256::ZERO,
            "blockNumber":"0x1","gasUsed":"0x5208","effectiveGasPrice":"0x1","from":Address::ZERO,"to":proxy,"contractAddress":null}),
        other => panic!("unexpected {other}"),
    })));
    let provider = evm::read_provider(&rpc.url).unwrap();
    let mut row = Row::new(Address::repeat_byte(1).to_string());
    row.amount_raw = "100".into(); row.intent_id = Some(id.to_string()); row.placement_block = Some(1);
    assert_eq!(intent_received(&provider, config, &row).await.unwrap(), "95");
    row.tx_hash = Some(id.to_string());
    assert_eq!(market_received(&provider, proxy, receive, &row).await.unwrap(), "97");
    assert!(market_received(&provider, Address::ZERO, receive, &row).await.is_err());
}