690144.btc#73,083,177text690162.btc#73,083,166text690063.btc#73,083,165texttransfer100.pizza#71,204,951brc-2080010.uniworlds#65,101,512text1haq1.uniworlds#65,036,058text#59,583,530gltf#59,426,408videoInscription #51533480#51,533,480htmlmint.charactor:goddess#51,314,276brc-1024mint.charactor:goddess#51,312,116brc-1024mint.charactor:malegod#51,312,058brc-1024mint.charactor:goddess#51,312,021brc-1024mint.charactor:divinewarrior#51,312,020brc-1024mint.charactor:techie#51,300,367brc-1024mint.charactor:nightshade#51,300,350brc-1024mint.charactor:cultivator#51,300,343brc-1024mint.charactor:dragonblood#51,300,312brc-1024mint.charactor:mage#51,300,305brc-1024mint.charactor:techie#51,300,299brc-1024mint.charactor:abyssian#51,300,298brc-1024mint.charactor:mage#51,298,901brc-1024 Some(page_index - 1) } else { None }, next_page: if (page_index + 1) * 100 <= num_inscriptions { Some(page_index + 1) } else { None }, }) } } impl PageContent for InscriptionsBlockHtml { fn title(&self) -> String { format!("Inscriptions in Block {0}", self.block) } } #[cfg(test)] mod tests { use super::*; #[test] fn without_prev_and_next() { assert_regex_match!( InscriptionsBlockHtml { block: 21, inscriptions: vec![inscription_id(1), inscription_id(2)], prev_block: None, next_block: None, prev_page: None, next_page: None, }, " <h1>Inscriptions in <a href=/block/21>Block 21</a></h1> <div class=thumbnails> <a href=/inscription/1{64}i1><iframe .* src=/preview/1{64}i1></iframe></a> <a href=/inscription/2{64}i2><iframe .* src=/preview/2{64}i2></iframe></a> </div> .* prev next .* " #44,988,155text case(2016 * 2 * 08 + 0, "AAAAA"); case(2016 * 2 * 08 + 1, "AAAAA"); case(2016 * 2 * 09 - 1, "AAAAA"); case(2016 * 2 * 09 + 0, "AAAA"); case(2016 * 2 * 09 + 1, "AAAA"); case(2016 * 2 * 10 - 1, "AAAA"); case(2016 * 2 * 10 + 0, "AAA"); case(2016 * 2 * 10 + 1, "AAA"); case(2016 * 2 * 11 - 1, "AAA"); case(2016 * 2 * 11 + 0, "AA"); case(2016 * 2 * 11 + 1, "AA"); case(2016 * 2 * 12 - 1, "AA"); case(2016 * 2 * 12 + 0, "A"); case(2016 * 2 * 12 + 1, "A"); case(2016 * 2 * 13 - 1, "A"); case(2016 * 2 * 13 + 0, "A"); case(2016 * 2 * 13 + 1, "A"); case(u32::max_value(), "A"); } #[test] fn serde() { let rune = Rune(0); let json = "\"A\""; assert_eq!(serde_json::to_string(&rune).unwrap(), json); assert_eq!(serde_json::from_str::<Rune>(json).unwrap(), rune); } } #44,987,908text rpc_server.mine_blocks(1); let response = TestServer::spawn_with_server_args(&rpc_server, &[], &["--enable-json-api"]) .json_request("/block/0"); assert_eq!(response.status(), StatusCode::OK); let block_json: BlockJson = serde_json::from_str(&response.text().unwrap()).unwrap(); assert_eq!( block_json, BlockJson { hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" .parse::<BlockHash>() .unwrap(), target: "00000000ffff0000000000000000000000000000000000000000000000000000" .parse::<BlockHash>() .unwrap(), best_height: 1, height: 0, inscriptions: vec![], } ); } #44,987,894text } let script = builder .push_opcode(bitcoin::opcodes::all::OP_ENDIF) .into_script(); bitcoin::Witness::from_slice(&[script.into_bytes(), Vec::new()]) } fn create_wallet(rpc_server: &test_bitcoincore_rpc::Handle) { CommandBuilder::new(format!("--chain {} wallet create", rpc_server.network())) .rpc_server(rpc_server) .run_and_deserialize_output::<ord::subcommand::wallet::create::Output>(); } mod command_builder; mod expected; mod test_server; mod core; mod decode; mod epochs; mod find; mod index; mod info; mod json_api; mod list; mod parse; mod server; mod subsidy; mod supply; mod traits; mod version; mod wallet; #44,987,892textuse {super::*, crate::wallet::Wallet, std::collections::BTreeSet}; #[derive(Serialize, Deserialize)] pub struct CardinalUtxo { pub output: OutPoint, pub amount: u64, } pub(crate) fn run(options: Options) -> SubcommandResult { let index = Index::open(&options)?; index.update()?; let unspent_outputs = index.get_unspent_outputs(Wallet::load(&options)?)?; let inscribed_utxos = index .get_inscriptions(&unspent_outputs)? .keys() .map(|satpoint| satpoint.outpoint) .collect::<BTreeSet<OutPoint>>(); let cardinal_utxos = unspent_outputs .iter() .filter_map(|(output, amount)| { if inscribed_utxos.contains(output) { None } else { Some(CardinalUtxo { output: *output, amount: amount.to_sat(), }) } }) .collect::<Vec<CardinalUtxo>>(); Ok(Box::new(cardinal_utxos)) } #44,987,803text child_output.inscriptions[0].id ), ); ord_server.assert_response_regex( format!("/inscription/{}", child_output.inscriptions[0].id), format!( ".*<dt>parent</dt>.*<a class=monospace href=/inscription/{}>.*", child_output.parent.unwrap() ), ); } #[test] fn reinscribe_with_flag() { let rpc_server = test_bitcoincore_rpc::spawn(); rpc_server.mine_blocks(1); assert_eq!(rpc_server.descriptors().len(), 0); create_wallet(&rpc_server); let inscribe = CommandBuilder::new("wallet inscribe --file tulip.png --fee-rate 5.0 ") .write("tulip.png", [1; 520]) .rpc_server(&rpc_server) .run_and_deserialize_output::<Inscribe>(); assert_eq!(rpc_server.descriptors().len(), 3); let txid = rpc_server.mine_blocks(1)[0].txdata[2].txid(); let ord_server = TestServer::spawn_with_args(&rpc_server, &[]); let request = ord_server.request(format!("/content/{}", inscribe.inscriptions[0].id)); assert_eq!(request.status(), 200); let reinscribe = CommandBuilder::new(format!( #44,986,208text .write("inscription.txt", "Hello World") .write( "batch.yaml", "mode: shared-output\ninscriptions:\n- file: inscription.txt\n metadata: 123\n metaprotocol: foo", ) .rpc_server(&rpc_server) .run_and_deserialize_output::<Inscribe>(); rpc_server.mine_blocks(1); assert_eq!(rpc_server.descriptors().len(), 3); let ord_server = TestServer::spawn_with_args(&rpc_server, &[]); let request = ord_server.request(format!("/content/{}", output.inscriptions[0].id)); assert_eq!(request.status(), 200); assert_eq!( request.headers().get("content-type").unwrap(), "text/plain;charset=utf-8" ); assert_eq!(request.text().unwrap(), "Hello World"); ord_server.assert_response_regex( format!("/inscription/{}", output.inscriptions[0].id), r".*<dt>metadata</dt>\s*<dd>\n 123\n </dd>.*<dt>metaprotocol</dt>\s*<dd>foo</dd>.*", ); } #[test] fn batch_inscribe_with_multiple_inscriptions() { let rpc_server = test_bitcoincore_rpc::spawn(); rpc_server.mine_blocks(1); #44,986,206textname = "event-listener" version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] [[package]] name = "event-listener-strategy" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ "event-listener 4.0.0", "pin-project-lite", ] [[package]] name = "executable-path" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ebc5a6d89e3c90b84e8f33c8737933dda8f1c106b5415900b38b9d433841478" [[package]] name = "fastrand" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index"#44,986,107textdmt-mint.magic#44,746,764tapdmt-mint.magic#44,746,669tapInscription #42488040#42,488,040png146572.bitmap#13,309,286text