Skip to content

Commit

Permalink
Show all inscription geneses on /tx (#2909)
Browse files Browse the repository at this point in the history
  • Loading branch information
casey authored Dec 25, 2023
1 parent 4bbeadc commit ee0a1a3
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 38 deletions.
20 changes: 20 additions & 0 deletions src/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1389,6 +1389,26 @@ impl Index {
}))
}

pub(crate) fn inscription_count(&self, txid: Txid) -> Result<u32> {
let start = InscriptionId { index: 0, txid };

let end = InscriptionId {
index: u32::MAX,
txid,
};

Ok(
self
.database
.begin_read()?
.open_table(INSCRIPTION_ID_TO_SEQUENCE_NUMBER)?
.range::<&InscriptionIdValue>(&start.store()..&end.store())?
.count()
.try_into()
.unwrap(),
)
}

pub(crate) fn inscription_exists(&self, inscription_id: InscriptionId) -> Result<bool> {
Ok(
self
Expand Down
21 changes: 12 additions & 9 deletions src/subcommand/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -718,20 +718,23 @@ impl Server {
Extension(index): Extension<Arc<Index>>,
Path(txid): Path<Txid>,
) -> ServerResult<PageHtml<TransactionHtml>> {
let inscription = index.get_inscription_by_id(InscriptionId { txid, index: 0 })?;
let transaction = index
.get_transaction(txid)?
.ok_or_not_found(|| format!("transaction {txid}"))?;

let inscription_count = index.inscription_count(txid)?;

let blockhash = index.get_transaction_blockhash(txid)?;

Ok(
TransactionHtml::new(
index
.get_transaction(txid)?
.ok_or_not_found(|| format!("transaction {txid}"))?,
TransactionHtml {
blockhash,
inscription.map(|_| InscriptionId { txid, index: 0 }),
server_config.chain,
index.get_etching(txid)?,
)
transaction,
txid,
inscription_count,
chain: server_config.chain,
etching: index.get_etching(txid)?,
}
.page(server_config),
)
}
Expand Down
50 changes: 23 additions & 27 deletions src/templates/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,12 @@ use super::*;

#[derive(Boilerplate)]
pub(crate) struct TransactionHtml {
blockhash: Option<BlockHash>,
chain: Chain,
etching: Option<SpacedRune>,
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<SpacedRune>,
) -> Self {
Self {
txid: transaction.txid(),
blockhash,
chain,
etching,
inscription,
transaction,
}
}
pub(crate) blockhash: Option<BlockHash>,
pub(crate) chain: Chain,
pub(crate) etching: Option<SpacedRune>,
pub(crate) inscription_count: u32,
pub(crate) transaction: Transaction,
pub(crate) txid: Txid,
}

impl PageContent for TransactionHtml {
Expand Down Expand Up @@ -65,7 +46,14 @@ mod tests {
let txid = transaction.txid();

pretty_assert_eq!(
TransactionHtml::new(transaction, None, None, Chain::Mainnet, None).to_string(),
TransactionHtml {
blockhash: None,
chain: Chain::Mainnet,
etching: None,
inscription_count: 0,
txid: transaction.txid(),
transaction,
}.to_string(),
format!(
"
<h1>Transaction <span class=monospace>{txid}</span></h1>
Expand Down Expand Up @@ -121,7 +109,15 @@ mod tests {
};

assert_regex_match!(
TransactionHtml::new(transaction, Some(blockhash(0)), None, Chain::Mainnet, None),
TransactionHtml {
blockhash: Some(blockhash(0)),
chain: Chain::Mainnet,
etching: None,
inscription_count: 0,
txid: transaction.txid(),
transaction,
}
.to_string(),
"
<h1>Transaction <span class=monospace>[[:xdigit:]]{64}</span></h1>
<dl>
Expand Down
6 changes: 4 additions & 2 deletions templates/transaction.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<h1>Transaction <span class=monospace>{{self.txid}}</span></h1>
%% if let Some(id) = self.inscription {
%% if self.inscription_count > 0 {
<h2>Inscription Geneses</h2>
<div class=thumbnails>
{{ Iframe::thumbnail(id) }}
%% for index in 0..self.inscription_count {
{{ Iframe::thumbnail(InscriptionId { txid: self.txid, index }) }}
%% }
</div>
%% }
<dl>
Expand Down
29 changes: 29 additions & 0 deletions tests/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,35 @@ fn inscription_appears_on_reveal_transaction_page() {
);
}

#[test]
fn multiple_inscriptions_appear_on_reveal_transaction_page() {
let rpc_server = test_bitcoincore_rpc::spawn();
create_wallet(&rpc_server);

rpc_server.mine_blocks(1);

let output = CommandBuilder::new("wallet inscribe --batch batch.yaml --fee-rate 55")
.write("inscription.txt", "Hello World")
.write("meow.wav", [0; 2048])
.write(
"batch.yaml",
"mode: shared-output\ninscriptions:\n- file: inscription.txt\n- file: meow.wav\n",
)
.rpc_server(&rpc_server)
.run_and_deserialize_output::<Inscribe>();

rpc_server.mine_blocks(1);

let id0 = output.inscriptions[0].id;
let id1 = output.inscriptions[1].id;
let reveal = output.reveal;

TestServer::spawn_with_args(&rpc_server, &[]).assert_response_regex(
format!("/tx/{reveal}"),
format!(".*<h1>Transaction .*</h1>.*<a href=/inscription/{id0}.*<a href=/inscription/{id1}.*"),
);
}

#[test]
fn inscription_appears_on_output_page() {
let rpc_server = test_bitcoincore_rpc::spawn();
Expand Down

0 comments on commit ee0a1a3

Please sign in to comment.