Skip to main content

urma_runtime/
config.rs

1use urma_core::format::Urma;
2pub struct Limits;
3impl Limits {
4    pub const INPUT_BYTES: usize = 16 * 1024 * 1024;
5    pub const RECORDS: usize = Self::INPUT_BYTES / Urma::CHUNK_BYTES;
6    pub const CONTAINER_BYTES: usize = 12 + Self::RECORDS * (4 + Urma::PRIVATE_RECORD_BYTES);
7    pub const OBJECTS: usize = 64;
8}
9
10use crate::error::{Context, Error};
11use serde_json::Value;
12
13pub fn confirmations(value: &Value) -> Result<i64, Error> {
14    match value.get("confirmations") {
15        Some(number) => number.as_i64().context("invalid confirmations"),
16        None => Ok(0),
17    }
18}
19
20#[derive(Clone, Copy)]
21pub enum RpcScope<'a> {
22    Node,
23    Wallet(&'a str),
24}
25impl<'a> From<Option<&'a str>> for RpcScope<'a> {
26    fn from(wallet: Option<&'a str>) -> Self {
27        match wallet {
28            Some(name) => Self::Wallet(name),
29            None => Self::Node,
30        }
31    }
32}
33#[derive(Clone, Copy)]
34pub enum ScanEnd {
35    Tip,
36    Height(u64),
37}
38#[derive(Clone, Copy)]
39pub enum RevealSelection {
40    All,
41    First(usize),
42}
43impl RevealSelection {
44    pub fn count(self, total: usize) -> usize {
45        match self {
46            Self::All => total,
47            Self::First(count) => count.min(total),
48        }
49    }
50}
51#[derive(Clone, Copy)]
52pub enum TxPresence {
53    Missing,
54    Observed(i64),
55}
56impl TxPresence {
57    pub fn confirmed(self) -> bool {
58        match self {
59            Self::Missing => false,
60            Self::Observed(count) => count > 0,
61        }
62    }
63}
64
65#[derive(Clone, Copy)]
66pub enum MempoolPresence {
67    Absent,
68    Present,
69}
70impl From<Option<usize>> for RevealSelection {
71    fn from(count: Option<usize>) -> Self {
72        match count {
73            Some(n) => Self::First(n),
74            None => Self::All,
75        }
76    }
77}
78pub const MAX_OBJECTS: usize = Limits::OBJECTS;
79pub const MAX_DIRECTORY_RECORDS: usize = MAX_OBJECTS * Limits::RECORDS;
80pub const LITECOIN_NETWORK: &str = "litecoin-testnet";
81pub const LITECOIN_GENESIS: &str = urma_chain::observation::Chain::LITECOIN_TESTNET_GENESIS;
82pub const LITECOIN_RPC_PORT: u16 = 19332;
83pub const LITECOIN_RETURN_LITOSHIS: u64 = 1_000;
84pub const LITECOIN_MAX_FEE_LITOSHIS: u64 = 500_000;
85pub const LITECOIN_MAX_SCAN_BLOCKS: u64 = 10_000;
86pub const LITECOIN_MAX_SCAN_BYTES: usize = 256 * 1024 * 1024;
87pub const LITECOIN_MAX_JOURNAL_BYTES: usize = 4_000_000;
88pub const RELAY_MAX_BUDGET_SATS: u64 = 500_000;
89pub const SOURCE_MAX_BLOCK_BYTES: usize = 4_000_000;
90pub const SOURCE_MAX_JSON_BYTES: usize = 1_000_000;
91pub const SOURCE_MAX_UTXOS: usize = 1_000;
92pub const SOURCE_MAX_SCAN_BLOCKS: u64 = 10_000;
93pub const SOURCE_MAX_SCAN_BYTES: usize = 256 * 1024 * 1024;
94pub const BITCOIN_RETURN_SATS: u64 = 1_000;
95pub const BITCOIN_MAX_FEE_SATS: u64 = 500_000;
96pub const BITCOIN_MAX_FEE_RATE: u64 = 100;
97
98pub const STANDARD_TX_WEIGHT: u64 = 400_000;
99pub const PUBLICATION_BUFFER_WEIGHT: u64 = 7_960_000;
100pub const PUBLICATION_PENDING_COMMITS: usize = 24;
101pub const PUBLICATION_COMMIT_VBYTES: u64 = 90_000;
102pub const LITECOIN_DUST_RELAY_FEE: u64 = 30_000;
103
104pub fn publication_return(chain: urma_chain::observation::Chain) -> u64 {
105    use urma_chain::observation::Chain;
106    match chain {
107        Chain::LitecoinTestnet | Chain::LitecoinMainnet => 110 * LITECOIN_DUST_RELAY_FEE / 1000,
108        Chain::BitcoinRegtest | Chain::BitcoinTestnet4 => 1000,
109    }
110}