diff --git a/src/chain.rs b/src/chain.rs index f8ef180cdc..1186ac63ad 100644 --- a/src/chain.rs +++ b/src/chain.rs @@ -47,6 +47,16 @@ impl Chain { } } + pub(crate) fn first_rune_height(self) -> u32 { + SUBSIDY_HALVING_INTERVAL + * match self { + Self::Mainnet => 4, + Self::Regtest => 0, + Self::Signet => 0, + Self::Testnet => 12, + } + } + pub(crate) fn jubilee_height(self) -> u32 { match self { Self::Mainnet => 824544, diff --git a/src/index.rs b/src/index.rs index 6ad52f673e..3394701202 100644 --- a/src/index.rs +++ b/src/index.rs @@ -470,7 +470,10 @@ impl Index { height, inscriptions: blessed_inscriptions + cursed_inscriptions, lost_sats: statistic(Statistic::LostSats)?, - minimum_rune_for_next_block: Rune::minimum_at_height(Height(next_height)), + minimum_rune_for_next_block: Rune::minimum_at_height( + self.options.chain(), + Height(next_height), + ), rune_index: statistic(Statistic::IndexRunes)? != 0, runes: statistic(Statistic::Runes)?, sat_index: statistic(Statistic::IndexSats)? != 0, diff --git a/src/index/testing.rs b/src/index/testing.rs index d40405eae8..462f07336c 100644 --- a/src/index/testing.rs +++ b/src/index/testing.rs @@ -53,6 +53,11 @@ impl ContextBuilder { self } + pub(crate) fn chain(mut self, chain: Chain) -> Self { + self.chain = chain; + self + } + pub(crate) fn tempdir(mut self, tempdir: TempDir) -> Self { self.tempdir = Some(tempdir); self diff --git a/src/index/updater.rs b/src/index/updater.rs index 5e62ade0a2..c9f91b37cb 100644 --- a/src/index/updater.rs +++ b/src/index/updater.rs @@ -570,7 +570,7 @@ impl<'index> Updater<'_> { &inscription_updater.unbound_inscriptions, )?; - if index.index_runes { + if index.index_runes && self.height >= self.index.options.first_rune_height() { let mut outpoint_to_rune_balances = wtx.open_table(OUTPOINT_TO_RUNE_BALANCES)?; let mut rune_id_to_rune_entry = wtx.open_table(RUNE_ID_TO_RUNE_ENTRY)?; let mut rune_to_rune_id = wtx.open_table(RUNE_TO_RUNE_ID)?; @@ -586,7 +586,7 @@ impl<'index> Updater<'_> { height: self.height, id_to_entry: &mut rune_id_to_rune_entry, inscription_id_to_sequence_number: &mut inscription_id_to_sequence_number, - minimum: Rune::minimum_at_height(Height(self.height)), + minimum: Rune::minimum_at_height(self.index.options.chain(), Height(self.height)), outpoint_to_balances: &mut outpoint_to_rune_balances, rune_to_id: &mut rune_to_rune_id, runes, diff --git a/src/lib.rs b/src/lib.rs index acc862e89a..0afb473dc4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,7 @@ use { bitcoin::{ address::{Address, NetworkUnchecked}, blockdata::constants::COIN_VALUE, + blockdata::constants::{DIFFCHANGE_INTERVAL, SUBSIDY_HALVING_INTERVAL}, consensus::{self, Decodable, Encodable}, hash_types::BlockHash, hashes::Hash, @@ -140,8 +141,6 @@ mod wallet; type Result = std::result::Result; -const DIFFCHANGE_INTERVAL: u32 = bitcoin::blockdata::constants::DIFFCHANGE_INTERVAL; -const SUBSIDY_HALVING_INTERVAL: u32 = bitcoin::blockdata::constants::SUBSIDY_HALVING_INTERVAL; const CYCLE_EPOCHS: u32 = 6; static SHUTTING_DOWN: AtomicBool = AtomicBool::new(false); diff --git a/src/options.rs b/src/options.rs index 31267d8546..d34c9bf736 100644 --- a/src/options.rs +++ b/src/options.rs @@ -46,7 +46,7 @@ pub(crate) struct Options { long, help = "Track location of runes. RUNES ARE IN AN UNFINISHED PRE-ALPHA STATE AND SUBJECT TO CHANGE AT ANY TIME." )] - pub(crate) index_runes_pre_alpha_i_agree_to_get_rekt: bool, + pub(crate) index_runes: bool, #[arg(long, help = "Track location of all satoshis.")] pub(crate) index_sats: bool, #[arg(long, short, help = "Use regtest. Equivalent to `--chain regtest`.")] @@ -75,9 +75,7 @@ impl Options { } pub(crate) fn first_inscription_height(&self) -> u32 { - if self.chain() == Chain::Regtest { - self.first_inscription_height.unwrap_or(0) - } else if integration_test() { + if integration_test() { 0 } else { self @@ -86,8 +84,16 @@ impl Options { } } + pub(crate) fn first_rune_height(&self) -> u32 { + if integration_test() { + 0 + } else { + self.chain().first_rune_height() + } + } + pub(crate) fn index_runes(&self) -> bool { - self.index_runes_pre_alpha_i_agree_to_get_rekt && self.chain() != Chain::Mainnet + self.index_runes && self.chain() != Chain::Mainnet } pub(crate) fn rpc_url(&self) -> String { @@ -805,26 +811,23 @@ mod tests { assert!(Arguments::try_parse_from([ "ord", "--chain=signet", - "--index-runes-pre-alpha-i-agree-to-get-rekt", + "--index-runes", "index", "update" ]) .unwrap() .options - .index_runes(),); - assert!(!Arguments::try_parse_from([ - "ord", - "--index-runes-pre-alpha-i-agree-to-get-rekt", - "index", - "update" - ]) - .unwrap() - .options - .index_runes(),); + .index_runes()); + assert!( + !Arguments::try_parse_from(["ord", "--index-runes", "index", "update"]) + .unwrap() + .options + .index_runes() + ); assert!(!Arguments::try_parse_from(["ord", "index", "update"]) .unwrap() .options - .index_runes(),); + .index_runes()); } #[test] diff --git a/src/runes.rs b/src/runes.rs index 7d21b7f119..2e72ba8f71 100644 --- a/src/runes.rs +++ b/src/runes.rs @@ -26,9 +26,7 @@ mod tests { #[test] fn index_starts_with_no_runes() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.assert_runes([], []); } @@ -65,9 +63,7 @@ mod tests { #[test] fn empty_runestone_does_not_create_rune() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -84,9 +80,7 @@ mod tests { #[test] fn etching_with_no_edicts_creates_rune() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -128,9 +122,7 @@ mod tests { #[test] fn etching_with_edict_creates_rune() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -178,9 +170,12 @@ mod tests { #[test] fn runes_must_be_greater_than_or_equal_to_minimum_for_height() { + const SECOND_BLOCK_LOCKED_RUNE: u128 = 99235208761673842; + { let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") + .chain(Chain::Regtest) + .arg("--index-runes") .build(); context.mine_blocks(1); @@ -195,7 +190,7 @@ mod tests { output: 0, }], etching: Some(Etching { - rune: Rune(RUNE - 1), + rune: Rune(SECOND_BLOCK_LOCKED_RUNE - 1), ..Default::default() }), ..Default::default() @@ -211,9 +206,7 @@ mod tests { } { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -227,7 +220,7 @@ mod tests { output: 0, }], etching: Some(Etching { - rune: Rune(RUNE), + rune: Rune(SECOND_BLOCK_LOCKED_RUNE), ..Default::default() }), ..Default::default() @@ -249,7 +242,7 @@ mod tests { id, RuneEntry { etching: txid, - rune: Rune(RUNE), + rune: Rune(SECOND_BLOCK_LOCKED_RUNE), supply: u128::max_value(), timestamp: 2, ..Default::default() @@ -262,9 +255,7 @@ mod tests { #[test] fn etching_with_non_zero_divisibility_and_rune() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -314,9 +305,7 @@ mod tests { #[test] fn allocations_over_max_supply_are_ignored() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -371,9 +360,7 @@ mod tests { #[test] fn allocations_partially_over_max_supply_are_honored() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -429,9 +416,7 @@ mod tests { #[test] fn etching_may_allocate_less_than_max_supply() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -479,9 +464,7 @@ mod tests { #[test] fn etching_may_allocate_to_multiple_outputs() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -537,9 +520,7 @@ mod tests { #[test] fn allocations_to_invalid_outputs_are_ignored() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -594,9 +575,7 @@ mod tests { #[test] fn input_runes_may_be_allocated() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -688,9 +667,7 @@ mod tests { #[test] fn etched_rune_is_burned_if_an_unrecognized_even_tag_is_encountered() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -737,9 +714,7 @@ mod tests { #[test] fn input_runes_are_burned_if_an_unrecognized_even_tag_is_encountered() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -822,9 +797,7 @@ mod tests { #[test] fn unallocated_runes_are_assigned_to_first_non_op_return_output() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -906,9 +879,7 @@ mod tests { #[test] fn unallocated_runes_are_burned_if_no_non_op_return_output_is_present() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -987,9 +958,7 @@ mod tests { #[test] fn unallocated_runes_in_transactions_with_no_runestone_are_assigned_to_first_non_op_return_output( ) { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1071,9 +1040,7 @@ mod tests { #[test] fn duplicate_runes_are_forbidden() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1157,9 +1124,7 @@ mod tests { #[test] fn outpoint_may_hold_multiple_runes() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1322,9 +1287,7 @@ mod tests { #[test] fn multiple_input_runes_on_the_same_input_may_be_allocated() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1558,9 +1521,7 @@ mod tests { #[test] fn multiple_input_runes_on_different_inputs_may_be_allocated() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1742,9 +1703,7 @@ mod tests { #[test] fn unallocated_runes_are_assigned_to_first_non_op_return_output_when_op_return_is_not_last_output( ) { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -1825,9 +1784,7 @@ mod tests { #[test] fn rune_rarity_is_assigned_correctly() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(2); @@ -1928,9 +1885,7 @@ mod tests { #[test] fn edicts_with_id_zero_are_skipped() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2029,9 +1984,7 @@ mod tests { #[test] fn edicts_which_refer_to_input_rune_with_no_balance_are_skipped() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2221,9 +2174,7 @@ mod tests { #[test] fn edicts_over_max_inputs_are_ignored() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2315,9 +2266,7 @@ mod tests { #[test] fn edicts_may_transfer_runes_to_op_return_outputs() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2366,9 +2315,7 @@ mod tests { #[test] fn outputs_with_no_runes_have_no_balance() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2417,9 +2364,7 @@ mod tests { #[test] fn edicts_which_transfer_no_runes_to_output_create_no_balance_entry() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2475,9 +2420,7 @@ mod tests { #[test] fn split_in_etching() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2543,9 +2486,7 @@ mod tests { #[test] fn split_in_etching_with_preceding_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2618,9 +2559,7 @@ mod tests { #[test] fn split_in_etching_with_following_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2693,9 +2632,7 @@ mod tests { #[test] fn split_with_amount_in_etching() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2749,9 +2686,7 @@ mod tests { #[test] fn split_in_etching_with_amount_with_preceding_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2814,9 +2749,7 @@ mod tests { #[test] fn split_in_etching_with_amount_with_following_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2880,9 +2813,7 @@ mod tests { #[test] fn split() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -2984,9 +2915,7 @@ mod tests { #[test] fn split_with_preceding_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3095,9 +3024,7 @@ mod tests { #[test] fn split_with_following_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3206,9 +3133,7 @@ mod tests { #[test] fn split_with_amount() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3310,9 +3235,7 @@ mod tests { #[test] fn split_with_amount_with_preceding_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3421,9 +3344,7 @@ mod tests { #[test] fn split_with_amount_with_following_edict() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3546,9 +3467,7 @@ mod tests { #[test] fn etching_may_specify_symbol() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3598,9 +3517,7 @@ mod tests { #[test] fn allocate_all_remaining_runes_in_etching() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3648,9 +3565,7 @@ mod tests { #[test] fn allocate_all_remaining_runes_in_inputs() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3750,9 +3665,7 @@ mod tests { #[test] fn etching_with_limit_can_be_minted() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -3883,9 +3796,7 @@ mod tests { #[test] fn open_etchings_can_be_limited_to_term() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4011,9 +3922,7 @@ mod tests { #[test] fn open_etchings_with_term_zero_cannot_be_minted() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4098,9 +4007,7 @@ mod tests { #[test] fn open_etching_claims_can_use_split() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4193,9 +4100,7 @@ mod tests { #[test] fn runes_can_be_etched_and_claimed_in_the_same_transaction() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4245,9 +4150,7 @@ mod tests { #[test] fn limit_over_max_limit_is_ignored() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4321,9 +4224,7 @@ mod tests { #[test] fn omitted_limit_defaults_to_max_limit() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4368,9 +4269,7 @@ mod tests { #[test] fn transactions_cannot_claim_more_than_limit() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); @@ -4479,9 +4378,7 @@ mod tests { #[test] fn multiple_edicts_in_one_transaction_may_claim_open_etching() { - let context = Context::builder() - .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") - .build(); + let context = Context::builder().arg("--index-runes").build(); context.mine_blocks(1); diff --git a/src/runes/rune.rs b/src/runes/rune.rs index 4165070b8b..e2c14db1dd 100644 --- a/src/runes/rune.rs +++ b/src/runes/rune.rs @@ -4,20 +4,63 @@ use super::*; pub struct Rune(pub u128); impl Rune { - pub(crate) fn minimum_at_height(height: Height) -> Self { - let length = 13u32 - .saturating_sub(height.0 / (DIFFCHANGE_INTERVAL * 2)) - .max(1); + const STEPS: &'static [u128] = &[ + 0, + 26, + 702, + 18278, + 475254, + 12356630, + 321272406, + 8353082582, + 217180147158, + 5646683826134, + 146813779479510, + 3817158266467286, + 99246114928149462, + 2580398988131886038, + 67090373691429037014, + 1744349715977154962390, + 45353092615406029022166, + 1179180408000556754576342, + 30658690608014475618984918, + 797125955808376366093607894, + 20725274851017785518433805270, + 538857146126462423479278937046, + 14010285799288023010461252363222, + 364267430781488598271992561443798, + 9470953200318703555071806597538774, + 246244783208286292431866971536008150, + 6402364363415443603228541259936211926, + 166461473448801533683942072758341510102, + ]; - let mut rune = 0u128; - for i in 0..length { - if i > 0 { - rune += 1; - } - rune *= 26; + pub(crate) fn minimum_at_height(chain: Chain, height: Height) -> Self { + const INTERVAL: u32 = SUBSIDY_HALVING_INTERVAL / 12; + + let start = chain.first_rune_height(); + + let end = start + SUBSIDY_HALVING_INTERVAL; + + if height.0 < start { + return Rune(Self::STEPS[12]); + } + + if height.0 >= end { + return Rune(0); } - Rune(rune) + let progress = height.0.saturating_sub(start); + + let length = 12u32.saturating_sub(progress / INTERVAL); + + let end = Self::STEPS[usize::try_from(length - 1).unwrap()]; + + let start = Self::STEPS[usize::try_from(length).unwrap()]; + + let remainder = u128::from(progress % INTERVAL); + + Rune(start - ((start - end) * remainder / u128::from(INTERVAL))) } } @@ -75,7 +118,7 @@ impl FromStr for Rune { if i > 0 { x += 1; } - x *= 26; + x = x.checked_mul(26).ok_or_else(|| anyhow!("out of range"))?; match c { 'A'..='Z' => { x = x @@ -144,54 +187,112 @@ mod tests { #[allow(clippy::identity_op)] #[allow(clippy::erasing_op)] #[allow(clippy::zero_prefixed_literal)] - fn minimum_at_height() { + fn mainnet_minimum_at_height() { #[track_caller] fn case(height: u32, minimum: &str) { - assert_eq!(Rune::minimum_at_height(Height(height)).to_string(), minimum); + assert_eq!( + Rune::minimum_at_height(Chain::Mainnet, Height(height)).to_string(), + minimum, + ); } - case(2016 * 2 * 00 + 0, "AAAAAAAAAAAAA"); - case(2016 * 2 * 00 + 1, "AAAAAAAAAAAAA"); - case(2016 * 2 * 01 - 1, "AAAAAAAAAAAAA"); - case(2016 * 2 * 01 + 0, "AAAAAAAAAAAA"); - case(2016 * 2 * 01 + 1, "AAAAAAAAAAAA"); - case(2016 * 2 * 02 - 1, "AAAAAAAAAAAA"); - case(2016 * 2 * 02 + 0, "AAAAAAAAAAA"); - case(2016 * 2 * 02 + 1, "AAAAAAAAAAA"); - case(2016 * 2 * 03 - 1, "AAAAAAAAAAA"); - case(2016 * 2 * 03 + 0, "AAAAAAAAAA"); - case(2016 * 2 * 03 + 1, "AAAAAAAAAA"); - case(2016 * 2 * 04 - 1, "AAAAAAAAAA"); - case(2016 * 2 * 04 + 0, "AAAAAAAAA"); - case(2016 * 2 * 04 + 1, "AAAAAAAAA"); - case(2016 * 2 * 05 - 1, "AAAAAAAAA"); - case(2016 * 2 * 05 + 0, "AAAAAAAA"); - case(2016 * 2 * 05 + 1, "AAAAAAAA"); - case(2016 * 2 * 06 - 1, "AAAAAAAA"); - case(2016 * 2 * 06 + 0, "AAAAAAA"); - case(2016 * 2 * 06 + 1, "AAAAAAA"); - case(2016 * 2 * 07 - 1, "AAAAAAA"); - case(2016 * 2 * 07 + 0, "AAAAAA"); - case(2016 * 2 * 07 + 1, "AAAAAA"); - case(2016 * 2 * 08 - 1, "AAAAAA"); - case(2016 * 2 * 08 + 0, "AAAAA"); - case(2016 * 2 * 08 + 1, "AAAAA"); - case(2016 * 2 * 09 - 1, "AAAAA"); - case(2016 * 2 * 09 + 0, "AAAA"); - case(2016 * 2 * 09 + 1, "AAAA"); - case(2016 * 2 * 10 - 1, "AAAA"); - case(2016 * 2 * 10 + 0, "AAA"); - case(2016 * 2 * 10 + 1, "AAA"); - case(2016 * 2 * 11 - 1, "AAA"); - case(2016 * 2 * 11 + 0, "AA"); - case(2016 * 2 * 11 + 1, "AA"); - case(2016 * 2 * 12 - 1, "AA"); - case(2016 * 2 * 12 + 0, "A"); - case(2016 * 2 * 12 + 1, "A"); - case(2016 * 2 * 13 - 1, "A"); - case(2016 * 2 * 13 + 0, "A"); - case(2016 * 2 * 13 + 1, "A"); + const START: u32 = SUBSIDY_HALVING_INTERVAL * 4; + const END: u32 = START + SUBSIDY_HALVING_INTERVAL; + const INTERVAL: u32 = SUBSIDY_HALVING_INTERVAL / 12; + + case(0, "AAAAAAAAAAAAA"); + case(START / 2, "AAAAAAAAAAAAA"); + case(START, "AAAAAAAAAAAAA"); + case(START + 1, "ZZYZXBRKWXVA"); + case(END - 1, "B"); + case(END, "A"); + case(END + 1, "A"); case(u32::max_value(), "A"); + + case(START + INTERVAL * 00 - 1, "AAAAAAAAAAAAA"); + case(START + INTERVAL * 00 + 0, "AAAAAAAAAAAAA"); + case(START + INTERVAL * 00 + 1, "ZZYZXBRKWXVA"); + + case(START + INTERVAL * 01 - 1, "AABACYIPDCFB"); + case(START + INTERVAL * 01 + 0, "AAAAAAAAAAAA"); + case(START + INTERVAL * 01 + 1, "ZZYZXBRKWXV"); + + case(START + INTERVAL * 02 - 1, "AABACYIPDCG"); + case(START + INTERVAL * 02 + 0, "AAAAAAAAAAA"); + case(START + INTERVAL * 02 + 1, "ZZYZXBRKWY"); + + case(START + INTERVAL * 03 - 1, "AABACYIPDD"); + case(START + INTERVAL * 03 + 0, "AAAAAAAAAA"); + case(START + INTERVAL * 03 + 1, "ZZYZXBRKX"); + + case(START + INTERVAL * 04 - 1, "AABACYIPE"); + case(START + INTERVAL * 04 + 0, "AAAAAAAAA"); + case(START + INTERVAL * 04 + 1, "ZZYZXBRL"); + + case(START + INTERVAL * 05 - 1, "AABACYIQ"); + case(START + INTERVAL * 05 + 0, "AAAAAAAA"); + case(START + INTERVAL * 05 + 1, "ZZYZXBS"); + + case(START + INTERVAL * 06 - 1, "AABACYJ"); + case(START + INTERVAL * 06 + 0, "AAAAAAA"); + case(START + INTERVAL * 06 + 1, "ZZYZXC"); + + case(START + INTERVAL * 07 - 1, "AABACZ"); + case(START + INTERVAL * 07 + 0, "AAAAAA"); + case(START + INTERVAL * 07 + 1, "ZZYZY"); + + case(START + INTERVAL * 08 - 1, "AABAD"); + case(START + INTERVAL * 08 + 0, "AAAAA"); + case(START + INTERVAL * 08 + 1, "ZZZA"); + + case(START + INTERVAL * 09 - 1, "AABB"); + case(START + INTERVAL * 09 + 0, "AAAA"); + case(START + INTERVAL * 09 + 1, "ZZZ"); + + case(START + INTERVAL * 10 - 1, "AAC"); + case(START + INTERVAL * 10 + 0, "AAA"); + case(START + INTERVAL * 10 + 1, "AAA"); + + case(START + INTERVAL * 10 + INTERVAL / 2, "NA"); + + case(START + INTERVAL * 11 - 1, "AB"); + case(START + INTERVAL * 11 + 0, "AA"); + case(START + INTERVAL * 11 + 1, "AA"); + + case(START + INTERVAL * 11 + INTERVAL / 2, "N"); + + case(START + INTERVAL * 12 - 1, "B"); + case(START + INTERVAL * 12 + 0, "A"); + case(START + INTERVAL * 12 + 1, "A"); + } + + #[test] + fn minimum_at_height() { + #[track_caller] + fn case(chain: Chain, height: u32, minimum: &str) { + assert_eq!( + Rune::minimum_at_height(chain, Height(height)).to_string(), + minimum, + ); + } + + case(Chain::Testnet, 0, "AAAAAAAAAAAAA"); + case( + Chain::Testnet, + SUBSIDY_HALVING_INTERVAL * 12, + "AAAAAAAAAAAAA", + ); + case( + Chain::Testnet, + SUBSIDY_HALVING_INTERVAL * 12 + 1, + "ZZYZXBRKWXVA", + ); + + case(Chain::Signet, 0, "AAAAAAAAAAAAA"); + case(Chain::Signet, 1, "ZZYZXBRKWXVA"); + + case(Chain::Regtest, 0, "AAAAAAAAAAAAA"); + case(Chain::Regtest, 1, "ZZYZXBRKWXVA"); } #[test] @@ -201,4 +302,17 @@ mod tests { assert_eq!(serde_json::to_string(&rune).unwrap(), json); assert_eq!(serde_json::from_str::(json).unwrap(), rune); } + + #[test] + fn steps() { + for i in 0.. { + match "A".repeat(i + 1).parse::() { + Ok(rune) => assert_eq!(Rune(Rune::STEPS[i]), rune), + Err(_) => { + assert_eq!(Rune::STEPS.len(), i); + break; + } + } + } + } } diff --git a/src/subcommand/balances.rs b/src/subcommand/balances.rs index 425d8a9db7..cc94155bbf 100644 --- a/src/subcommand/balances.rs +++ b/src/subcommand/balances.rs @@ -10,7 +10,7 @@ pub(crate) fn run(options: Options) -> SubcommandResult { ensure!( index.has_rune_index(), - "`ord balances` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag", + "`ord balances` requires index created with `--index-runes` flag", ); index.update()?; diff --git a/src/subcommand/runes.rs b/src/subcommand/runes.rs index 5e88e02c80..a6748929d3 100644 --- a/src/subcommand/runes.rs +++ b/src/subcommand/runes.rs @@ -27,7 +27,7 @@ pub(crate) fn run(options: Options) -> SubcommandResult { ensure!( index.has_rune_index(), - "`ord runes` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag", + "`ord runes` requires index created with `--index-runes` flag", ); index.update()?; diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs index 85345b3fca..0bbf4af678 100644 --- a/src/subcommand/server.rs +++ b/src/subcommand/server.rs @@ -603,7 +603,7 @@ impl Server { ) -> ServerResult> { let (id, entry) = index.rune(rune)?.ok_or_else(|| { ServerError::NotFound( - "tracking runes requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag".into(), + "tracking runes requires index created with `--index-runes` flag".into(), ) })?; @@ -1610,11 +1610,7 @@ mod tests { .network(bitcoin::Network::Regtest) .build(), None, - &[ - "--chain", - "regtest", - "--index-runes-pre-alpha-i-agree-to-get-rekt", - ], + &["--chain", "regtest", "--index-runes"], &["--enable-json-api"], ) } diff --git a/src/subcommand/wallet/etch.rs b/src/subcommand/wallet/etch.rs index 1a32d1a09f..f9398c140d 100644 --- a/src/subcommand/wallet/etch.rs +++ b/src/subcommand/wallet/etch.rs @@ -25,7 +25,7 @@ impl Etch { ensure!( index.has_rune_index(), - "`ord wallet etch` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag", + "`ord wallet etch` requires index created with `--index-runes` flag", ); index.update()?; @@ -40,7 +40,8 @@ impl Etch { self.rune ); - let minimum_at_height = Rune::minimum_at_height(Height(u32::try_from(count).unwrap() + 1)); + let minimum_at_height = + Rune::minimum_at_height(options.chain(), Height(u32::try_from(count).unwrap() + 1)); ensure!( self.rune >= minimum_at_height, diff --git a/tests/balances.rs b/tests/balances.rs index 247e96a15a..1fba7f19da 100644 --- a/tests/balances.rs +++ b/tests/balances.rs @@ -7,12 +7,10 @@ fn flag_is_required() { .build(); CommandBuilder::new("--regtest balances") - .rpc_server(&rpc_server) - .expected_exit_code(1) - .expected_stderr( - "error: `ord balances` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag\n", - ) - .run_and_extract_stdout(); + .rpc_server(&rpc_server) + .expected_exit_code(1) + .expected_stderr("error: `ord balances` requires index created with `--index-runes` flag\n") + .run_and_extract_stdout(); } #[test] @@ -21,10 +19,9 @@ fn no_runes() { .network(Network::Regtest) .build(); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt balances") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes balances") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!( output, @@ -45,10 +42,9 @@ fn with_runes() { let a = etch(&rpc_server, Rune(RUNE)); let b = etch(&rpc_server, Rune(RUNE + 1)); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt balances") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes balances") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!( output, diff --git a/tests/etch.rs b/tests/etch.rs index e7d7e5fb9a..1e9f92962a 100644 --- a/tests/etch.rs +++ b/tests/etch.rs @@ -15,9 +15,7 @@ fn flag_is_required() { )) .rpc_server(&rpc_server) .expected_exit_code(1) - .expected_stderr( - "error: `ord wallet etch` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag\n", - ) + .expected_stderr("error: `ord wallet etch` requires index created with `--index-runes` flag\n") .run_and_extract_stdout(); } @@ -33,7 +31,7 @@ fn divisibility_over_max_is_an_error() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 39 --fee-rate 1 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 39 --fee-rate 1 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -54,7 +52,7 @@ fn supply_over_max_is_an_error() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 340282366920938463463374607431768211456 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 340282366920938463463374607431768211456 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -75,11 +73,11 @@ fn rune_below_minimum_is_an_error() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 1000 --symbol ¢", - Rune(RUNE - 1), + "--index-runes --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 1000 --symbol ¢", + Rune(99235208761673842 - 1), )) .rpc_server(&rpc_server) - .expected_stderr("error: rune is less than minimum for next block: ZZZZZZZZZZZZ < AAAAAAAAAAAAA\n") + .expected_stderr("error: rune is less than minimum for next block: ZZXZUDIVTVPZ < ZZXZUDIVTVQA\n") .expected_exit_code(1) .run_and_extract_stdout(); } @@ -98,7 +96,7 @@ fn trying_to_etch_an_existing_rune_is_an_error() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 0 --fee-rate 1 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -119,7 +117,7 @@ fn runes_can_be_etched() { let output = CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 1 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 1 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -154,10 +152,9 @@ fn runes_can_be_etched() { .collect() ); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes wallet balance") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!(output.runes.unwrap()[&Rune(RUNE)], 1000); } @@ -174,7 +171,7 @@ fn etch_sets_integer_fee_rate_correctly() { let output = CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 100 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 100 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -203,7 +200,7 @@ fn etch_sets_decimal_fee_rate_correctly() { let output = CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 100.5 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 100.5 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -230,10 +227,9 @@ fn etch_does_not_select_inscribed_utxos() { rpc_server.mine_blocks(1); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes wallet balance") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!(output.cardinal, 5000000000); @@ -244,16 +240,15 @@ fn etch_does_not_select_inscribed_utxos() { rpc_server.mine_blocks_with_subsidy(1, 0); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes wallet balance") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!(output.cardinal, 0); CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 1 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 1 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -276,7 +271,7 @@ fn inscribe_does_not_select_runic_utxos() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -284,16 +279,15 @@ fn inscribe_does_not_select_runic_utxos() { rpc_server.mine_blocks_with_subsidy(1, 0); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes wallet balance") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!(output.cardinal, 0); assert_eq!(output.ordinal, 0); assert_eq!(output.runic, Some(10000)); - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet inscribe --fee-rate 0 --file foo.txt") + CommandBuilder::new("--regtest --index-runes wallet inscribe --fee-rate 0 --file foo.txt") .write("foo.txt", "FOO") .rpc_server(&rpc_server) .expected_exit_code(1) @@ -313,7 +307,7 @@ fn send_amount_does_not_select_runic_utxos() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -321,7 +315,7 @@ fn send_amount_does_not_select_runic_utxos() { rpc_server.mine_blocks_with_subsidy(1, 0); - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet send --fee-rate 1 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw 600sat") + CommandBuilder::new("--regtest --index-runes wallet send --fee-rate 1 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw 600sat") .rpc_server(&rpc_server) .expected_exit_code(1) .stderr_regex("error: JSON-RPC error: .*") @@ -340,7 +334,7 @@ fn send_satpoint_does_not_send_runic_utxos() { let output = CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -348,7 +342,7 @@ fn send_satpoint_does_not_send_runic_utxos() { rpc_server.mine_blocks_with_subsidy(1, 0); - CommandBuilder::new(format!("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet send --fee-rate 1 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw {}:1:0", output.transaction)) + CommandBuilder::new(format!("--regtest --index-runes wallet send --fee-rate 1 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw {}:1:0", output.transaction)) .rpc_server(&rpc_server) .expected_stderr("error: runic outpoints may not be sent by satpoint\n") .expected_exit_code(1) @@ -367,7 +361,7 @@ fn send_inscription_does_not_select_runic_utxos() { CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 1 --fee-rate 0 --supply 1000 --symbol ¢", Rune(RUNE), )) .rpc_server(&rpc_server) @@ -375,23 +369,23 @@ fn send_inscription_does_not_select_runic_utxos() { rpc_server.mine_blocks_with_subsidy(1, 10000); - let inscribe = CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet inscribe --fee-rate 0 --file foo.txt") - .write("foo.txt", "FOO") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let inscribe = + CommandBuilder::new("--regtest --index-runes wallet inscribe --fee-rate 0 --file foo.txt") + .write("foo.txt", "FOO") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); rpc_server.mine_blocks_with_subsidy(1, 0); - let output = - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") - .rpc_server(&rpc_server) - .run_and_deserialize_output::(); + let output = CommandBuilder::new("--regtest --index-runes wallet balance") + .rpc_server(&rpc_server) + .run_and_deserialize_output::(); assert_eq!(output.cardinal, 0); assert_eq!(output.ordinal, 10000); assert_eq!(output.runic, Some(10000)); - CommandBuilder::new(format!("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet send --postage 10001sat --fee-rate 0 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw {}", inscribe.inscriptions[0].id)) + CommandBuilder::new(format!("--regtest --index-runes wallet send --postage 10001sat --fee-rate 0 bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw {}", inscribe.inscriptions[0].id)) .rpc_server(&rpc_server) .expected_stderr("error: wallet does not contain enough cardinal UTXOs, please add additional funds to wallet.\n") .expected_exit_code(1) diff --git a/tests/lib.rs b/tests/lib.rs index 4026234ed2..758ad07e97 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -85,7 +85,7 @@ fn etch(rpc_server: &test_bitcoincore_rpc::Handle, rune: Rune) -> Etch { let output = CommandBuilder::new( format!( - "--index-runes-pre-alpha-i-agree-to-get-rekt --regtest wallet etch --rune {} --divisibility 0 --fee-rate 0 --supply 1000 --symbol ¢", + "--index-runes --regtest wallet etch --rune {} --divisibility 0 --fee-rate 0 --supply 1000 --symbol ¢", rune ) ) @@ -98,7 +98,7 @@ fn etch(rpc_server: &test_bitcoincore_rpc::Handle, rune: Rune) -> Etch { } fn runes(rpc_server: &test_bitcoincore_rpc::Handle) -> BTreeMap { - CommandBuilder::new("--index-runes-pre-alpha-i-agree-to-get-rekt --regtest runes") + CommandBuilder::new("--index-runes --regtest runes") .rpc_server(rpc_server) .run_and_deserialize_output::() .runes diff --git a/tests/runes.rs b/tests/runes.rs index b974ecbba7..d2ca6c9c1a 100644 --- a/tests/runes.rs +++ b/tests/runes.rs @@ -9,7 +9,7 @@ fn flag_is_required() { CommandBuilder::new("--regtest runes") .rpc_server(&rpc_server) .expected_exit_code(1) - .expected_stderr("error: `ord runes` requires index created with `--index-runes-pre-alpha-i-agree-to-get-rekt` flag\n") + .expected_stderr("error: `ord runes` requires index created with `--index-runes` flag\n") .run_and_extract_stdout(); } @@ -20,7 +20,7 @@ fn no_runes() { .build(); assert_eq!( - CommandBuilder::new("--index-runes-pre-alpha-i-agree-to-get-rekt --regtest runes") + CommandBuilder::new("--index-runes --regtest runes") .rpc_server(&rpc_server) .run_and_deserialize_output::(), Output { @@ -40,7 +40,7 @@ fn one_rune() { let etch = etch(&rpc_server, Rune(RUNE)); assert_eq!( - CommandBuilder::new("--index-runes-pre-alpha-i-agree-to-get-rekt --regtest runes") + CommandBuilder::new("--index-runes --regtest runes") .rpc_server(&rpc_server) .run_and_deserialize_output::(), Output { @@ -83,7 +83,7 @@ fn two_runes() { let b = etch(&rpc_server, Rune(RUNE + 1)); assert_eq!( - CommandBuilder::new("--index-runes-pre-alpha-i-agree-to-get-rekt --regtest runes") + CommandBuilder::new("--index-runes --regtest runes") .rpc_server(&rpc_server) .run_and_deserialize_output::(), Output { diff --git a/tests/wallet/balance.rs b/tests/wallet/balance.rs index 7b67825eab..ea50fe36b8 100644 --- a/tests/wallet/balance.rs +++ b/tests/wallet/balance.rs @@ -73,7 +73,7 @@ fn runic_utxos_are_deducted_from_cardinal() { create_wallet(&rpc_server); assert_eq!( - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") + CommandBuilder::new("--regtest --index-runes wallet balance") .rpc_server(&rpc_server) .run_and_deserialize_output::(), Output { @@ -88,7 +88,7 @@ fn runic_utxos_are_deducted_from_cardinal() { etch(&rpc_server, Rune(RUNE)); assert_eq!( - CommandBuilder::new("--regtest --index-runes-pre-alpha-i-agree-to-get-rekt wallet balance") + CommandBuilder::new("--regtest --index-runes wallet balance") .rpc_server(&rpc_server) .run_and_deserialize_output::(), Output { diff --git a/tests/wallet/inscribe.rs b/tests/wallet/inscribe.rs index f1fa390ca5..a2696e15aa 100644 --- a/tests/wallet/inscribe.rs +++ b/tests/wallet/inscribe.rs @@ -1780,6 +1780,8 @@ fn server_can_decompress_brotli() { let test_server = TestServer::spawn_with_server_args(&rpc_server, &[], &["--decompress"]); + test_server.sync_server(); + let client = reqwest::blocking::Client::builder() .brotli(false) .build()