urma-runtime 0.1.1

URMA publication planning, network transports and recovery
Documentation
use urma_core::format::Urma;
pub struct Limits;
impl Limits {
    pub const INPUT_BYTES: usize = 16 * 1024 * 1024;
    pub const RECORDS: usize = Self::INPUT_BYTES / Urma::CHUNK_BYTES;
    pub const CONTAINER_BYTES: usize = 12 + Self::RECORDS * (4 + Urma::PRIVATE_RECORD_BYTES);
    pub const OBJECTS: usize = 64;
}

use crate::error::{Context, Error};
use serde_json::Value;

pub fn confirmations(value: &Value) -> Result<i64, Error> {
    match value.get("confirmations") {
        Some(number) => number.as_i64().context("invalid confirmations"),
        None => Ok(0),
    }
}

#[derive(Clone, Copy)]
pub enum RpcScope<'a> {
    Node,
    Wallet(&'a str),
}
impl<'a> From<Option<&'a str>> for RpcScope<'a> {
    fn from(wallet: Option<&'a str>) -> Self {
        match wallet {
            Some(name) => Self::Wallet(name),
            None => Self::Node,
        }
    }
}
#[derive(Clone, Copy)]
pub enum ScanEnd {
    Tip,
    Height(u64),
}
#[derive(Clone, Copy)]
pub enum RevealSelection {
    All,
    First(usize),
}
impl RevealSelection {
    pub fn count(self, total: usize) -> usize {
        match self {
            Self::All => total,
            Self::First(count) => count.min(total),
        }
    }
}
#[derive(Clone, Copy)]
pub enum TxPresence {
    Missing,
    Observed(i64),
}
impl TxPresence {
    pub fn confirmed(self) -> bool {
        match self {
            Self::Missing => false,
            Self::Observed(count) => count > 0,
        }
    }
}

#[derive(Clone, Copy)]
pub enum MempoolPresence {
    Absent,
    Present,
}
impl From<Option<usize>> for RevealSelection {
    fn from(count: Option<usize>) -> Self {
        match count {
            Some(n) => Self::First(n),
            None => Self::All,
        }
    }
}
pub const MAX_OBJECTS: usize = Limits::OBJECTS;
pub const MAX_DIRECTORY_RECORDS: usize = MAX_OBJECTS * Limits::RECORDS;
pub const LITECOIN_NETWORK: &str = "litecoin-testnet";
pub const LITECOIN_GENESIS: &str = urma_chain::observation::Chain::LITECOIN_TESTNET_GENESIS;
pub const LITECOIN_RPC_PORT: u16 = 19332;
pub const LITECOIN_RETURN_LITOSHIS: u64 = 1_000;
pub const LITECOIN_MAX_FEE_LITOSHIS: u64 = 500_000;
pub const LITECOIN_MAX_SCAN_BLOCKS: u64 = 10_000;
pub const LITECOIN_MAX_SCAN_BYTES: usize = 256 * 1024 * 1024;
pub const LITECOIN_MAX_JOURNAL_BYTES: usize = 4_000_000;
pub const RELAY_MAX_BUDGET_SATS: u64 = 500_000;
pub const SOURCE_MAX_BLOCK_BYTES: usize = 4_000_000;
pub const SOURCE_MAX_JSON_BYTES: usize = 1_000_000;
pub const SOURCE_MAX_UTXOS: usize = 1_000;
pub const SOURCE_MAX_SCAN_BLOCKS: u64 = 10_000;
pub const SOURCE_MAX_SCAN_BYTES: usize = 256 * 1024 * 1024;
pub const BITCOIN_RETURN_SATS: u64 = 1_000;
pub const BITCOIN_MAX_FEE_SATS: u64 = 500_000;
pub const BITCOIN_MAX_FEE_RATE: u64 = 100;

pub const STANDARD_TX_WEIGHT: u64 = 400_000;
pub const PUBLICATION_BUFFER_WEIGHT: u64 = 7_960_000;
pub const PUBLICATION_PENDING_COMMITS: usize = 24;
pub const PUBLICATION_COMMIT_VBYTES: u64 = 90_000;
pub const LITECOIN_DUST_RELAY_FEE: u64 = 30_000;

pub fn publication_return(chain: urma_chain::observation::Chain) -> u64 {
    use urma_chain::observation::Chain;
    match chain {
        Chain::LitecoinTestnet | Chain::LitecoinMainnet => 110 * LITECOIN_DUST_RELAY_FEE / 1000,
        Chain::BitcoinRegtest | Chain::BitcoinTestnet4 => 1000,
    }
}