Skip to content

Commit

Permalink
Send by inscription ID (#877)
Browse files Browse the repository at this point in the history
  • Loading branch information
casey authored Dec 1, 2022
1 parent 252a8dd commit c991229
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 8 deletions.
30 changes: 28 additions & 2 deletions src/subcommand/wallet/send.rs
Original file line number Diff line number Diff line change
@@ -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<Self, Self::Err> {
Ok(if s.len() == 64 {
Self::InscriptionId(s.parse()?)
} else {
Self::SatPoint(s.parse()?)
})
}
}

#[derive(Debug, Parser)]
pub(crate) struct Send {
satpoint: SatPoint,
reference: Reference,
address: Address,
}

Expand All @@ -27,8 +45,16 @@ impl Send {

let change = get_change_addresses(&options, 2)?;

let satpoint = match self.reference {
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,
Expand Down
2 changes: 1 addition & 1 deletion tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
108 changes: 103 additions & 5 deletions tests/wallet.rs
Original file line number Diff line number Diff line change
@@ -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();
Expand Down Expand Up @@ -62,14 +74,100 @@ 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".*")
.run();

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!(
".*<h1>Inscription</h1>
<dl>
<dt>satpoint</dt>
<dd>{send_txid}:0:0</dd>
</dl>
.*",
),
);
}

#[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_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!(
".*<h1>Inscription</h1>
<dl>
<dt>satpoint</dt>
<dd>{send_txid}:0:0</dd>
</dl>
.*",
),
);
}

#[test]
Expand Down Expand Up @@ -168,9 +266,10 @@ fn inscribe() {
".*<dt>inscription</dt><dd>HELLOWORLD</dd>.*",
);

let reveal_txid = stdout.split("reveal\t").collect::<Vec<&str>>()[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]
Expand Down Expand Up @@ -252,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::<Vec<&str>>()[1].trim();
let txid = rpc_server.mine_blocks_with_subsidy(1, 100)[0].txdata[0].txid();

CommandBuilder::new(format!(
Expand Down

0 comments on commit c991229

Please sign in to comment.