SHOWING: First 60
caudillismo 14066
monumentale 14071
heppenstall 14079
delaminated 14080
aprendizaje 14085
madreporite 14096
barnesville 14099
humanistica 14103
agronomical 14114
instruccion 14114
embrocation 14118
coherentism 14122
directorium 14127
jahrzehnten 14131
callicrates 14135
microtrauma 14137
disburdened 14140
antimitotic 14141
endocytotic 14147
intradiscal 14148
histochemie 14168
intendencia 14182
metolachlor 14183
micrometric 14185
centerpoint 14197
mefistofele 14197
certifiably 14200
duddingston 14201
carabiniers 14208
allegorizes 14209
noncellular 14214
eventration 14215
nonhispanic 14215
imaginaires 14236
emperorship 14241
criminating 14244
interpretes 14251
interlingua 14255
haircutting 14265
millennials 14265
dipotassium 14275
misericorde 14277
mittermeier 14278
cavendishes 14280
connaughton 14297
mooresville 14302
cancellated 14303
gondreville 14304
angewandten 14307
funduscopic 14315
judicatures 14316
masturbator 14318
diplomatics 14325
leiomyomata 14331
morgentaler 14331
hydroplanes 14335
credulously 14339
#44,989,821textembryopathy 14571
multicelled 14577
dereference 14581
constantijn 14582
moundsville 14609
izdatelstvo 14611
antarcticus 14614
conseguenza 14616
disciplinae 14617
honeyeaters 14624
democritean 14626
chichimecas 14627
musselshell 14627
middleburgh 14628
hypsometric 14640
dramaturgie 14649
hindquarter 14655
delightsome 14657
koskenniemi 14657
brahmacarya 14660
arachnoidal 14664
crowborough 14666
goalkeepers 14669
lechevalier 14682
macadamised 14687
capodistria 14688
ineptitudes 14690
miscarrying 14695
buddenbrook 14696
histologist 14702
hieronymous 14703
cumberlands 14705
classischen 14717
bouthillier 14719
microcavity 14720
azacytidine 14725
autochthony 14728
dismutation 14742
dissyllabic 14748
athenodorus 14749
cliffhanger 14749
hindostanee 14753
chanterelle 14756
cefamandole 14769
conselheiro 14775
meteoritics 14777
microfossil 14780
axiomatized 14791
anglogerman 14808
kommunismus 14810
flowability 14813
interbranch 14813
gunslingers 14817
literalized 14819
dostoevskij 14820
beleuchtung 14822
hardicanute 14828
#44,989,791textmachynlleth 13846
dubiousness 13854
noteholders 13863
calophyllum 13877
birkenmajer 13879
breechcloth 13881
chachapoyas 13882
megavitamin 13882
cancellaria 13884
ascophyllum 13892
embarcation 13897
helicoverpa 13900
indefinably 13900
conformally 13902
nachmansohn 13902
nieuwenhuys 13911
athapaskans 13916
flowthrough 13924
bronchogram 13927
chronoscope 13927
aristotelem 13938
mandarinate 13944
nightshirts 13947
klinghoffer 13948
inductivism 13949
aristogiton 13951
moratoriums 13952
grantmakers 13960
barthelmess 13962
deamidation 13974
hairstylist 13975
gastrinomas 13976
novgorodian 13977
enshrouding 13986
alchemistic 13989
microcystic 13995
dramatistic 13996
embryologie 14001
escapements 14004
bilingually 14005
nonseasonal 14008
korrelation 14009
marketbased 14012
depauperate 14016
cacciaguida 14018
hematocrits 14025
caprimulgus 14027
loudmouthed 14028
hindumuslim 14037
bartenstein 14038
heresiarchs 14042
aufderheide 14046
agyptischen 14048
conciliates 14052
arquitectos 14056
kulasekhara 14058
banquetting 14066
#44,989,737textlymphoblast 14838
mohorovicic 14845
branciforte 14851
nasociliary 14853
leptokurtic 14860
genuflected 14861
guilelessly 14861
entomologie 14873
desiderated 14876
azurophilic 14884
midnovember 14886
cockleshell 14895
disciplinam 14896
moderations 14900
jagellonian 14902
jellyfishes 14902
gravitative 14907
autosampler 14914
notwendigen 14915
conventuals 14916
autocontent 14934
indecisions 14936
casecontrol 14937
coastguards 14938
frontrunner 14946
limitedness 14947
anwesenheit 14950
gnatcatcher 14952
calceolaria 14953
infomiation 14958
multivendor 14959
africanness 14961
harzburgite 14964
londinensis 14966
neorealists 14972
biosorption 14974
normalement 14977
monocytosis 14997
churchwomen 15000
gastroscope 15000
bettesworth 15004
materialman 15009
dietrichson 15010
calibrators 15013
divinitatis 15013
moleculaire 15014
classwizard 15015
monochromes 15020
compulsives 15024
gypsiferous 15024
guisborough 15030
migratorius 15034
goluchowski 15043
infiltrator 15044
materiellen 15048
interfluves 15063
lanceolatum 15067
#44,989,715textiesculapius 14341
fraserburgh 14344
gopalaswami 14349
isopentenyl 14350
middecember 14350
naturschutz 14350
bissonnette 14359
newtonville 14359
dhrtarastra 14366
geochemists 14373
microrelief 14378
freeloaders 14380
invaginates 14381
argersinger 14383
isbrandtsen 14385
commination 14393
microcuries 14393
containable 14397
migraineurs 14401
burhanuddin 14408
centipoises 14408
moclobemide 14427
debilitates 14429
manuscritos 14439
keyboardist 14440
infundibula 14445
nonbreaking 14445
dirofilaria 14459
kiesewetter 14468
camaldolese 14471
informativo 14478
cartularies 14482
demonically 14484
bettencourt 14496
cognoscendi 14499
edutainment 14505
angegebenen 14511
dipsomaniac 14511
fortysecond 14513
feuerwerker 14521
cybernation 14529
enjambement 14536
calisthenic 14537
instauratio 14538
antommarchi 14541
injectables 14542
elementorum 14543
commandtext 14545
nonharmonic 14559
baudricourt 14561
blackmarket 14561
ajdukiewicz 14562
frankreichs 14563
mythography 14564
fanaticisms 14565
microplates 14566
massanutten 14568
#44,989,674textjitteriness 15070
nonbiblical 15071
jagannathan 15076
impropriate 15083
corcyraeans 15085
belchertown 15088
floriferous 15089
displayable 15090
lecithinase 15090
botheration 15092
importances 15099
metrication 15103
grundlinien 15146
khmelnytsky 15150
marschallin 15154
indomitably 15155
chymopapain 15159
caesalpinia 15161
lionhearted 15163
endogeneous 15168
avalanching 15171
noticeboard 15173
methylating 15174
duesseldorf 15181
derepressed 15183
blogosphere 15194
chancellory 15195
inductivist 15196
episcopally 15199
liberazione 15199
hypermobile 15204
motherchild 15210
chateauguay 15212
microworlds 15218
chrysostome 15223
maclaughlin 15238
masquerader 15239
brasileiras 15240
haemophilic 15248
boomeranged 15256
multiagency 15262
attapulgite 15264
ballinasloe 15265
codimension 15265
boncompagni 15273
necrotising 15277
mandelshtam 15281
balcerowicz 15284
conspicious 15285
hornblendic 15286
mirthlessly 15288
multisector 15292
altostratus 15298
deoxidizing 15306
margueritte 15312
microblades 15314
housesteads 15316
#44,989,673text self.destinations.len(),
self.inscriptions.len(),
"invariant: destination addresses and number of inscriptions doesn't match"
),
Mode::SharedOutput => assert_eq!(
self.destinations.len(),
1,
"invariant: destination addresses and number of inscriptions doesn't match"
),
}
let satpoint = if let Some(satpoint) = self.satpoint {
satpoint
} else {
let inscribed_utxos = wallet_inscriptions
.keys()
.map(|satpoint| satpoint.outpoint)
.collect::<BTreeSet<OutPoint>>();
utxos
.keys()
.find(|outpoint| !inscribed_utxos.contains(outpoint) && !locked_utxos.contains(outpoint))
.map(|outpoint| SatPoint {
outpoint: *outpoint,
offset: 0,
})
.ok_or_else(|| anyhow!("wallet contains no cardinal utxos"))?
};
let mut reinscription = false;
for (inscribed_satpoint, inscription_id) in &wallet_inscriptions {
if *inscribed_satpoint == satpoint {
#44,989,204text .add_leaf(0, reveal_script.clone())
.expect("adding leaf should work")
.finalize(&secp256k1, public_key)
.expect("finalizing taproot builder should work");
let control_block = taproot_spend_info
.control_block(&(reveal_script.clone(), LeafVersion::TapScript))
.expect("should compute control block");
let commit_tx_address = Address::p2tr_tweaked(taproot_spend_info.output_key(), chain.network());
let total_postage = self.postage * u64::try_from(self.inscriptions.len()).unwrap();
let mut reveal_inputs = vec![OutPoint::null()];
let mut reveal_outputs = self
.destinations
.iter()
.map(|destination| TxOut {
script_pubkey: destination.script_pubkey(),
value: match self.mode {
Mode::SeparateOutputs => self.postage.to_sat(),
Mode::SharedOutput => total_postage.to_sat(),
},
})
.collect::<Vec<TxOut>>();
if let Some(ParentInfo {
location,
id: _,
destination,
tx_out,
#44,989,177text }) = self.parent_info.clone()
{
reveal_inputs.insert(0, location.outpoint);
reveal_outputs.insert(
0,
TxOut {
script_pubkey: destination.script_pubkey(),
value: tx_out.value,
},
);
}
let commit_input = if self.parent_info.is_some() { 1 } else { 0 };
let (_, reveal_fee) = Self::build_reveal_transaction(
&control_block,
self.reveal_fee_rate,
reveal_inputs.clone(),
commit_input,
reveal_outputs.clone(),
&reveal_script,
);
let unsigned_commit_tx = TransactionBuilder::new(
satpoint,
wallet_inscriptions,
utxos.clone(),
locked_utxos.clone(),
commit_tx_address.clone(),
change,
self.commit_fee_rate,
Target::Value(reveal_fee + total_postage),
)
.build_transaction()?;
let (vout, _commit_output) = unsigned_commit_tx
.output
.iter()
.enumerate()
.find(|(_vout, output)| output.script_pubkey == commit_tx_address.script_pubkey())
#44,989,158text outpoint: OutPoint { txid: reveal, vout },
offset,
},
});
}
super::Output {
commit,
reveal,
total_fees,
parent: self.parent_info.clone().map(|info| info.id),
inscriptions: inscriptions_output,
}
}
pub(crate) fn create_batch_inscription_transactions(
&self,
wallet_inscriptions: BTreeMap<SatPoint, InscriptionId>,
chain: Chain,
locked_utxos: BTreeSet<OutPoint>,
mut utxos: BTreeMap<OutPoint, Amount>,
change: [Address; 2],
) -> Result<(Transaction, Transaction, TweakedKeyPair, u64)> {
if let Some(parent_info) = &self.parent_info {
assert!(self
.inscriptions
.iter()
.all(|inscription| inscription.parent().unwrap() == parent_info.id))
}
if self.satpoint.is_some() {
assert_eq!(
self.inscriptions.len(),
1,
"invariant: satpoint may only be specified when making a single inscription",
);
}
match self.mode {
Mode::SeparateOutputs => assert_eq!(
#44,989,136textuse {
self::batch::{Batch, Batchfile, Mode},
super::*,
crate::{subcommand::wallet::transaction_builder::Target, wallet::Wallet},
bitcoin::{
blockdata::{opcodes, script},
key::PrivateKey,
key::{TapTweak, TweakedKeyPair, TweakedPublicKey, UntweakedKeyPair},
locktime::absolute::LockTime,
policy::MAX_STANDARD_TX_WEIGHT,
secp256k1::{self, constants::SCHNORR_SIGNATURE_SIZE, rand, Secp256k1, XOnlyPublicKey},
sighash::{Prevouts, SighashCache, TapSighashType},
taproot::Signature,
taproot::{ControlBlock, LeafVersion, TapLeafHash, TaprootBuilder},
ScriptBuf, Witness,
},
bitcoincore_rpc::bitcoincore_rpc_json::{ImportDescriptors, SignRawTransactionInput, Timestamp},
bitcoincore_rpc::Client,
std::collections::BTreeSet,
};
mod batch;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct InscriptionInfo {
pub id: InscriptionId,
pub location: SatPoint,
}
#[derive(Serialize, Deserialize)]
pub struct Output {
pub commit: Txid,
pub inscriptions: Vec<InscriptionInfo>,
#44,989,040text reinscription = true;
if self.reinscribe {
continue;
} else {
return Err(anyhow!("sat at {} already inscribed", satpoint));
}
}
if inscribed_satpoint.outpoint == satpoint.outpoint {
return Err(anyhow!(
"utxo {} already inscribed with inscription {inscription_id} on sat {inscribed_satpoint}",
satpoint.outpoint,
));
}
}
if self.reinscribe && !reinscription {
return Err(anyhow!(
"reinscribe flag set but this would not be a reinscription"
));
}
let secp256k1 = Secp256k1::new();
let key_pair = UntweakedKeyPair::new(&secp256k1, &mut rand::thread_rng());
let (public_key, _parity) = XOnlyPublicKey::from_keypair(&key_pair);
let reveal_script = Inscription::append_batch_reveal_script(
&self.inscriptions,
ScriptBuf::builder()
.push_slice(public_key.serialize())
.push_opcode(opcodes::all::OP_CHECKSIG),
);
let taproot_spend_info = TaprootBuilder::new()
#44,989,039text
let response = test_server.get("/blockcount");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.text().unwrap(), "2");
}
#[test]
fn block_height_endpoint() {
let test_server = TestServer::new();
let response = test_server.get("/blockheight");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.text().unwrap(), "0");
test_server.mine_blocks(2);
let response = test_server.get("/blockheight");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.text().unwrap(), "2");
}
#[test]
fn block_hash_endpoint() {
let test_server = TestServer::new();
let response = test_server.get("/blockhash");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(
response.text().unwrap(),
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
);
}
#[test]
fn block_hash_from_height_endpoint() {
let test_server = TestServer::new();
let response = test_server.get("/blockhash/0");#44,985,986text rune,
supply: u128::max_value(),
timestamp: 2,
..Default::default()
}
)]
);
let output = OutPoint { txid, vout: 0 };
assert_eq!(
server.index.get_rune_balances(),
[(output, vec![(id, u128::max_value())])]
);
server.assert_response_regex(
format!("/output/{output}"),
StatusCode::OK,
format!(
".*<title>Output {output}</title>.*<h1>Output <span class=monospace>{output}</span></h1>.*
<dt>runes</dt>
<dd>
<table>
<tr>
<th>rune</th>
<th>balance</th>
</tr>
<tr>
<td><a href=/rune/AAAAAAAAAAAAA>AAAAAAAAAAAAA</a></td>
<td>34028236692093846346337460743176821145.5</td>
</tr>
</table>
</dd>
.*"
),
);
assert_eq!(
server.get_json::<OutputJson>(format!("/output/{output}")),
OutputJson {
value: 5000000000,
script_pubkey: String::new(),
address: None,
transaction: txid.to_string(),
sat_ranges: None,
#44,985,982text inscriptions: Vec::new(),
runes: vec![(Rune(RUNE), 340282366920938463463374607431768211455)]
.into_iter()
.collect(),
}
);
}
#[test]
fn http_to_https_redirect_with_path() {
TestServer::new_with_args(&[], &["--redirect-http-to-https", "--https"]).assert_redirect(
"/sat/0",
&format!("https://{}/sat/0", System::new().host_name().unwrap()),
);
}
#[test]
fn http_to_https_redirect_with_empty() {
TestServer::new_with_args(&[], &["--redirect-http-to-https", "--https"]).assert_redirect(
"/",
&format!("https://{}/", System::new().host_name().unwrap()),
);
}
#[test]
fn status() {
TestServer::new().assert_response("/status", StatusCode::OK, "OK");
}
#[test]
fn block_count_endpoint() {
let test_server = TestServer::new();
let response = test_server.get("/blockcount");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.text().unwrap(), "1");
test_server.mine_blocks(1);
#44,985,981text );
}
#[test]
fn empty_range_returns_400() {
TestServer::new().assert_response("/range/0/0", StatusCode::BAD_REQUEST, "empty range");
}
#[test]
fn range() {
TestServer::new().assert_response_regex(
"/range/0/1",
StatusCode::OK,
r".*<title>Sat range 0–1</title>.*<h1>Sat range 0–1</h1>
<dl>
<dt>value</dt><dd>1</dd>
<dt>first</dt><dd><a href=/sat/0 class=mythic>0</a></dd>
</dl>.*",
);
}
#[test]
fn sat_number() {
TestServer::new().assert_response_regex("/sat/0", StatusCode::OK, ".*<h1>Sat 0</h1>.*");
}
#[test]
fn sat_decimal() {
TestServer::new().assert_response_regex("/sat/0.0", StatusCode::OK, ".*<h1>Sat 0</h1>.*");
}
#[test]
fn sat_degree() {
TestServer::new().assert_response_regex("/sat/0°0′0″0‴", StatusCode::OK, ".*<h1>Sat 0</h1>.*");
}
#[test]
fn sat_name() {
TestServer::new().assert_response_regex(
"/sat/nvtdijuwxlp",
StatusCode::OK,
".*<h1>Sat 0</h1>.*",
);
}
#[test]
fn sat() {
TestServer::new().assert_response_regex(
#44,985,976text
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(
response.text().unwrap(),
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
);
}
#[test]
fn block_time_endpoint() {
let test_server = TestServer::new();
let response = test_server.get("/blocktime");
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.text().unwrap(), "1231006505");
}
#[test]
fn range_end_before_range_start_returns_400() {
TestServer::new().assert_response(
"/range/1/0",
StatusCode::BAD_REQUEST,
"range start greater than range end",
);
}
#[test]
fn invalid_range_start_returns_400() {
TestServer::new().assert_response(
"/range/=/0",
StatusCode::BAD_REQUEST,
"Invalid URL: invalid digit found in string",
);
}
#[test]
fn invalid_range_end_returns_400() {
TestServer::new().assert_response(
"/range/0/=",
StatusCode::BAD_REQUEST,
"Invalid URL: invalid digit found in string",
#44,985,949textmsgstr "`--testnet` or `-t`"
#: src/guides/testing.md:13
msgid "Signet"
msgstr "Signet"
#: src/guides/testing.md:13
msgid "`--signet` or `-s`"
msgstr "`--signet` or `-s`"
#: src/guides/testing.md:14
msgid "Regtest"
msgstr "Regtest"
#: src/guides/testing.md:14
msgid "`--regtest` or `-r`"
msgstr "`--regtest` or `-r`"
#: src/guides/testing.md:16
msgid "Regtest doesn't require downloading the blockchain or indexing ord."
msgstr ""
"Ang regtest ay hindi nangangailangan ng pag-download ng blockchain o "
"indexing ord."
#: src/guides/testing.md:21
msgid "Run bitcoind in regtest with:"
msgstr "I-run ang bitcoind sa regtest gamit ang:"
#: src/guides/testing.md:25
msgid "Create a wallet in regtest with:"
msgstr "Gumawa ng wallet bilang regtest gamit ang:"
#: src/guides/testing.md:29
msgid "Get a regtest receive address with:"
msgstr "Kumuha ng isang regtest receive address na may:"
#: src/guides/testing.md:33
msgid "Mine 101 blocks (to unlock the coinbase) with:"
msgstr "Mine 101 blocks (upang i-unlock ang coinbase) gamit ang:"
#44,985,172text
#: src/guides/testing.md:37
msgid "Inscribe in regtest with:"
msgstr "I-inscribe sa regtest kasama:"
#: src/guides/testing.md:41
msgid "Mine the inscription with:"
msgstr "I-mine and inscription gamit ang:"
#: src/guides/testing.md:45
msgid "View the inscription in the regtest explorer:"
msgstr "Tingnan ang inskripsiyon sa regtest explorer:"
#: src/guides/testing.md:50
msgid "Testing Recursion"
msgstr "Pag-test ng Recursion"
#: src/guides/testing.md:53
msgid ""
"When testing out [recursion](../inscriptions/recursion.md), inscribe the "
"dependencies first (example with [p5.js](https://p5js.org)):"
msgstr ""
"Kapag sinusubukan ang [recursion](../inscriptions/recursion.md), isulat ang "
"mga dependencies muna (halimbawa sa [p5.js](https://p5js.org)):"
#: src/guides/testing.md:58
msgid ""
"This should return a `inscription_id` which you can then reference in your "
"recursive inscription."
msgstr ""
"Dapat itong magbalik ng `inscription_id` na maaari mong ireference sa iyong "
"recursive inscription."
#: src/guides/testing.md:61
#44,985,171text