use r402_protocol::network::ChainId;
use r402_protocol::payment::PriceTag;
#[cfg(not(feature = "keeta"))]
use super::feature_missing;
#[cfg(feature = "keeta")]
use super::{
accept_custom_decimals, custom_asset_address, invalid_asset_address, invalid_network,
invalid_pay_to, named_ticker, no_deployment, reject_evm_fields, require_exact,
};
use crate::config::{AcceptConfig, ConfigError};
#[cfg(not(feature = "keeta"))]
pub(super) fn build(
_accept: &AcceptConfig,
_network: &ChainId,
_amount: u128,
_pay_to: &str,
) -> Result<PriceTag, ConfigError> {
Err(feature_missing("keeta", "keeta"))
}
#[cfg(not(feature = "keeta"))]
pub(super) fn decimals(_accept: &AcceptConfig, _network: &ChainId) -> Result<u8, ConfigError> {
Err(feature_missing("keeta", "keeta"))
}
#[cfg(feature = "keeta")]
pub(super) fn decimals(accept: &AcceptConfig, network: &ChainId) -> Result<u8, ConfigError> {
Ok(token(accept, network)?.decimals)
}
#[cfg(feature = "keeta")]
pub(super) fn build(
accept: &AcceptConfig,
network: &ChainId,
amount: u128,
pay_to: &str,
) -> Result<PriceTag, ConfigError> {
use std::str::FromStr as _;
use r402_keeta::KeetaExact;
use r402_keeta::chain::KeetaAddress;
require_exact(accept)?;
reject_evm_fields(accept, "keeta")?;
let pay_to =
KeetaAddress::from_str(pay_to).map_err(|error| invalid_pay_to("Keeta", pay_to, error))?;
let token = token(accept, network)?;
Ok(KeetaExact::price_tag(pay_to, token.amount(amount)))
}
#[cfg(feature = "keeta")]
fn token(
accept: &AcceptConfig,
network: &ChainId,
) -> Result<r402_keeta::chain::KeetaTokenDeployment, ConfigError> {
use std::str::FromStr as _;
use r402_keeta::USDC;
use r402_keeta::chain::{KeetaAddress, KeetaChainReference, KeetaTokenDeployment};
let chain = KeetaChainReference::try_from(network.clone())
.map_err(|error| invalid_network("keeta", &accept.network, error))?;
if named_ticker(accept, &["usdc"])?.is_some() {
return USDC::on(chain)
.cloned()
.ok_or_else(|| no_deployment("USDC", &accept.network));
}
let address = custom_asset_address(accept)?;
let address =
KeetaAddress::from_str(address).map_err(|error| invalid_asset_address(address, error))?;
Ok(KeetaTokenDeployment::new(
chain,
address,
accept_custom_decimals(accept)?,
))
}