#71,562,158texttransfer300.pizza#71,411,083brc-20transfer50,000.mice#45,802,358brc-20transfer24,000.mice#45,439,476brc-20<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="#a1adb8"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --><path d="M96 0C43 0 0 43 0 96V416c0 53 43 96 96 96H384h32c17.7 0 32-14.3 32-32s-14.3-32-32-32V384c17.7 0 32-14.3 32-32V32c0-17.7-14.3-32-32-32H384 96zm0 384H352v64H96c-17.7 0-32-14.3-32-32s14.3-32 32-32zm32-240c0-8.8 7.2-16 16-16H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16zm16 48H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16s7.2-16 16-16z"/></svg> #44,986,149text script_sig: Default::default(), witness: Default::default(), }], output: vec![ TxOut { value: 50 * COIN_VALUE, script_pubkey: script::Builder::new().push_int(0).into_script(), }, TxOut { value: 50 * COIN_VALUE, script_pubkey: script::Builder::new().push_int(1).into_script(), }, ], }; let txid = transaction.txid(); pretty_assert_eq!( TransactionHtml::new(transaction, None, None, Chain::Mainnet, None).to_string(), format!( " <h1>Transaction <span class=monospace>{txid}</span></h1> <dl> </dl> <h2>1 Input</h2> <ul> <li><a class=monospace href=/output/0000000000000000000000000000000000000000000000000000000000000000:4294967295>0000000000000000000000000000000000000000000000000000000000000000:4294967295</a></li> </ul> <h2>2 Outputs</h2> <ul class=monospace> <li> <a href=/output/{txid}:0 class=monospace> #44,986,110textuse super::*; #[derive(Boilerplate)] pub(crate) struct TransactionHtml { blockhash: Option<BlockHash>, chain: Chain, etching: Option<Rune>, inscription: Option<InscriptionId>, transaction: Transaction, txid: Txid, } impl TransactionHtml { pub(crate) fn new( transaction: Transaction, blockhash: Option<BlockHash>, inscription: Option<InscriptionId>, chain: Chain, etching: Option<Rune>, ) -> Self { Self { txid: transaction.txid(), blockhash, chain, etching, inscription, transaction, } } } impl PageContent for TransactionHtml { fn title(&self) -> String { format!("Transaction {}", self.txid) } } #[cfg(test)] mod tests { use { super::*, bitcoin::{blockdata::script, locktime::absolute::LockTime, TxOut}, }; #[test] fn html() { let transaction = Transaction { version: 0, lock_time: LockTime::ZERO, input: vec![TxIn { sequence: Default::default(), previous_output: Default::default(), #44,986,108text {txid}:0 </a> <dl> <dt>value</dt><dd>5000000000</dd> <dt>script pubkey</dt><dd class=monospace>OP_0</dd> </dl> </li> <li> <a href=/output/{txid}:1 class=monospace> {txid}:1 </a> <dl> <dt>value</dt><dd>5000000000</dd> <dt>script pubkey</dt><dd class=monospace>OP_PUSHNUM_1</dd> </dl> </li> </ul> " ) .unindent() ); } #[test] fn with_blockhash() { let transaction = Transaction { version: 0, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![ TxOut { value: 50 * COIN_VALUE, script_pubkey: script::Builder::new().push_int(0).into_script(), }, TxOut { value: 50 * COIN_VALUE, script_pubkey: script::Builder::new().push_int(1).into_script(), }, ], }; assert_regex_match!( #44,986,083text ); } #[test] fn sat_with_inscription() { assert_regex_match!( SatHtml { sat: Sat(0), satpoint: None, blocktime: Blocktime::confirmed(0), inscriptions: vec![inscription_id(1)], }, " <h1>Sat 0</h1> .* <dt>inscriptions</dt> <dd class=thumbnails> <a href=/inscription/1{64}i1>.*</a> </dd> .*" .unindent(), ); } #[test] fn sat_with_reinscription() { assert_regex_match!( SatHtml { sat: Sat(0), satpoint: None, blocktime: Blocktime::confirmed(0), inscriptions: vec![inscription_id(1), inscription_id(2)], }, " <h1>Sat 0</h1> .* <dt>inscriptions</dt> <dd class=thumbnails> <a href=/inscription/1{64}i1>.*</a> <a href=/inscription/2{64}i2>.*</a> </dd> .*" .unindent(), ); } #[test] fn last_sat_next_link_is_disabled() { assert_regex_match!( #44,986,082textdmt-mint.magic#44,749,948tapdmt-mint.magic#44,744,162tapdmt-mint.nat#42,582,321tapdmt-mint.nat#42,582,276tapdmt-mint.nat#42,582,249tapdmt-mint.nat#42,582,248tapdmt-mint.nat#42,559,780tapdmt-mint.nat#42,559,638tapdmt-mint.nat#42,559,623taptransfer20,000.turt#42,454,377brc-20transfer100,000.cats#41,237,661brc-20mint100.stst#40,868,771brc-20mint100.stst#40,868,741brc-20mint100.stst#40,868,735brc-20mint100.stst#40,868,725brc-20mint100.stst#40,868,709brc-20mint100.stst#40,868,708brc-20mint100.stst#40,868,705brc-20mint100.stst#40,868,704brc-20mint100.stst#40,868,702brc-20mint100.stst#40,868,671brc-20mint100.stst#40,868,653brc-20mint100.stst#40,868,652brc-20mint100.stst#40,868,650brc-20mint100.stst#40,868,642brc-20mint100.stst#40,868,627brc-20mint100.stst#40,868,612brc-20mint100.stst#40,868,610brc-20mint100.stst#40,868,603brc-20mint100.stst#40,868,594brc-20mint100.stst#40,868,590brc-20mint100.stst#40,868,575brc-20mint100.stst#40,868,567brc-20mint100.stst#40,868,555brc-20mint100.stst#40,868,551brc-20mint100.stst#40,868,536brc-20mint100.stst#40,868,531brc-20mint100.stst#40,868,526brc-20mint100.stst#40,868,524brc-20mint100.stst#40,868,522brc-20mint100.stst#40,868,520brc-20mint100.stst#40,868,519brc-20mint100.stst#40,868,517brc-20mint100.stst#40,868,515brc-20mint100.stst#40,868,514brc-20mint100.stst#40,868,500brc-20mint100.stst#40,868,499brc-20mint100.stst#40,868,497brc-20mint100.stst#40,868,496brc-20mint100.stst#40,866,244brc-20mint100.stst#40,866,215brc-20