diff --git a/crates/mockcore/src/lib.rs b/crates/mockcore/src/lib.rs index 0c1933f2e4..dd5245c6c4 100644 --- a/crates/mockcore/src/lib.rs +++ b/crates/mockcore/src/lib.rs @@ -263,8 +263,16 @@ impl Handle { blocks } - pub fn broadcast_tx(&self, template: TransactionTemplate) -> Txid { - self.state().broadcast_tx(template) + pub fn create_tx_from_template(&self, template: TransactionTemplate) -> Transaction { + self.state().create_tx_from_template(template) + } + + pub fn broadcast_tx(&self, transaction: Transaction) -> Txid { + self.state().broadcast_tx(transaction) + } + + pub fn broadcast_template(&self, template: TransactionTemplate) -> Txid { + self.state().broadcast_template(template) } pub fn height(&self) -> u64 { diff --git a/crates/mockcore/src/state.rs b/crates/mockcore/src/state.rs index 9105633d50..946ef3f958 100644 --- a/crates/mockcore/src/state.rs +++ b/crates/mockcore/src/state.rs @@ -190,7 +190,7 @@ impl State { blockhash } - pub(crate) fn broadcast_tx(&mut self, template: TransactionTemplate) -> Txid { + pub(crate) fn create_tx_from_template(&mut self, template: TransactionTemplate) -> Transaction { let mut total_value = 0; let mut input = Vec::new(); for (height, tx, vout, witness) in template.inputs.iter() { @@ -274,6 +274,19 @@ impl State { ); } + tx + } + + pub(crate) fn broadcast_tx(&mut self, transaction: Transaction) -> Txid { + let txid = transaction.compute_txid(); + + self.mempool.push(transaction); + + txid + } + + pub(crate) fn broadcast_template(&mut self, template: TransactionTemplate) -> Txid { + let tx = self.create_tx_from_template(template); let txid = tx.compute_txid(); self.mempool.push(tx); diff --git a/src/api.rs b/src/api.rs index eae5ac144a..bfa5330376 100644 --- a/src/api.rs +++ b/src/api.rs @@ -118,7 +118,7 @@ pub struct InscriptionRecursive { pub charms: Vec, pub content_type: Option, pub content_length: Option, - pub delegate: Option, + pub delegates: Vec, pub fee: u64, pub height: u32, pub id: InscriptionId, diff --git a/src/index.rs b/src/index.rs index 2695ebc7b7..fd70c6c11a 100644 --- a/src/index.rs +++ b/src/index.rs @@ -2087,16 +2087,14 @@ impl Index { Charm::Lost.set(&mut charms); } - let effective_mime_type = if let Some(delegate_id) = inscription.delegate() { - let delegate_result = self.get_inscription_by_id(delegate_id); - if let Ok(Some(delegate)) = delegate_result { - delegate.content_type().map(str::to_string) - } else { - inscription.content_type().map(str::to_string) - } - } else { - inscription.content_type().map(str::to_string) - }; + let effective_mime_type = inscription + .delegates() + .iter() + .find_map(|delegate| self.get_inscription_by_id(*delegate).unwrap_or(None)) + .as_ref() + .unwrap_or(&inscription) + .content_type() + .map(str::to_string); Ok(Some(( api::Inscription { @@ -2428,7 +2426,7 @@ mod tests { { let context = Context::builder().build(); context.mine_blocks(1); - let txid = context.core.broadcast_tx(template.clone()); + let txid = context.core.broadcast_template(template.clone()); let inscription_id = InscriptionId { txid, index: 0 }; context.mine_blocks(1); @@ -2452,7 +2450,7 @@ mod tests { { let context = Context::builder().chain(Chain::Mainnet).build(); context.mine_blocks(1); - let txid = context.core.broadcast_tx(template); + let txid = context.core.broadcast_template(template); let inscription_id = InscriptionId { txid, index: 0 }; context.mine_blocks(1); @@ -2477,7 +2475,7 @@ mod tests { { let context = Context::builder().build(); context.mine_blocks(1); - let txid = context.core.broadcast_tx(template.clone()); + let txid = context.core.broadcast_template(template.clone()); let inscription_id = InscriptionId { txid, index: 0 }; context.mine_blocks(1); @@ -2501,7 +2499,7 @@ mod tests { { let context = Context::builder().arg("--no-index-inscriptions").build(); context.mine_blocks(1); - let txid = context.core.broadcast_tx(template); + let txid = context.core.broadcast_template(template); let inscription_id = InscriptionId { txid, index: 0 }; context.mine_blocks(1); @@ -2553,7 +2551,7 @@ mod tests { fee: 0, ..default() }; - let txid = context.core.broadcast_tx(split_coinbase_output); + let txid = context.core.broadcast_template(split_coinbase_output); context.mine_blocks(1); @@ -2579,7 +2577,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(merge_coinbase_outputs); + let txid = context.core.broadcast_template(merge_coinbase_outputs); context.mine_blocks(1); assert_eq!( @@ -2602,7 +2600,7 @@ mod tests { fee: 10, ..default() }; - let txid = context.core.broadcast_tx(fee_paying_tx); + let txid = context.core.broadcast_template(fee_paying_tx); let coinbase_txid = context.mine_blocks(1)[0].txdata[0].compute_txid(); assert_eq!( @@ -2640,8 +2638,8 @@ mod tests { fee: 10, ..default() }; - context.core.broadcast_tx(first_fee_paying_tx); - context.core.broadcast_tx(second_fee_paying_tx); + context.core.broadcast_template(first_fee_paying_tx); + context.core.broadcast_template(second_fee_paying_tx); let coinbase_txid = context.mine_blocks(1)[0].txdata[0].compute_txid(); @@ -2669,7 +2667,7 @@ mod tests { fee: 50 * COIN_VALUE, ..default() }; - let txid = context.core.broadcast_tx(no_value_output); + let txid = context.core.broadcast_template(no_value_output); context.mine_blocks(1); assert_eq!( @@ -2688,7 +2686,7 @@ mod tests { fee: 50 * COIN_VALUE, ..default() }; - context.core.broadcast_tx(no_value_output); + context.core.broadcast_template(no_value_output); context.mine_blocks(1); let no_value_input = TransactionTemplate { @@ -2696,7 +2694,7 @@ mod tests { fee: 0, ..default() }; - let txid = context.core.broadcast_tx(no_value_input); + let txid = context.core.broadcast_template(no_value_input); context.mine_blocks(1); assert_eq!( @@ -2709,7 +2707,7 @@ mod tests { fn list_spent_output() { let context = Context::builder().arg("--index-sats").build(); context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 0, ..default() @@ -2791,7 +2789,7 @@ mod tests { fn find_first_sat_spent_in_second_block() { let context = Context::builder().arg("--index-sats").build(); context.mine_blocks(1); - let spend_txid = context.core.broadcast_tx(TransactionTemplate { + let spend_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 0, ..default() @@ -2811,7 +2809,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -2835,7 +2833,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 50 * 100_000_000, ..default() @@ -2843,7 +2841,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -2863,7 +2861,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(4, 0, 0, Default::default())], fee: 50 * 100_000_000, ..default() @@ -2871,7 +2869,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(5, 1, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -2896,7 +2894,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -2913,7 +2911,7 @@ mod tests { Some(50 * COIN_VALUE), ); - let send_txid = context.core.broadcast_tx(TransactionTemplate { + let send_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Default::default()), (2, 1, 0, Default::default())], ..default() }); @@ -2939,7 +2937,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(2); - let first_txid = context.core.broadcast_tx(TransactionTemplate { + let first_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -2949,7 +2947,7 @@ mod tests { index: 0, }; - let second_txid = context.core.broadcast_tx(TransactionTemplate { + let second_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/png", [1; 100]).to_witness())], ..default() }); @@ -2960,7 +2958,7 @@ mod tests { context.mine_blocks(1); - let merged_txid = context.core.broadcast_tx(TransactionTemplate { + let merged_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 0, Default::default()), (3, 2, 0, Default::default())], ..default() }); @@ -2998,7 +2996,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3015,7 +3013,7 @@ mod tests { Some(50 * COIN_VALUE), ); - let send_txid = context.core.broadcast_tx(TransactionTemplate { + let send_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Default::default()), (2, 1, 0, Default::default())], outputs: 2, ..default() @@ -3042,7 +3040,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3050,7 +3048,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, Default::default())], fee: 50 * COIN_VALUE, ..default() @@ -3077,7 +3075,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(2); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3085,7 +3083,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Default::default()), (3, 1, 0, Default::default())], fee: 50 * COIN_VALUE, ..default() @@ -3112,7 +3110,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -3140,7 +3138,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -3165,7 +3163,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let first_txid = context.core.broadcast_tx(TransactionTemplate { + let first_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -3178,7 +3176,7 @@ mod tests { context.mine_blocks_with_subsidy(1, 0); context.mine_blocks(1); - let second_txid = context.core.broadcast_tx(TransactionTemplate { + let second_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -3297,7 +3295,7 @@ mod tests { context.mine_blocks_with_subsidy(1, 0); context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "hello").to_witness())], outputs: 2, ..default() @@ -3305,7 +3303,7 @@ mod tests { let inscription_id = InscriptionId { txid, index: 0 }; context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 1, Default::default()), (3, 1, 0, Default::default())], fee: 50 * COIN_VALUE, ..default() @@ -3328,7 +3326,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], outputs: 2, output_values: &[0, 50 * COIN_VALUE], @@ -3353,7 +3351,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -3462,7 +3460,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3487,7 +3485,7 @@ mod tests { [inscription_id] ); - let send_id = context.core.broadcast_tx(TransactionTemplate { + let send_id = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, Default::default())], ..default() }); @@ -3520,7 +3518,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let first = context.core.broadcast_tx(TransactionTemplate { + let first = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3555,7 +3553,7 @@ mod tests { Some(50 * COIN_VALUE), ); - let second = context.core.broadcast_tx(TransactionTemplate { + let second = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3604,7 +3602,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3626,7 +3624,7 @@ mod tests { let mut ids = Vec::new(); for i in 0..101 { - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3660,7 +3658,7 @@ mod tests { b"ord", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3697,7 +3695,7 @@ mod tests { b"ord", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3732,7 +3730,7 @@ mod tests { b"text/plain;charset=utf-8", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness.clone())], ..default() }); @@ -3745,7 +3743,7 @@ mod tests { assert_eq!(context.index.inscription_number(inscription_id), -1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, witness)], ..default() }); @@ -3773,7 +3771,7 @@ mod tests { b"text/plain;charset=utf-8", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3793,7 +3791,7 @@ mod tests { let witness = envelope(&[b"ord", &[1]]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3822,7 +3820,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3852,7 +3850,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -3871,7 +3869,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 50 * 100_000_000, ..default() @@ -3879,7 +3877,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -3907,7 +3905,7 @@ mod tests { context.mine_blocks(1); // create zero value input - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 50 * 100_000_000, ..default() @@ -3917,7 +3915,7 @@ mod tests { let witness = inscription("text/plain", "hello").to_witness(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, witness.clone()), (2, 1, 0, witness.clone())], ..default() }); @@ -3948,7 +3946,7 @@ mod tests { let witness = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, witness.clone()), (2, 0, 0, witness.clone()), @@ -4030,7 +4028,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -4110,7 +4108,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, witness.clone()), (2, 0, 0, witness.clone()), @@ -4213,7 +4211,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], fee: 33, ..default() @@ -4254,7 +4252,7 @@ mod tests { let witness = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let cursed_txid = context.core.broadcast_tx(TransactionTemplate { + let cursed_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness.clone()), (2, 0, 0, witness.clone())], outputs: 2, ..default() @@ -4289,7 +4287,7 @@ mod tests { b"reinscription on cursed", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 1, witness)], ..default() }); @@ -4319,7 +4317,7 @@ mod tests { let witness = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let cursed_txid = context.core.broadcast_tx(TransactionTemplate { + let cursed_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness.clone()), (2, 0, 0, witness.clone())], outputs: 2, ..default() @@ -4354,7 +4352,7 @@ mod tests { b"reinscription on cursed", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 1, witness)], ..default() }); @@ -4382,7 +4380,7 @@ mod tests { b"second reinscription on cursed", ]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(4, 1, 0, witness)], ..default() }); @@ -4429,7 +4427,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4443,7 +4441,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -4456,7 +4454,7 @@ mod tests { let second = InscriptionId { txid, index: 0 }; context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 3, 1, @@ -4492,7 +4490,7 @@ mod tests { let mut inscription_ids = Vec::new(); for i in 1..=21 { - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( i, if i == 1 { 0 } else { 1 }, @@ -4541,7 +4539,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4562,7 +4560,7 @@ mod tests { .index .assert_inscription_location(first_id, first_location, Some(50 * COIN_VALUE)); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 0, @@ -4601,7 +4599,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4618,7 +4616,7 @@ mod tests { context.mine_blocks(10); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 0, @@ -4664,7 +4662,7 @@ mod tests { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4682,7 +4680,7 @@ mod tests { offset: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 0, @@ -4723,7 +4721,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4747,7 +4745,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4759,7 +4757,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 0, @@ -4794,7 +4792,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4806,7 +4804,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -4846,11 +4844,11 @@ mod tests { for context in Context::configurations() { context.mine_blocks(2); - let parent_txid_a = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_a = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); - let parent_txid_b = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_b = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "world").to_witness())], ..default() }); @@ -4881,7 +4879,7 @@ mod tests { let parent_b_input = (3, 2, 0, Witness::new()); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[revelation_input, parent_b_input], ..default() }); @@ -4917,7 +4915,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4929,7 +4927,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -4969,7 +4967,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4987,7 +4985,7 @@ mod tests { .chain(vec![0, 0, 0, 0]) .collect(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -5027,15 +5025,15 @@ mod tests { for context in Context::configurations() { context.mine_blocks(3); - let parent_txid_a = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_a = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); - let parent_txid_b = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_b = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "world").to_witness())], ..default() }); - let parent_txid_c = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_c = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, inscription("text/plain", "wazzup").to_witness())], ..default() }); @@ -5071,7 +5069,7 @@ mod tests { let parent_c_input = (4, 3, 0, Witness::new()); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[revealing_parent_a_input, parent_c_input], ..default() }); @@ -5114,15 +5112,15 @@ mod tests { for context in Context::configurations() { context.mine_blocks(3); - let parent_txid_a = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_a = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); - let parent_txid_b = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_b = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "world").to_witness())], ..default() }); - let parent_txid_c = context.core.broadcast_tx(TransactionTemplate { + let parent_txid_c = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, inscription("text/plain", "wazzup").to_witness())], ..default() }); @@ -5164,7 +5162,7 @@ mod tests { let parent_b_input = (4, 2, 0, Witness::new()); let parent_c_input = (4, 3, 0, Witness::new()); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[revealing_parent_a_input, parent_b_input, parent_c_input], ..default() }); @@ -5207,7 +5205,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5219,7 +5217,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (2, 1, 0, Default::default()), ( @@ -5262,7 +5260,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5274,7 +5272,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ ( 3, @@ -5317,7 +5315,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5329,7 +5327,7 @@ mod tests { index: 0, }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -5363,6 +5361,67 @@ mod tests { } } + #[test] + fn inscription_with_three_delegates_serves_the_first_available_one() { + for context in Context::configurations() { + context.mine_blocks(1); + + let delegate_txid = context.core.broadcast_template(TransactionTemplate { + inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], + ..Default::default() + }); + + context.mine_blocks(1); + + let delegate_inscription_id_real = InscriptionId { + txid: delegate_txid, + index: 0, + }; + + let delegate_inscription_id_fake_a = InscriptionId { + txid: delegate_txid, + index: 1, + }; + let delegate_inscription_id_fake_b = InscriptionId { + txid: delegate_txid, + index: 2, + }; + + let multi_delegate_inscription = Inscription { + content_type: Some("text/plain".into()), + body: Some("world".into()), + delegates: vec![ + delegate_inscription_id_fake_a.value(), + delegate_inscription_id_real.value(), + delegate_inscription_id_fake_b.value(), + ], + ..Default::default() + }; + let txid = context.core.broadcast_template(TransactionTemplate { + inputs: &[(2, 0, 0, multi_delegate_inscription.to_witness())], + ..Default::default() + }); + + context.mine_blocks(1); + let inscription_id = InscriptionId { txid, index: 0 }; + + let recovered_delegator = context + .index + .get_inscription_by_id(inscription_id) + .unwrap() + .unwrap(); + + assert_eq!( + recovered_delegator.delegates(), + vec![ + delegate_inscription_id_fake_a, + delegate_inscription_id_real, + delegate_inscription_id_fake_b + ] + ); + } + } + #[test] fn inscription_with_pointer() { for context in Context::configurations() { @@ -5375,7 +5434,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -5407,7 +5466,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -5439,7 +5498,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], fee: 25 * COIN_VALUE, ..default() @@ -5472,7 +5531,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -5499,7 +5558,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(1); - let parent_txid = context.core.broadcast_tx(TransactionTemplate { + let parent_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "parent").to_witness())], ..default() }); @@ -5519,7 +5578,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, child_inscription.to_witness())], ..default() }); @@ -5592,7 +5651,7 @@ mod tests { let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -5659,7 +5718,7 @@ mod tests { let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], outputs: 3, ..default() @@ -5726,7 +5785,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, inscription_for_second_output.to_witness()), (2, 0, 0, inscription_for_third_output.to_witness()), @@ -5796,7 +5855,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, first_inscription.to_witness()), (2, 0, 0, second_inscription.to_witness()), @@ -5859,7 +5918,7 @@ mod tests { ..default() }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, inscription.to_witness()), (2, 0, 0, cursed_reinscription.to_witness()), @@ -5907,7 +5966,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -5938,7 +5997,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -5981,7 +6040,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -6013,7 +6072,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, inscription.to_witness())], ..default() }); @@ -6045,7 +6104,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 0, inscription.to_witness())], ..default() }); @@ -6092,7 +6151,7 @@ mod tests { let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -6124,7 +6183,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(111, 1, 0, inscription.to_witness())], ..default() }); @@ -6156,7 +6215,7 @@ mod tests { let inscription = Inscription::default(); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(112, 1, 0, inscription.to_witness())], ..default() }); @@ -6205,7 +6264,7 @@ mod tests { }) .unwrap()); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], ..default() }); @@ -6271,7 +6330,7 @@ mod tests { context.mine_blocks(2); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new()), (2, 0, 0, Witness::new())], outputs: 2, ..Default::default() @@ -6304,7 +6363,7 @@ mod tests { ] ); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 1, 0, Witness::new())], p2tr: true, ..Default::default() @@ -6340,7 +6399,7 @@ mod tests { for context in Context::configurations() { context.mine_blocks(2); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], fee: 50 * COIN_VALUE, ..default() @@ -6348,7 +6407,7 @@ mod tests { let a = InscriptionId { txid, index: 0 }; - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -6370,7 +6429,7 @@ mod tests { context.mine_blocks(1); let inscription = Inscription::default(); - let create_txid = context.core.broadcast_tx(TransactionTemplate { + let create_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], fee: 0, outputs: 1, @@ -6404,7 +6463,7 @@ mod tests { ); // Transfer inscription - let transfer_txid = context.core.broadcast_tx(TransactionTemplate { + let transfer_txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, Default::default())], fee: 0, outputs: 1, @@ -6496,7 +6555,7 @@ mod tests { } ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -6550,7 +6609,7 @@ mod tests { } ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[(9, 1, 0, Witness::new())], op_return: Some( Runestone { @@ -6613,7 +6672,7 @@ mod tests { } ); - let txid3 = context.core.broadcast_tx(TransactionTemplate { + let txid3 = context.core.broadcast_template(TransactionTemplate { inputs: &[(10, 1, 0, Witness::new())], op_return: Some( Runestone { diff --git a/src/index/testing.rs b/src/index/testing.rs index 27af8ede60..cf826cc847 100644 --- a/src/index/testing.rs +++ b/src/index/testing.rs @@ -157,7 +157,7 @@ impl Context { self.mine_blocks(1); - self.core.broadcast_tx(TransactionTemplate { + self.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Witness::new())], p2tr: true, ..default() @@ -187,7 +187,7 @@ impl Context { witness.push([]); - let txid = self.core.broadcast_tx(TransactionTemplate { + let txid = self.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs, diff --git a/src/inscriptions/envelope.rs b/src/inscriptions/envelope.rs index a8c7b8788c..102a4ad799 100644 --- a/src/inscriptions/envelope.rs +++ b/src/inscriptions/envelope.rs @@ -49,7 +49,7 @@ impl From for ParsedEnvelope { let content_encoding = Tag::ContentEncoding.take(&mut fields); let content_type = Tag::ContentType.take(&mut fields); - let delegate = Tag::Delegate.take(&mut fields); + let delegates = Tag::Delegate.take_array(&mut fields); let metadata = Tag::Metadata.take(&mut fields); let metaprotocol = Tag::Metaprotocol.take(&mut fields); let parents = Tag::Parent.take_array(&mut fields); @@ -71,7 +71,7 @@ impl From for ParsedEnvelope { }), content_encoding, content_type, - delegate, + delegates, duplicate_field, incomplete_field, metadata, diff --git a/src/inscriptions/inscription.rs b/src/inscriptions/inscription.rs index 2c0fad3c9c..39be69a81c 100644 --- a/src/inscriptions/inscription.rs +++ b/src/inscriptions/inscription.rs @@ -13,7 +13,7 @@ pub struct Inscription { pub body: Option>, pub content_encoding: Option>, pub content_type: Option>, - pub delegate: Option>, + pub delegates: Vec>, pub duplicate_field: bool, pub incomplete_field: bool, pub metadata: Option>, @@ -28,7 +28,7 @@ impl Inscription { pub fn new( chain: Chain, compress: bool, - delegate: Option, + delegates: Vec, metadata: Option>, metaprotocol: Option, parents: Vec, @@ -96,7 +96,7 @@ impl Inscription { body, content_encoding, content_type: content_type.map(|content_type| content_type.into()), - delegate: delegate.map(|delegate| delegate.value()), + delegates: delegates.iter().map(|delegate| delegate.value()).collect(), metadata, metaprotocol: metaprotocol.map(|metaprotocol| metaprotocol.into_bytes()), parents: parents.iter().map(|parent| parent.value()).collect(), @@ -126,7 +126,7 @@ impl Inscription { Tag::ContentEncoding.append(&mut builder, &self.content_encoding); Tag::Metaprotocol.append(&mut builder, &self.metaprotocol); Tag::Parent.append_array(&mut builder, &self.parents); - Tag::Delegate.append(&mut builder, &self.delegate); + Tag::Delegate.append_array(&mut builder, &self.delegates); Tag::Pointer.append(&mut builder, &self.pointer); Tag::Metadata.append(&mut builder, &self.metadata); Tag::Rune.append(&mut builder, &self.rune); @@ -231,8 +231,12 @@ impl Inscription { HeaderValue::from_str(str::from_utf8(self.content_encoding.as_ref()?).unwrap_or_default()).ok() } - pub fn delegate(&self) -> Option { - Self::inscription_id_field(self.delegate.as_deref()) + pub(crate) fn delegates(&self) -> Vec { + self + .delegates + .iter() + .filter_map(|delegate| Self::inscription_id_field(Some(delegate))) + .collect() } pub fn metadata(&self) -> Option { @@ -480,14 +484,15 @@ mod tests { fn inscription_delegate_txid_is_deserialized_correctly() { assert_eq!( Inscription { - delegate: Some(vec![ + delegates: vec![vec![ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - ]), + ]], ..default() } - .delegate() + .delegates() + .first() .unwrap() .txid, "1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100" @@ -769,7 +774,7 @@ mod tests { let inscription = Inscription::new( Chain::Mainnet, false, - None, + Vec::new(), None, None, Vec::new(), @@ -784,7 +789,7 @@ mod tests { let inscription = Inscription::new( Chain::Mainnet, false, - None, + Vec::new(), None, None, Vec::new(), @@ -799,7 +804,7 @@ mod tests { let inscription = Inscription::new( Chain::Mainnet, false, - None, + Vec::new(), None, None, Vec::new(), @@ -814,7 +819,7 @@ mod tests { let inscription = Inscription::new( Chain::Mainnet, false, - None, + Vec::new(), None, None, Vec::new(), diff --git a/src/runes.rs b/src/runes.rs index aea423d8f8..e06e509d97 100644 --- a/src/runes.rs +++ b/src/runes.rs @@ -59,7 +59,7 @@ mod tests { context.etch(Default::default(), 1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new())], op_return: Some(Runestone::default().encipher()), ..default() @@ -290,7 +290,7 @@ mod tests { context.mine_blocks(1); - let txid0 = context.core.broadcast_tx(TransactionTemplate { + let txid0 = context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new())], outputs: 2, op_return: Some( @@ -342,7 +342,7 @@ mod tests { context.mine_blocks(1); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -738,7 +738,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { @@ -882,7 +882,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -950,7 +950,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { @@ -1029,7 +1029,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some(Runestone::default().encipher()), ..default() @@ -1107,7 +1107,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some(Runestone::default().encipher()), outputs: 0, @@ -1181,7 +1181,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -1266,7 +1266,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -1347,7 +1347,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: None, ..default() @@ -1568,7 +1568,7 @@ mod tests { ], ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[ (id0.block.try_into().unwrap(), 1, 0, Witness::new()), (id1.block.try_into().unwrap(), 1, 0, Witness::new()), @@ -1732,7 +1732,7 @@ mod tests { ], ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[ (id0.block.try_into().unwrap(), 1, 0, Witness::new()), (id1.block.try_into().unwrap(), 1, 0, Witness::new()), @@ -1783,7 +1783,7 @@ mod tests { )], ); - let txid3 = context.core.broadcast_tx(TransactionTemplate { + let txid3 = context.core.broadcast_template(TransactionTemplate { inputs: &[((id1.block + 1).try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -1972,7 +1972,7 @@ mod tests { ], ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[ (id0.block.try_into().unwrap(), 1, 0, Witness::new()), (id1.block.try_into().unwrap(), 1, 0, Witness::new()), @@ -2088,7 +2088,7 @@ mod tests { )], ); - let txid = context.core.broadcast_tx(TransactionTemplate { + let txid = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( script::Builder::new() @@ -2254,7 +2254,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { @@ -2416,7 +2416,7 @@ mod tests { ], ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id0.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { @@ -2537,7 +2537,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { @@ -3065,7 +3065,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -3163,7 +3163,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -3268,7 +3268,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -3373,7 +3373,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -3471,7 +3471,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 4, op_return: Some( @@ -3576,7 +3576,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 4, op_return: Some( @@ -3777,7 +3777,7 @@ mod tests { )], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], outputs: 2, op_return: Some( @@ -3864,7 +3864,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -3952,7 +3952,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], outputs: 2, op_return: Some( @@ -4047,7 +4047,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4097,7 +4097,7 @@ mod tests { ); // claim the rune - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[(4, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4156,7 +4156,7 @@ mod tests { ); // claim the rune in a burn runestone - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(5, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4257,7 +4257,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4284,7 +4284,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4350,7 +4350,7 @@ mod tests { context.assert_runes([(id, entry)], []); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4366,7 +4366,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4434,7 +4434,7 @@ mod tests { context.assert_runes([(id, entry)], []); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4450,7 +4450,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4518,7 +4518,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4545,7 +4545,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4611,7 +4611,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4637,7 +4637,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4703,7 +4703,7 @@ mod tests { context.assert_runes([(id, entry)], []); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4729,7 +4729,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4795,7 +4795,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4813,7 +4813,7 @@ mod tests { context.mine_blocks(1); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4881,7 +4881,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4899,7 +4899,7 @@ mod tests { context.mine_blocks(1); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -4976,7 +4976,7 @@ mod tests { [(OutPoint { txid, vout: 0 }, vec![(id, 1111)])], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], outputs: 2, op_return: Some( @@ -5057,7 +5057,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5105,7 +5105,7 @@ mod tests { )], ); - let txid2 = context.core.broadcast_tx(TransactionTemplate { + let txid2 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5162,7 +5162,7 @@ mod tests { ], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(4, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5262,7 +5262,7 @@ mod tests { [], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5347,7 +5347,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, Witness::new())], outputs: 2, op_return: Some( @@ -5567,7 +5567,7 @@ mod tests { 1, ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5658,7 +5658,7 @@ mod tests { [], ); - let txid1 = context.core.broadcast_tx(TransactionTemplate { + let txid1 = context.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, Witness::new())], op_return: Some( Runestone { @@ -5727,7 +5727,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Witness::new())], p2tr: false, ..default() @@ -5767,7 +5767,7 @@ mod tests { witness.push([]); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs: 1, @@ -5787,7 +5787,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Witness::new())], p2tr: true, ..default() @@ -5827,7 +5827,7 @@ mod tests { witness.push([]); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs: 1, @@ -5847,7 +5847,7 @@ mod tests { context.mine_blocks_with_update(1, false); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Witness::new())], p2tr: true, ..default() @@ -5887,7 +5887,7 @@ mod tests { witness.push([]); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs: 1, @@ -5909,7 +5909,7 @@ mod tests { context.mine_blocks(1); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Witness::new())], p2tr: true, ..default() @@ -5939,7 +5939,7 @@ mod tests { witness.push([]); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs: 1, @@ -5974,7 +5974,7 @@ mod tests { witness.push([opcodes::all::OP_PUSHDATA4.to_u8()]); witness.push([]); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], op_return: Some(runestone.encipher()), outputs: 1, @@ -6026,7 +6026,7 @@ mod tests { )], ); - context.core.broadcast_tx(TransactionTemplate { + context.core.broadcast_template(TransactionTemplate { inputs: &[(id.block.try_into().unwrap(), 1, 0, Witness::new())], op_return: Some( Runestone { diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs index 38e501f4ed..0481b0cb7d 100644 --- a/src/subcommand/server.rs +++ b/src/subcommand/server.rs @@ -1201,7 +1201,7 @@ impl Server { charms: Charm::charms(entry.charms), content_type: inscription.content_type().map(|s| s.to_string()), content_length: inscription.content_length(), - delegate: inscription.delegate(), + delegates: inscription.delegates(), fee: entry.fee, height: entry.height, id: inscription_id, @@ -1583,11 +1583,12 @@ impl Server { }; }; - if let Some(delegate) = inscription.delegate() { - inscription = index - .get_inscription_by_id(delegate)? - .ok_or_not_found(|| format!("delegate {inscription_id}"))? - } + let inscription_override = inscription + .delegates() + .iter() + .find_map(|delegate| index.get_inscription_by_id(*delegate).unwrap_or(None)); + + inscription = inscription_override.unwrap_or(inscription); Ok( Self::content_response(inscription, accept_encoding, &server_config)? @@ -1707,11 +1708,12 @@ impl Server { .get_inscription_by_id(inscription_id)? .ok_or_not_found(|| format!("inscription {inscription_id}"))?; - if let Some(delegate) = inscription.delegate() { - inscription = index - .get_inscription_by_id(delegate)? - .ok_or_not_found(|| format!("delegate {inscription_id}"))? - } + let inscription_override = inscription + .delegates() + .iter() + .find_map(|delegate| index.get_inscription_by_id(*delegate).unwrap_or(None)); + + inscription = inscription_override.unwrap_or(inscription); let media = inscription.media(); @@ -2499,7 +2501,7 @@ mod tests { self.mine_blocks(1); - self.core.broadcast_tx(TransactionTemplate { + self.core.broadcast_template(TransactionTemplate { inputs: &[(block_count, 0, 0, Default::default())], p2tr: true, ..default() @@ -2527,7 +2529,7 @@ mod tests { witness }); - let txid = self.core.broadcast_tx(TransactionTemplate { + let txid = self.core.broadcast_template(TransactionTemplate { inputs: &[(block_count + 1, 1, 0, witness)], op_return: Some(runestone.encipher()), outputs, @@ -3049,7 +3051,7 @@ mod tests { ..default() }; - server.core.broadcast_tx(split); + server.core.broadcast_template(split); server.mine_blocks(1); @@ -3059,7 +3061,7 @@ mod tests { ..default() }; - let txid = server.core.broadcast_tx(merge); + let txid = server.core.broadcast_template(merge); server.mine_blocks(1); @@ -3775,7 +3777,7 @@ mod tests { server.mine_blocks(3); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -3785,7 +3787,7 @@ mod tests { ..default() }); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 0, @@ -3795,7 +3797,7 @@ mod tests { ..default() }); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[( 3, 0, @@ -4075,7 +4077,7 @@ mod tests { server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], fee: 50 * 100_000_000, ..default() @@ -4083,7 +4085,7 @@ mod tests { server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 2, 1, @@ -4147,7 +4149,7 @@ mod tests { let mut ids = Vec::new(); for i in 0..101 { - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("image/png", "hello").to_witness())], ..default() }); @@ -4155,7 +4157,7 @@ mod tests { server.mine_blocks(1); } - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(102, 0, 0, inscription("text/plain", "{}").to_witness())], ..default() }); @@ -4290,7 +4292,7 @@ mod tests { fee: 0, ..default() }; - test_server.core.broadcast_tx(transaction); + test_server.core.broadcast_template(transaction); let block_hash = test_server.mine_blocks(1)[0].block_hash(); test_server.assert_response_regex( @@ -4543,7 +4545,7 @@ mod tests { ); server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], outputs: 2, fee: 0, @@ -4567,7 +4569,7 @@ mod tests { ); server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, Default::default())], outputs: 2, fee: 2, @@ -4663,7 +4665,7 @@ mod tests { server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4688,7 +4690,7 @@ mod tests { server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -4711,7 +4713,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4772,7 +4774,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4799,7 +4801,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("audio/flac", "hello").to_witness())], ..default() }); @@ -4819,7 +4821,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("font/ttf", "hello").to_witness())], ..default() }); @@ -4839,7 +4841,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4864,7 +4866,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/markdown", "hello").to_witness())], ..default() }); @@ -4884,7 +4886,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("image/png", "hello").to_witness())], ..default() }); @@ -4905,7 +4907,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -4930,7 +4932,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -4950,7 +4952,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("video/webm", "hello").to_witness())], ..default() }); @@ -4973,7 +4975,7 @@ mod tests { .build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -4995,7 +4997,7 @@ mod tests { .build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5017,7 +5019,7 @@ mod tests { .build(); server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5045,7 +5047,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5079,7 +5081,7 @@ mod tests { .build(); server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5101,7 +5103,7 @@ mod tests { .build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -5135,7 +5137,7 @@ mod tests { .build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[( 1, 0, @@ -5166,7 +5168,7 @@ mod tests { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5213,7 +5215,7 @@ mod tests { for i in 0..101 { server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5237,7 +5239,7 @@ mod tests { for i in 0..101 { server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -5265,7 +5267,7 @@ mod tests { server.mine_blocks(1); parent_ids.push(InscriptionId { - txid: server.core.broadcast_tx(TransactionTemplate { + txid: server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }), @@ -5276,7 +5278,7 @@ mod tests { for (i, parent_id) in parent_ids.iter().enumerate().take(101) { server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[ (i + 2, 1, 0, Default::default()), ( @@ -5383,7 +5385,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5395,7 +5397,7 @@ next index: 0, }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ ( 2, @@ -5449,7 +5451,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5467,7 +5469,7 @@ next ".*

No children

.*", ); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ ( 2, @@ -5502,7 +5504,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5514,7 +5516,7 @@ next index: 0, }; - let _txid = server.core.broadcast_tx(TransactionTemplate { + let _txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ ( 2, @@ -5604,7 +5606,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5616,7 +5618,7 @@ next index: 0, }; - let child_txid = server.core.broadcast_tx(TransactionTemplate { + let child_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ ( 2, @@ -5685,12 +5687,12 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(2); - let parent_a_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_a_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); - let parent_b_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_b_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -5707,7 +5709,7 @@ next index: 0, }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ ( 3, @@ -5752,7 +5754,7 @@ next for i in 0..101 { parent_ids.push( InscriptionId { - txid: server.core.broadcast_tx(TransactionTemplate { + txid: server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }), @@ -5782,7 +5784,7 @@ next ), ); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &inputs, ..default() }); @@ -5815,7 +5817,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(2); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, inscription("text/plain", "hello").to_witness()), (2, 0, 0, inscription("text/plain", "cursed").to_witness()), @@ -5868,7 +5870,7 @@ next server.mine_blocks(2); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, Witness::default()), (2, 0, 0, inscription("text/plain", "cursed").to_witness()), @@ -5907,7 +5909,7 @@ next server.mine_blocks(110); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, Witness::default()), (2, 0, 0, inscription("text/plain", "cursed").to_witness()), @@ -5947,7 +5949,7 @@ next server.mine_blocks(2); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -5983,7 +5985,7 @@ next server.mine_blocks(2); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -6019,7 +6021,7 @@ next server.mine_blocks(9); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(9, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -6052,14 +6054,14 @@ next server.mine_blocks(1); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, inscription("text/plain", "bar").to_witness())], ..default() }); @@ -6124,7 +6126,7 @@ next let witness = Witness::from_slice(&[script.into_bytes(), Vec::new()]); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, witness)], ..default() }); @@ -6181,7 +6183,7 @@ next } .into(); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, inscription("text/plain", "foo").to_witness()), (2, 0, 0, cursed_inscription.to_witness()), @@ -6234,7 +6236,7 @@ next server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, envelope(&[b"ord", &[128], &[0]]))], ..default() }); @@ -6270,7 +6272,7 @@ next server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -6297,7 +6299,7 @@ next ), ); - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, Default::default())], fee: 50 * COIN_VALUE, ..default() @@ -6348,7 +6350,7 @@ next server.mine_blocks(1); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -6359,7 +6361,7 @@ next ids.push(InscriptionId { txid, index: 0 }); for i in 1..111 { - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 1, 0, inscription("text/plain", "foo").to_witness())], ..default() }); @@ -6430,7 +6432,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -6466,7 +6468,7 @@ next let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, witness), (2, 1, 0, Default::default())], ..default() }); @@ -6506,7 +6508,7 @@ next let mut inputs = Vec::new(); for i in 0..111 { parent_ids.push(InscriptionId { - txid: server.core.broadcast_tx(TransactionTemplate { + txid: server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }), @@ -6534,7 +6536,7 @@ next ), ); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &inputs, ..default() }); @@ -6571,7 +6573,7 @@ next let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -6608,7 +6610,7 @@ next let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, witness), (2, 1, 0, Default::default())], ..default() }); @@ -6675,7 +6677,7 @@ next } for i in 0..101 { - server.core.broadcast_tx(TransactionTemplate { + server.core.broadcast_template(TransactionTemplate { inputs: &[(i + 1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -6741,7 +6743,7 @@ next ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, delegate.to_witness())], ..default() }); @@ -6751,11 +6753,11 @@ next server.mine_blocks(1); let inscription = Inscription { - delegate: Some(delegate.value()), + delegates: vec![delegate.value()], ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription.to_witness())], ..default() }); @@ -6764,21 +6766,37 @@ next let id = InscriptionId { txid, index: 0 }; - server.assert_response_regex( + let output = server.get_json::(format!("/output/{}", OutPoint { txid, vout: 0 })); + + server.assert_html( format!("/inscription/{id}"), - StatusCode::OK, - format!( - ".*

Inscription 1

.* -
-
id
-
{id}
- .* -
delegate
-
{delegate}
- .* -
.*" - ) - .unindent(), + InscriptionHtml { + chain: Chain::Regtest, + charms: 0, + child_count: 0, + children: Vec::new(), + fee: 0, + height: 3, + inscription, + id, + number: 1, + next: None, + output: Some(TxOut { + value: Amount::from_sat(output.value), + script_pubkey: output.script_pubkey, + }), + parents: Vec::new(), + previous: Some(delegate), + rune: None, + sat: None, + satpoint: SatPoint { + outpoint: output.outpoint, + offset: 0, + }, + timestamp: "1970-01-01 00:00:03+00:00" + .parse::>() + .unwrap(), + }, ); server.assert_response(format!("/content/{id}"), StatusCode::OK, "foo"); @@ -6788,8 +6806,204 @@ next assert_eq!( server .get_json::(format!("/r/inscription/{id}")) - .delegate, - Some(delegate) + .delegates + .first(), + Some(&delegate) + ); + } + + #[test] + fn multiple_delegates() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(5); + + let mined_delegates = { + let delegate_a = Inscription { + content_type: Some("text/html".into()), + body: Some("alpha".into()), + ..default() + }; + + let delegate_b = Inscription { + content_type: Some("text/plain".into()), + body: Some("bravo".into()), + ..default() + }; + + let txid_a = server.core.broadcast_template(TransactionTemplate { + inputs: &[(1, 0, 0, delegate_a.to_witness())], + ..default() + }); + + let txid_b = server.core.broadcast_template(TransactionTemplate { + inputs: &[(2, 0, 0, delegate_b.to_witness())], + ..default() + }); + + [ + InscriptionId { + txid: txid_a, + index: 0, + }, + InscriptionId { + txid: txid_b, + index: 0, + }, + ] + }; + + server.mine_blocks(1); + + let unmined_delegate_transactions = { + let delegate_a = server.core.create_tx_from_template(TransactionTemplate { + inputs: &[( + 3, + 0, + 0, + Inscription { + content_type: Some("text/html".into()), + body: Some("charlie".into()), + ..default() + } + .to_witness(), + )], + ..default() + }); + + let delegate_b = server.core.create_tx_from_template(TransactionTemplate { + inputs: &[( + 4, + 0, + 0, + Inscription { + content_type: Some("text/plain".into()), + body: Some("delta".into()), + ..default() + } + .to_witness(), + )], + ..default() + }); + + [delegate_a, delegate_b] + }; + + let unmined_delegates = { + [ + InscriptionId { + txid: unmined_delegate_transactions[0].compute_txid(), + index: 0, + }, + InscriptionId { + txid: unmined_delegate_transactions[1].compute_txid(), + index: 0, + }, + ] + }; + + let inscription = Inscription { + delegates: vec![ + unmined_delegates[0].value(), // charlie + unmined_delegates[1].value(), // delta + mined_delegates[0].value(), // alpha + mined_delegates[1].value(), // bravo + ], + ..default() + }; + + let txid = server.core.broadcast_template(TransactionTemplate { + inputs: &[(5, 0, 0, inscription.to_witness())], + ..default() + }); + + server.mine_blocks(1); + + let id = InscriptionId { txid, index: 0 }; + + let output = server.get_json::(format!("/output/{}", OutPoint { txid, vout: 0 })); + + server.assert_html( + format!("/inscription/{id}"), + InscriptionHtml { + chain: Chain::Regtest, + charms: Charm::Cursed.flag(), + child_count: 0, + children: Vec::new(), + fee: 0, + height: 7, + inscription, + id, + number: -1, + next: None, + output: Some(TxOut { + value: Amount::from_sat(output.value), + script_pubkey: output.script_pubkey, + }), + parents: Vec::new(), + previous: Some(mined_delegates[1]), + rune: None, + sat: None, + satpoint: SatPoint { + outpoint: output.outpoint, + offset: 0, + }, + timestamp: "1970-01-01 00:00:07+00:00" + .parse::>() + .unwrap(), + }, + ); + + server.assert_response(format!("/content/{id}"), StatusCode::OK, "alpha"); + server.assert_response(format!("/preview/{id}"), StatusCode::OK, "alpha"); + + assert_eq!( + server + .get_json::(format!("/inscription/{id}")) + .effective_content_type, + Some("text/html".to_string()) + ); + + assert_eq!( + server + .get_json::(format!("/r/inscription/{id}")) + .delegates + .first(), + Some(&unmined_delegates[0]) + ); + + server + .core + .broadcast_tx(unmined_delegate_transactions[1].clone()); + server.mine_blocks(1); + + assert_eq!( + server + .get_json::(format!("/inscription/{id}")) + .effective_content_type, + Some("text/plain".to_string()) + ); + + server + .core + .broadcast_tx(unmined_delegate_transactions[0].clone()); + server.mine_blocks(1); + + server.assert_response(format!("/content/{id}"), StatusCode::OK, "charlie"); + server.assert_response(format!("/preview/{id}"), StatusCode::OK, "charlie"); + assert_eq!( + server + .get_json::(format!("/inscription/{id}")) + .effective_content_type, + Some("text/html".to_string()) + ); + + assert_eq!( + server + .get_json::(format!("/r/inscription/{id}")) + .delegates + .first(), + Some(&unmined_delegates[0]) ); } @@ -6805,7 +7019,7 @@ next ..default() }; - let delegate_txid = server.core.broadcast_tx(TransactionTemplate { + let delegate_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, delegate.to_witness())], ..default() }); @@ -6820,11 +7034,11 @@ next let inscription = Inscription { content_type: Some("text/plain".into()), body: Some("bar".into()), - delegate: Some(delegate_id.value()), + delegates: vec![delegate_id.value()], ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, inscription.to_witness())], ..default() }); @@ -6848,7 +7062,7 @@ next ..default() }; - let normal_txid = server.core.broadcast_tx(TransactionTemplate { + let normal_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(3, 0, 0, normal_inscription.to_witness())], ..default() }); @@ -6880,7 +7094,7 @@ next ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -6918,7 +7132,7 @@ next ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -6959,7 +7173,7 @@ next server.mine_blocks(1); - let parent_txid = server.core.broadcast_tx(TransactionTemplate { + let parent_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], ..default() }); @@ -6995,7 +7209,7 @@ next let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 0, 0, witness), (2, 1, 0, Default::default())], ..default() }); @@ -7039,7 +7253,7 @@ next ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], ..default() }); @@ -7054,7 +7268,7 @@ next charms: Vec::new(), content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, @@ -7084,7 +7298,7 @@ next charms: Vec::new(), content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, @@ -7107,7 +7321,7 @@ next charms: Vec::new(), content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, @@ -7229,7 +7443,7 @@ next core.mine_blocks(1); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription("text/foo", "hello").to_witness())], ..default() }); @@ -7270,7 +7484,7 @@ next ..default() }; - let txid = server.core.broadcast_tx(TransactionTemplate { + let txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], outputs: 0, op_return_index: Some(0), @@ -7293,7 +7507,7 @@ next charms: vec![Charm::Burned], content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, @@ -7323,7 +7537,7 @@ next ..default() }; - let create_txid = server.core.broadcast_tx(TransactionTemplate { + let create_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, inscription.to_witness())], outputs: 1, ..default() @@ -7342,7 +7556,7 @@ next charms: vec![], content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, @@ -7365,7 +7579,7 @@ next } ); - let transfer_txid = server.core.broadcast_tx(TransactionTemplate { + let transfer_txid = server.core.broadcast_template(TransactionTemplate { inputs: &[(2, 1, 0, Default::default())], fee: 0, outputs: 0, @@ -7387,7 +7601,7 @@ next charms: vec![Charm::Burned], content_type: Some("text/html".into()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 0, height: 2, id, diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index c71c652318..efbc156e8c 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -71,7 +71,7 @@ impl Inscribe { inscriptions: vec![Inscription::new( chain, self.shared.compress, - self.delegate, + self.delegate.into_iter().collect(), WalletCommand::parse_metadata(self.cbor_metadata, self.json_metadata)?, self.metaprotocol, self.parent.into_iter().collect(), diff --git a/src/templates/inscription.rs b/src/templates/inscription.rs index d9e5ce2ba0..3bc3b2bbd1 100644 --- a/src/templates/inscription.rs +++ b/src/templates/inscription.rs @@ -535,4 +535,138 @@ mod tests { .unindent() ); } + + #[test] + fn single_delegate() { + assert_regex_match!( + InscriptionHtml { + fee: 1, + inscription: Inscription { + delegates: vec![inscription_id(2).value()], + ..inscription("text/plain;charset=utf-8", "HELLOWORLD") + }, + id: inscription_id(1), + number: 1, + satpoint: satpoint(1, 0), + ..default() + }, + " +

Inscription 1

+
+
+ +
+
+
+
id
+
1{64}i1
+
delegates
+
2{64}i2
+
preview
+
link
+
content
+
link
+
content length
+
10 bytes
+
content type
+
text/plain;charset=utf-8
+
timestamp
+
+
height
+
0
+
fee
+
1
+
reveal transaction
+
1{64}
+
location
+
1{64}:1:0
+
output
+
1{64}:1
+
offset
+
0
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
+
+ " + .unindent() + ); + } + + #[test] + fn multiple_delegate() { + assert_regex_match!( + InscriptionHtml { + fee: 1, + inscription: Inscription { + delegates: vec![ + inscription_id(2).value(), + inscription_id(3).value(), + inscription_id(4).value() + ], + ..inscription("text/plain;charset=utf-8", "HELLOWORLD") + }, + id: inscription_id(1), + number: 1, + satpoint: satpoint(1, 0), + ..default() + }, + " +

Inscription 1

+
+
+ +
+
+
+
id
+
1{64}i1
+
delegates
+
2{64}i2
+
3{64}i3
+
4{64}i4
+
preview
+
link
+
content
+
link
+
content length
+
10 bytes
+
content type
+
text/plain;charset=utf-8
+
timestamp
+
+
height
+
0
+
fee
+
1
+
reveal transaction
+
1{64}
+
location
+
1{64}:1:0
+
output
+
1{64}:1
+
offset
+
0
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
+
+ " + .unindent() + ); + } } diff --git a/src/wallet/batch/file.rs b/src/wallet/batch/file.rs index 8f8056f5f4..94846a9bd9 100644 --- a/src/wallet/batch/file.rs +++ b/src/wallet/batch/file.rs @@ -134,7 +134,7 @@ impl File { inscriptions.push(Inscription::new( wallet.chain(), compress, - entry.delegate, + entry.delegate.into_iter().collect(), entry.metadata()?, entry.metaprotocol.clone(), self.parents.clone(), diff --git a/templates/inscription.html b/templates/inscription.html index d201f9aa36..87dc34e06b 100644 --- a/templates/inscription.html +++ b/templates/inscription.html @@ -85,10 +85,12 @@

Inscription {{ self.number }}

metaprotocol
{{ metaprotocol }}
%% } -%% if self.inscription.content_length().is_some() || self.inscription.delegate().is_some() { -%% if let Some(delegate) = self.inscription.delegate() { -
delegate
+%% if self.inscription.content_length().is_some() || !self.inscription.delegates().is_empty() { +%% if !self.inscription.delegates().is_empty() { +
delegates
+%% for delegate in self.inscription.delegates() {
{{ delegate }}
+%% } %% }
preview
link
diff --git a/tests/json_api.rs b/tests/json_api.rs index 6ef28b2ae6..388361ce09 100644 --- a/tests/json_api.rs +++ b/tests/json_api.rs @@ -264,7 +264,7 @@ fn get_inscriptions() { core.mine_blocks(1); core.mine_blocks(1); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[ (i * 3 + 1, 0, 0, witness.clone()), (i * 3 + 2, 0, 0, witness.clone()), @@ -311,7 +311,7 @@ fn get_inscriptions_in_block() { let envelope = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, envelope.clone()), (2, 0, 0, envelope.clone()), @@ -322,14 +322,14 @@ fn get_inscriptions_in_block() { core.mine_blocks(1); - let _ = core.broadcast_tx(TransactionTemplate { + let _ = core.broadcast_template(TransactionTemplate { inputs: &[(4, 0, 0, envelope.clone()), (5, 0, 0, envelope.clone())], ..default() }); core.mine_blocks(1); - let _ = core.broadcast_tx(TransactionTemplate { + let _ = core.broadcast_template(TransactionTemplate { inputs: &[(6, 0, 0, envelope.clone())], ..default() }); @@ -363,7 +363,7 @@ fn get_output() { let envelope = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[ (1, 0, 0, envelope.clone()), (2, 0, 0, envelope.clone()), @@ -724,7 +724,7 @@ fn get_decode_tx() { let envelope = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[(1, 0, 0, envelope.clone())], ..default() }); diff --git a/tests/server.rs b/tests/server.rs index 4b170b32f5..9df90a032b 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -510,7 +510,7 @@ fn recursive_inscription_endpoint() { charms: vec![Charm::Coin, Charm::Uncommon], content_type: Some("text/plain;charset=utf-8".to_string()), content_length: Some(3), - delegate: None, + delegates: Vec::new(), fee: 138, height: 2, id: inscription.id, diff --git a/tests/wallet/batch_command.rs b/tests/wallet/batch_command.rs index d4fa0e1d76..bede2aec49 100644 --- a/tests/wallet/batch_command.rs +++ b/tests/wallet/batch_command.rs @@ -1106,7 +1106,7 @@ inscriptions: ord.assert_response_regex( format!("/inscription/{}", inscribe.inscriptions[0].id), - format!(r#".*
delegate
\s*
{delegate}
.*"#,), + format!(r#".*
delegates
\s*
{delegate}
.*"#,), ); ord.assert_response(format!("/content/{}", inscribe.inscriptions[0].id), "FOO"); diff --git a/tests/wallet/burn.rs b/tests/wallet/burn.rs index 232c04a44e..1adadd7eb4 100644 --- a/tests/wallet/burn.rs +++ b/tests/wallet/burn.rs @@ -79,7 +79,7 @@ fn runic_outputs_are_protected() { core.mine_blocks(2); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[ // send rune and inscription to the same output (height as usize, 2, 0, Witness::new()), @@ -190,7 +190,7 @@ fn cannot_burn_inscription_sharing_utxo_with_another_inscription() { let (inscription2, _) = inscribe_with_postage(&core, &ord, Some(1000)); let height2 = core.height(); - let txid = core.broadcast_tx(TransactionTemplate { + let txid = core.broadcast_template(TransactionTemplate { inputs: &[ // send all 3 inscriptions on a single output (height0 as usize, 2, 0, Witness::new()), diff --git a/tests/wallet/inscribe.rs b/tests/wallet/inscribe.rs index 0b328f8af7..5ef0e40b10 100644 --- a/tests/wallet/inscribe.rs +++ b/tests/wallet/inscribe.rs @@ -1168,7 +1168,7 @@ fn file_inscribe_with_delegate_inscription() { ord.assert_response_regex( format!("/inscription/{}", inscribe.inscriptions[0].id), - format!(r#".*
delegate
\s*
{delegate}
.*"#,), + format!(r#".*
delegates
\s*
{delegate}
.*"#,), ); ord.assert_response(format!("/content/{}", inscribe.inscriptions[0].id), "FOO"); @@ -1197,7 +1197,7 @@ fn file_inscribe_with_only_delegate() { ord.assert_response_regex( format!("/inscription/{}", inscribe.inscriptions[0].id), - format!(r#".*
delegate
\s*
{delegate}
.*"#,), + format!(r#".*
delegates
\s*
{delegate}
.*"#,), ); ord.assert_response(format!("/content/{}", inscribe.inscriptions[0].id), "FOO"); diff --git a/tests/wallet/send.rs b/tests/wallet/send.rs index 2d843f65b8..3ba72d34f7 100644 --- a/tests/wallet/send.rs +++ b/tests/wallet/send.rs @@ -878,7 +878,7 @@ fn sending_rune_creates_change_output_for_non_outgoing_runes() { .next() .unwrap(); - let merge = core.broadcast_tx(TransactionTemplate { + let merge = core.broadcast_template(TransactionTemplate { inputs: &[(a_block, a_tx, 1, default()), (b_block, b_tx, 1, default())], recipient: Some(address.require_network(Network::Regtest).unwrap()), ..default()