use crate::account::{ActionKind, Signers};
use crate::client::Network;
use crate::utils::sign::{L1Action, Map};
use crate::utils::{Address, BadUnits, Dec, USDC_DECIMALS, exact_units};
const fn address(text: &str) -> Address {
match Address::parse_const(text) {
Some(address) => address,
None => Address::ZERO,
}
}
pub const MAINNET_HLP: Address = address("0xdfc24b077bc1425ad1dea75bcb6f8158e10df303");
pub const TESTNET_HLP: Address = address("0xa15099a30bbf2e68942d6f4c43d70d04faeab0a0");
pub const HLP_LOCKUP_MS: u64 = 4 * 86_400_000;
pub const MAINNET_VAULT_LOCKUP_MS: u64 = 86_400_000;
pub const TESTNET_VAULT_LOCKUP_MS: u64 = 20_000;
#[must_use]
pub const fn hlp(network: Network) -> Address {
match network {
Network::Mainnet => MAINNET_HLP,
Network::Testnet => TESTNET_HLP,
}
}
#[must_use]
pub fn lockup_ms(network: Network, vault: Address) -> u64 {
match (vault == hlp(network), network) {
(true, _) => HLP_LOCKUP_MS,
(false, Network::Mainnet) => MAINNET_VAULT_LOCKUP_MS,
(false, Network::Testnet) => TESTNET_VAULT_LOCKUP_MS,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VaultTransfer {
vault: Address,
is_deposit: bool,
usd: u64,
}
impl VaultTransfer {
pub const KEY: Signers = ActionKind::VaultTransfer.signers();
pub fn deposit(vault: Address, usdc: Dec) -> Result<VaultTransfer, BadUnits> {
Ok(VaultTransfer { vault, is_deposit: true, usd: exact_units(usdc, USDC_DECIMALS)? })
}
pub fn withdraw(vault: Address, usdc: Dec) -> Result<VaultTransfer, BadUnits> {
Ok(VaultTransfer { vault, is_deposit: false, usd: exact_units(usdc, USDC_DECIMALS)? })
}
#[must_use]
pub const fn from_micros(vault: Address, is_deposit: bool, usd: u64) -> VaultTransfer {
VaultTransfer { vault, is_deposit, usd }
}
#[must_use]
pub const fn usd(&self) -> u64 {
self.usd
}
#[must_use]
pub const fn vault(&self) -> Address {
self.vault
}
}
impl L1Action for VaultTransfer {
fn action(&self) -> Map {
Map::new()
.put("type", "vaultTransfer")
.put("vaultAddress", self.vault.to_hex())
.put("isDeposit", self.is_deposit)
.put("usd", self.usd)
}
}