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