From 990bad702931b074bf370fdf3e4c5c6535be7ca9 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Thu, 18 May 2023 18:17:15 -0300 Subject: [PATCH 01/40] create inscribe-chain cmd --- src/subcommand/server.rs | 60 +++++++++++-------- src/subcommand/wallet.rs | 6 +- src/subcommand/wallet/inscribe.rs | 43 ++++++++++---- src/subcommand/wallet/inscribe_chain.rs | 76 +++++++++++++++++++++++++ 4 files changed, 151 insertions(+), 34 deletions(-) create mode 100644 src/subcommand/wallet/inscribe_chain.rs diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs index e0b3ab9382..9330eebfeb 100644 --- a/src/subcommand/server.rs +++ b/src/subcommand/server.rs @@ -732,7 +732,8 @@ impl Server { return None; } - let json_result: Result = serde_json::from_slice(&inscription.body().unwrap()); + let json_result: Result = + serde_json::from_slice(&inscription.body().unwrap()); let json: Value = json_result.unwrap(); if !json.as_object().unwrap().contains_key("use_p") { @@ -756,7 +757,10 @@ impl Server { if let Some(url_params_field) = json.get("params") { if let Some(url_params) = url_params_field.as_array() { - let param_strs: Vec<&str> = url_params.into_iter().map(|v| v.as_str().unwrap()).collect(); + let param_strs: Vec<&str> = url_params + .into_iter() + .map(|v| v.as_str().unwrap()) + .collect(); params_str = param_strs.join("&"); } } @@ -768,19 +772,31 @@ impl Server { format!("?{params_str}") } - fn get_content_response_if_child_pointer(inscription: &Inscription) -> Option> { + fn get_content_response_if_child_pointer( + inscription: &Inscription, + ) -> Option> { let parent_url_params = Self::get_parent_url_params_if_child_pointer(inscription); if let Some(url_params) = parent_url_params { - let redirect_uri = format!("/content/{}{}", inscription.get_parent_id().unwrap(), url_params); + let redirect_uri = format!( + "/content/{}{}", + inscription.get_parent_id().unwrap(), + url_params + ); return Some(Ok(Redirect::permanent(&redirect_uri).into_response())); } None } - fn get_preview_response_if_child_pointer(inscription: &Inscription) -> Option> { + fn get_preview_response_if_child_pointer( + inscription: &Inscription, + ) -> Option> { let parent_url_params = Self::get_parent_url_params_if_child_pointer(inscription); if let Some(url_params) = parent_url_params { - let redirect_uri = format!("/preview/{}{}", inscription.get_parent_id().unwrap(), url_params); + let redirect_uri = format!( + "/preview/{}{}", + inscription.get_parent_id().unwrap(), + url_params + ); return Some(Ok(Redirect::permanent(&redirect_uri).into_response())); } None @@ -1056,9 +1072,7 @@ mod tests { Self::new_server(test_bitcoincore_rpc::spawn(), None, ord_args, server_args) } - fn new_with_bitcoin_rpc_server( - bitcoin_rpc_server: test_bitcoincore_rpc::Handle, - ) -> Self { + fn new_with_bitcoin_rpc_server(bitcoin_rpc_server: test_bitcoincore_rpc::Handle) -> Self { Self::new_server(bitcoin_rpc_server, None, &[], &[]) } @@ -2641,8 +2655,9 @@ mod tests { inscription_with_parent( "application/json", "{\"use_p\":1,\"params\":[\"tokenID=69\"]}", - parent_inscription - ).to_witness() + parent_inscription, + ) + .to_witness(), ], ..Default::default() }); @@ -2657,11 +2672,11 @@ mod tests { server.assert_redirect_permanent( &format!("/preview/{child_inscription}"), - &format!("/preview/{parent_inscription}?tokenID=69") + &format!("/preview/{parent_inscription}?tokenID=69"), ); server.assert_redirect_permanent( &format!("/content/{child_inscription}"), - &format!("/content/{parent_inscription}?tokenID=69") + &format!("/content/{parent_inscription}?tokenID=69"), ); } @@ -2682,11 +2697,8 @@ mod tests { inputs: &[(2, 1, 0), (2, 0, 0)], witnesses: vec![ Witness::new(), - inscription_with_parent( - "application/json", - "{\"use_p\":1}", - parent_inscription - ).to_witness() + inscription_with_parent("application/json", "{\"use_p\":1}", parent_inscription) + .to_witness(), ], ..Default::default() }); @@ -2701,11 +2713,11 @@ mod tests { server.assert_redirect_permanent( &format!("/preview/{child_inscription}"), - &format!("/preview/{parent_inscription}") + &format!("/preview/{parent_inscription}"), ); server.assert_redirect_permanent( &format!("/content/{child_inscription}"), - &format!("/content/{parent_inscription}") + &format!("/content/{parent_inscription}"), ); } @@ -2729,8 +2741,9 @@ mod tests { inscription_with_parent( "application/json", "{\"not_ord_pointer\":1}", - parent_inscription - ).to_witness() + parent_inscription, + ) + .to_witness(), ], ..Default::default() }); @@ -2768,7 +2781,8 @@ mod tests { inputs: &[(2, 1, 0), (2, 0, 0)], witnesses: vec![ Witness::new(), - inscription_with_parent("text/plain;charset=utf-8", "child", parent_inscription).to_witness(), + inscription_with_parent("text/plain;charset=utf-8", "child", parent_inscription) + .to_witness(), ], ..Default::default() }); diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index 914805d5af..02e61f8112 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -18,6 +18,7 @@ pub mod balance; pub mod cardinals; pub mod create; pub(crate) mod inscribe; +pub mod inscribe_chain; pub mod inscriptions; pub mod outputs; pub mod receive; @@ -51,6 +52,8 @@ pub(crate) enum Wallet { Outputs, #[clap(about = "List unspent cardinal outputs in wallet")] Cardinals, + #[clap(about = "...")] + InscribeChain(inscribe_chain::InscribeChain), } impl Wallet { @@ -58,7 +61,8 @@ impl Wallet { match self { Self::Balance => balance::run(options), Self::Create(create) => create.run(options), - Self::Inscribe(inscribe) => inscribe.run(options), + Self::Inscribe(inscribe) => inscribe.run(options).map(|_| Ok(()))?, + Self::InscribeChain(inscribe_chain) => inscribe_chain.run(options), Self::Inscriptions => inscriptions::run(options), Self::Receive => receive::run(options), Self::Restore(restore) => restore.run(options), diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index d0f38dcd4a..d08e4906b7 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -21,8 +21,8 @@ use { }; #[derive(Serialize)] -struct Output { - commit: Txid, +pub struct Output { + pub commit: Txid, inscription: InscriptionId, parent: Option, reveal: Txid, @@ -58,7 +58,7 @@ pub(crate) struct Inscribe { } impl Inscribe { - pub(crate) fn run(self, options: Options) -> Result { + pub(crate) fn run(self, options: Options) -> Result { let index = Index::open(&options)?; index.update()?; @@ -66,6 +66,17 @@ impl Inscribe { let mut utxos = index.get_unspent_outputs(Wallet::load(&options)?)?; + if let Some(satpoint) = &self.satpoint { + if utxos.get(&satpoint.outpoint).is_none() { + let mempool_transaction = client.get_raw_transaction(&satpoint.outpoint.txid, None)?; + let mempool_outpoint_amount = + Amount::from_sat(mempool_transaction.output[satpoint.outpoint.vout as usize].value); + + utxos.insert(satpoint.outpoint, mempool_outpoint_amount); + println!("Using a satpoint pending in the mempool."); + } + } + let inscriptions = index.get_inscriptions(None)?; let (parent, commit_input_offset) = if let Some(parent_id) = self.parent { @@ -103,7 +114,7 @@ impl Inscribe { .map(Ok) .unwrap_or_else(|| get_change_address(&client))?; - let (unsigned_commit_tx, partially_signed_reveal_tx, _recovery_key_pair) = + let (unsigned_commit_tx, partially_signed_reveal_tx, recovery_key_pair) = Inscribe::create_inscription_transactions( self.satpoint, parent, @@ -140,12 +151,18 @@ impl Inscribe { fees, })?; - return Ok(()); + return Ok(Output { + commit: unsigned_commit_tx.txid(), + reveal: partially_signed_reveal_tx.txid(), + inscription: partially_signed_reveal_tx.txid().into(), + parent: self.parent, + fees, + }); } - // if !self.no_backup { - // Inscribe::backup_recovery_key(&client, recovery_key_pair, options.chain().network())?; - // } + if !self.no_backup { + Inscribe::backup_recovery_key(&client, recovery_key_pair, options.chain().network())?; + } let signed_raw_commit_tx = client .sign_raw_transaction_with_wallet(&unsigned_commit_tx, None, None)? @@ -182,7 +199,13 @@ impl Inscribe { fees, })?; - Ok(()) + Ok(Output { + commit, + reveal, + inscription, + parent: self.parent, + fees, + }) } fn calculate_fee(tx: &Transaction, utxos: &BTreeMap) -> u64 { @@ -410,7 +433,7 @@ impl Inscribe { Ok((unsigned_commit_tx, reveal_tx, recovery_key_pair)) } - fn _backup_recovery_key( + fn backup_recovery_key( client: &Client, recovery_key_pair: TweakedKeyPair, network: Network, diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs new file mode 100644 index 0000000000..e9679de4a7 --- /dev/null +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -0,0 +1,76 @@ +use super::{inscribe::Inscribe, *}; + +#[derive(Debug, Parser)] +pub(crate) struct InscribeChain { + #[clap(long, help = "Inscribe ")] + pub(crate) satpoint: SatPoint, + #[clap(long, help = "Use fee rate of sats/vB")] + pub(crate) fee_rate: FeeRate, + #[clap( + long, + help = "Use sats/vbyte for commit transaction.\nDefaults to if unset." + )] + pub(crate) commit_fee_rate: Option, + #[clap(help = "Inscribe sat with contents of ")] + pub(crate) dir: PathBuf, + #[clap(long, help = "Do not back up recovery key.")] + pub(crate) no_backup: bool, + #[clap( + long, + help = "Do not check that transactions are equal to or below the MAX_STANDARD_TX_WEIGHT of 400,000 weight units. Transactions over this limit are currently nonstandard and will not be relayed by bitcoind in its default configuration. Do not use this flag unless you understand the implications." + )] + pub(crate) no_limit: bool, + #[clap(long, help = "Don't sign or broadcast transactions.")] + pub(crate) dry_run: bool, + #[clap(long, help = "Send inscription to .")] + pub(crate) destination: Option
, + #[clap(long, help = "Establish parent relationship with .")] + pub(crate) parent: Option, +} + +impl InscribeChain { + pub(crate) fn run(self, options: Options) -> Result { + let mut satpoint = self.satpoint; + + let dir = self.dir.read_dir()?; + let files: Vec<_> = dir.collect(); + + if files.len() as u64 > satpoint.offset { + return Err(anyhow!( + "Not enough sats: folder has {} files and output offset is {}", + files.len(), + satpoint.offset + )); + } + + for file in files { + let inscribe = Inscribe { + dry_run: false, + fee_rate: self.fee_rate, + commit_fee_rate: self.commit_fee_rate, + destination: self.destination.clone(), + file: file?.path(), + no_backup: self.no_backup, + no_limit: self.no_limit, + satpoint: Some(satpoint), + parent: self.parent.clone(), + }; + + let inscription = inscribe.run(options.clone())?; + + if satpoint.offset >= 1 { + satpoint.offset -= 1 + }; + + satpoint = SatPoint { + outpoint: OutPoint { + txid: inscription.commit, + vout: 0, + }, + offset: satpoint.offset, + }; + } + + Ok(()) + } +} From 32fe5f8d637b7a68b6531ec4180573d29cd16653 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Thu, 18 May 2023 21:18:18 -0300 Subject: [PATCH 02/40] add parent --- src/index.rs | 15 +++++++++++++++ src/subcommand/wallet/inscribe.rs | 24 ++++++++++++++++++++---- src/subcommand/wallet/inscribe_chain.rs | 17 +++++++++-------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/index.rs b/src/index.rs index 32062bd38a..b6d90db0a9 100644 --- a/src/index.rs +++ b/src/index.rs @@ -525,6 +525,21 @@ impl Index { ) } + pub(crate) fn insert_inscription_satpoint( + &self, + inscription_id: InscriptionId, + satpoint: SatPoint, + ) -> Result { + let tx = self.database.begin_write()?; + + tx.open_table(INSCRIPTION_ID_TO_SATPOINT)? + .insert(&inscription_id.store(), &satpoint.store())?; + + tx.commit()?; + + Ok(()) + } + pub(crate) fn get_inscription_satpoint_by_id( &self, inscription_id: InscriptionId, diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index d08e4906b7..5a13d78ec3 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -25,7 +25,7 @@ pub struct Output { pub commit: Txid, inscription: InscriptionId, parent: Option, - reveal: Txid, + pub reveal: Txid, fees: u64, } @@ -82,9 +82,12 @@ impl Inscribe { let (parent, commit_input_offset) = if let Some(parent_id) = self.parent { if let Some(satpoint) = index.get_inscription_satpoint_by_id(parent_id)? { if !utxos.contains_key(&satpoint.outpoint) { - return Err(anyhow!(format!( - "unrelated parent {parent_id} not accepting mailman's child" // for the germans: "Kuckuckskind" - ))); + let mempool_transaction = client.get_raw_transaction(&satpoint.outpoint.txid, None)?; + let mempool_outpoint_amount = + Amount::from_sat(mempool_transaction.output[satpoint.outpoint.vout as usize].value); + + utxos.insert(satpoint.outpoint, mempool_outpoint_amount); + println!("Using a parent satpoint pending in the mempool."); } let output = index @@ -191,6 +194,19 @@ impl Inscribe { index: 0, }; + // update parent satpoint (only needed for inscribe-chain) + if let Some(parent_id) = self.parent { + let parent_new_satpoint = SatPoint { + outpoint: OutPoint { + txid: reveal, + vout: 0, + }, + offset: 0, + }; + + index.insert_inscription_satpoint(parent_id, parent_new_satpoint)?; + } + print_json(Output { commit, reveal, diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index e9679de4a7..e0c09580f0 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -58,16 +58,17 @@ impl InscribeChain { let inscription = inscribe.run(options.clone())?; + // update inscribe satpoint if satpoint.offset >= 1 { - satpoint.offset -= 1 - }; + satpoint.offset -= 1; - satpoint = SatPoint { - outpoint: OutPoint { - txid: inscription.commit, - vout: 0, - }, - offset: satpoint.offset, + satpoint = SatPoint { + outpoint: OutPoint { + txid: inscription.commit, + vout: 0, + }, + offset: satpoint.offset, + }; }; } From c3cb49b799b8068cf4b2fecc4a4342b414a17827 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Thu, 18 May 2023 22:18:24 -0300 Subject: [PATCH 03/40] create utxo splitter --- src/subcommand/wallet.rs | 4 ++ src/subcommand/wallet/split.rs | 75 ++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/subcommand/wallet/split.rs diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index 02e61f8112..371531eb88 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -25,6 +25,7 @@ pub mod receive; mod restore; pub mod sats; pub mod send; +pub mod split; pub(crate) mod transaction_builder; pub mod transactions; @@ -54,6 +55,8 @@ pub(crate) enum Wallet { Cardinals, #[clap(about = "...")] InscribeChain(inscribe_chain::InscribeChain), + #[clap(about = "...")] + Split(split::Split), } impl Wallet { @@ -71,6 +74,7 @@ impl Wallet { Self::Transactions(transactions) => transactions.run(options), Self::Outputs => outputs::run(options), Self::Cardinals => cardinals::run(options), + Self::Split(split) => split.run(options), } } } diff --git a/src/subcommand/wallet/split.rs b/src/subcommand/wallet/split.rs new file mode 100644 index 0000000000..59fe625627 --- /dev/null +++ b/src/subcommand/wallet/split.rs @@ -0,0 +1,75 @@ +use { + super::*, + bitcoin::{PackedLockTime, Witness}, +}; + +#[derive(Debug, Parser)] +pub(crate) struct Split { + #[clap(long)] + pub(crate) fee: u64, + #[clap(long)] + pub(crate) destination: Address, + #[clap()] + pub(crate) outpoint: OutPoint, +} + +impl Split { + pub(crate) fn run(&self, options: Options) -> Result { + let client = options.bitcoin_rpc_client_for_wallet_command(false)?; + + let output_to_spend = OutPoint { + txid: self.outpoint.txid, + vout: self.outpoint.vout, + }; + + let txin = TxIn { + previous_output: output_to_spend, + script_sig: Script::new(), + sequence: Sequence::MAX, + witness: Witness::new(), + }; + + let output_tx = client.get_raw_transaction(&self.outpoint.txid, None)?; + let output_sats = output_tx.output[self.outpoint.vout as usize].value; + let new_outputs_quantity = output_sats / 11_000; + + let to_address = self.destination.clone(); + let output_locking_script = to_address.script_pubkey(); + let mut outputs: Vec = vec![]; + + // how many outputs to remove from the transaction to pay the fee. + let n: u64 = self.fee / 11_000 + 1; + + for _ in n..new_outputs_quantity { + let txout = TxOut { + script_pubkey: output_locking_script.clone(), + value: 11_000, + }; + + outputs.push(txout); + } + + let change_amount = output_sats - (new_outputs_quantity - n) * 11_000 - self.fee; + let change = TxOut { + script_pubkey: output_locking_script.clone(), + value: change_amount, + }; + outputs.push(change); + + let transaction = Transaction { + version: 1, + lock_time: PackedLockTime::ZERO, + input: vec![txin], + output: outputs, + }; + + let signed_tx = client + .sign_raw_transaction_with_wallet(&transaction, None, None)? + .hex; + let txid = client.send_raw_transaction(&signed_tx)?; + + println!("Transaction: {}", txid); + + Ok(()) + } +} From 040f82465f8fed63b123d599f10378f2afd39348 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Thu, 18 May 2023 23:30:41 -0300 Subject: [PATCH 04/40] add amount --- src/subcommand/wallet/split.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/subcommand/wallet/split.rs b/src/subcommand/wallet/split.rs index 59fe625627..d767fb6a28 100644 --- a/src/subcommand/wallet/split.rs +++ b/src/subcommand/wallet/split.rs @@ -8,6 +8,8 @@ pub(crate) struct Split { #[clap(long)] pub(crate) fee: u64, #[clap(long)] + pub(crate) amount: u64, + #[clap(long)] pub(crate) destination: Address, #[clap()] pub(crate) outpoint: OutPoint, @@ -31,25 +33,25 @@ impl Split { let output_tx = client.get_raw_transaction(&self.outpoint.txid, None)?; let output_sats = output_tx.output[self.outpoint.vout as usize].value; - let new_outputs_quantity = output_sats / 11_000; + let new_outputs_quantity = output_sats / self.amount; let to_address = self.destination.clone(); let output_locking_script = to_address.script_pubkey(); let mut outputs: Vec = vec![]; // how many outputs to remove from the transaction to pay the fee. - let n: u64 = self.fee / 11_000 + 1; + let n: u64 = self.fee / self.amount + 1; for _ in n..new_outputs_quantity { let txout = TxOut { script_pubkey: output_locking_script.clone(), - value: 11_000, + value: self.amount, }; outputs.push(txout); } - let change_amount = output_sats - (new_outputs_quantity - n) * 11_000 - self.fee; + let change_amount = output_sats - (new_outputs_quantity - n) * self.amount - self.fee; let change = TxOut { script_pubkey: output_locking_script.clone(), value: change_amount, From 6fd25712ea102680939440a4fbab124d3274bd5e Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 19 May 2023 19:05:10 -0300 Subject: [PATCH 05/40] improve error and fee rates --- src/subcommand/wallet/inscribe.rs | 4 +- src/subcommand/wallet/inscribe_chain.rs | 67 +++++++++++++++++++++++-- src/subcommand/wallet/split.rs | 26 +++++----- 3 files changed, 77 insertions(+), 20 deletions(-) diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index 5a13d78ec3..6a105bf437 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -73,7 +73,7 @@ impl Inscribe { Amount::from_sat(mempool_transaction.output[satpoint.outpoint.vout as usize].value); utxos.insert(satpoint.outpoint, mempool_outpoint_amount); - println!("Using a satpoint pending in the mempool."); + //println!("Using a satpoint pending in the mempool."); } } @@ -87,7 +87,7 @@ impl Inscribe { Amount::from_sat(mempool_transaction.output[satpoint.outpoint.vout as usize].value); utxos.insert(satpoint.outpoint, mempool_outpoint_amount); - println!("Using a parent satpoint pending in the mempool."); + //println!("Using a parent satpoint pending in the mempool."); } let output = index diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index e0c09580f0..f8fd744fb5 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -1,3 +1,5 @@ +use std::fs::{DirBuilder, DirEntry}; + use super::{inscribe::Inscribe, *}; #[derive(Debug, Parser)] @@ -33,9 +35,13 @@ impl InscribeChain { let mut satpoint = self.satpoint; let dir = self.dir.read_dir()?; - let files: Vec<_> = dir.collect(); + let mut files: Vec = dir + .map(|f| f.unwrap()) + .filter(|file| file.path().is_file()) + .collect(); + files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); - if files.len() as u64 > satpoint.offset { + if files.len() as u64 > satpoint.offset + 1 { return Err(anyhow!( "Not enough sats: folder has {} files and output offset is {}", files.len(), @@ -43,22 +49,44 @@ impl InscribeChain { )); } + DirBuilder::new() + .create(&self.dir.join("inscribed")) + .unwrap_or_default(); + for file in files { + let file_path = file.path(); + + if file_path.is_dir() { + continue; + }; + let inscribe = Inscribe { dry_run: false, fee_rate: self.fee_rate, commit_fee_rate: self.commit_fee_rate, destination: self.destination.clone(), - file: file?.path(), + file: file_path.clone(), no_backup: self.no_backup, no_limit: self.no_limit, satpoint: Some(satpoint), parent: self.parent.clone(), }; - let inscription = inscribe.run(options.clone())?; + println!("Inscribing {} at {}", file_path.clone().display(), satpoint); + let inscription = inscribe.run(options.clone()).context(format!( + "Wait for a new block to be mined and resume the operation running:\n{}\n", + self.get_resume_cli_command(satpoint) + ))?; + + fs::rename( + file_path.clone(), + &self + .dir + .join("inscribed") + .join(file_path.file_name().unwrap()), + )?; - // update inscribe satpoint + // update satpoint to inscribe for next iteration if satpoint.offset >= 1 { satpoint.offset -= 1; @@ -74,4 +102,33 @@ impl InscribeChain { Ok(()) } + + fn get_resume_cli_command(&self, updated_satpoint: SatPoint) -> String { + let mut cli = format!( + "ord wallet inscribe --fee-rate {:.1}", + self.fee_rate.fee(10 as usize).to_sat() as f64 / 10.0 + ); + if let Some(parent) = self.parent { + cli.push_str(&format!(" --parent {}", parent)); + } + if let Some(destination) = &self.destination { + cli.push_str(&format!(" --destination {}", destination)); + } + cli.push_str(&format!(" --satpoint {}", updated_satpoint)); + cli.push_str(&format!(" {}", self.dir.display())); + + return cli; + } +} + +fn get_number_from_dir_entry(dir_entry: &DirEntry) -> u64 { + dir_entry + .path() + .file_stem() + .unwrap() + .to_str() + .unwrap() + .parse() + .context("Name the files in the format: ., e.g. 1.json") + .unwrap() } diff --git a/src/subcommand/wallet/split.rs b/src/subcommand/wallet/split.rs index d767fb6a28..b5b12fa40f 100644 --- a/src/subcommand/wallet/split.rs +++ b/src/subcommand/wallet/split.rs @@ -6,7 +6,7 @@ use { #[derive(Debug, Parser)] pub(crate) struct Split { #[clap(long)] - pub(crate) fee: u64, + pub(crate) fee_rate: FeeRate, #[clap(long)] pub(crate) amount: u64, #[clap(long)] @@ -39,10 +39,7 @@ impl Split { let output_locking_script = to_address.script_pubkey(); let mut outputs: Vec = vec![]; - // how many outputs to remove from the transaction to pay the fee. - let n: u64 = self.fee / self.amount + 1; - - for _ in n..new_outputs_quantity { + for _ in 0..new_outputs_quantity { let txout = TxOut { script_pubkey: output_locking_script.clone(), value: self.amount, @@ -51,20 +48,23 @@ impl Split { outputs.push(txout); } - let change_amount = output_sats - (new_outputs_quantity - n) * self.amount - self.fee; - let change = TxOut { - script_pubkey: output_locking_script.clone(), - value: change_amount, - }; - outputs.push(change); - - let transaction = Transaction { + let mut transaction = Transaction { version: 1, lock_time: PackedLockTime::ZERO, input: vec![txin], output: outputs, }; + let fee = self.fee_rate.fee(transaction.vsize()); + transaction.output[(new_outputs_quantity - 1) as usize].value = transaction.output + [(new_outputs_quantity - 1) as usize] + .value + .checked_sub(fee.to_sat()) + .context(format!( + "fees higher than output amount: {} > {}", + fee, self.amount + ))?; + let signed_tx = client .sign_raw_transaction_with_wallet(&transaction, None, None)? .hex; From 07ecc648114a0bdbc17088162060ffe6b089b278 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 19 May 2023 21:12:44 -0300 Subject: [PATCH 06/40] add docs and fix errors --- chain.png | Bin 0 -> 98659 bytes inscribe-chain.md | 56 ++++++++++++++++++++++++ src/subcommand/wallet/inscribe_chain.rs | 25 ++++++----- 3 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 chain.png create mode 100644 inscribe-chain.md diff --git a/chain.png b/chain.png new file mode 100644 index 0000000000000000000000000000000000000000..8679ef6ede45a0cf8d7724ee2650ab195ca6de4a GIT binary patch literal 98659 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ƗA%fdyN_;7EYPyf>6o|7~sU>D^Au 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 CcWEO4 literal 0 HcmV?d00001 diff --git a/inscribe-chain.md b/inscribe-chain.md new file mode 100644 index 0000000000..46b020161d --- /dev/null +++ b/inscribe-chain.md @@ -0,0 +1,56 @@ +# ord wallet inscribe-chain +> Broadcast a transaction chain to the mempool inscribing 10 ordinals, each containing one special sat extracted from a designated output. + +![](chain.png) + +## Example +1. Create the files to be inscribed: + ```bash + mkdir files/ + echo "1" > files/1.txt + echo "2" > files/2.txt + echo "3" > files/3.txt + echo "4" > files/4.txt + echo "5" > files/5.txt + echo "6" > files/6.txt + echo "7" > files/7.txt + echo "8" > files/8.txt + echo "9" > files/9.txt + echo "10" > files/10.txt + echo "11" > files/11.txt + echo "12" > files/12.txt + echo "13" > files/13.txt + echo "14" > files/14.txt + echo "15" > files/15.txt + ``` +2. Get the special utxo + ```bash + ord wallet outputs + ``` + ```json + [ + { + "output": "7f320d87dd2d011ba9a3dbc66c46aed4b0b3a9a0a4d1c93fe3ed97ab280463f5:8", + "amount": 15000 + } + ] + ``` + Lets pick sats from `10_001` to `10_015` as the special ones, so my `satpoint` is: + ``` + 7f320d87dd2d011ba9a3dbc66c46aed4b0b3a9a0a4d1c93fe3ed97ab280463f5:8:10014 + ``` +3. Run the `inscribe-chain` command + > **note** + > You must have at least 10 additional available utxos, each containing a minimum of 12,000 sats, when running this command. If you don't have enough, use the `ord wallet split` command to break one of your larger utxos into several smaller ones.. + + ```bash + ord wallet inscribe-chain --fee-rate=1.0 --satpoint=7f320d87dd2d011ba9a3dbc66c46aed4b0b3a9a0a4d1c93fe3ed97ab280463f5:8:10014 files/ + ``` + The sats `24015`, `24014`, `24013`, `24012`, `24011`, `24010`, `24009`, `24008`, `24007` and `24006` were extracted from the special utxo and given to the inscribed files `1.json`, `2.json`, ... `10.json` in this order. + +4. Now we have to **wait for the block to be mined** and then run the next command (that was given when the previous completed): + > **warning** + > If you run the following command while the previous transaction chain is still pending in the mempool, you will be able to inscribe only 2 more inscriptions and will have a commit transaction without the reveal. In other words, it will waste valuable special sats and will require a manual task to fix the transaction chain. + ```bash + ord wallet inscribe-chain --fee-rate 1 --satpoint d3ecd1d753e09d2ca3a69fe1a36a7b829e3c096d44f101d11c5a3f6aef1e757b:0:10004 files/ + ``` diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index f8fd744fb5..dbbd436f9f 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -30,6 +30,9 @@ pub(crate) struct InscribeChain { pub(crate) parent: Option, } +// maximum of 12 +const INSCRIPTION_PER_BLOCK: usize = 10; + impl InscribeChain { pub(crate) fn run(self, options: Options) -> Result { let mut satpoint = self.satpoint; @@ -53,13 +56,10 @@ impl InscribeChain { .create(&self.dir.join("inscribed")) .unwrap_or_default(); - for file in files { + for i in 0..(files.len().min(INSCRIPTION_PER_BLOCK)) { + let file = files.get(i).unwrap(); let file_path = file.path(); - if file_path.is_dir() { - continue; - }; - let inscribe = Inscribe { dry_run: false, fee_rate: self.fee_rate, @@ -73,10 +73,7 @@ impl InscribeChain { }; println!("Inscribing {} at {}", file_path.clone().display(), satpoint); - let inscription = inscribe.run(options.clone()).context(format!( - "Wait for a new block to be mined and resume the operation running:\n{}\n", - self.get_resume_cli_command(satpoint) - ))?; + let inscription = inscribe.run(options.clone())?; fs::rename( file_path.clone(), @@ -100,12 +97,20 @@ impl InscribeChain { }; } + println!("\nSuccess!"); + println!( + "{} new inscriptions pending in the mempool.", + files.len().min(INSCRIPTION_PER_BLOCK) + ); + println!("\nTo continue inscribing, wait for the block to be mined and run:"); + println!("{}", self.get_resume_cli_command(satpoint)); + Ok(()) } fn get_resume_cli_command(&self, updated_satpoint: SatPoint) -> String { let mut cli = format!( - "ord wallet inscribe --fee-rate {:.1}", + "ord wallet inscribe-chain --fee-rate {}", self.fee_rate.fee(10 as usize).to_sat() as f64 / 10.0 ); if let Some(parent) = self.parent { From 44982ca678b5a381828beaa0d5fec2967f9b922e Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 19 May 2023 21:25:03 -0300 Subject: [PATCH 07/40] add req section --- inscribe-chain.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/inscribe-chain.md b/inscribe-chain.md index 46b020161d..26b89f9184 100644 --- a/inscribe-chain.md +++ b/inscribe-chain.md @@ -3,6 +3,12 @@ ![](chain.png) +## Requirements +1. utxo containing special sats must be padded with at least 1,000 normal sats at the beginning +2. if the utxo has more than one range of special sats, start with the last sat of the last range, because everything below that will be trimmed. +3. for each iteration, 10 inscriptions being created in one block, wallet must have 10 additional available utxos with enough sats for each inscriptions because 1 sat will come from the special utxo and the other 9,999 will come from any other normal utxo available in the wallet. +4. files to be inscribed must be named as `.`, the inscribing will take place in that order. + ## Example 1. Create the files to be inscribed: ```bash @@ -40,7 +46,7 @@ 7f320d87dd2d011ba9a3dbc66c46aed4b0b3a9a0a4d1c93fe3ed97ab280463f5:8:10014 ``` 3. Run the `inscribe-chain` command - > **note** + > **Note** > You must have at least 10 additional available utxos, each containing a minimum of 12,000 sats, when running this command. If you don't have enough, use the `ord wallet split` command to break one of your larger utxos into several smaller ones.. ```bash @@ -49,7 +55,7 @@ The sats `24015`, `24014`, `24013`, `24012`, `24011`, `24010`, `24009`, `24008`, `24007` and `24006` were extracted from the special utxo and given to the inscribed files `1.json`, `2.json`, ... `10.json` in this order. 4. Now we have to **wait for the block to be mined** and then run the next command (that was given when the previous completed): - > **warning** + > **Warning** > If you run the following command while the previous transaction chain is still pending in the mempool, you will be able to inscribe only 2 more inscriptions and will have a commit transaction without the reveal. In other words, it will waste valuable special sats and will require a manual task to fix the transaction chain. ```bash ord wallet inscribe-chain --fee-rate 1 --satpoint d3ecd1d753e09d2ca3a69fe1a36a7b829e3c096d44f101d11c5a3f6aef1e757b:0:10004 files/ From 24b1e609c776e5354aeaba765f5c93b431c9d814 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 19 May 2023 21:33:53 -0300 Subject: [PATCH 08/40] add mempool --- inscribe-chain.md | 8 +++++++- mempool.png | Bin 0 -> 109802 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 mempool.png diff --git a/inscribe-chain.md b/inscribe-chain.md index 26b89f9184..e4d1caac24 100644 --- a/inscribe-chain.md +++ b/inscribe-chain.md @@ -52,7 +52,7 @@ ```bash ord wallet inscribe-chain --fee-rate=1.0 --satpoint=7f320d87dd2d011ba9a3dbc66c46aed4b0b3a9a0a4d1c93fe3ed97ab280463f5:8:10014 files/ ``` - The sats `24015`, `24014`, `24013`, `24012`, `24011`, `24010`, `24009`, `24008`, `24007` and `24006` were extracted from the special utxo and given to the inscribed files `1.json`, `2.json`, ... `10.json` in this order. + The sats `10015`, `10014`, `10013`, `10012`, `10011`, `10010`, `10009`, `10008`, `10007` and `10006` were extracted from the special utxo and given to the inscribed files `1.json`, `2.json`, ... `10.json` in this order. 4. Now we have to **wait for the block to be mined** and then run the next command (that was given when the previous completed): > **Warning** @@ -60,3 +60,9 @@ ```bash ord wallet inscribe-chain --fee-rate 1 --satpoint d3ecd1d753e09d2ca3a69fe1a36a7b829e3c096d44f101d11c5a3f6aef1e757b:0:10004 files/ ``` + +And this is the full chain: +https://mempool.space/pt/signet/tx/58a7f430fbd5933d7f2dbcb9b2e1b4aaeea3af47a965c1a8917fa05bbf854a45#flow=&vin=0 + +![](mempool.png) +If we navigate through the first outputs we can see all the 10015 to 10001 sats being added to the commit outputs and then to the reveal output. diff --git a/mempool.png b/mempool.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c1b2db1c5de20f25018192c2723db8354fe436 GIT binary patch literal 109802 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 Date: Fri, 26 May 2023 11:21:19 -0300 Subject: [PATCH 09/40] add mint guide --- .gitignore | 1 + 300-mint.md | 185 ++++++++++++++++++++++++ create-300.sh | 17 +++ src/subcommand/wallet/inscribe.rs | 8 + src/subcommand/wallet/inscribe_chain.rs | 2 - 5 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 300-mint.md create mode 100644 create-300.sh diff --git a/.gitignore b/.gitignore index 26154489a5..d272a24139 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ /target /test-times.txt /tmp +/300-inscriptions diff --git a/300-mint.md b/300-mint.md new file mode 100644 index 0000000000..8d96cf751a --- /dev/null +++ b/300-mint.md @@ -0,0 +1,185 @@ +# 300 mint + +## 1. Environment setup +Make sure to have `bitcoind` running, `rust` installed and no previous `ord` installation. +1.1 Building `ord` +``` +git clone git@github.com:metagood/ord.git +git checkout inscribe-in-mempool + +cargo build --release +``` + +1.2 Indexing +``` +alias ord=./target/release/ord +ord index +``` + +## 2. Creating the reveal inscription +2.1 Create an ord wallet +``` +ord wallet create +``` +```json +{ + "mnemonic": "boost reopen else velvet stairs north glance perfect review faint debris vendor", + "address": "tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf", + "public_key": "031fec97bc1edf5a674ecdee1cfef05d361ad6f07e82d6eafa8db2e60c84a898ce", + "passphrase": "" +} +``` +2.2 Fund it with just enough for one inscription (`0.00015 BTC`). +2.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. [[why?]()] +``` +echo "999" > reveal.txt +ord wallet inscribe --fee-rate=1.0 --dry-run reveal.txt +``` +``` +{ + "commit": "f1938727c6c62854dcf2a03ad0c7472d11d6287f159ff3e762a14913e7899784", + "inscription": "7789307187f985b659a88577c324a2e0d1d47b6185c83ed770c6a84ca0f96b20i0", + "reveal": "7789307187f985b659a88577c324a2e0d1d47b6185c83ed770c6a84ca0f96b20", + "fees": 293 +} +commit tx hex +0100000000010190e04255f5059e62a12ba212be1e8ea3e7fcd7cf5474dc7f3ff3bd63bd41c3780000000000fdffffff029b27000000000000225120f137116e15b332bf2b65654c38875167c76b02b97449cbee6eea6785389692831b9b000000000000225120370f63d7d9540bd950f7f4c469e75bb19570173e28fb1e28b6263bff3a0ab8350140fc8067945e3476ce6477ff170d5ec37dbf50d5b13e8c62865fd58b684652da3e0a742839d9698ebf97131e462833939cfc0d5bc4f6697c159da4304b8fd9357600000000 + +reveal tx hex +01000000000101849789e71349a162e7f39f157f28d6112d47c7d03aa0f2dc5428c6c6278793f10000000000fdffffff011027000000000000225120e02f25580deedbf208ee84f78c1e1f5a3d780520de51668233d183468e2d308d0340ec920064008a617b7de6c2825750322397f9211b5a2f0f09c75980b7323488e34aebcf8012be43634efc131f64c21adbead67476b79cf8094f31870e7d76f6954a202c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c12c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d000000000 +``` +2.4 Save the inscription id, commit and reveal transaction hex. +2.4 Put this wallet on hold until it is needed again +``` +mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-reveal-inscription +``` +## 3. Creating the 300 inscriptions +> **Note** +> Only 20 will be created on this example + +3.1 Create a new ord wallet (restarting `bitcoind` is required) +``` +killall bitcoind +bitcoind --daemon + +ord wallet create +``` +```json +{ + "mnemonic": "brass knife empty issue submit portion need razor lend undo despair pelican", + "address": "tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8", + "public_key": "0358bfbc7266e6e997dd7dee379b6be7e057a54d634dfcd51e9bdd112f0450f56a", + "passphrase": "" +} +``` +3.2 Fund it with enough for one inscription (vary according to file size). +3.3 Get the file to be inscribed as the parent and inscribe it. +``` +ord wallet inscribe --fee-rate=1.0 parent.txt +``` +```json +{ + "commit": "b7dfef2f97c626f75b1d02c9ca9f759dfc5419e245283c46cbd8befb4ec4d283", + "inscription": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", + "reveal": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948edd", + "fees": 292 +} +``` +3.4 Transfer `300 x 0.00015 = 0.045 BTC` to this wallet. +```sh +# Using a 20 x 0.00015 = 0.003 BTC UTXO in this example +# txhash:vout +06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 +``` +3.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. +``` +ord wallet split --fee-rate=1.0 --amount=14990 --destination=tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 +``` +3.6 Generate the 300 files to be inscribed +``` +bash create-300.sh +``` +3.7 Transfer the important UTXO to this wallet. +```sh +# txhash:vout +967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0 +``` +3.8 Identify the range where the important sats are in this output +```sh +# on this example, the output 967d...8de9:0 has 9500 sats and they are distributed as follows +# [0 - 7499] 7500 normal sats +# [7500 - 7519] 20 important sats* +# [7520 - 9499] 1980 normal sats +``` +Make sure that: +* the UTXO has at least `550 sats` (dust limit) above the important sats +* the range containing important sats has at least 300 sats + +3.9 Inscribe the 300 files giving one important sat to each +``` +ord wallet inscribe-chain --fee-rate=1.5 --parent=bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint=967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 300-inscriptions/ +``` +``` +Inscribing 300-inscriptions/1.json at 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 +{ + "commit": "6382e2d71145caf02b21f7786554823ddadc2e1cddc596cd1ad081b03dd4bfaa", + "inscription": "aa928749abcbb93cff404a75ddede7fd46ca64aee6c1d2eb06c5d64b51908f2ei0", + "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", + "reveal": "aa928749abcbb93cff404a75ddede7fd46ca64aee6c1d2eb06c5d64b51908f2e", + "fees": 769 +} +Inscribing 300-inscriptions/2.json at 6382e2d71145caf02b21f7786554823ddadc2e1cddc596cd1ad081b03dd4bfaa:0:7518 +{ + "commit": "2dc1e3dbf866774f601e1a5563197e0e379d304f30d633432145b8ce779739f9", + "inscription": "905c1f7c5a4e982d84a78a859bb9156163dbc010d6e5de67e7111d6f9a98cefai0", + "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", + "reveal": "905c1f7c5a4e982d84a78a859bb9156163dbc010d6e5de67e7111d6f9a98cefa", + "fees": 769 +} + +... [TRUNCATED] + +Inscribing 300-inscriptions/9.json at 843a1018b70363d360fcf51573c191d2ca1060a5fcbb4075f24d817f6f59a11e:0:7511 +{ + "commit": "5d4bda0e9f137f1c4f9f077ed7b637552b506039e7bbc46fe02b424af5360f35", + "inscription": "da929a6715e0231c3643807ac65126b2aab033fa48e3069a90cb226fbf68e43ci0", + "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", + "reveal": "da929a6715e0231c3643807ac65126b2aab033fa48e3069a90cb226fbf68e43c", + "fees": 769 +} +Inscribing 300-inscriptions/10.json at 5d4bda0e9f137f1c4f9f077ed7b637552b506039e7bbc46fe02b424af5360f35:0:7510 +{ + "commit": "a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f", + "inscription": "f73c80bdd87e4df1eb6c41fe815515e656930ca67cdfa6a5e4ec07acb3de7c3di0", + "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", + "reveal": "f73c80bdd87e4df1eb6c41fe815515e656930ca67cdfa6a5e4ec07acb3de7c3d", + "fees": 770 +} + +Success! +10 new inscriptions pending in the mempool. + +To continue inscribing, wait for the block to be mined and run: +ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ +``` +Important to note +* `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain +* `--satpoint` has to point to the last important sat position, `967d...8de9:0:7519`, because this command will consume all 300 sats above it, including it +* Upon completion, the `inscribe-chain` will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" + +3.10 Wait for the previous transaction chain to be mined +3.11 Run the next `inscribe-chain` command +``` +ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ +``` +3.12 Loop through steps `3.10` and `3.11` until the folder `300-inscriptions` has no more files left to be inscribed. + +## 4. Reveal +4.1 Broadcast the commit transaction from step `2.3` +``` +bitcoin-cli sendrawtransaction 0100000000010190e04255f5059e62a12ba212be1e8ea3e7fcd7cf5474dc7f3ff3bd63bd41c3780000000000fdffffff029b27000000000000225120f137116e15b332bf2b65654c38875167c76b02b97449cbee6eea6785389692831b9b000000000000225120370f63d7d9540bd950f7f4c469e75bb19570173e28fb1e28b6263bff3a0ab8350140fc8067945e3476ce6477ff170d5ec37dbf50d5b13e8c62865fd58b684652da3e0a742839d9698ebf97131e462833939cfc0d5bc4f6697c159da4304b8fd9357600000000 +``` +4.2 Broadcast the reveal transaction from step `2.3` +``` +bitcoin-cli sendrawtransaction 01000000000101849789e71349a162e7f39f157f28d6112d47c7d03aa0f2dc5428c6c6278793f10000000000fdffffff011027000000000000225120e02f25580deedbf208ee84f78c1e1f5a3d780520de51668233d183468e2d308d0340ec920064008a617b7de6c2825750322397f9211b5a2f0f09c75980b7323488e34aebcf8012be43634efc131f64c21adbead67476b79cf8094f31870e7d76f6954a202c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c12c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d000000000 +``` diff --git a/create-300.sh b/create-300.sh new file mode 100644 index 0000000000..ffad3984f6 --- /dev/null +++ b/create-300.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +mkdir -p 300-inscriptions + +for ((i=1; i<=300; i++)); do + filename="${i}.json" + filepath="300-inscriptions/${filename}" + tokenID=$i + + echo '{ + "use_p": 1, + "params": ["tokenID='$tokenID'"] +}' > "$filepath" + +done + +echo "Files created!" diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index 6a105bf437..9485aa19f7 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -1,4 +1,5 @@ use bitcoin::SchnorrSig; +use bitcoincore_rpc::RawTx; use { super::*, @@ -154,6 +155,13 @@ impl Inscribe { fees, })?; + let signed_raw_commit_tx = client + .sign_raw_transaction_with_wallet(&unsigned_commit_tx, None, None)? + .hex; + + println!("commit tx hex\n{}\n", hex::encode(signed_raw_commit_tx)); + println!("reveal tx hex\n{}", partially_signed_reveal_tx.raw_hex()); + return Ok(Output { commit: unsigned_commit_tx.txid(), reveal: partially_signed_reveal_tx.txid(), diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index dbbd436f9f..1d0de44056 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -23,8 +23,6 @@ pub(crate) struct InscribeChain { )] pub(crate) no_limit: bool, #[clap(long, help = "Don't sign or broadcast transactions.")] - pub(crate) dry_run: bool, - #[clap(long, help = "Send inscription to .")] pub(crate) destination: Option

, #[clap(long, help = "Establish parent relationship with .")] pub(crate) parent: Option, From 0777b91ac57591d102278abedad636286d096f0b Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 26 May 2023 11:57:02 -0300 Subject: [PATCH 10/40] make destination required --- 300-mint.md | 29 +++++++++++++++++++++++------ src/subcommand/wallet/create.rs | 22 ++++++++++++++++++++++ src/subcommand/wallet/inscribe.rs | 4 ++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/300-mint.md b/300-mint.md index 8d96cf751a..dafeb3e957 100644 --- a/300-mint.md +++ b/300-mint.md @@ -30,10 +30,15 @@ ord wallet create } ``` 2.2 Fund it with just enough for one inscription (`0.00015 BTC`). -2.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. [[why?]()] +2.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. ``` echo "999" > reveal.txt -ord wallet inscribe --fee-rate=1.0 --dry-run reveal.txt + +ord wallet inscribe \ +--fee-rate 1.0 \ +--destination tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf \ +--dry-run \ +reveal.txt ``` ``` { @@ -75,7 +80,10 @@ ord wallet create 3.2 Fund it with enough for one inscription (vary according to file size). 3.3 Get the file to be inscribed as the parent and inscribe it. ``` -ord wallet inscribe --fee-rate=1.0 parent.txt +ord wallet inscribe \ +--fee-rate 1.0 \ +--destination tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf \ +parent.txt ``` ```json { @@ -93,7 +101,10 @@ ord wallet inscribe --fee-rate=1.0 parent.txt ``` 3.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. ``` -ord wallet split --fee-rate=1.0 --amount=14990 --destination=tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 +ord wallet split \ +--fee-rate 1.0 \ +--amount 14990 \ +06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 ``` 3.6 Generate the 300 files to be inscribed ``` @@ -117,7 +128,12 @@ Make sure that: 3.9 Inscribe the 300 files giving one important sat to each ``` -ord wallet inscribe-chain --fee-rate=1.5 --parent=bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint=967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 300-inscriptions/ +ord wallet inscribe-chain \ +--fee-rate 1.5 \ +--parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 \ +--destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 \ +--satpoint 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 \ +300-inscriptions/ ``` ``` Inscribing 300-inscriptions/1.json at 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 @@ -164,13 +180,14 @@ ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949 ``` Important to note * `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain +* `--destination` must be the address given when the wallet was created on step `3.1` * `--satpoint` has to point to the last important sat position, `967d...8de9:0:7519`, because this command will consume all 300 sats above it, including it * Upon completion, the `inscribe-chain` will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" 3.10 Wait for the previous transaction chain to be mined 3.11 Run the next `inscribe-chain` command ``` -ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ +ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ ``` 3.12 Loop through steps `3.10` and `3.11` until the folder `300-inscriptions` has no more files left to be inscribed. diff --git a/src/subcommand/wallet/create.rs b/src/subcommand/wallet/create.rs index a236f8ee80..6f186d957a 100644 --- a/src/subcommand/wallet/create.rs +++ b/src/subcommand/wallet/create.rs @@ -1,8 +1,15 @@ +use bitcoin::{ + secp256k1::PublicKey, + util::bip32::{self, ExtendedPubKey}, +}; + use super::*; #[derive(Serialize)] struct Output { mnemonic: Mnemonic, + address: Address, + public_key: PublicKey, passphrase: Option, } @@ -22,11 +29,26 @@ impl Create { rand::thread_rng().fill_bytes(&mut entropy); let mnemonic = Mnemonic::from_entropy(&entropy)?; + let seed = mnemonic.to_seed(self.passphrase.clone()); + let secp = Secp256k1::new(); + let root = bip32::ExtendedPrivKey::new_master(options.chain().network(), &seed)?; + + let xprv = root.derive_priv(&secp, &DerivationPath::from_str("m/86'/1'/0'")?)?; + let xpub = ExtendedPubKey::from_priv(&secp, &xprv); + let public_key = xpub + .derive_pub(&secp, &DerivationPath::from_str("m/0/0")?)? + .public_key; initialize_wallet(&options, mnemonic.to_seed(self.passphrase.clone()))?; + let address = options + .bitcoin_rpc_client_for_wallet_command(false)? + .get_new_address(None, Some(bitcoincore_rpc::json::AddressType::Bech32m))?; + print_json(Output { mnemonic, + address, + public_key, passphrase: Some(self.passphrase), })?; diff --git a/src/subcommand/wallet/inscribe.rs b/src/subcommand/wallet/inscribe.rs index 9485aa19f7..bf08887738 100644 --- a/src/subcommand/wallet/inscribe.rs +++ b/src/subcommand/wallet/inscribe.rs @@ -60,6 +60,10 @@ pub(crate) struct Inscribe { impl Inscribe { pub(crate) fn run(self, options: Options) -> Result { + if self.destination.is_none() { + bail!("--destination is required"); + } + let index = Index::open(&options)?; index.update()?; From 5462780816b72003d6bcc525617abfa533de0c49 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 26 May 2023 12:24:58 -0300 Subject: [PATCH 11/40] fix destination --- 300-mint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/300-mint.md b/300-mint.md index dafeb3e957..a70d78e6b1 100644 --- a/300-mint.md +++ b/300-mint.md @@ -82,7 +82,7 @@ ord wallet create ``` ord wallet inscribe \ --fee-rate 1.0 \ ---destination tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf \ +--destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 \ parent.txt ``` ```json From 3b2e47a115c2274d0fce076884acfd1a97ff7483 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Fri, 26 May 2023 16:51:23 -0300 Subject: [PATCH 12/40] add ord5 and ord9 wip --- 300-mint.md | 144 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 98 insertions(+), 46 deletions(-) diff --git a/300-mint.md b/300-mint.md index a70d78e6b1..d34ce3923d 100644 --- a/300-mint.md +++ b/300-mint.md @@ -1,9 +1,50 @@ # 300 mint -## 1. Environment setup -Make sure to have `bitcoind` running, `rust` installed and no previous `ord` installation. +## 1. Environment setup: `ord9` +Make sure to have `bitcoind` running and `rust` installed. 1.1 Building `ord` ``` +ssh @ + +git clone git@github.com:metagood/ord.git +git checkout ord-pc-logfile-052 + +cargo build --release +``` + +1.2 Indexing +``` +alias ord9=./target/release/ord +ord9 index +``` + +1.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. +``` +mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-old + +killall bitcoind +bitcoind --daemon +``` + +1.4 Create a new wallet to receive the 300 inscriptions +``` +ord9 wallet create +``` +```json +{ + "mnemonic": "stadium three aspect awesome oyster ski bring wash call fan stage display", + "address": "tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw", + "public_key": "027f24948757f56793856ca16eb0b2e34644e8643dddd5fffda387515be0e3ad8a", + "passphrase": "" +} +``` + +## 2. Environment setup: `ord5` +Make sure to have `bitcoind` running and `rust` installed. +1.1 Building `ord` +``` +ssh @ + git clone git@github.com:metagood/ord.git git checkout inscribe-in-mempool @@ -12,77 +53,88 @@ cargo build --release 1.2 Indexing ``` -alias ord=./target/release/ord -ord index +alias ord5=./target/release/ord +ord5 index ``` -## 2. Creating the reveal inscription -2.1 Create an ord wallet +1.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. ``` -ord wallet create +mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-old + +killall bitcoind +bitcoind --daemon +``` + +## 3. Creating the reveal inscription +3.1 Create an ord wallet +``` +ord5 wallet create ``` ```json { - "mnemonic": "boost reopen else velvet stairs north glance perfect review faint debris vendor", - "address": "tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf", - "public_key": "031fec97bc1edf5a674ecdee1cfef05d361ad6f07e82d6eafa8db2e60c84a898ce", + "mnemonic": "butter tuition draft reopen cereal match soft average thumb comfort dilemma labor", + "address": "tb1psh7f8tvrrdd0re20ntnsayhd5g7pu2ckvx7clsh2f6tyvuyh8peq2stc40", + "public_key": "037335a3c64eed26736c5fb83321441742f7e6cb8d8f10a2b2eb0397027dd200f7", "passphrase": "" } ``` -2.2 Fund it with just enough for one inscription (`0.00015 BTC`). -2.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. +3.2 Fund it with just enough for one inscription (`0.00015 BTC`). +3.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. ``` echo "999" > reveal.txt - -ord wallet inscribe \ +``` +```sh +# use the address from ord9's wallet for destination (step 1.4) +ord5 wallet inscribe \ --fee-rate 1.0 \ ---destination tb1p7rpgexms8p35vyvk8zcs22mgp79sqvgf6q7na25sjjefpqj2whzsvkzesf \ +--destination tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw \ --dry-run \ reveal.txt ``` ``` { - "commit": "f1938727c6c62854dcf2a03ad0c7472d11d6287f159ff3e762a14913e7899784", - "inscription": "7789307187f985b659a88577c324a2e0d1d47b6185c83ed770c6a84ca0f96b20i0", - "reveal": "7789307187f985b659a88577c324a2e0d1d47b6185c83ed770c6a84ca0f96b20", + "commit": "1cc502b83155da5f7e46ae73d16f30d0b3b5ae3f4a113740c0d025759b0c4e82", + "inscription": "746fa2816f997527eab5007c622f402ae4a1634f1ef41e2744cf82ebe6e073c2i0", + "parent": null, + "reveal": "746fa2816f997527eab5007c622f402ae4a1634f1ef41e2744cf82ebe6e073c2", "fees": 293 } commit tx hex -0100000000010190e04255f5059e62a12ba212be1e8ea3e7fcd7cf5474dc7f3ff3bd63bd41c3780000000000fdffffff029b27000000000000225120f137116e15b332bf2b65654c38875167c76b02b97449cbee6eea6785389692831b9b000000000000225120370f63d7d9540bd950f7f4c469e75bb19570173e28fb1e28b6263bff3a0ab8350140fc8067945e3476ce6477ff170d5ec37dbf50d5b13e8c62865fd58b684652da3e0a742839d9698ebf97131e462833939cfc0d5bc4f6697c159da4304b8fd9357600000000 +010000000001010acc93eb8f2bee57d3ef2257eb520115a8536f80f0beab8bacab24b7d97161920000000000fdffffff029b270000000000002251201b8d03f5db831a5a19e0b23cdc7a0505109ef39b57e220b7e1c22fc62818f3a863120000000000002251208397d49b90850e3da31ed72edeeb39fcb9c941d637754eb33827ee4abde06b96014083679ccce44cbcbd7465a0bfb6de1a26ef955cb115ce1368f01f2c8a7c6ff8e51b94affa6d3c65bac929eeabe5576542ddcbe0b6eed533caf24fd1699770f37b00000000 reveal tx hex -01000000000101849789e71349a162e7f39f157f28d6112d47c7d03aa0f2dc5428c6c6278793f10000000000fdffffff011027000000000000225120e02f25580deedbf208ee84f78c1e1f5a3d780520de51668233d183468e2d308d0340ec920064008a617b7de6c2825750322397f9211b5a2f0f09c75980b7323488e34aebcf8012be43634efc131f64c21adbead67476b79cf8094f31870e7d76f6954a202c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c12c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d000000000 +01000000000101824e0c9b7525d0c04037114a3faeb5b3d0306fd173ae467e5fda5531b802c51c0000000000fdffffff011027000000000000225120399105d32771342719a0dbf1d99345d80c8b87ecea8c01672fbce9e5b9a153e80340d2fd4e0d3b7316fd12786c7698be810a182a01f1ad18d6b4942efbf80ec5b0294cecf991294232bbfcbaf9e6d08ec3695ddb1564139d44e824238e7916ac669d4a206b7ac0f8123521249c460e9e43c417b94eeb9912485699ca3a59463ab4396424ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c06b7ac0f8123521249c460e9e43c417b94eeb9912485699ca3a59463ab439642400000000 ``` -2.4 Save the inscription id, commit and reveal transaction hex. -2.4 Put this wallet on hold until it is needed again +3.4 Put this wallet on hold until it is needed again. Restarting `bitcoind` is required. ``` mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-reveal-inscription + +killall bitcoind +bitcoind --daemon ``` -## 3. Creating the 300 inscriptions +## 4. Creating the 300 inscriptions > **Note** > Only 20 will be created on this example -3.1 Create a new ord wallet (restarting `bitcoind` is required) +4.1 Create a new ord wallet (restarting `bitcoind` is required) ``` -killall bitcoind -bitcoind --daemon - -ord wallet create +ord5 wallet create ``` ```json { - "mnemonic": "brass knife empty issue submit portion need razor lend undo despair pelican", - "address": "tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8", - "public_key": "0358bfbc7266e6e997dd7dee379b6be7e057a54d634dfcd51e9bdd112f0450f56a", + "mnemonic": "burst fiction thank assault own double skill lyrics blind country tribe moment", + "address": "tb1pmqwwx0kdhdekfyzwc33mfctcf6j9z4huvc2m6kru9stpws4veguqkq9j0s", + "public_key": "035d7a50961320da1cd59b75ee2ab8ce52f88d1f1ef65fec8be7dc958e1f502381", "passphrase": "" } ``` -3.2 Fund it with enough for one inscription (vary according to file size). -3.3 Get the file to be inscribed as the parent and inscribe it. -``` -ord wallet inscribe \ +4.2 Fund it with enough for the parent inscription (vary according to file size). +4.3 Get the file to be inscribed as the parent and inscribe it. +```sh +# use the address from ord9's wallet for destination (step 1.4) +ord5 wallet inscribe \ --fee-rate 1.0 \ ---destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 \ +--destination tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw \ parent.txt ``` ```json @@ -93,29 +145,29 @@ parent.txt "fees": 292 } ``` -3.4 Transfer `300 x 0.00015 = 0.045 BTC` to this wallet. +4.4 Transfer `300 x 0.00015 = 0.045 BTC` to this wallet. ```sh # Using a 20 x 0.00015 = 0.003 BTC UTXO in this example # txhash:vout 06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 ``` -3.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. +4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. ``` ord wallet split \ --fee-rate 1.0 \ --amount 14990 \ 06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 ``` -3.6 Generate the 300 files to be inscribed +4.6 Generate the 300 files to be inscribed ``` bash create-300.sh ``` -3.7 Transfer the important UTXO to this wallet. +4.7 Transfer the important UTXO to this wallet. ```sh # txhash:vout 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0 ``` -3.8 Identify the range where the important sats are in this output +4.8 Identify the range where the important sats are in this output ```sh # on this example, the output 967d...8de9:0 has 9500 sats and they are distributed as follows # [0 - 7499] 7500 normal sats @@ -126,7 +178,7 @@ Make sure that: * the UTXO has at least `550 sats` (dust limit) above the important sats * the range containing important sats has at least 300 sats -3.9 Inscribe the 300 files giving one important sat to each +4.9 Inscribe the 300 files giving one important sat to each ``` ord wallet inscribe-chain \ --fee-rate 1.5 \ @@ -180,16 +232,16 @@ ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949 ``` Important to note * `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain -* `--destination` must be the address given when the wallet was created on step `3.1` +* `--destination` must be the address given when the wallet was created on step `4.1` * `--satpoint` has to point to the last important sat position, `967d...8de9:0:7519`, because this command will consume all 300 sats above it, including it * Upon completion, the `inscribe-chain` will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" -3.10 Wait for the previous transaction chain to be mined -3.11 Run the next `inscribe-chain` command +4.10 Wait for the previous transaction chain to be mined +4.11 Run the next `inscribe-chain` command ``` ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ ``` -3.12 Loop through steps `3.10` and `3.11` until the folder `300-inscriptions` has no more files left to be inscribed. +4.12 Loop through steps `4.10` and `4.11` until the folder `300-inscriptions` has no more files left to be inscribed. ## 4. Reveal 4.1 Broadcast the commit transaction from step `2.3` From 8f23fa6148530da00f6f8da1a2d2d1be14fa1904 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Mon, 29 May 2023 12:54:02 -0300 Subject: [PATCH 13/40] complete 300 mint guide --- 300-mint.md | 142 +++++++++++++++++++++++++++------------------------- 1 file changed, 75 insertions(+), 67 deletions(-) diff --git a/300-mint.md b/300-mint.md index d34ce3923d..6527a14202 100644 --- a/300-mint.md +++ b/300-mint.md @@ -32,9 +32,9 @@ ord9 wallet create ``` ```json { - "mnemonic": "stadium three aspect awesome oyster ski bring wash call fan stage display", - "address": "tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw", - "public_key": "027f24948757f56793856ca16eb0b2e34644e8643dddd5fffda387515be0e3ad8a", + "mnemonic": "behind nest scare mistake ticket divorce stumble cage same tortoise clay search", + "address": "tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg", + "public_key": "023c95cb6df3cadd29fbcdba58ffc77a493bc6d3db94ab453185fa671b5424b752", "passphrase": "" } ``` @@ -72,9 +72,9 @@ ord5 wallet create ``` ```json { - "mnemonic": "butter tuition draft reopen cereal match soft average thumb comfort dilemma labor", - "address": "tb1psh7f8tvrrdd0re20ntnsayhd5g7pu2ckvx7clsh2f6tyvuyh8peq2stc40", - "public_key": "037335a3c64eed26736c5fb83321441742f7e6cb8d8f10a2b2eb0397027dd200f7", + "mnemonic": "innocent arrest blue admit rocket cabbage crack come leave hidden stumble problem", + "address": "tb1pv3x70rdfd76wdqdunafw53g7m8xs9y6mvfcg6fzvpx44ewh8vcgs8c98pq", + "public_key": "02184f648ce7542fc1c1a68fec523abfce225a362fcf01d30c527236e9abb5f8f6", "passphrase": "" } ``` @@ -84,26 +84,26 @@ ord5 wallet create echo "999" > reveal.txt ``` ```sh -# use the address from ord9's wallet for destination (step 1.4) +# for the destination use the address from ord9's wallet (step 1.4) ord5 wallet inscribe \ --fee-rate 1.0 \ ---destination tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw \ +--destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ --dry-run \ reveal.txt ``` ``` { - "commit": "1cc502b83155da5f7e46ae73d16f30d0b3b5ae3f4a113740c0d025759b0c4e82", - "inscription": "746fa2816f997527eab5007c622f402ae4a1634f1ef41e2744cf82ebe6e073c2i0", + "commit": "50a43b347b5402c03371e4141c538444dd46a819b7d7849cb76dc2204370b1ac", + "inscription": "7e4f534fdd58838bfebad3c518a66c76afb97259911a4c344ef23b136b409b44i0", "parent": null, - "reveal": "746fa2816f997527eab5007c622f402ae4a1634f1ef41e2744cf82ebe6e073c2", + "reveal": "7e4f534fdd58838bfebad3c518a66c76afb97259911a4c344ef23b136b409b44", "fees": 293 } commit tx hex -010000000001010acc93eb8f2bee57d3ef2257eb520115a8536f80f0beab8bacab24b7d97161920000000000fdffffff029b270000000000002251201b8d03f5db831a5a19e0b23cdc7a0505109ef39b57e220b7e1c22fc62818f3a863120000000000002251208397d49b90850e3da31ed72edeeb39fcb9c941d637754eb33827ee4abde06b96014083679ccce44cbcbd7465a0bfb6de1a26ef955cb115ce1368f01f2c8a7c6ff8e51b94affa6d3c65bac929eeabe5576542ddcbe0b6eed533caf24fd1699770f37b00000000 +0100000000010199f09cd21ae51899bc2034a55ad8a50f8cf3dc20bb0354f05641eeb1814de0c20100000000fdffffff029b2700000000000022512057045365b773be604cbabe52e21939c4527e2692cba495197327bc1fc688e3786312000000000000225120f4a9f9a1fffc0d7f11ca4f4bd371f1fd37c6a53f4d21768e03c9d156f7e9612b01402c458b78e72c3cce3ebba2941f6dd3592d1f9b29d47168665a2e0cebcea1570f6f33678cef80e1f307406b3f7dde333b700e433ecf68ab65111436328aabe65500000000 reveal tx hex -01000000000101824e0c9b7525d0c04037114a3faeb5b3d0306fd173ae467e5fda5531b802c51c0000000000fdffffff011027000000000000225120399105d32771342719a0dbf1d99345d80c8b87ecea8c01672fbce9e5b9a153e80340d2fd4e0d3b7316fd12786c7698be810a182a01f1ad18d6b4942efbf80ec5b0294cecf991294232bbfcbaf9e6d08ec3695ddb1564139d44e824238e7916ac669d4a206b7ac0f8123521249c460e9e43c417b94eeb9912485699ca3a59463ab4396424ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c06b7ac0f8123521249c460e9e43c417b94eeb9912485699ca3a59463ab439642400000000 +01000000000101acb1704320c26db79c84d7b719a846dd4484531c14e47133c002547b343ba4500000000000fdffffff01102700000000000022512053733dbbeb8decd9c9bddee252b43a6c7448f6914c3af6764749933d534fdea003404c8053708e073423854cbd07efad25b93b2cf4c2c9b7d3ef98a011d9164f3f2353c90cd9622998e5322820f64c24e8e2a17aac011d3b15da77a1e026087fbd294a20dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e77417ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c1dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e7741700000000 ``` 3.4 Put this wallet on hold until it is needed again. Restarting `bitcoind` is required. ``` @@ -122,105 +122,118 @@ ord5 wallet create ``` ```json { - "mnemonic": "burst fiction thank assault own double skill lyrics blind country tribe moment", - "address": "tb1pmqwwx0kdhdekfyzwc33mfctcf6j9z4huvc2m6kru9stpws4veguqkq9j0s", - "public_key": "035d7a50961320da1cd59b75ee2ab8ce52f88d1f1ef65fec8be7dc958e1f502381", + "mnemonic": "dress glare differ before excuse usage town quantum ladder movie cushion clip", + "address": "tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r", + "public_key": "031d6fa549dfdb0b48f6db233cfbbf79b711255f93b3e78c86b6373723f39d0c55", "passphrase": "" } ``` 4.2 Fund it with enough for the parent inscription (vary according to file size). 4.3 Get the file to be inscribed as the parent and inscribe it. ```sh -# use the address from ord9's wallet for destination (step 1.4) +# for the destination use the address from step 4.1 ord5 wallet inscribe \ --fee-rate 1.0 \ ---destination tb1p8xgst5e8wy6zwxdqm0cany69mqxghplva2xqzee0hn57twdp205qzg7trw \ +--destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ parent.txt ``` ```json { - "commit": "b7dfef2f97c626f75b1d02c9ca9f759dfc5419e245283c46cbd8befb4ec4d283", - "inscription": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", - "reveal": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948edd", - "fees": 292 + "commit": "5aff9fd0503346dc98e8f861e3fde6802faf567e8ca06c89a99bfb482a132278", + "inscription": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", + "parent": null, + "reveal": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829", + "fees": 293 } ``` 4.4 Transfer `300 x 0.00015 = 0.045 BTC` to this wallet. ```sh # Using a 20 x 0.00015 = 0.003 BTC UTXO in this example # txhash:vout -06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 +46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` -4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. -``` -ord wallet split \ +4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. Don't need to wait for the previous transaction to be mined, from step 4.4. +```sh +# for the destination use the address from step 4.1 +ord5 wallet split \ --fee-rate 1.0 \ --amount 14990 \ -06aac693f19f8d384764bfe090719d4b373ea11d536b2ef337fc3f6f1334e916:0 +--destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ +46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` 4.6 Generate the 300 files to be inscribed -``` +```sh +# for this example this file was updated to produce only 20 files bash create-300.sh ``` 4.7 Transfer the important UTXO to this wallet. ```sh # txhash:vout -967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0 +c1c9dbf3b86ea75a5a4fa80cf7aef14c2840bc92c254f11188e656198f35f892:0 ``` 4.8 Identify the range where the important sats are in this output ```sh -# on this example, the output 967d...8de9:0 has 9500 sats and they are distributed as follows +# on this example, the output c1c9...f892:0 has 95000 sats and they are distributed as follows # [0 - 7499] 7500 normal sats # [7500 - 7519] 20 important sats* -# [7520 - 9499] 1980 normal sats +# [7520 - 94999] 87480 normal sats ``` Make sure that: * the UTXO has at least `550 sats` (dust limit) above the important sats -* the range containing important sats has at least 300 sats +* the range containing important sats has at least `300 sats` -4.9 Inscribe the 300 files giving one important sat to each -``` -ord wallet inscribe-chain \ +4.9 Inscribe the 300 files giving one important sat to each +Important to note +* Wait for all the transactions to be mined before running this step. +* `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain +* `--parent` is the inscription id inscribed on step `4.3` +* `--destination` must be the address given when the ord9 wallet was created on step `4.1` +* `--satpoint` has to point to the last important sat position, `c1c9...f892:0:7519`, because this command will consume the important sats in a bottom-up direction +* Upon completion, the `inscribe-chain` command will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" +```sh +# for the destination use the address from ord9's wallet (step 1.4) +# it's important to use exactly the one from step 1.4, because we have the public key for that address. +ord5 wallet inscribe-chain \ --fee-rate 1.5 \ ---parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 \ ---destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 \ ---satpoint 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 \ +--parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 \ +--destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ +--satpoint c1c9dbf3b86ea75a5a4fa80cf7aef14c2840bc92c254f11188e656198f35f892:0:7519 \ 300-inscriptions/ ``` ``` -Inscribing 300-inscriptions/1.json at 967d433a2068f742b25e35e106c9d476d70632cb291c3b8b498adf699d938de9:0:7519 +Inscribing 300-inscriptions/1.json at c1c9dbf3b86ea75a5a4fa80cf7aef14c2840bc92c254f11188e656198f35f892:0:7519 { - "commit": "6382e2d71145caf02b21f7786554823ddadc2e1cddc596cd1ad081b03dd4bfaa", - "inscription": "aa928749abcbb93cff404a75ddede7fd46ca64aee6c1d2eb06c5d64b51908f2ei0", - "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", - "reveal": "aa928749abcbb93cff404a75ddede7fd46ca64aee6c1d2eb06c5d64b51908f2e", - "fees": 769 + "commit": "72cc2b074f19c37ca0f81e2ad9177abb8f918c42a2e8d6e16314ee8f69af8638", + "inscription": "d4f79e33497fcb263274916d9fef0b105107a588f7b823e29babda435cf4bf27i0", + "parent": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", + "reveal": "d4f79e33497fcb263274916d9fef0b105107a588f7b823e29babda435cf4bf27", + "fees": 682 } -Inscribing 300-inscriptions/2.json at 6382e2d71145caf02b21f7786554823ddadc2e1cddc596cd1ad081b03dd4bfaa:0:7518 +Inscribing 300-inscriptions/2.json at 72cc2b074f19c37ca0f81e2ad9177abb8f918c42a2e8d6e16314ee8f69af8638:0:7518 { - "commit": "2dc1e3dbf866774f601e1a5563197e0e379d304f30d633432145b8ce779739f9", - "inscription": "905c1f7c5a4e982d84a78a859bb9156163dbc010d6e5de67e7111d6f9a98cefai0", - "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", - "reveal": "905c1f7c5a4e982d84a78a859bb9156163dbc010d6e5de67e7111d6f9a98cefa", + "commit": "21d63c5491e5ea1a9598acb980d8fcf538ca4b7642ad8503ca8f9acea31f55a8", + "inscription": "5c0f07b2aa7bf17e8528d289034210a5b6fbee9d39b043d7b9632a5a9cc3064ai0", + "parent": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", + "reveal": "5c0f07b2aa7bf17e8528d289034210a5b6fbee9d39b043d7b9632a5a9cc3064a", "fees": 769 } -... [TRUNCATED] +... [TRUNCATED] -Inscribing 300-inscriptions/9.json at 843a1018b70363d360fcf51573c191d2ca1060a5fcbb4075f24d817f6f59a11e:0:7511 +Inscribing 300-inscriptions/9.json at cdaca6dd542e14a9ef29cc1d7567e07928fd5782342b92d1e47955a353d24b37:0:7511 { - "commit": "5d4bda0e9f137f1c4f9f077ed7b637552b506039e7bbc46fe02b424af5360f35", - "inscription": "da929a6715e0231c3643807ac65126b2aab033fa48e3069a90cb226fbf68e43ci0", - "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", - "reveal": "da929a6715e0231c3643807ac65126b2aab033fa48e3069a90cb226fbf68e43c", + "commit": "616f407f07c3ee2361f9cee0243219eae8dfb945b38e3dae1393c189624cb5f1", + "inscription": "66311ed501c4ace9628e9b183b10633fb62cdd518a41dcfdd299ce4feb6c3542i0", + "parent": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", + "reveal": "66311ed501c4ace9628e9b183b10633fb62cdd518a41dcfdd299ce4feb6c3542", "fees": 769 } -Inscribing 300-inscriptions/10.json at 5d4bda0e9f137f1c4f9f077ed7b637552b506039e7bbc46fe02b424af5360f35:0:7510 +Inscribing 300-inscriptions/10.json at 616f407f07c3ee2361f9cee0243219eae8dfb945b38e3dae1393c189624cb5f1:0:7510 { - "commit": "a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f", - "inscription": "f73c80bdd87e4df1eb6c41fe815515e656930ca67cdfa6a5e4ec07acb3de7c3di0", - "parent": "bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0", - "reveal": "f73c80bdd87e4df1eb6c41fe815515e656930ca67cdfa6a5e4ec07acb3de7c3d", + "commit": "0ba61faa20a556f6e22a23b3c43a002395049133ce2586bbc9a06ad9fc7221ff", + "inscription": "c49d89f52b7209b3a5fb3ab4d826c6b29a99972718ba677008460651e2ebcd38i0", + "parent": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", + "reveal": "c49d89f52b7209b3a5fb3ab4d826c6b29a99972718ba677008460651e2ebcd38", "fees": 770 } @@ -228,18 +241,13 @@ Success! 10 new inscriptions pending in the mempool. To continue inscribing, wait for the block to be mined and run: -ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ +ord wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg --satpoint 0ba61faa20a556f6e22a23b3c43a002395049133ce2586bbc9a06ad9fc7221ff:0:7509 300-inscriptions/ ``` -Important to note -* `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain -* `--destination` must be the address given when the wallet was created on step `4.1` -* `--satpoint` has to point to the last important sat position, `967d...8de9:0:7519`, because this command will consume all 300 sats above it, including it -* Upon completion, the `inscribe-chain` will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" 4.10 Wait for the previous transaction chain to be mined 4.11 Run the next `inscribe-chain` command ``` -ord wallet inscribe-chain --fee-rate 1.5 --parent bd89bcea3f82864df2c8bc66c94949c54ad13c13e939d37b8a1b168632948eddi0 --destination tb1phca60mcg0pg5c2fhtck384pqn86rt5ljsen635rrtqezpxa7pcws7dz3y8 --satpoint a2a627094403497b477dbeec56ab0cefe2a662f57762e485dd815da0da8ea69f:0:7509 300-inscriptions/ +ord5 wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg --satpoint 0ba61faa20a556f6e22a23b3c43a002395049133ce2586bbc9a06ad9fc7221ff:0:7509 300-inscriptions/ ``` 4.12 Loop through steps `4.10` and `4.11` until the folder `300-inscriptions` has no more files left to be inscribed. From 4300bd86ae3b09244b2fc4dfe9bc42391b983fb0 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Mon, 29 May 2023 13:44:54 -0300 Subject: [PATCH 14/40] fix step numbers --- 300-mint.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/300-mint.md b/300-mint.md index 6527a14202..ef3abf1ca9 100644 --- a/300-mint.md +++ b/300-mint.md @@ -41,7 +41,7 @@ ord9 wallet create ## 2. Environment setup: `ord5` Make sure to have `bitcoind` running and `rust` installed. -1.1 Building `ord` +2.1 Building `ord` ``` ssh @ @@ -51,13 +51,13 @@ git checkout inscribe-in-mempool cargo build --release ``` -1.2 Indexing +2.2 Indexing ``` alias ord5=./target/release/ord ord5 index ``` -1.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. +2.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. ``` mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-old @@ -152,7 +152,7 @@ parent.txt # txhash:vout 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` -4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. Don't need to wait for the previous transaction to be mined, from step 4.4. +4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. Don't need to wait for the previous transaction to be mined, from step `4.4`. ```sh # for the destination use the address from step 4.1 ord5 wallet split \ @@ -251,12 +251,12 @@ ord5 wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea148 ``` 4.12 Loop through steps `4.10` and `4.11` until the folder `300-inscriptions` has no more files left to be inscribed. -## 4. Reveal -4.1 Broadcast the commit transaction from step `2.3` +## 5. Reveal +5.1 Broadcast the commit transaction from step `3.3` ``` -bitcoin-cli sendrawtransaction 0100000000010190e04255f5059e62a12ba212be1e8ea3e7fcd7cf5474dc7f3ff3bd63bd41c3780000000000fdffffff029b27000000000000225120f137116e15b332bf2b65654c38875167c76b02b97449cbee6eea6785389692831b9b000000000000225120370f63d7d9540bd950f7f4c469e75bb19570173e28fb1e28b6263bff3a0ab8350140fc8067945e3476ce6477ff170d5ec37dbf50d5b13e8c62865fd58b684652da3e0a742839d9698ebf97131e462833939cfc0d5bc4f6697c159da4304b8fd9357600000000 +bitcoin-cli sendrawtransaction 0100000000010199f09cd21ae51899bc2034a55ad8a50f8cf3dc20bb0354f05641eeb1814de0c20100000000fdffffff029b2700000000000022512057045365b773be604cbabe52e21939c4527e2692cba495197327bc1fc688e3786312000000000000225120f4a9f9a1fffc0d7f11ca4f4bd371f1fd37c6a53f4d21768e03c9d156f7e9612b01402c458b78e72c3cce3ebba2941f6dd3592d1f9b29d47168665a2e0cebcea1570f6f33678cef80e1f307406b3f7dde333b700e433ecf68ab65111436328aabe65500000000 ``` -4.2 Broadcast the reveal transaction from step `2.3` +5.2 Broadcast the reveal transaction from step `3.3` ``` -bitcoin-cli sendrawtransaction 01000000000101849789e71349a162e7f39f157f28d6112d47c7d03aa0f2dc5428c6c6278793f10000000000fdffffff011027000000000000225120e02f25580deedbf208ee84f78c1e1f5a3d780520de51668233d183468e2d308d0340ec920064008a617b7de6c2825750322397f9211b5a2f0f09c75980b7323488e34aebcf8012be43634efc131f64c21adbead67476b79cf8094f31870e7d76f6954a202c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d0ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c12c7363b0319ce5ccad2fe028603ffba0373a91373eff7bb0a3f3cc842554b2d000000000 +bitcoin-cli sendrawtransaction 01000000000101acb1704320c26db79c84d7b719a846dd4484531c14e47133c002547b343ba4500000000000fdffffff01102700000000000022512053733dbbeb8decd9c9bddee252b43a6c7448f6914c3af6764749933d534fdea003404c8053708e073423854cbd07efad25b93b2cf4c2c9b7d3ef98a011d9164f3f2353c90cd9622998e5322820f64c24e8e2a17aac011d3b15da77a1e026087fbd294a20dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e77417ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c1dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e7741700000000 ``` From c340c2ef52f64253884a4216d0876311d1fa8619 Mon Sep 17 00:00:00 2001 From: Felipe Lincoln Date: Mon, 29 May 2023 21:47:47 -0300 Subject: [PATCH 15/40] use no backup --- src/subcommand/wallet/inscribe_chain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index 1d0de44056..bfaf33a2fe 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -64,7 +64,7 @@ impl InscribeChain { commit_fee_rate: self.commit_fee_rate, destination: self.destination.clone(), file: file_path.clone(), - no_backup: self.no_backup, + no_backup: true, no_limit: self.no_limit, satpoint: Some(satpoint), parent: self.parent.clone(), From 71c39d3e8abb4bb68da2bb7dd72af7485465c77d Mon Sep 17 00:00:00 2001 From: ericatallah Date: Wed, 31 May 2023 13:53:18 -0700 Subject: [PATCH 16/40] update 300-mint markdown --- 300-mint.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/300-mint.md b/300-mint.md index ef3abf1ca9..28028a908b 100644 --- a/300-mint.md +++ b/300-mint.md @@ -117,6 +117,9 @@ bitcoind --daemon > Only 20 will be created on this example 4.1 Create a new ord wallet (restarting `bitcoind` is required) +********************************** +for Dimensions mint, we will be importing the wallet holding the dimensions parent inscription +********************************** ``` ord5 wallet create ``` @@ -146,18 +149,18 @@ parent.txt "fees": 293 } ``` -4.4 Transfer `300 x 0.00015 = 0.045 BTC` to this wallet. +4.4 Transfer `300 x 0.0002 = 0.065 BTC` (includes .005 extra to be safe) to this wallet. ```sh -# Using a 20 x 0.00015 = 0.003 BTC UTXO in this example +# Using a 20 x 0.0002 = 0.0045 BTC UTXO in this example # txhash:vout 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` -4.5 Split the `0.045 BTC` UTXO into 300 UTXOs of `0.00014990 BTC`. Don't need to wait for the previous transaction to be mined, from step `4.4`. +4.5 Split the `0.065 BTC` UTXO into 300 UTXOs of `0.00020000 BTC`. Don't need to wait for the previous transaction to be mined, from step `4.4`. ```sh # for the destination use the address from step 4.1 ord5 wallet split \ --fee-rate 1.0 \ ---amount 14990 \ +--amount 20000 \ --destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` From 03a036e4f8af95407fe4ac55426436182da17b75 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Wed, 31 May 2023 13:54:13 -0700 Subject: [PATCH 17/40] add inscription_satpoint logging --- src/index/updater.rs | 15 ++++++++-- src/index/updater/inscription_updater.rs | 38 +++++++++++++++++++++++- src/lib.rs | 19 ++++++++++-- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/index/updater.rs b/src/index/updater.rs index 89906bf049..a474197ac6 100644 --- a/src/index/updater.rs +++ b/src/index/updater.rs @@ -116,10 +116,21 @@ impl<'a> Updater<'a> { &mut outpoint_sender, &mut value_receiver, &mut wtx, - block, + &block, &mut value_cache, )?; + if self.height.checked_sub(1).is_some() { + log::info!( + target: "new_inscription_satpoint", + "{{\"height\":{},\"block_hash\":\"{}\",\"prev_block_hash\":\"{}\",\"tx_count\":{}}}", + &self.height - 1, + &block.header.block_hash(), + &block.header.prev_blockhash, + &block.txdata.len(), + ); + } + if let Some(progress_bar) = &mut progress_bar { progress_bar.inc(1); @@ -336,7 +347,7 @@ impl<'a> Updater<'a> { outpoint_sender: &mut Sender, value_receiver: &mut Receiver, wtx: &mut WriteTransaction, - block: BlockData, + block: &BlockData, value_cache: &mut HashMap, ) -> Result<()> { // If value_receiver still has values something went wrong with the last block diff --git a/src/index/updater/inscription_updater.rs b/src/index/updater/inscription_updater.rs index d33535f707..2d44d9450e 100644 --- a/src/index/updater/inscription_updater.rs +++ b/src/index/updater/inscription_updater.rs @@ -1,10 +1,11 @@ use {super::*, std::collections::BTreeSet}; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Debug)] pub(super) struct Flotsam { inscription_id: InscriptionId, offset: u64, origin: Origin, + tx: Option, } // change name to Jetsam or more poetic german word @@ -97,6 +98,7 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { offset: input_value + old_satpoint.offset, inscription_id, origin: Origin::Old(old_satpoint), + tx: None, }); inscribed_offsets.insert(input_value + old_satpoint.offset); @@ -139,6 +141,7 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { inscription_id, offset: input_value, origin: Origin::New((0, parent)), + tx: Some(tx.clone()), }); } } @@ -170,12 +173,14 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { inscription_id, offset, origin: Origin::New((_, parent)), + tx, } = flotsam { Flotsam { inscription_id, offset, origin: Origin::New((input_value - total_output_value, parent)), + tx, } } else { flotsam @@ -316,6 +321,37 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { self.satpoint_to_id.insert(&new_satpoint, &inscription_id)?; self.id_to_satpoint.insert(&inscription_id, &new_satpoint)?; + let inscription_id = InscriptionId::load(inscription_id); + let satpoint = SatPoint::load(new_satpoint); + let inscription_entry = self.id_to_entry.get(&inscription_id.store())?.unwrap(); + let inscription_number = InscriptionEntry::load(inscription_entry.value()).number; + + if let Some(tx) = flotsam.tx { + let inscription = Inscription::from_transaction(&tx).unwrap(); + let content_type = inscription.content_type().unwrap_or(""); + let content_len = inscription.body().map_or(0, |body| body.len()); + + log::info!( + target: "new_inscription_satpoint", + "{},{},{},{},{},{}", + self.height, + satpoint, + inscription_id, + inscription_number, + content_type, + content_len, + ); + } else { + log::info!( + target: "new_inscription_satpoint", + "{},{},{},{}", + self.height, + satpoint, + inscription_id, + inscription_number, + ); + } + Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index ca7229fe56..37ce5f10c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,8 +54,8 @@ use { env, ffi::OsString, fmt::{self, Display, Formatter}, - fs::{self, File}, - io, + fs::{self, File, OpenOptions}, + io::{self, Write}, net::{TcpListener, ToSocketAddrs}, ops::{Add, AddAssign, Sub}, path::{Path, PathBuf}, @@ -144,7 +144,20 @@ fn timestamp(seconds: u32) -> DateTime { const INTERRUPT_LIMIT: u64 = 5; pub fn main() { - env_logger::init(); + let inscription_satpoint_logs_file = OpenOptions::new() + .write(true) + .append(true) + .create(true) + .open("inscription_satpoint.txt") + .unwrap(); + + env_logger::builder() + .filter(Some("new_inscription_satpoint"), log::LevelFilter::Info) + .target(env_logger::Target::Pipe(Box::new( + inscription_satpoint_logs_file, + ))) + .format(|buf, record| writeln!(buf, "{}", record.args())) + .init(); ctrlc::set_handler(move || { LISTENERS From 8e0796584cf68e10108e93228d49fa945f562bf3 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Thu, 1 Jun 2023 11:41:50 -0700 Subject: [PATCH 18/40] add self csp --- src/subcommand/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs index 9330eebfeb..110ed23033 100644 --- a/src/subcommand/server.rs +++ b/src/subcommand/server.rs @@ -839,7 +839,7 @@ impl Server { ); headers.insert( header::CONTENT_SECURITY_POLICY, - HeaderValue::from_static("default-src 'unsafe-eval' 'unsafe-inline' data:"), + HeaderValue::from_static("default-src 'self' 'unsafe-eval' 'unsafe-inline' data:"), ); headers.insert( header::CACHE_CONTROL, @@ -2299,7 +2299,7 @@ mod tests { server.assert_response_csp( format!("/preview/{}", InscriptionId::from(txid)), StatusCode::OK, - "default-src 'unsafe-eval' 'unsafe-inline' data:", + "default-src 'self' 'unsafe-eval' 'unsafe-inline' data:", "hello", ); } From e1d59eede9737c995639bcdd50815f05ef6af4d1 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Thu, 1 Jun 2023 13:08:17 -0700 Subject: [PATCH 19/40] add offset tx validation step --- 300-mint.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/300-mint.md b/300-mint.md index 28028a908b..a9ff5212b8 100644 --- a/300-mint.md +++ b/300-mint.md @@ -105,7 +105,14 @@ commit tx hex reveal tx hex 01000000000101acb1704320c26db79c84d7b719a846dd4484531c14e47133c002547b343ba4500000000000fdffffff01102700000000000022512053733dbbeb8decd9c9bddee252b43a6c7448f6914c3af6764749933d534fdea003404c8053708e073423854cbd07efad25b93b2cf4c2c9b7d3ef98a011d9164f3f2353c90cd9622998e5322820f64c24e8e2a17aac011d3b15da77a1e026087fbd294a20dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e77417ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c1dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e7741700000000 ``` -3.4 Put this wallet on hold until it is needed again. Restarting `bitcoind` is required. +3.4 Test both commit and reveal tx hex to ensure they are valid and can be decoded. The below commands should print out the JSON tx code. +``` +bitcoin-cli decoderawtransaction 0100000000010199f09cd21ae51899bc2034a55ad8a50f8cf3dc20bb0354f05641eeb1814de0c20100000000fdffffff029b2700000000000022512057045365b773be604cbabe52e21939c4527e2692cba495197327bc1fc688e3786312000000000000225120f4a9f9a1fffc0d7f11ca4f4bd371f1fd37c6a53f4d21768e03c9d156f7e9612b01402c458b78e72c3cce3ebba2941f6dd3592d1f9b29d47168665a2e0cebcea1570f6f33678cef80e1f307406b3f7dde333b700e433ecf68ab65111436328aabe65500000000 + +bitcoin-cli decoderawtransaction +01000000000101acb1704320c26db79c84d7b719a846dd4484531c14e47133c002547b343ba4500000000000fdffffff01102700000000000022512053733dbbeb8decd9c9bddee252b43a6c7448f6914c3af6764749933d534fdea003404c8053708e073423854cbd07efad25b93b2cf4c2c9b7d3ef98a011d9164f3f2353c90cd9622998e5322820f64c24e8e2a17aac011d3b15da77a1e026087fbd294a20dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e77417ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c1dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e7741700000000 +``` +3.5 Put this wallet on hold until it is needed again. Restarting `bitcoind` is required. ``` mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-reveal-inscription From 06e3b0a0a5b317d9494f204817127317b7de89dc Mon Sep 17 00:00:00 2001 From: ericatallah Date: Fri, 2 Jun 2023 15:48:34 -0700 Subject: [PATCH 20/40] add is_brc_20 flag to logfile, update 300-mint.md --- 300-mint.md | 2 + src/index/updater.rs | 1 + src/index/updater/inscription_updater.rs | 89 ++++++++++++++++++------ 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/300-mint.md b/300-mint.md index a9ff5212b8..6ba2ccd9e7 100644 --- a/300-mint.md +++ b/300-mint.md @@ -107,6 +107,8 @@ reveal tx hex ``` 3.4 Test both commit and reveal tx hex to ensure they are valid and can be decoded. The below commands should print out the JSON tx code. ``` +bitcoin-cli testmempoolaccept '["commit_hex", "reveal_hex"]' + bitcoin-cli decoderawtransaction 0100000000010199f09cd21ae51899bc2034a55ad8a50f8cf3dc20bb0354f05641eeb1814de0c20100000000fdffffff029b2700000000000022512057045365b773be604cbabe52e21939c4527e2692cba495197327bc1fc688e3786312000000000000225120f4a9f9a1fffc0d7f11ca4f4bd371f1fd37c6a53f4d21768e03c9d156f7e9612b01402c458b78e72c3cce3ebba2941f6dd3592d1f9b29d47168665a2e0cebcea1570f6f33678cef80e1f307406b3f7dde333b700e433ecf68ab65111436328aabe65500000000 bitcoin-cli decoderawtransaction diff --git a/src/index/updater.rs b/src/index/updater.rs index a474197ac6..12b819f14d 100644 --- a/src/index/updater.rs +++ b/src/index/updater.rs @@ -445,6 +445,7 @@ impl<'a> Updater<'a> { block.header.time, value_cache, self.cached_children_by_id, + // &index.client, )?; if self.index_sats { diff --git a/src/index/updater/inscription_updater.rs b/src/index/updater/inscription_updater.rs index 2d44d9450e..b1f9673aa5 100644 --- a/src/index/updater/inscription_updater.rs +++ b/src/index/updater/inscription_updater.rs @@ -1,3 +1,4 @@ +use serde_json::Value; use {super::*, std::collections::BTreeSet}; #[derive(Clone, Debug)] @@ -31,6 +32,7 @@ pub(super) struct InscriptionUpdater<'a, 'db, 'tx> { timestamp: u32, value_cache: &'a mut HashMap, cached_children_by_id: &'a Mutex>>, + // client: &'a Client, } impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { @@ -47,6 +49,7 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { timestamp: u32, value_cache: &'a mut HashMap, cached_children_by_id: &'a Mutex>>, + // client: &'a Client, ) -> Result { let next_number = number_to_id .iter()? @@ -71,6 +74,7 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { timestamp, value_cache, cached_children_by_id, + // client, }) } @@ -328,28 +332,39 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { if let Some(tx) = flotsam.tx { let inscription = Inscription::from_transaction(&tx).unwrap(); - let content_type = inscription.content_type().unwrap_or(""); - let content_len = inscription.body().map_or(0, |body| body.len()); - - log::info!( - target: "new_inscription_satpoint", - "{},{},{},{},{},{}", - self.height, - satpoint, - inscription_id, - inscription_number, - content_type, - content_len, - ); + let is_brc_20 = Self::is_brc_20(&self, &inscription); + + // if !Self::is_brc_20(&self, &inscription) { + let content_type = inscription.content_type().unwrap_or(""); + let content_len = inscription.body().map_or(0, |body| body.len()); + + log::info!( + target: "new_inscription_satpoint", + "{},{},{},{},{},{},{}", + self.height, + satpoint, + inscription_id, + inscription_number, + content_type, + content_len, + is_brc_20, + ); + // } } else { - log::info!( - target: "new_inscription_satpoint", - "{},{},{},{}", - self.height, - satpoint, - inscription_id, - inscription_number, - ); + // let inscription = self + // .get_transaction(inscription_id.txid)? + // .and_then(|tx| Inscription::from_transaction(&tx)).unwrap(); + + // if !Self::is_brc_20(&self, &inscription) { + log::info!( + target: "new_inscription_satpoint", + "{},{},{},{}", + self.height, + satpoint, + inscription_id, + inscription_number, + ); + // } } Ok(()) @@ -363,4 +378,36 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> { children.push(inscription_id); } } + + fn valid_json(data: Option<&[u8]>) -> bool { + match data { + Some(bytes) => serde_json::from_slice::(bytes).is_ok(), + None => false, + } + } + + // fn get_transaction(&self, txid: Txid) -> Result> { + // self.client.get_raw_transaction(&txid, None).into_option() + // } + + fn is_brc_20(&self, inscription: &Inscription) -> bool { + let valid_json = Self::valid_json(inscription.body()); + if valid_json { + let json_result: Result = + serde_json::from_slice(&inscription.body().unwrap()); + let json: Value = json_result.unwrap(); + let empty_json = serde_json::Map::new(); + let json_obj = json.as_object().unwrap_or(&empty_json); + if json_obj.contains_key("p") { + let p = json_obj.get("p").unwrap(); + if p.is_string() { + let p_str = p.as_str().unwrap(); + if p_str.to_lowercase() == "brc-20" { + return true; + } + } + } + } + false + } } From 33c74002b0cb571ceaa26e2fcc41f4cdcb36f0de Mon Sep 17 00:00:00 2001 From: ericatallah Date: Mon, 5 Jun 2023 11:53:58 -0700 Subject: [PATCH 21/40] update 300 mint md --- 300-mint.md | 76 ++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 42 deletions(-) diff --git a/300-mint.md b/300-mint.md index 6ba2ccd9e7..0cc5ea6408 100644 --- a/300-mint.md +++ b/300-mint.md @@ -1,21 +1,22 @@ # 300 mint -## 1. Environment setup: `ord9` +## 1. Environment setup: `ord14` Make sure to have `bitcoind` running and `rust` installed. 1.1 Building `ord` ``` -ssh @ +ssh @ git clone git@github.com:metagood/ord.git -git checkout ord-pc-logfile-052 +git checkout ord-logfile-060 cargo build --release ``` -1.2 Indexing +1.2 Copy binary to ~/bin/ and start indexing (or download full index and log file from S3 bucket if exists) ``` -alias ord9=./target/release/ord -ord9 index +cp -a ~/ord/target/release/ord ~/bin/ +cd ~/bin/ +ord index ``` 1.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. @@ -26,9 +27,9 @@ killall bitcoind bitcoind --daemon ``` -1.4 Create a new wallet to receive the 300 inscriptions +1.4 Create a new wallet to receive the 300 inscriptions **IMPORTANT**: this wallet's public key will need to be set as the taproot pub key env var in `ord-marketplace/packages/om-server/.env` ``` -ord9 wallet create +ord wallet create ``` ```json { @@ -39,6 +40,11 @@ ord9 wallet create } ``` +1.5 Set public key in `ord-marketplace/packages/om-server/.env` +``` + +``` + ## 2. Environment setup: `ord5` Make sure to have `bitcoind` running and `rust` installed. 2.1 Building `ord` @@ -51,10 +57,11 @@ git checkout inscribe-in-mempool cargo build --release ``` -2.2 Indexing +2.2 Copy binary to ~/bin/ and start indexing (or download full index and log file from S3 bucket if exists) ``` -alias ord5=./target/release/ord -ord5 index +cp -a ~/ord/target/release/ord ~/bin/ +cd ~/bin/ +ord index ``` 2.3 Move (or delete) any pre-existing ord wallet. Restarting `bitcoind` is required. @@ -65,10 +72,10 @@ killall bitcoind bitcoind --daemon ``` -## 3. Creating the reveal inscription +## 3. Creating the reveal inscription (`ord5`) 3.1 Create an ord wallet ``` -ord5 wallet create +ord5 wallet create | tee reveal-offset-wallet.txt ``` ```json { @@ -78,7 +85,7 @@ ord5 wallet create "passphrase": "" } ``` -3.2 Fund it with just enough for one inscription (`0.00015 BTC`). +3.2 Fund it with just enough for one inscription and high fee rate (`0.005 BTC`). 3.3 Create the reveal txt file and inscribe it using `--dry-run` to not broadcast it. ``` echo "999" > reveal.txt @@ -86,10 +93,10 @@ echo "999" > reveal.txt ```sh # for the destination use the address from ord9's wallet (step 1.4) ord5 wallet inscribe \ ---fee-rate 1.0 \ +--fee-rate 100.0 \ --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ --dry-run \ -reveal.txt +reveal.txt | tee offset-tx-hex ``` ``` { @@ -109,10 +116,9 @@ reveal tx hex ``` bitcoin-cli testmempoolaccept '["commit_hex", "reveal_hex"]' -bitcoin-cli decoderawtransaction 0100000000010199f09cd21ae51899bc2034a55ad8a50f8cf3dc20bb0354f05641eeb1814de0c20100000000fdffffff029b2700000000000022512057045365b773be604cbabe52e21939c4527e2692cba495197327bc1fc688e3786312000000000000225120f4a9f9a1fffc0d7f11ca4f4bd371f1fd37c6a53f4d21768e03c9d156f7e9612b01402c458b78e72c3cce3ebba2941f6dd3592d1f9b29d47168665a2e0cebcea1570f6f33678cef80e1f307406b3f7dde333b700e433ecf68ab65111436328aabe65500000000 +bitcoin-cli decoderawtransaction -bitcoin-cli decoderawtransaction -01000000000101acb1704320c26db79c84d7b719a846dd4484531c14e47133c002547b343ba4500000000000fdffffff01102700000000000022512053733dbbeb8decd9c9bddee252b43a6c7448f6914c3af6764749933d534fdea003404c8053708e073423854cbd07efad25b93b2cf4c2c9b7d3ef98a011d9164f3f2353c90cd9622998e5322820f64c24e8e2a17aac011d3b15da77a1e026087fbd294a20dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e77417ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d3800043939390a6821c1dfc54602ac25b8863da0a938ad7143adc7809556486faf850955c5f840e7741700000000 +bitcoin-cli decoderawtransaction ``` 3.5 Put this wallet on hold until it is needed again. Restarting `bitcoind` is required. ``` @@ -126,11 +132,8 @@ bitcoind --daemon > Only 20 will be created on this example 4.1 Create a new ord wallet (restarting `bitcoind` is required) -********************************** -for Dimensions mint, we will be importing the wallet holding the dimensions parent inscription -********************************** ``` -ord5 wallet create +ord5 wallet create | tee wallet-holding-parent-dimensions.txt ``` ```json { @@ -140,27 +143,16 @@ ord5 wallet create "passphrase": "" } ``` -4.2 Fund it with enough for the parent inscription (vary according to file size). -4.3 Get the file to be inscribed as the parent and inscribe it. +4.2 Danny login to machine with wallet holding parent dimensions inscription +4.3 Danny send parent inscription to wallet created in 4.1 ```sh # for the destination use the address from step 4.1 -ord5 wallet inscribe \ ---fee-rate 1.0 \ ---destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ -parent.txt +ord wallet send --fee-rate 100.0 tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r 2dbdf9ebbec6be793fd16ae9b797c7cf968ab2427166aaf390b90b71778266abi0 ``` -```json -{ - "commit": "5aff9fd0503346dc98e8f861e3fde6802faf567e8ca06c89a99bfb482a132278", - "inscription": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0", - "parent": null, - "reveal": "db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829", - "fees": 293 -} -``` -4.4 Transfer `300 x 0.0002 = 0.065 BTC` (includes .005 extra to be safe) to this wallet. +4.4 Transfer `300 x 0.0002 = 0.065 BTC` (includes .005 extra to be safe) to the wallet created in 4.1, then find the outpoint to this utxo. ```sh -# Using a 20 x 0.0002 = 0.0045 BTC UTXO in this example +ord5 wallet outputs + # txhash:vout 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 ``` @@ -168,7 +160,7 @@ parent.txt ```sh # for the destination use the address from step 4.1 ord5 wallet split \ ---fee-rate 1.0 \ +--fee-rate 100.0 \ --amount 20000 \ --destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 @@ -178,7 +170,7 @@ ord5 wallet split \ # for this example this file was updated to produce only 20 files bash create-300.sh ``` -4.7 Transfer the important UTXO to this wallet. +4.7 Danny transfer the important UTXO to this wallet. ```sh # txhash:vout c1c9dbf3b86ea75a5a4fa80cf7aef14c2840bc92c254f11188e656198f35f892:0 From ade3ac0941e36ffea68b0fe9b0121cc0fb0b09e0 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Mon, 5 Jun 2023 14:13:52 -0700 Subject: [PATCH 22/40] fix create-300 and add create-30 shell scripts --- 300-mint.md | 12 ++++++------ create-30-testnet.sh | 26 ++++++++++++++++++++++++++ create-300.sh | 19 ++++++++++++++----- 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100755 create-30-testnet.sh mode change 100644 => 100755 create-300.sh diff --git a/300-mint.md b/300-mint.md index 0cc5ea6408..8a262d53b1 100644 --- a/300-mint.md +++ b/300-mint.md @@ -29,7 +29,7 @@ bitcoind --daemon 1.4 Create a new wallet to receive the 300 inscriptions **IMPORTANT**: this wallet's public key will need to be set as the taproot pub key env var in `ord-marketplace/packages/om-server/.env` ``` -ord wallet create +ord wallet create | tee wallet-holding-300-inscriptions.txt ``` ```json { @@ -42,14 +42,14 @@ ord wallet create 1.5 Set public key in `ord-marketplace/packages/om-server/.env` ``` - +PROJECT_OWNER_TAPROOT_PUB_KEY=023c95cb6df3cadd29fbcdba58ffc77a493bc6d3db94ab453185fa671b5424b752 ``` -## 2. Environment setup: `ord5` +## 2. Environment setup: `ord9` Make sure to have `bitcoind` running and `rust` installed. 2.1 Building `ord` ``` -ssh @ +ssh @ git clone git@github.com:metagood/ord.git git checkout inscribe-in-mempool @@ -72,7 +72,7 @@ killall bitcoind bitcoind --daemon ``` -## 3. Creating the reveal inscription (`ord5`) +## 3. Creating the reveal inscription (`ord9`) 3.1 Create an ord wallet ``` ord5 wallet create | tee reveal-offset-wallet.txt @@ -91,7 +91,7 @@ ord5 wallet create | tee reveal-offset-wallet.txt echo "999" > reveal.txt ``` ```sh -# for the destination use the address from ord9's wallet (step 1.4) +# for the destination use the address from ord14's wallet-holding-300-inscriptions (step 1.4) ord5 wallet inscribe \ --fee-rate 100.0 \ --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ diff --git a/create-30-testnet.sh b/create-30-testnet.sh new file mode 100755 index 0000000000..0702c6fee2 --- /dev/null +++ b/create-30-testnet.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +mkdir -p 30-inscriptions-testnet + +parentInscriptionId="3995befab6b08427416bf9442d6877f6057780f31cdca37eb600a12bcf5e9345i0" +offsetInscriptionId="f4429c67523c9437f3db69fe0521f10dec4ae2b3bb64e98a1fd97c53c59803cai0" + +for ((i=1; i<=30; i++)); do + filename="${i}.html" + filepath="30-inscriptions-testnet/${filename}" + tokenID=$i + + echo ' +' > "$filepath" + +done + +echo "Test files created!" diff --git a/create-300.sh b/create-300.sh old mode 100644 new mode 100755 index ffad3984f6..fcad55480b --- a/create-300.sh +++ b/create-300.sh @@ -2,15 +2,24 @@ mkdir -p 300-inscriptions +parentInscriptionId="2dbdf9ebbec6be793fd16ae9b797c7cf968ab2427166aaf390b90b71778266abi0" +offsetInscriptionId="90e7d9261f3812eb02519de31fddc43ba33b0308c143f893bc79fa6d6dcaa8bfi0" + for ((i=1; i<=300; i++)); do - filename="${i}.json" + filename="${i}.html" filepath="300-inscriptions/${filename}" tokenID=$i - echo '{ - "use_p": 1, - "params": ["tokenID='$tokenID'"] -}' > "$filepath" + echo ' +' > "$filepath" done From 092d720af8eb81653cddc0c2893a99830e6987f9 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Tue, 6 Jun 2023 09:47:06 -0700 Subject: [PATCH 23/40] update 300 mint md --- 300-mint.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/300-mint.md b/300-mint.md index 8a262d53b1..5e616b80d2 100644 --- a/300-mint.md +++ b/300-mint.md @@ -45,11 +45,11 @@ ord wallet create | tee wallet-holding-300-inscriptions.txt PROJECT_OWNER_TAPROOT_PUB_KEY=023c95cb6df3cadd29fbcdba58ffc77a493bc6d3db94ab453185fa671b5424b752 ``` -## 2. Environment setup: `ord9` +## 2. Environment setup: `ord12` Make sure to have `bitcoind` running and `rust` installed. 2.1 Building `ord` ``` -ssh @ +ssh @ git clone git@github.com:metagood/ord.git git checkout inscribe-in-mempool @@ -72,10 +72,10 @@ killall bitcoind bitcoind --daemon ``` -## 3. Creating the reveal inscription (`ord9`) +## 3. Creating the reveal inscription (`ord12`) 3.1 Create an ord wallet ``` -ord5 wallet create | tee reveal-offset-wallet.txt +ord12 wallet create | tee reveal-offset-wallet.txt ``` ```json { @@ -92,7 +92,7 @@ echo "999" > reveal.txt ``` ```sh # for the destination use the address from ord14's wallet-holding-300-inscriptions (step 1.4) -ord5 wallet inscribe \ +ord12 wallet inscribe \ --fee-rate 100.0 \ --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ --dry-run \ @@ -127,13 +127,13 @@ mv ~/.bitcoin/wallets/ord ~/.bitcoin/wallets/ord-reveal-inscription killall bitcoind bitcoind --daemon ``` -## 4. Creating the 300 inscriptions +## 4. Creating the 300 inscriptions (ord12) > **Note** > Only 20 will be created on this example 4.1 Create a new ord wallet (restarting `bitcoind` is required) ``` -ord5 wallet create | tee wallet-holding-parent-dimensions.txt +ord12 wallet create | tee wallet-holding-parent-dimensions.txt ``` ```json { @@ -151,7 +151,7 @@ ord wallet send --fee-rate 100.0 tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t ``` 4.4 Transfer `300 x 0.0002 = 0.065 BTC` (includes .005 extra to be safe) to the wallet created in 4.1, then find the outpoint to this utxo. ```sh -ord5 wallet outputs +ord12 wallet outputs # txhash:vout 46b289bd46c53a2ef6bc96bea18c6ef277d8037cb5a967f00ecb74ad21ee2ca9:1 @@ -159,7 +159,7 @@ ord5 wallet outputs 4.5 Split the `0.065 BTC` UTXO into 300 UTXOs of `0.00020000 BTC`. Don't need to wait for the previous transaction to be mined, from step `4.4`. ```sh # for the destination use the address from step 4.1 -ord5 wallet split \ +ord12 wallet split \ --fee-rate 100.0 \ --amount 20000 \ --destination tb1pysn0zy62526txvyvn4384psk2g6wv6f36dm7mw7vc7t996d0xkvqmcuj0r \ @@ -191,13 +191,13 @@ Important to note * Wait for all the transactions to be mined before running this step. * `--fee-rate` is set to `1.5` instead of `1.0` to avoid the possibility of getting "min relay fee not met" error in the middle of the transactions chain * `--parent` is the inscription id inscribed on step `4.3` -* `--destination` must be the address given when the ord9 wallet was created on step `4.1` +* `--destination` must be the address given when the ord12 wallet was created on step `4.1` * `--satpoint` has to point to the last important sat position, `c1c9...f892:0:7519`, because this command will consume the important sats in a bottom-up direction * Upon completion, the `inscribe-chain` command will give the next command to be run. It's highly important to wait for the current transaction chain to be mined before running this new command, otherwise the next chain will be broken in the middle with the error "transaction chain size limit exceeded" ```sh -# for the destination use the address from ord9's wallet (step 1.4) +# for the destination use the address from ord12's wallet (step 1.4) # it's important to use exactly the one from step 1.4, because we have the public key for that address. -ord5 wallet inscribe-chain \ +ord12 wallet inscribe-chain \ --fee-rate 1.5 \ --parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 \ --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg \ @@ -251,7 +251,7 @@ ord wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea1482 4.10 Wait for the previous transaction chain to be mined 4.11 Run the next `inscribe-chain` command ``` -ord5 wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg --satpoint 0ba61faa20a556f6e22a23b3c43a002395049133ce2586bbc9a06ad9fc7221ff:0:7509 300-inscriptions/ +ord12 wallet inscribe-chain --fee-rate 1.5 --parent db3b817f1676b7b00f6ed90dea14821b60ffc4f995af156b8b2c0f8ed5bdb829i0 --destination tb1p2denmwlt3hkdnjdamm399dp6d36y3a53fsa0vaj8fxfn6560m6sq8m0glg --satpoint 0ba61faa20a556f6e22a23b3c43a002395049133ce2586bbc9a06ad9fc7221ff:0:7509 300-inscriptions/ ``` 4.12 Loop through steps `4.10` and `4.11` until the folder `300-inscriptions` has no more files left to be inscribed. From e9f106599a951dc0ab7b56e615f18f2ae36d16f8 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Thu, 8 Jun 2023 19:19:09 -0700 Subject: [PATCH 24/40] fix inscription creation scripts --- create-30-testnet.sh | 17 ++++++++--------- create-300.sh | 7 +++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/create-30-testnet.sh b/create-30-testnet.sh index 0702c6fee2..f864ed40de 100755 --- a/create-30-testnet.sh +++ b/create-30-testnet.sh @@ -1,21 +1,20 @@ #!/bin/bash -mkdir -p 30-inscriptions-testnet +mkdir -p 50-inscriptions-testnet parentInscriptionId="3995befab6b08427416bf9442d6877f6057780f31cdca37eb600a12bcf5e9345i0" offsetInscriptionId="f4429c67523c9437f3db69fe0521f10dec4ae2b3bb64e98a1fd97c53c59803cai0" -for ((i=1; i<=30; i++)); do +for ((i=1; i<=50; i++)); do filename="${i}.html" - filepath="30-inscriptions-testnet/${filename}" + filepath="50-inscriptions-testnet/${filename}" tokenID=$i - echo ' -' > "$filepath" done -echo "Test files created!" +echo "Test files created!" \ No newline at end of file diff --git a/create-300.sh b/create-300.sh index fcad55480b..8d6f785372 100755 --- a/create-300.sh +++ b/create-300.sh @@ -3,16 +3,15 @@ mkdir -p 300-inscriptions parentInscriptionId="2dbdf9ebbec6be793fd16ae9b797c7cf968ab2427166aaf390b90b71778266abi0" -offsetInscriptionId="90e7d9261f3812eb02519de31fddc43ba33b0308c143f893bc79fa6d6dcaa8bfi0" +offsetInscriptionId="" for ((i=1; i<=300; i++)); do filename="${i}.html" filepath="300-inscriptions/${filename}" tokenID=$i - echo ' -' > "$filepath" + +done + +echo "Test files created!" diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index 371531eb88..521af47d14 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -19,6 +19,7 @@ pub mod cardinals; pub mod create; pub(crate) mod inscribe; pub mod inscribe_chain; +pub mod inscribe_chain_destination_addresses; pub mod inscriptions; pub mod outputs; pub mod receive; @@ -56,6 +57,8 @@ pub(crate) enum Wallet { #[clap(about = "...")] InscribeChain(inscribe_chain::InscribeChain), #[clap(about = "...")] + InscribeChainDestinationAddresses(inscribe_chain_destination_addresses::InscribeChainDestinationAddresses), + #[clap(about = "...")] Split(split::Split), } @@ -66,6 +69,7 @@ impl Wallet { Self::Create(create) => create.run(options), Self::Inscribe(inscribe) => inscribe.run(options).map(|_| Ok(()))?, Self::InscribeChain(inscribe_chain) => inscribe_chain.run(options), + Self::InscribeChainDestinationAddresses(inscribe_chain_destination_addresses) => inscribe_chain_destination_addresses.run(options), Self::Inscriptions => inscriptions::run(options), Self::Receive => receive::run(options), Self::Restore(restore) => restore.run(options), diff --git a/src/subcommand/wallet/inscribe_chain.rs b/src/subcommand/wallet/inscribe_chain.rs index 33e93d3568..2c6fe86e9b 100644 --- a/src/subcommand/wallet/inscribe_chain.rs +++ b/src/subcommand/wallet/inscribe_chain.rs @@ -22,7 +22,7 @@ pub(crate) struct InscribeChain { help = "Do not check that transactions are equal to or below the MAX_STANDARD_TX_WEIGHT of 400,000 weight units. Transactions over this limit are currently nonstandard and will not be relayed by bitcoind in its default configuration. Do not use this flag unless you understand the implications." )] pub(crate) no_limit: bool, - #[clap(long, help = "Don't sign or broadcast transactions.")] + #[clap(long, help = "Send inscription to .")] pub(crate) destination: Option
, #[clap(long, help = "Establish parent relationship with .")] pub(crate) parent: Option, diff --git a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs new file mode 100644 index 0000000000..95de7409b7 --- /dev/null +++ b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs @@ -0,0 +1,208 @@ +use std::fs::{DirBuilder, DirEntry}; + +use super::{inscribe::Inscribe, *}; + +#[derive(Debug, Parser)] +pub(crate) struct InscribeChainDestinationAddresses { + #[clap(long, help = "Inscribe ")] + pub(crate) satpoint: SatPoint, + #[clap(long, help = "Use fee rate of sats/vB")] + pub(crate) fee_rate: FeeRate, + #[clap( + long, + help = "Use sats/vbyte for commit transaction.\nDefaults to if unset." + )] + pub(crate) commit_fee_rate: Option, + #[clap(help = "Inscribe sats with contents of /inscriptions/ and send to /addresses/")] + pub(crate) dir: PathBuf, + #[clap(long, help = "Do not back up recovery key.")] + pub(crate) no_backup: bool, + #[clap( + long, + help = "Do not check that transactions are equal to or below the MAX_STANDARD_TX_WEIGHT of 400,000 weight units. Transactions over this limit are currently nonstandard and will not be relayed by bitcoind in its default configuration. Do not use this flag unless you understand the implications." + )] + pub(crate) no_limit: bool, + // #[clap(long, help = "Send inscription to .")] + // pub(crate) destination: Option
, + #[clap(long, help = "Establish parent relationship with .")] + pub(crate) parent: Option, +} + +// maximum of 12 +const INSCRIPTION_PER_BLOCK: usize = 12; + +impl InscribeChainDestinationAddresses { + pub(crate) fn run(self, options: Options) -> Result { + let mut satpoint = self.satpoint; + + let inscriptions_path = self.dir.join("inscriptions"); + let addresses_path = self.dir.join("addresses"); + + let mut inscriptions_files: Vec = fs::read_dir(inscriptions_path) + .unwrap() + .map(|f| f.unwrap()) + .filter(|file| file.path().is_file()) + // .unwrap() + // .filter_map(|entry| { + // entry.ok().and_then(|e| e.path().file_name().map(|f| f.to_string_lossy().to_string())) + // }) + .collect(); + inscriptions_files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); + + let mut addresses_files: Vec = fs::read_dir(addresses_path) + .unwrap() + .map(|f| f.unwrap()) + .filter(|file| file.path().is_file()) + .collect(); + addresses_files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); + + if inscriptions_files.len() != addresses_files.len() { + // panic!("The number of files in 'inscriptions' and 'addresses' subdirectories is not the same."); + return Err(anyhow!( + "The number of files in 'inscriptions' and 'addresses' subdirectories is not the same: inscriptions/ has {} files and addresses/ has {} files", + inscriptions_files.len(), + addresses_files.len() + )); + } + + // let dir = self.dir.read_dir()?; + // let mut files: Vec = dir + // .map(|f| f.unwrap()) + // .filter(|file| file.path().is_file()) + // .collect(); + // files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); + + if inscriptions_files.len() as u64 > satpoint.offset + 1 { + return Err(anyhow!( + "Not enough sats: folder has {} files and output offset is {}", + inscriptions_files.len(), + satpoint.offset + )); + } + + DirBuilder::new() + .create(&self.dir.join("inscribed")) + .unwrap_or_default(); + + // validate all addresses before inscribing anything + for i in 0..(addresses_files.len().min(INSCRIPTION_PER_BLOCK)) { + let destination_address_file_path = addresses_files.get(i).unwrap().path(); + let destination_address_str = fs::read_to_string(destination_address_file_path.clone())?; + self.validate_btc_address(options.chain().network(), destination_address_str.as_str()); + } + + + for i in 0..(inscriptions_files.len().min(INSCRIPTION_PER_BLOCK)) { + let file = inscriptions_files.get(i).unwrap(); + let file_path = file.path(); + let destination_address_file = addresses_files.get(i).unwrap(); + let destination_address_file_path = destination_address_file.path(); + let destination_address_str = fs::read_to_string(destination_address_file_path.clone())?; + let destination_address = Address::from_str(destination_address_str.as_str().trim()).ok(); + + let inscribe = Inscribe { + dry_run: false, + fee_rate: self.fee_rate, + commit_fee_rate: self.commit_fee_rate, + destination: destination_address, + file: file_path.clone(), + no_backup: true, + no_limit: self.no_limit, + satpoint: Some(satpoint), + parent: self.parent.clone(), + commit: None, + keypair: None, + }; + + println!("Inscribing {} at {}, and sending to {}", file_path.clone().display(), satpoint, destination_address_str); + let inscription = inscribe.run(options.clone())?; + + fs::rename( + file_path.clone(), + &self + .dir + .join("inscribed") + .join(file_path.file_name().unwrap()), + )?; + + fs::rename( + destination_address_file_path.clone(), + &self + .dir + .join("inscribed") + .join(destination_address_file_path.file_name().unwrap()), + )?; + + // update satpoint to inscribe for next iteration + if satpoint.offset >= 1 { + satpoint.offset -= 1; + + satpoint = SatPoint { + outpoint: OutPoint { + txid: inscription.commit, + vout: 0, + }, + offset: satpoint.offset, + }; + }; + } + + println!("\nSuccess!"); + println!( + "{} new inscriptions pending in the mempool.", + inscriptions_files.len().min(INSCRIPTION_PER_BLOCK) + ); + println!("\nTo continue inscribing, wait for the block to be mined and run:"); + println!("{}", self.get_resume_cli_command(satpoint)); + + Ok(()) + } + + fn get_resume_cli_command(&self, updated_satpoint: SatPoint) -> String { + let mut cli = format!( + "ord wallet inscribe-chain --fee-rate {}", + self.fee_rate.fee(10 as usize).to_sat() as f64 / 10.0 + ); + if let Some(parent) = self.parent { + cli.push_str(&format!(" --parent {}", parent)); + } + // if let Some(destination) = &self.destination { + // cli.push_str(&format!(" --destination {}", destination)); + // } + cli.push_str(&format!(" --satpoint {}", updated_satpoint)); + cli.push_str(&format!(" {}", self.dir.display())); + + return cli; + } + + fn validate_btc_address(&self, network: bitcoin::network::constants::Network, address_str: &str) -> bool { + // let network = Network::Bitcoin; + // let address = Address::from_str(address)?; + match Address::from_str(address_str) { + Ok(address) => { + if address.network == network { + return true; + } + // } else { + // panic!("Invalid btc address: {}", address_str); + // } + } + Err(err) => { + panic!("Invalid btc address {}: {}", address_str, err); + } + } + panic!("Invalid btc address: {}", address_str); + } +} + +fn get_number_from_dir_entry(dir_entry: &DirEntry) -> u64 { + dir_entry + .path() + .file_stem() + .unwrap() + .to_str() + .unwrap() + .parse() + .context("Name the files in the format: ., e.g. 1.json") + .unwrap() +} From 2725798b3f9a0f7f5679812f5de1fc34eed254c0 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Thu, 22 Jun 2023 12:34:09 -0700 Subject: [PATCH 36/40] cleanup --- .../inscribe_chain_destination_addresses.rs | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs index 95de7409b7..9915ab807d 100644 --- a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs +++ b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs @@ -22,8 +22,6 @@ pub(crate) struct InscribeChainDestinationAddresses { help = "Do not check that transactions are equal to or below the MAX_STANDARD_TX_WEIGHT of 400,000 weight units. Transactions over this limit are currently nonstandard and will not be relayed by bitcoind in its default configuration. Do not use this flag unless you understand the implications." )] pub(crate) no_limit: bool, - // #[clap(long, help = "Send inscription to .")] - // pub(crate) destination: Option
, #[clap(long, help = "Establish parent relationship with .")] pub(crate) parent: Option, } @@ -42,10 +40,6 @@ impl InscribeChainDestinationAddresses { .unwrap() .map(|f| f.unwrap()) .filter(|file| file.path().is_file()) - // .unwrap() - // .filter_map(|entry| { - // entry.ok().and_then(|e| e.path().file_name().map(|f| f.to_string_lossy().to_string())) - // }) .collect(); inscriptions_files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); @@ -57,20 +51,12 @@ impl InscribeChainDestinationAddresses { addresses_files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); if inscriptions_files.len() != addresses_files.len() { - // panic!("The number of files in 'inscriptions' and 'addresses' subdirectories is not the same."); return Err(anyhow!( "The number of files in 'inscriptions' and 'addresses' subdirectories is not the same: inscriptions/ has {} files and addresses/ has {} files", inscriptions_files.len(), addresses_files.len() )); } - - // let dir = self.dir.read_dir()?; - // let mut files: Vec = dir - // .map(|f| f.unwrap()) - // .filter(|file| file.path().is_file()) - // .collect(); - // files.sort_by(|a, b| get_number_from_dir_entry(a).cmp(&get_number_from_dir_entry(b))); if inscriptions_files.len() as u64 > satpoint.offset + 1 { return Err(anyhow!( @@ -160,15 +146,12 @@ impl InscribeChainDestinationAddresses { fn get_resume_cli_command(&self, updated_satpoint: SatPoint) -> String { let mut cli = format!( - "ord wallet inscribe-chain --fee-rate {}", + "ord wallet inscribe-chain-destination-addresses --fee-rate {}", self.fee_rate.fee(10 as usize).to_sat() as f64 / 10.0 ); if let Some(parent) = self.parent { cli.push_str(&format!(" --parent {}", parent)); } - // if let Some(destination) = &self.destination { - // cli.push_str(&format!(" --destination {}", destination)); - // } cli.push_str(&format!(" --satpoint {}", updated_satpoint)); cli.push_str(&format!(" {}", self.dir.display())); @@ -176,16 +159,11 @@ impl InscribeChainDestinationAddresses { } fn validate_btc_address(&self, network: bitcoin::network::constants::Network, address_str: &str) -> bool { - // let network = Network::Bitcoin; - // let address = Address::from_str(address)?; match Address::from_str(address_str) { Ok(address) => { if address.network == network { return true; } - // } else { - // panic!("Invalid btc address: {}", address_str); - // } } Err(err) => { panic!("Invalid btc address {}: {}", address_str, err); From fcb07487f0945d7d26d7532a022a7e4522b1a0ba Mon Sep 17 00:00:00 2001 From: ericatallah Date: Fri, 23 Jun 2023 08:57:51 -0700 Subject: [PATCH 37/40] remove address validation, check if subdirs exist, add cmd descriptions --- src/subcommand/wallet.rs | 6 ++-- .../inscribe_chain_destination_addresses.rs | 33 +++++++------------ 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index 521af47d14..261d04cb13 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -54,11 +54,11 @@ pub(crate) enum Wallet { Outputs, #[clap(about = "List unspent cardinal outputs in wallet")] Cardinals, - #[clap(about = "...")] + #[clap(about = "Inscribe a directory of files on specific sats, 12 at a time using CPFP. Takes as an argument, a path to a directory of files to be inscribed.")] InscribeChain(inscribe_chain::InscribeChain), - #[clap(about = "...")] + #[clap(about = "Inscribe a directory of files on specific sats, sent to specific destination addresses, 12 at a time using CPFP. Takes as an argument, a path to a directory containing 'addresses/' and 'inscriptions/' subdirs.")] InscribeChainDestinationAddresses(inscribe_chain_destination_addresses::InscribeChainDestinationAddresses), - #[clap(about = "...")] + #[clap(about = "Split a utxo into multiple utxo's of smaller, equal denominations.")] Split(split::Split), } diff --git a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs index 9915ab807d..94d65ff2ae 100644 --- a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs +++ b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs @@ -34,8 +34,19 @@ impl InscribeChainDestinationAddresses { let mut satpoint = self.satpoint; let inscriptions_path = self.dir.join("inscriptions"); + + if !Path::new(&inscriptions_path).exists() { + eprintln!("Error: inscriptions/ directory does not exist"); + return Ok(()); + } + let addresses_path = self.dir.join("addresses"); + if !Path::new(&addresses_path).exists() { + eprintln!("Error: addresses/ directory does not exist"); + return Ok(()); + } + let mut inscriptions_files: Vec = fs::read_dir(inscriptions_path) .unwrap() .map(|f| f.unwrap()) @@ -70,14 +81,6 @@ impl InscribeChainDestinationAddresses { .create(&self.dir.join("inscribed")) .unwrap_or_default(); - // validate all addresses before inscribing anything - for i in 0..(addresses_files.len().min(INSCRIPTION_PER_BLOCK)) { - let destination_address_file_path = addresses_files.get(i).unwrap().path(); - let destination_address_str = fs::read_to_string(destination_address_file_path.clone())?; - self.validate_btc_address(options.chain().network(), destination_address_str.as_str()); - } - - for i in 0..(inscriptions_files.len().min(INSCRIPTION_PER_BLOCK)) { let file = inscriptions_files.get(i).unwrap(); let file_path = file.path(); @@ -157,20 +160,6 @@ impl InscribeChainDestinationAddresses { return cli; } - - fn validate_btc_address(&self, network: bitcoin::network::constants::Network, address_str: &str) -> bool { - match Address::from_str(address_str) { - Ok(address) => { - if address.network == network { - return true; - } - } - Err(err) => { - panic!("Invalid btc address {}: {}", address_str, err); - } - } - panic!("Invalid btc address: {}", address_str); - } } fn get_number_from_dir_entry(dir_entry: &DirEntry) -> u64 { From 070a9edc60cb1b42042ecf98eaa9a35fa8b33696 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Fri, 23 Jun 2023 09:16:09 -0700 Subject: [PATCH 38/40] change scripts back to 30 --- create-30-testnet.sh | 4 ++-- create-30-with-addresses-testnet.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/create-30-testnet.sh b/create-30-testnet.sh index 6daf0a5cc2..db6b19f60e 100755 --- a/create-30-testnet.sh +++ b/create-30-testnet.sh @@ -1,12 +1,12 @@ #!/bin/bash -dir="12-inscriptions-testnet" +dir="30-inscriptions-testnet" mkdir -p $dir parentInscriptionId="3995befab6b08427416bf9442d6877f6057780f31cdca37eb600a12bcf5e9345i0" offsetInscriptionId="f4429c67523c9437f3db69fe0521f10dec4ae2b3bb64e98a1fd97c53c59803cai0" -for ((i=1; i<=12; i++)); do +for ((i=1; i<=30; i++)); do filename="${i}.html" filepath="${dir}/${filename}" tokenID=$i diff --git a/create-30-with-addresses-testnet.sh b/create-30-with-addresses-testnet.sh index ef2c65a12d..0dc9a25f6e 100755 --- a/create-30-with-addresses-testnet.sh +++ b/create-30-with-addresses-testnet.sh @@ -8,7 +8,7 @@ if [ ! -f "$file" ]; then exit 1 fi -dir="12-inscriptions-testnet" +dir="30-inscriptions-testnet" mkdir -p $dir inscriptions_dir="$dir/inscriptions" @@ -29,7 +29,7 @@ done < "$file" parentInscriptionId="3995befab6b08427416bf9442d6877f6057780f31cdca37eb600a12bcf5e9345i0" offsetInscriptionId="f4429c67523c9437f3db69fe0521f10dec4ae2b3bb64e98a1fd97c53c59803cai0" -for ((i=1; i<=12; i++)); do +for ((i=1; i<=30; i++)); do filename="${i}.html" filepath="${inscriptions_dir}/${filename}" tokenID=$i From 37af6d61a91545471ea9d5cb8c17505a2ac8a3e6 Mon Sep 17 00:00:00 2001 From: ericatallah Date: Fri, 23 Jun 2023 09:18:12 -0700 Subject: [PATCH 39/40] add example addresses.txt --- addresses.example.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 addresses.example.txt diff --git a/addresses.example.txt b/addresses.example.txt new file mode 100644 index 0000000000..8ab45cd653 --- /dev/null +++ b/addresses.example.txt @@ -0,0 +1,12 @@ +tb1p7t5xhyxj2g98eua7xfgrp5ufgwjypqje8q2z2cns79yaly4vv9lq5k4fmh +tb1p2khdgxygwmt4hs2ls9p39w6m9pf3lxfvtmg855h65jqazj0e2hrse387vm +tb1p833fd7mv8kngqf6acue3f8c9k63xwxu23ph3jmt8fjqn2p0d4amqawndj6 +tb1pajkhapfr7qzsv84x4esmp8tt87rgfy2764a2we9zahawp02sn2ask4wwvp +tb1pak3d2nf3n2ezpm3tx52sswz2zzlr75ch9fq2qp8dt8re4a3r2p5shja0ku +tb1pw5fkhj4u9fhs4hednnd2x2tped4ssuwnxax39ndcakce7ayc6erq9679tm +tb1pkeetmfw2khdvlessj7wgk5gvmc4lg46cq4z5m590pkk8r80edrcqjxa82t +tb1pldqf2fmtj6f38z5qmtemlfx3rxmvt7sg3xq00px4yc90fe9adx4qfn6xpf +tb1pyc3ng7l4ry9e9tvhudeq8tlt3zu77uynjm4vx2wppvywvke2pd2scrtgrf +tb1pcxtr98jtam7zpk6lfvth675c43r8eteslgw9809ykucvdusquv3qzygc3s +tb1p44qzt7sxmjhr2rlhxw7y6zl5n4hhwlq35wuthfrkpx2rtqj4uxcqk02x2q +tb1pqswqkj4rp86lats7plu0ypc2u9vphnmackm0cccax8f8dchkq8jsc3u99u From 5d1c911c8fbc6607105ac8f815dbd94e7683940c Mon Sep 17 00:00:00 2001 From: ericatallah Date: Wed, 28 Jun 2023 11:49:17 -0700 Subject: [PATCH 40/40] Update src/subcommand/wallet/inscribe_chain_destination_addresses.rs Co-authored-by: Felipe Lincoln --- .../wallet/inscribe_chain_destination_addresses.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs index 94d65ff2ae..e64240c8dc 100644 --- a/src/subcommand/wallet/inscribe_chain_destination_addresses.rs +++ b/src/subcommand/wallet/inscribe_chain_destination_addresses.rs @@ -36,15 +36,13 @@ impl InscribeChainDestinationAddresses { let inscriptions_path = self.dir.join("inscriptions"); if !Path::new(&inscriptions_path).exists() { - eprintln!("Error: inscriptions/ directory does not exist"); - return Ok(()); + return Err(anyhow!("Error: inscriptions/ directory does not exist")); } let addresses_path = self.dir.join("addresses"); if !Path::new(&addresses_path).exists() { - eprintln!("Error: addresses/ directory does not exist"); - return Ok(()); + return Err(anyhow!("Error: addresses/ directory does not exist")); } let mut inscriptions_files: Vec = fs::read_dir(inscriptions_path)