Skip to content

Commit 14a74f4

Browse files
authored
Merge branch 'master' into master
2 parents 910f37f + b6620c2 commit 14a74f4

File tree

4 files changed

+107
-4
lines changed

4 files changed

+107
-4
lines changed

src/outgoing.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub enum Outgoing {
55
Amount(Amount),
66
InscriptionId(InscriptionId),
77
SatPoint(SatPoint),
8+
Sat(Sat),
89
Rune { decimal: Decimal, rune: SpacedRune },
910
}
1011

@@ -13,6 +14,7 @@ impl Display for Outgoing {
1314
match self {
1415
Self::Amount(amount) => write!(f, "{}", amount.to_string().to_lowercase()),
1516
Self::InscriptionId(inscription_id) => inscription_id.fmt(f),
17+
Self::Sat(sat) => sat.fmt(f),
1618
Self::SatPoint(satpoint) => satpoint.fmt(f),
1719
Self::Rune { decimal, rune } => write!(f, "{decimal} {rune}"),
1820
}
@@ -61,7 +63,9 @@ impl FromStr for Outgoing {
6163
.unwrap();
6264
}
6365

64-
Ok(if re::SATPOINT.is_match(s) {
66+
Ok(if s.parse::<Sat>().is_ok() {
67+
Self::Sat(s.parse()?)
68+
} else if re::SATPOINT.is_match(s) {
6569
Self::SatPoint(s.parse()?)
6670
} else if re::INSCRIPTION_ID.is_match(s) {
6771
Self::InscriptionId(s.parse()?)
@@ -107,6 +111,12 @@ mod tests {
107111
assert_eq!(s.parse::<Outgoing>().unwrap(), outgoing);
108112
}
109113

114+
case("0", Outgoing::Sat("0".parse().unwrap()));
115+
case(
116+
"2099999997689999",
117+
Outgoing::Sat("2099999997689999".parse().unwrap()),
118+
);
119+
110120
case(
111121
"0000000000000000000000000000000000000000000000000000000000000000i0",
112122
Outgoing::InscriptionId(
@@ -177,8 +187,6 @@ mod tests {
177187
decimal: "1.1".parse().unwrap(),
178188
},
179189
);
180-
181-
assert!("0".parse::<Outgoing>().is_err());
182190
}
183191

184192
#[test]
@@ -189,6 +197,12 @@ mod tests {
189197
assert_eq!(s, outgoing.to_string());
190198
}
191199

200+
case("0", Outgoing::Sat("0".parse().unwrap()));
201+
case(
202+
"2099999997689999",
203+
Outgoing::Sat("2099999997689999".parse().unwrap()),
204+
);
205+
192206
case(
193207
"0000000000000000000000000000000000000000000000000000000000000000i0",
194208
Outgoing::InscriptionId(
@@ -236,6 +250,13 @@ mod tests {
236250
assert_eq!(serde_json::from_str::<Outgoing>(j).unwrap(), o);
237251
}
238252

253+
case("0", "\"0\"", Outgoing::Sat("0".parse().unwrap()));
254+
case(
255+
"2099999997689999",
256+
"\"2099999997689999\"",
257+
Outgoing::Sat("2099999997689999".parse().unwrap()),
258+
);
259+
239260
case(
240261
"0000000000000000000000000000000000000000000000000000000000000000i0",
241262
"\"0000000000000000000000000000000000000000000000000000000000000000i0\"",

src/subcommand/wallet/send.rs

+8
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ impl Send {
6666
self.fee_rate,
6767
false,
6868
)?,
69+
Outgoing::Sat(sat) => Self::create_unsigned_send_satpoint_transaction(
70+
&wallet,
71+
address,
72+
wallet.find_sat_in_outputs(sat)?,
73+
self.postage,
74+
self.fee_rate,
75+
true,
76+
)?,
6977
};
7078

7179
let unspent_outputs = wallet.utxos();

tests/lib.rs

+13
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,19 @@ fn receive(
111111
.unwrap()
112112
}
113113

114+
fn sats(
115+
bitcoin_rpc_server: &test_bitcoincore_rpc::Handle,
116+
ord_rpc_server: &TestServer,
117+
) -> Vec<ord::subcommand::wallet::sats::OutputRare> {
118+
CommandBuilder::new(format!(
119+
"--chain {} wallet sats",
120+
bitcoin_rpc_server.network()
121+
))
122+
.bitcoin_rpc_server(bitcoin_rpc_server)
123+
.ord_rpc_server(ord_rpc_server)
124+
.run_and_deserialize_output::<Vec<ord::subcommand::wallet::sats::OutputRare>>()
125+
}
126+
114127
fn inscribe(
115128
bitcoin_rpc_server: &test_bitcoincore_rpc::Handle,
116129
ord_rpc_server: &TestServer,

tests/wallet/send.rs

+62-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ fn send_unknown_inscription() {
6868
}
6969

7070
#[test]
71-
fn send_inscribed_sat() {
71+
fn send_inscribed_inscription() {
7272
let bitcoin_rpc_server = test_bitcoincore_rpc::spawn();
7373

7474
let ord_rpc_server = TestServer::spawn_with_server_args(&bitcoin_rpc_server, &[], &[]);
@@ -100,6 +100,67 @@ fn send_inscribed_sat() {
100100
);
101101
}
102102

103+
#[test]
104+
fn send_uninscribed_sat() {
105+
let bitcoin_rpc_server = test_bitcoincore_rpc::spawn();
106+
107+
let ord_rpc_server =
108+
TestServer::spawn_with_server_args(&bitcoin_rpc_server, &["--index-sats"], &[]);
109+
110+
create_wallet(&bitcoin_rpc_server, &ord_rpc_server);
111+
112+
let sat = 1;
113+
114+
CommandBuilder::new(format!(
115+
"wallet send --fee-rate 1 bc1qcqgs2pps4u4yedfyl5pysdjjncs8et5utseepv {sat}"
116+
))
117+
.bitcoin_rpc_server(&bitcoin_rpc_server)
118+
.ord_rpc_server(&ord_rpc_server)
119+
.expected_stderr(format!(
120+
"error: could not find sat `{sat}` in wallet outputs\n"
121+
))
122+
.expected_exit_code(1)
123+
.run_and_extract_stdout();
124+
}
125+
126+
#[test]
127+
fn send_inscription_by_sat() {
128+
let bitcoin_rpc_server = test_bitcoincore_rpc::spawn();
129+
130+
let ord_rpc_server =
131+
TestServer::spawn_with_server_args(&bitcoin_rpc_server, &["--index-sats"], &[]);
132+
133+
create_wallet(&bitcoin_rpc_server, &ord_rpc_server);
134+
135+
bitcoin_rpc_server.mine_blocks(1);
136+
137+
let (inscription, txid) = inscribe(&bitcoin_rpc_server, &ord_rpc_server);
138+
139+
bitcoin_rpc_server.mine_blocks(1);
140+
141+
let sat_list = sats(&bitcoin_rpc_server, &ord_rpc_server);
142+
143+
let sat = sat_list.iter().find(|s| s.output.txid == txid).unwrap().sat;
144+
145+
let address = "bc1qcqgs2pps4u4yedfyl5pysdjjncs8et5utseepv";
146+
147+
let output = CommandBuilder::new(format!("wallet send --fee-rate 1 {address} {sat}"))
148+
.bitcoin_rpc_server(&bitcoin_rpc_server)
149+
.ord_rpc_server(&ord_rpc_server)
150+
.run_and_deserialize_output::<Send>();
151+
152+
bitcoin_rpc_server.mine_blocks(1);
153+
154+
let send_txid = output.txid;
155+
156+
ord_rpc_server.assert_response_regex(
157+
format!("/inscription/{inscription}"),
158+
format!(
159+
".*<h1>Inscription 0</h1>.*<dt>address</dt>.*<dd class=monospace>{address}</dd>.*<dt>location</dt>.*<dd class=monospace>{send_txid}:0:0</dd>.*",
160+
),
161+
);
162+
}
163+
103164
#[test]
104165
fn send_on_mainnnet_works_with_wallet_named_foo() {
105166
let bitcoin_rpc_server = test_bitcoincore_rpc::spawn();

0 commit comments

Comments
 (0)