transfer100.pizza#71,399,816brc-20Inscription #54260504#54,260,504htmlInscription #54260503#54,260,503htmlInscription #54004077#54,004,077gifInscription #54004062#54,004,062gifInscription #51036840#51,036,840pngInscription #51036821#51,036,821pngmint1,000.seed#48,894,945brc-20mint1,000.seed#48,894,935brc-20mint1,000.seed#48,894,928brc-20mint1,000.seed#48,894,909brc-20mint1,000.seed#48,894,898brc-20mint1,000.seed#48,894,889brc-20mint1,000.seed#48,894,877brc-20mint1,000.seed#48,894,870brc-20mint1,000.seed#48,894,853brc-20mint1,000.seed#48,894,844brc-20mint1,000.seed#48,894,843brc-20mint1,000.bjgn#46,881,796brc-20mint1,000.bjgn#46,881,749brc-20mint1,000.bjgn#46,881,729brc-20mint1,000.bjgn#46,881,722brc-20mint1,000.bjgn#46,881,675brc-20mint1,000.bjgn#46,875,139brc-20mint1,000.bjgn#46,875,082brc-20mint1,000.bjgn#46,875,039brc-20mint1,000.bjgn#46,875,033brc-20mint1,000.bjgn#46,875,032brc-20mint1,000.bjgn#46,871,012brc-20mint1,000.bjgn#46,871,011brc-20mint1,000.bjgn#46,871,010brc-20mint1,000.bjgn#46,871,009brc-20mint1,000.bjgn#46,871,008brc-20caudillismo 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