From 5df0d5a035d34d01a93fec348a23ff1f2dd96a08 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Thu, 1 Dec 2022 13:53:28 -0800 Subject: [PATCH 1/3] Send by inscription ID --- src/subcommand/wallet/send.rs | 30 ++++++++++++++++++++++++++++-- tests/wallet.rs | 15 +++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/subcommand/wallet/send.rs b/src/subcommand/wallet/send.rs index f41d06b618..f9d233bc5d 100644 --- a/src/subcommand/wallet/send.rs +++ b/src/subcommand/wallet/send.rs @@ -1,8 +1,26 @@ use super::*; +#[derive(Debug)] +enum Reference { + SatPoint(SatPoint), + InscriptionId(Txid), +} + +impl FromStr for Reference { + type Err = Error; + + fn from_str(s: &str) -> Result { + Ok(if s.len() == 64 { + Self::InscriptionId(s.parse()?) + } else { + Self::SatPoint(s.parse()?) + }) + } +} + #[derive(Debug, Parser)] pub(crate) struct Send { - satpoint: SatPoint, + satpoint: Reference, address: Address, } @@ -27,8 +45,16 @@ impl Send { let change = get_change_addresses(&options, 2)?; + let satpoint = match self.satpoint { + Reference::SatPoint(satpoint) => satpoint, + Reference::InscriptionId(txid) => match index.get_inscription_by_inscription_id(txid)? { + Some((_inscription, satpoint)) => satpoint, + None => bail!("No inscription found for {txid}"), + }, + }; + let unsigned_transaction = TransactionBuilder::build_transaction( - self.satpoint, + satpoint, inscription_satpoints, utxos, self.address, diff --git a/tests/wallet.rs b/tests/wallet.rs index 44f466a8f9..8047871ccf 100644 --- a/tests/wallet.rs +++ b/tests/wallet.rs @@ -72,6 +72,21 @@ fn send_works_on_signet() { assert_eq!(format!("{}\n", txid), stdout); } +#[test] +fn send_unknown_inscription() { + let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Signet, "ord"); + + let txid = rpc_server.mine_blocks(1)[0].txdata[0].txid(); + + CommandBuilder::new(format!( + "--chain signet wallet send {txid} tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw" + )) + .rpc_server(&rpc_server) + .expected_stderr(format!("error: No inscription found for {txid}\n")) + .expected_exit_code(1) + .run(); +} + #[test] fn send_on_mainnnet_refuses_to_work_with_wallet_name_foo() { let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Bitcoin, "foo"); From 2275ecab900dd305cd80967163e23474c40f9111 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Thu, 1 Dec 2022 14:09:11 -0800 Subject: [PATCH 2/3] Add tests --- tests/lib.rs | 2 +- tests/wallet.rs | 93 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/tests/lib.rs b/tests/lib.rs index 5e090f2c88..5d117ebcd4 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -2,7 +2,7 @@ use { self::{command_builder::CommandBuilder, expected::Expected, test_server::TestServer}, - bitcoin::{blockdata::constants::COIN_VALUE, Network, OutPoint}, + bitcoin::{blockdata::constants::COIN_VALUE, Network, OutPoint, Txid}, executable_path::executable_path, pretty_assertions::assert_eq as pretty_assert_eq, regex::Regex, diff --git a/tests/wallet.rs b/tests/wallet.rs index 8047871ccf..2b455825db 100644 --- a/tests/wallet.rs +++ b/tests/wallet.rs @@ -1,5 +1,17 @@ use super::*; +fn reveal_txid_from_inscribe_stdout(stdout: &str) -> Txid { + stdout + .lines() + .nth(1) + .unwrap() + .split('\t') + .nth(1) + .unwrap() + .parse() + .unwrap() +} + #[test] fn identify() { let rpc_server = test_bitcoincore_rpc::spawn(); @@ -62,7 +74,19 @@ fn send_works_on_signet() { let txid = rpc_server.mine_blocks(1)[0].txdata[0].txid(); let stdout = CommandBuilder::new(format!( - "--chain signet wallet send {txid}:0:0 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw" + "--chain signet --index-ordinals wallet inscribe --satpoint {txid}:0:0 --file degenerate.png" + )) + .write("degenerate.png", [1; 520]) + .rpc_server(&rpc_server) + .stdout_regex("commit\t[[:xdigit:]]{64}\nreveal\t[[:xdigit:]]{64}\n") + .run(); + + let reveal_txid = reveal_txid_from_inscribe_stdout(&stdout); + + rpc_server.mine_blocks(1); + + let stdout = CommandBuilder::new(format!( + "--chain signet wallet send {reveal_txid}:0:0 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw" )) .rpc_server(&rpc_server) .stdout_regex(r".*") @@ -70,6 +94,23 @@ fn send_works_on_signet() { let txid = rpc_server.mempool()[0].txid(); assert_eq!(format!("{}\n", txid), stdout); + + rpc_server.mine_blocks(1); + + let send_txid = stdout.trim(); + + let ord_server = TestServer::spawn_with_args(&rpc_server, &[]); + ord_server.assert_response_regex( + &format!("/inscription/{}", reveal_txid), + &format!( + ".*

