SHOWING: First 60
#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 ""
msgstr ""
#: 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