use crate::constants::{COLLATERAL_HASH, MAINNET_STAKE_HASH, PREPROD_STAKE_HASH};
use anyhow::{Context, Result};
use hex;
use pallas_addresses::{
Address, Network, PaymentKeyHash, ScriptHash, ShelleyAddress, ShelleyDelegationPart,
ShelleyPaymentPart, StakeKeyHash,
};
pub fn stake_key(network_flag: bool) -> String {
if network_flag {
hex::encode(PREPROD_STAKE_HASH)
} else {
hex::encode(MAINNET_STAKE_HASH)
}
}
pub fn is_on_correct_network(addr: Address, network_flag: bool) -> bool {
if network_flag {
Address::network(&addr) == Some(Network::Testnet)
} else {
Address::network(&addr) == Some(Network::Mainnet)
}
}
pub fn is_not_a_script(addr: Address) -> bool {
!Address::has_script(&addr)
}
pub fn wallet_contract(network_flag: bool, wallet_contract_hash: [u8; 28]) -> Address {
let shelly_wallet_address: ShelleyAddress = if network_flag {
ShelleyAddress::new(
Network::Testnet,
ShelleyPaymentPart::Script(ScriptHash::new(wallet_contract_hash)),
ShelleyDelegationPart::Key(StakeKeyHash::new(PREPROD_STAKE_HASH)),
)
} else {
ShelleyAddress::new(
Network::Mainnet,
ShelleyPaymentPart::Script(ScriptHash::new(wallet_contract_hash)),
ShelleyDelegationPart::Key(StakeKeyHash::new(MAINNET_STAKE_HASH)),
)
};
Address::from(shelly_wallet_address.clone())
}
pub fn dummy_base_address() -> Address {
let shelly_wallet_address: ShelleyAddress = ShelleyAddress::new(
Network::Mainnet,
ShelleyPaymentPart::Script(ScriptHash::new(MAINNET_STAKE_HASH)),
ShelleyDelegationPart::Key(StakeKeyHash::new(MAINNET_STAKE_HASH)),
);
Address::from(shelly_wallet_address.clone())
}
pub fn collateral_address(network_flag: bool) -> Address {
let shelly_wallet_address: ShelleyAddress = if network_flag {
ShelleyAddress::new(
Network::Testnet,
ShelleyPaymentPart::Key(PaymentKeyHash::new(COLLATERAL_HASH)),
ShelleyDelegationPart::Null,
)
} else {
ShelleyAddress::new(
Network::Mainnet,
ShelleyPaymentPart::Key(PaymentKeyHash::new(COLLATERAL_HASH)),
ShelleyDelegationPart::Null,
)
};
Address::from(shelly_wallet_address.clone())
}
pub fn dapp_address(public_key: String, network_flag: bool) -> Result<Address> {
let shelly_wallet_address: ShelleyAddress = if network_flag {
ShelleyAddress::new(
Network::Testnet,
ShelleyPaymentPart::Key(PaymentKeyHash::new(
hex::decode(public_key)
.context("Incorrect Public Key Length")?
.as_slice()
.try_into()
.map_err(|e| anyhow::anyhow!("{e}"))?,
)),
ShelleyDelegationPart::Key(StakeKeyHash::new(PREPROD_STAKE_HASH)),
)
} else {
ShelleyAddress::new(
Network::Mainnet,
ShelleyPaymentPart::Key(PaymentKeyHash::new(
hex::decode(public_key)
.context("Incorrect Public Key Length")?
.as_slice()
.try_into()
.map_err(|e| anyhow::anyhow!("{e}"))?,
)),
ShelleyDelegationPart::Key(StakeKeyHash::new(MAINNET_STAKE_HASH)),
)
};
Ok(Address::from(shelly_wallet_address.clone()))
}