use ethers::abi::encode;
use ethers::abi::Token;
use ethers::types::{Address, U256};
use crate::contracts;
use crate::types::Transaction;
pub fn approve(token: &str, spender: &str, amount: U256) -> Transaction {
let spender_addr: Address = spender.parse().expect("invalid spender address");
let mut calldata = contracts::APPROVE_SELECTOR.to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(spender_addr),
Token::Uint(amount),
]));
Transaction {
to: token.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn set_approval_for_all(token: &str, operator: &str, approved: bool) -> Transaction {
let operator_addr: Address = operator.parse().expect("invalid operator address");
let mut calldata = contracts::SET_APPROVAL_FOR_ALL_SELECTOR.to_vec();
calldata.extend_from_slice(&encode(&[
Token::Address(operator_addr),
Token::Bool(approved),
]));
Transaction {
to: token.to_string(),
data: format!("0x{}", hex::encode(&calldata)),
value: "0".to_string(),
}
}
pub fn approve_usdc_for_ctf_exchange() -> Transaction {
approve(contracts::USDC_E, contracts::CTF_EXCHANGE, U256::MAX)
}
pub fn approve_usdc_for_neg_risk_exchange() -> Transaction {
approve(contracts::USDC_E, contracts::NEG_RISK_EXCHANGE, U256::MAX)
}
pub fn approve_ctf_for_ctf_exchange() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::CTF_EXCHANGE, true)
}
pub fn approve_ctf_for_neg_risk_exchange() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::NEG_RISK_EXCHANGE, true)
}
pub fn approve_ctf_for_neg_risk_adapter() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::NEG_RISK_ADAPTER, true)
}
pub fn approve_pusd_for_ctf_exchange_v2() -> Transaction {
approve(contracts::PUSD, contracts::CTF_EXCHANGE_V2, U256::MAX)
}
pub fn approve_pusd_for_neg_risk_exchange_v2() -> Transaction {
approve(contracts::PUSD, contracts::NEG_RISK_EXCHANGE_V2, U256::MAX)
}
pub fn approve_pusd_for_ctf_adapter() -> Transaction {
approve(contracts::PUSD, contracts::CTF_COLLATERAL_ADAPTER, U256::MAX)
}
pub fn approve_pusd_for_neg_risk_ctf_adapter() -> Transaction {
approve(
contracts::PUSD,
contracts::NEG_RISK_CTF_COLLATERAL_ADAPTER,
U256::MAX,
)
}
pub fn approve_ctf_for_ctf_exchange_v2() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::CTF_EXCHANGE_V2, true)
}
pub fn approve_ctf_for_neg_risk_exchange_v2() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::NEG_RISK_EXCHANGE_V2, true)
}
pub fn approve_ctf_for_ctf_adapter() -> Transaction {
set_approval_for_all(contracts::CTF, contracts::CTF_COLLATERAL_ADAPTER, true)
}
pub fn approve_ctf_for_neg_risk_ctf_adapter() -> Transaction {
set_approval_for_all(
contracts::CTF,
contracts::NEG_RISK_CTF_COLLATERAL_ADAPTER,
true,
)
}