use super::constants::{CTF, NEG_RISK_ADAPTER, USDC};
use super::types::TransactionRequest;
pub fn build_split_txn(condition_id: &str, amount: f64, neg_risk: bool) -> TransactionRequest {
let amount_raw = (amount * 1_000_000.0) as u64;
if neg_risk {
let mut data = vec![0xa3, 0xd7, 0xda, 0x1d]; data.extend_from_slice(&decode_bytes32(condition_id));
data.extend_from_slice(&pad_u256(amount_raw));
TransactionRequest {
to: NEG_RISK_ADAPTER.to_string(),
data: format!("0x{}", hex::encode(&data)),
value: "0".to_string(),
}
} else {
let mut data = vec![0x72, 0x10, 0x85, 0x03]; data.extend_from_slice(&pad_address(USDC));
data.extend_from_slice(&[0u8; 32]); data.extend_from_slice(&decode_bytes32(condition_id));
data.extend_from_slice(&pad_u256(160)); data.extend_from_slice(&pad_u256(amount_raw));
data.extend_from_slice(&pad_u256(2));
data.extend_from_slice(&pad_u256(1));
data.extend_from_slice(&pad_u256(2));
TransactionRequest {
to: CTF.to_string(),
data: format!("0x{}", hex::encode(&data)),
value: "0".to_string(),
}
}
}
pub fn build_merge_txn(condition_id: &str, amount: f64, neg_risk: bool) -> TransactionRequest {
let amount_raw = (amount * 1_000_000.0) as u64;
if neg_risk {
let mut data = vec![0x5d, 0x03, 0xf4, 0x53]; data.extend_from_slice(&decode_bytes32(condition_id));
data.extend_from_slice(&pad_u256(amount_raw));
TransactionRequest {
to: NEG_RISK_ADAPTER.to_string(),
data: format!("0x{}", hex::encode(&data)),
value: "0".to_string(),
}
} else {
let mut data = vec![0xca, 0xd9, 0x44, 0x0e]; data.extend_from_slice(&pad_address(USDC));
data.extend_from_slice(&[0u8; 32]);
data.extend_from_slice(&decode_bytes32(condition_id));
data.extend_from_slice(&pad_u256(160));
data.extend_from_slice(&pad_u256(amount_raw));
data.extend_from_slice(&pad_u256(2));
data.extend_from_slice(&pad_u256(1));
data.extend_from_slice(&pad_u256(2));
TransactionRequest {
to: CTF.to_string(),
data: format!("0x{}", hex::encode(&data)),
value: "0".to_string(),
}
}
}
pub fn build_convert_txn(
market_id: &str,
outcome_indices: &[u32],
amount: f64,
) -> TransactionRequest {
let amount_raw = (amount * 1_000_000.0) as u64;
let mut index_set: u128 = 0;
for &idx in outcome_indices {
index_set |= 1u128 << idx;
}
let mut data = vec![0xc6, 0x47, 0x48, 0xc4]; data.extend_from_slice(&decode_bytes32(market_id));
data.extend_from_slice(&pad_u128(index_set));
data.extend_from_slice(&pad_u256(amount_raw));
TransactionRequest {
to: NEG_RISK_ADAPTER.to_string(),
data: format!("0x{}", hex::encode(&data)),
value: "0".to_string(),
}
}
fn decode_bytes32(hex_str: &str) -> [u8; 32] {
let s = hex_str.strip_prefix("0x").unwrap_or(hex_str);
let mut out = [0u8; 32];
let bytes = hex::decode(s).unwrap_or_default();
let start = 32usize.saturating_sub(bytes.len());
out[start..].copy_from_slice(&bytes[..bytes.len().min(32)]);
out
}
fn pad_address(addr: &str) -> [u8; 32] {
let s = addr.strip_prefix("0x").unwrap_or(addr);
let mut out = [0u8; 32];
let bytes = hex::decode(s).unwrap_or_default();
let start = 32 - bytes.len().min(20);
out[start..start + bytes.len().min(20)].copy_from_slice(&bytes[..bytes.len().min(20)]);
out
}
fn pad_u256(val: u64) -> [u8; 32] {
let mut out = [0u8; 32];
out[24..32].copy_from_slice(&val.to_be_bytes());
out
}
fn pad_u128(val: u128) -> [u8; 32] {
let mut out = [0u8; 32];
out[16..32].copy_from_slice(&val.to_be_bytes());
out
}