use ethers::abi::encode;
use ethers::abi::Token;
use ethers::types::{Address, U256};
use ethers::utils::keccak256;
use crate::contracts;
use crate::types::Transaction;
pub fn split_position(
collateral_token: &str,
parent_collection: [u8; 32],
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
let collateral: Address = collateral_token.parse().expect("invalid collateral address");
let selector = keccak256(b"splitPosition(address,bytes32,bytes32,uint256[],uint256)");
let mut calldata = selector[..4].to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(collateral),
Token::FixedBytes(parent_collection.to_vec()),
Token::FixedBytes(condition_id.to_vec()),
Token::Array(partition.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
Token::Uint(amount),
]));
Transaction {
to: contracts::CTF.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn merge_positions(
collateral_token: &str,
parent_collection: [u8; 32],
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
let collateral: Address = collateral_token.parse().expect("invalid collateral address");
let selector = keccak256(b"mergePositions(address,bytes32,bytes32,uint256[],uint256)");
let mut calldata = selector[..4].to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(collateral),
Token::FixedBytes(parent_collection.to_vec()),
Token::FixedBytes(condition_id.to_vec()),
Token::Array(partition.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
Token::Uint(amount),
]));
Transaction {
to: contracts::CTF.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn split_regular(condition_id: [u8; 32], partition: &[u64], amount: U256) -> Transaction {
split_position(contracts::USDC_E, [0u8; 32], condition_id, partition, amount)
}
pub fn merge_regular(condition_id: [u8; 32], partition: &[u64], amount: U256) -> Transaction {
merge_positions(contracts::USDC_E, [0u8; 32], condition_id, partition, amount)
}
pub fn split_position_via_adapter(
adapter: &str,
collateral_token: &str,
parent_collection: [u8; 32],
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
let collateral: Address = collateral_token.parse().expect("invalid collateral address");
let selector = keccak256(b"splitPosition(address,bytes32,bytes32,uint256[],uint256)");
let mut calldata = selector[..4].to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(collateral),
Token::FixedBytes(parent_collection.to_vec()),
Token::FixedBytes(condition_id.to_vec()),
Token::Array(partition.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
Token::Uint(amount),
]));
Transaction {
to: adapter.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn merge_positions_via_adapter(
adapter: &str,
collateral_token: &str,
parent_collection: [u8; 32],
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
let collateral: Address = collateral_token.parse().expect("invalid collateral address");
let selector = keccak256(b"mergePositions(address,bytes32,bytes32,uint256[],uint256)");
let mut calldata = selector[..4].to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(collateral),
Token::FixedBytes(parent_collection.to_vec()),
Token::FixedBytes(condition_id.to_vec()),
Token::Array(partition.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
Token::Uint(amount),
]));
Transaction {
to: adapter.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn split_pusd(condition_id: [u8; 32], partition: &[u64], amount: U256) -> Transaction {
split_position_via_adapter(
contracts::CTF_COLLATERAL_ADAPTER,
contracts::PUSD,
[0u8; 32],
condition_id,
partition,
amount,
)
}
pub fn merge_pusd(condition_id: [u8; 32], partition: &[u64], amount: U256) -> Transaction {
merge_positions_via_adapter(
contracts::CTF_COLLATERAL_ADAPTER,
contracts::PUSD,
[0u8; 32],
condition_id,
partition,
amount,
)
}
pub fn split_pusd_neg_risk(
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
split_position_via_adapter(
contracts::NEG_RISK_CTF_COLLATERAL_ADAPTER,
contracts::PUSD,
[0u8; 32],
condition_id,
partition,
amount,
)
}
pub fn merge_pusd_neg_risk(
condition_id: [u8; 32],
partition: &[u64],
amount: U256,
) -> Transaction {
merge_positions_via_adapter(
contracts::NEG_RISK_CTF_COLLATERAL_ADAPTER,
contracts::PUSD,
[0u8; 32],
condition_id,
partition,
amount,
)
}