Inscription

+
+
satpoint
+
{send_txid}:0:0
+
+.*", + ), + ); } #[test] @@ -87,6 +128,48 @@ fn send_unknown_inscription() { .run(); } +#[test] +fn send_inscribed_sat() { + let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Signet, "ord"); + let txid = rpc_server.mine_blocks(1)[0].txdata[0].txid(); + + let stdout = CommandBuilder::new(format!( + "--chain signet --index-ordinals wallet inscribe --satpoint {txid}:0:0 --file degenerate.png" + )) + .write("degenerate.png", [1; 520]) + .rpc_server(&rpc_server) + .stdout_regex("commit\t[[:xdigit:]]{64}\nreveal\t[[:xdigit:]]{64}\n") + .run(); + + rpc_server.mine_blocks(1); + + let reveal_txid = reveal_txid_from_inscribe_stdout(&stdout); + + let stdout = CommandBuilder::new(format!( + "--chain signet wallet send {reveal_txid} tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw" + )) + .rpc_server(&rpc_server) + .stdout_regex("[[:xdigit:]]{64}\n") + .run(); + + rpc_server.mine_blocks(1); + + let send_txid = stdout.trim(); + + let ord_server = TestServer::spawn_with_args(&rpc_server, &[]); + ord_server.assert_response_regex( + &format!("/inscription/{}", reveal_txid), + &format!( + ".*

Inscription

+
+
satpoint
+
{send_txid}:0:0
+
+.*", + ), + ); +} + #[test] fn send_on_mainnnet_refuses_to_work_with_wallet_name_foo() { let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Bitcoin, "foo"); @@ -183,9 +266,10 @@ fn inscribe() { ".*
inscription
HELLOWORLD
.*", ); - let reveal_txid = stdout.split("reveal\t").collect::>()[1]; - TestServer::spawn_with_args(&rpc_server, &[]) - .assert_response_regex(&format!("/inscription/{reveal_txid}"), ".*HELLOWORLD.*"); + TestServer::spawn_with_args(&rpc_server, &[]).assert_response_regex( + &format!("/inscription/{}", reveal_txid_from_inscribe_stdout(&stdout)), + ".*HELLOWORLD.*", + ); } #[test] @@ -267,7 +351,6 @@ fn inscribe_does_not_use_inscribed_sats_as_cardinal_utxos() { .stdout_regex("commit\t[[:xdigit:]]{64}\nreveal\t[[:xdigit:]]{64}\n") .run(); - // let reveal_txid = stdout.split("reveal\t").collect::>()[1].trim(); let txid = rpc_server.mine_blocks_with_subsidy(1, 100)[0].txdata[0].txid(); CommandBuilder::new(format!( From b7922a8263fbb1a6fe25c16f0af17479d728fa2a Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Thu, 1 Dec 2022 14:16:32 -0800 Subject: [PATCH 3/3] tweak --- src/subcommand/wallet/send.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/subcommand/wallet/send.rs b/src/subcommand/wallet/send.rs index f9d233bc5d..87f0389c04 100644 --- a/src/subcommand/wallet/send.rs +++ b/src/subcommand/wallet/send.rs @@ -20,7 +20,7 @@ impl FromStr for Reference { #[derive(Debug, Parser)] pub(crate) struct Send { - satpoint: Reference, + reference: Reference, address: Address, } @@ -45,7 +45,7 @@ impl Send { let change = get_change_addresses(&options, 2)?; - let satpoint = match self.satpoint { + let satpoint = match self.reference { Reference::SatPoint(satpoint) => satpoint, Reference::InscriptionId(txid) => match index.get_inscription_by_inscription_id(txid)? { Some((_inscription, satpoint)) => satpoint,