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 redeem_positions(
collateral_token: &str,
parent_collection: [u8; 32],
condition_id: [u8; 32],
index_sets: &[u64],
) -> Transaction {
let collateral: Address = collateral_token.parse().expect("invalid collateral address");
let selector = keccak256(b"redeemPositions(address,bytes32,bytes32,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(index_sets.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
]));
Transaction {
to: contracts::CTF.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn redeem_neg_risk_positions(
condition_id: [u8; 32],
index_sets: &[u64],
) -> Transaction {
let selector = keccak256(b"redeemPositions(bytes32,uint256[])");
let mut calldata = selector[..4].to_vec();
calldata.extend_from_slice(&encode(&[
Token::FixedBytes(condition_id.to_vec()),
Token::Array(index_sets.iter().map(|&i| Token::Uint(U256::from(i))).collect()),
]));
Transaction {
to: contracts::NEG_RISK_ADAPTER.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn redeem_regular(condition_id: [u8; 32], index_sets: &[u64]) -> Transaction {
redeem_positions(contracts::USDC_E, [0u8; 32], condition_id, index_sets)
}