transfer1,000.pizza#76,140,275brc-20transfer1,000.pizza#76,140,267brc-20transfer3,055.88.pizza#75,672,975brc-20transfer10.bits#73,588,611brc-20transfer100.xmonk#72,288,831brc-20#71,557,208texttransfer1,050.pizza#71,554,160brc-20transfer1,000.pizza#71,553,913brc-20transfer100.pizza#71,547,361brc-20transfer50.pizza#71,547,284brc-20transfer100.pizza#71,547,000brc-20transfer100.pizza#71,546,399brc-20transfer100.pizza#71,545,197brc-20transfer100.pizza#71,540,696brc-20transfer100.pizza#71,540,666brc-20transfer100.pizza#71,540,660brc-20transfer100.pizza#71,540,658brc-20transfer100.pizza#71,540,644brc-20transfer100.pizza#71,540,551brc-20transfer100.pizza#71,540,546brc-20transfer100.pizza#71,540,538brc-20transfer100.pizza#71,540,514brc-20transfer100.pizza#71,533,794brc-20transfer100.pizza#71,533,687brc-20transfer100.pizza#71,533,615brc-20transfer100.pizza#71,533,541brc-20transfer100.pizza#71,533,535brc-20transfer100.pizza#71,445,384brc-20transfer100.pizza#71,262,029brc-20transfer500,000.bj:)#68,536,790brc-20mint1,000..bet#59,148,946brc-20mint1,000..420#59,086,326brc-20 ), ..Default::default() }); context.mine_blocks(1); context.assert_runes( [( id, RuneEntry { etching: txid0, rune: Rune(RUNE), supply: u128::max_value(), timestamp: 2, ..Default::default() }, )], [( OutPoint { txid: txid1, vout: 0, }, vec![(id, u128::max_value())], )], ); } #[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(); context.mine_blocks(1); let txid0 = context.rpc_server.broadcast_tx(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new())], op_return: Some( Runestone { edicts: vec![Edict { id: 0, amount: u128::max_value(), output: 0, }], etching: Some(Etching { rune: Rune(RUNE), ..Default::default() #45,159,794text "index_path": ".*\.redb", "leaf_pages": \d+, "metadata_bytes": \d+, "outputs_traversed": 0, "page_size": \d+, "sat_ranges": 0, "stored_bytes": \d+, "tables": .*, "transactions": \[ \{ "starting_block_count": 0, "starting_timestamp": \d+ \} \], "tree_height": \d+, "utxos_indexed": 0 \} "#, ) .run_and_extract_stdout(); } #[test] fn transactions() { let rpc_server = test_bitcoincore_rpc::spawn(); let tempdir = TempDir::new().unwrap(); let index_path = tempdir.path().join("index.redb"); assert!(CommandBuilder::new(format!( "--index {} index info --transactions", index_path.display() )) .rpc_server(&rpc_server) .run_and_deserialize_output::<Vec<TransactionsOutput>>() .is_empty()); rpc_server.mine_blocks(10); let output = CommandBuilder::new(format!( "--index {} index info --transactions", index_path.display() )) .rpc_server(&rpc_server) .run_and_deserialize_output::<Vec<TransactionsOutput>>(); assert_eq!(output[0].start, 0); #45,159,667text confirmations: 0, difficulty: 0.0, hash: block_hash, height, median_time: None, merkle_root: TxMerkleNode::all_zeros(), n_tx: 0, next_block_hash: None, nonce: 0, previous_block_hash: None, time: 0, version: Version::ONE, version_hex: Some(vec![0, 0, 0, 0]), }) .unwrap(), ) } else { match self.state().blocks.get(&block_hash) { Some(block) => Ok(serde_json::to_value(hex::encode(serialize(&block.header))).unwrap()), None => Err(Self::not_found()), } } } fn get_block( &self, block_hash: BlockHash, verbosity: u64, ) -> Result<String, jsonrpc_core::Error> { assert_eq!(verbosity, 0, "Verbosity level {verbosity} is unsupported"); match self.state().blocks.get(&block_hash) { Some(block) => Ok(hex::encode(serialize(block))), None => Err(Self::not_found()), } } fn get_block_count(&self) -> Result<u64, jsonrpc_core::Error> { #45,051,263text let string = $string; if !regex.is_match(string.as_ref()) { panic!( "Regex:\n\n{}\n\n…did not match string:\n\n{}", regex, string ); } }; } type Inscribe = ord::subcommand::wallet::inscribe::Output; fn inscribe(rpc_server: &test_bitcoincore_rpc::Handle) -> (InscriptionId, Txid) { rpc_server.mine_blocks(1); let output = CommandBuilder::new("wallet inscribe --fee-rate 1 --file foo.txt") .write("foo.txt", "FOO") .rpc_server(rpc_server) .run_and_deserialize_output::<Inscribe>(); rpc_server.mine_blocks(1); assert_eq!(output.inscriptions.len(), 1); (output.inscriptions[0].id, output.reveal) } fn envelope(payload: &[&[u8]]) -> bitcoin::Witness { let mut builder = bitcoin::script::Builder::new() .push_opcode(bitcoin::opcodes::OP_FALSE) .push_opcode(bitcoin::opcodes::all::OP_IF); for data in payload { let mut buf = bitcoin::script::PushBytesBuf::new(); buf.extend_from_slice(data).unwrap(); builder = builder.push_slice(buf); #45,051,252text rune: Rune(RUNE), ..Default::default() }), ..Default::default() } .encipher(), ), ..Default::default() }); context.mine_blocks(1); let id = RuneId { height: 2, index: 1, }; context.assert_runes( [( id, RuneEntry { etching: txid, rune: Rune(RUNE), supply: u128::max_value(), timestamp: 2, ..Default::default() }, )], [(OutPoint { txid, vout: 0 }, vec![(id, u128::max_value())])], ); } } #[test] fn etching_with_non_zero_divisibility_and_rune() { let context = Context::builder() .arg("--index-runes-pre-alpha-i-agree-to-get-rekt") .build(); context.mine_blocks(1); let txid = context.rpc_server.broadcast_tx(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new())], op_return: Some( Runestone { edicts: vec![Edict {#45,022,413text"```" msgstr "" "```sh\n" "bitcoin-cli getdescriptorinfo \\\n" " " "'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)'\n" "```" #: src/guides/sat-hunting.md:170 msgid "" "```json\n" "{\n" " \"descriptor\": " "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\",\n" " \"checksum\": \"tpnxnxax\",\n" " \"isrange\": true,\n" " \"issolvable\": true,\n" " \"hasprivatekeys\": false\n" "}\n" "```" msgstr "" "```json\n" "{\n" " \"descriptor\": " "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\",\n" " \"checksum\": \"tpnxnxax\",\n" " \"isrange\": true,\n" " \"issolvable\": true,\n" " \"hasprivatekeys\": false\n" "}\n" "```" #: src/guides/sat-hunting.md:180 msgid "And for the change address descriptor, in this case `64k8wnd7`:"#44,992,604text #: src/guides/collecting/sparrow-wallet.md:136 msgid "" "If you previously froze the UXTO you will need to right-click on it and " "unfreeze it." msgstr "" "Se você congelou o UXTO anteriormente, precisará clicar com o botão direito nele e descongelá-lo." #: src/guides/collecting/sparrow-wallet.md:138 msgid "" "Select the UTXO you want to send, and ensure that is the _only_ UTXO is " "selected. You should see `UTXOs 1/1` in the interface. Once you are sure " "this is the case you can hit `Send Selected`." msgstr "" "Selecione o UTXO que deseja enviar e certifique-se de que _apenas_ aquele UTXO esteja selecionado. " "Você deverá ver `UTXOs 1/1` na interface. Quando tiver certeza de que este é o caso, você pode clicar em `Send Selected`." #: src/guides/collecting/sparrow-wallet.md:140 msgid "![](images/sending_02.png)" msgstr "![](images/sending_02.png)" #: src/guides/collecting/sparrow-wallet.md:142 msgid "" "You will then be presented with the transaction construction interface. " "There is a few things you need to check here to make sure that this is a " #44,992,602text tempdir.path().display(), tempdir.path().display(), ord_args.join(" "), server_args.join(" "), ).to_args()) .env("ORD_INTEGRATION_TEST", "1") .current_dir(&tempdir) .spawn().unwrap(); for i in 0.. { match reqwest::blocking::get(format!("http://127.0.0.1:{port}/status")) { Ok(_) => break, Err(err) => { if i == 400 { panic!("Server failed to start: {err}"); } } } thread::sleep(Duration::from_millis(25)); } Self { child, tempdir, port, rpc_url: rpc_server.url(), } } pub(crate) fn url(&self) -> Url { format!("http://127.0.0.1:{}", self.port).parse().unwrap() } pub(crate) fn assert_response_regex(&self, path: impl AsRef<str>, regex: impl AsRef<str>) { self.sync_server(); let response = reqwest::blocking::get(self.url().join(path.as_ref()).unwrap()).unwrap(); assert_eq!(response.status(), StatusCode::OK); assert_regex_match!(response.text().unwrap(), regex.as_ref()); #44,992,601text let blocks = self.rpc_server.mine_blocks_with_subsidy(n, subsidy); self.index.update().unwrap(); blocks } pub(crate) fn configurations() -> Vec<Context> { vec![ Context::builder().build(), Context::builder().arg("--index-sats").build(), ] } #[track_caller] pub(crate) fn assert_runes( &self, mut runes: impl AsMut<[(RuneId, RuneEntry)]>, mut balances: impl AsMut<[(OutPoint, Vec<(RuneId, u128)>)]>, ) { let runes = runes.as_mut(); runes.sort_by_key(|(id, _)| *id); let balances = balances.as_mut(); balances.sort_by_key(|(outpoint, _)| *outpoint); for (_, balances) in balances.iter_mut() { balances.sort_by_key(|(id, _)| *id); } assert_eq!(runes, self.index.runes().unwrap()); assert_eq!(balances, self.index.get_rune_balances()); let mut outstanding: HashMap<RuneId, u128> = HashMap::new(); for (_, balances) in balances { for (id, balance) in balances { *outstanding.entry(*id).or_default() += *balance; #44,991,361textpub(crate) use { super::*, bitcoin::{ blockdata::{opcodes, script, script::PushBytesBuf}, ScriptBuf, Witness, }, pretty_assertions::assert_eq as pretty_assert_eq, std::iter, test_bitcoincore_rpc::TransactionTemplate, unindent::Unindent, }; macro_rules! assert_regex_match { ($value:expr, $pattern:expr $(,)?) => { let regex = Regex::new(&format!("^(?s){}$", $pattern)).unwrap(); let string = $value.to_string(); if !regex.is_match(string.as_ref()) { panic!( "Regex:\n\n{}\n\n…did not match string:\n\n{}", regex, string ); } }; } macro_rules! assert_matches { ($expression:expr, $( $pattern:pat_param )|+ $( if $guard:expr )? $(,)?) => { match $expression { $( $pattern )|+ $( if $guard )? => {} left => panic!( "assertion failed: (left ~= right)\n left: `{:?}`\n right: `{}`", left, stringify!($($pattern)|+ $(if $guard)?) ), } } } pub(crate) fn blockhash(n: u64) -> BlockHash { let hex = format!("{n:x}");#44,991,294text let info = server.index.info().unwrap(); assert_eq!(info.transactions.len(), 1); assert_eq!(info.transactions[0].starting_block_count, 0); server.index.update().unwrap(); assert_eq!(server.index.statistic(crate::index::Statistic::Commits), 1); let info = server.index.info().unwrap(); assert_eq!(info.transactions.len(), 1); assert_eq!(info.transactions[0].starting_block_count, 0); server.mine_blocks(1); thread::sleep(Duration::from_millis(10)); server.index.update().unwrap(); assert_eq!(server.index.statistic(crate::index::Statistic::Commits), 2); let info = server.index.info().unwrap(); assert_eq!(info.transactions.len(), 2); assert_eq!(info.transactions[0].starting_block_count, 0); assert_eq!(info.transactions[1].starting_block_count, 1); assert!( info.transactions[1].starting_timestamp - info.transactions[0].starting_timestamp >= 10 ); } #[test] fn outputs_traversed_are_tracked() { let server = TestServer::new_with_sat_index();#44,990,714text let acme_cache = if let Some(acme_cache) = acme_cache { acme_cache.clone() } else { options.data_dir()?.join("acme-cache") }; Ok(acme_cache) } fn acme_domains(&self) -> Result<Vec<String>> { if !self.acme_domain.is_empty() { Ok(self.acme_domain.clone()) } else { Ok(vec![System::new() .host_name() .ok_or(anyhow!("no hostname found"))?]) } } fn http_port(&self) -> Option<u16> { if self.http || self.http_port.is_some() || (self.https_port.is_none() && !self.https) { Some(self.http_port.unwrap_or(80)) } else { None } } fn https_port(&self) -> Option<u16> { if self.https || self.https_port.is_some() { Some(self.https_port.unwrap_or(443)) } else { None } } fn acceptor(&self, options: &Options) -> Result<AxumAcceptor> { let config = AcmeConfig::new(self.acme_domains()?) .contact(&self.acme_contact) .cache_option(Some(DirCache::new(Self::acme_cache( self.acme_cache.as_ref(),#44,990,711texteasterfield 9853 germanizing 9855 montelukast 9857 interspaced 9862 antilocapra 9863 chelicerata 9863 metabasites 9867 evangelised 9869 magistrorum 9870 magnificant 9875 epigraphica 9881 laicization 9881 countercoup 9884 demagnetize 9884 liebenstein 9884 callitriche 9885 dendermonde 9887 hyacinthine 9894 isometrical 9895 calypsonian 9899 hereditatem 9899 connexional 9900 eisenbahnen 9902 haemothorax 9905 jardinieres 9906 nocturnally 9907 inflatables 9913 birchington 9914 einsteinium 9914 coccinellid 9921 homogenizes 9930 allensworth 9931 morrissette 9931 ldentifying 9934 compossible 9935 judaization 9939 algebraists 9942 charactered 9956 insolencies 9956 ghorbanifar 9957 aurantiacus 9962 autoerotism 9964 fisherwomen 9964 montgomerys 9964 halfmillion 9965 amerasinghe 9967 flaubertian 9972 emasculates 9973 compellence 9974 instructers 9975 metatextual 9976 mahalakshmi 9982 ausreichend 9983 diligencias 9986 laframboise 9988 noninvolved 9989 middendorff 9994 fortenbaugh 10000 concertedly 10003 castellucci 10005 chirurgeons 10008#44,990,352text"digital money." msgstr "" "Se as inscrições provarem, como os autores esperam, serem artefatos digitais " "muito procurados com uma história rica, elas servirão como um gancho poderoso " "para a adoção do Bitcoin: venha pela diversão e arte rica, fique pelo dinheiro " "digital descentralizado." #: src/faq.md:327 msgid "" "Inscriptions are an extremely benign source of demand for block space. " "Unlike, for example, stablecoins, which potentially give large stablecoin " "issuers influence over the future of Bitcoin development, or DeFi, which " "might centralize mining by introducing opportunities for MEV, digital art " "and collectables on Bitcoin, are unlikely to produce individual entities " "with enough power to corrupt Bitcoin. Art is decentralized." msgstr "" "As inscrições são uma fonte extremamente benigna de demanda por espaço de bloco. " "Ao contrário, por exemplo, das stablecoins, que potencialmente dão aos grandes " "emissores de stablecoin influência sobre o futuro do desenvolvimento do Bitcoin, "#44,990,068textdmt-mint.nat#44,511,363tapdmt-mint.nat#44,511,271tapdmt-mint.nat#44,511,232tapdmt-mint.nat#44,511,096tapdmt-mint.nat#44,511,089tapdmt-mint.nat#44,511,049tapdmt-mint.nat#44,511,037tapdmt-mint.nat#44,511,011tapdmt-mint.nat#44,511,008tapdmt-mint.nat#44,510,983tapdmt-mint.nat#44,510,961tapdmt-mint.nat#44,510,951tapdmt-mint.nat#44,510,948tapdmt-mint.nat#44,510,918tap