diff --git a/src/subcommand/env.rs b/src/subcommand/env.rs index 8d34ce8222..a8931d6c5a 100644 --- a/src/subcommand/env.rs +++ b/src/subcommand/env.rs @@ -127,13 +127,19 @@ rpcport={bitcoind_port} let receive = serde_json::from_slice::(&output.stdout)?; - let address = receive.address.require_network(Network::Regtest)?; - let status = Command::new("bitcoin-cli") .arg(format!("-datadir={relative}")) .arg("generatetoaddress") .arg("200") - .arg(address.to_string()) + .arg( + receive + .addresses + .first() + .cloned() + .unwrap() + .require_network(Network::Regtest)? + .to_string(), + ) .status()?; ensure!(status.success(), "failed to create wallet: {status}"); diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index 59133dee65..bed95102c3 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -53,7 +53,7 @@ pub(crate) enum Subcommand { #[command(about = "List wallet inscriptions")] Inscriptions, #[command(about = "Generate receive address")] - Receive, + Receive(receive::Receive), #[command(about = "Restore wallet")] Restore(restore::Restore), #[command(about = "List wallet satoshis")] @@ -96,7 +96,7 @@ impl WalletCommand { Subcommand::Etch(etch) => etch.run(wallet), Subcommand::Inscribe(inscribe) => inscribe.run(wallet), Subcommand::Inscriptions => inscriptions::run(wallet), - Subcommand::Receive => receive::run(wallet), + Subcommand::Receive(receive) => receive.run(wallet), Subcommand::Sats(sats) => sats.run(wallet), Subcommand::Send(send) => send.run(wallet), Subcommand::Transactions(transactions) => transactions.run(wallet), diff --git a/src/subcommand/wallet/receive.rs b/src/subcommand/wallet/receive.rs index 70d650f277..0087b92529 100644 --- a/src/subcommand/wallet/receive.rs +++ b/src/subcommand/wallet/receive.rs @@ -2,13 +2,27 @@ use super::*; #[derive(Deserialize, Serialize)] pub struct Output { - pub address: Address, + pub addresses: Vec>, } -pub(crate) fn run(wallet: Wallet) -> SubcommandResult { - let address = wallet - .bitcoin_client() - .get_new_address(None, Some(bitcoincore_rpc::json::AddressType::Bech32m))?; +#[derive(Debug, Parser)] +pub(crate) struct Receive { + #[arg(short, long, help = "Generate addresses.")] + number: Option, +} + +impl Receive { + pub(crate) fn run(self, wallet: Wallet) -> SubcommandResult { + let mut addresses: Vec> = Vec::new(); + + for _ in 0..self.number.unwrap_or(1) { + addresses.push( + wallet + .bitcoin_client() + .get_new_address(None, Some(bitcoincore_rpc::json::AddressType::Bech32m))?, + ); + } - Ok(Some(Box::new(Output { address }))) + Ok(Some(Box::new(Output { addresses }))) + } } diff --git a/tests/wallet/inscribe.rs b/tests/wallet/inscribe.rs index 877de7edb2..ca548664e9 100644 --- a/tests/wallet/inscribe.rs +++ b/tests/wallet/inscribe.rs @@ -477,11 +477,13 @@ fn inscribe_to_specific_destination() { bitcoin_rpc_server.mine_blocks(1); - let destination = CommandBuilder::new("wallet receive") + let addresses = CommandBuilder::new("wallet receive") .bitcoin_rpc_server(&bitcoin_rpc_server) .ord_rpc_server(&ord_rpc_server) .run_and_deserialize_output::() - .address; + .addresses; + + let destination = addresses.first().unwrap(); let txid = CommandBuilder::new(format!( "wallet inscribe --destination {} --file degenerate.png --fee-rate 1", diff --git a/tests/wallet/inscriptions.rs b/tests/wallet/inscriptions.rs index 9c10ed1924..0c6fe4708a 100644 --- a/tests/wallet/inscriptions.rs +++ b/tests/wallet/inscriptions.rs @@ -28,15 +28,17 @@ fn inscriptions() { format!("https://ordinals.com/inscription/{inscription}") ); - let address = CommandBuilder::new("wallet receive") + let addresses = CommandBuilder::new("wallet receive") .bitcoin_rpc_server(&bitcoin_rpc_server) .ord_rpc_server(&ord_rpc_server) .run_and_deserialize_output::() - .address; + .addresses; + + let destination = addresses.first().unwrap(); let txid = CommandBuilder::new(format!( "wallet send --fee-rate 1 {} {inscription}", - address.assume_checked() + destination.clone().assume_checked() )) .bitcoin_rpc_server(&bitcoin_rpc_server) .ord_rpc_server(&ord_rpc_server) @@ -105,15 +107,17 @@ fn inscriptions_with_postage() { assert_eq!(output[0].postage, 10000); - let address = CommandBuilder::new("wallet receive") + let addresses = CommandBuilder::new("wallet receive") .bitcoin_rpc_server(&bitcoin_rpc_server) .ord_rpc_server(&ord_rpc_server) .run_and_deserialize_output::() - .address; + .addresses; + + let destination = addresses.first().unwrap(); CommandBuilder::new(format!( "wallet send --fee-rate 1 {} {inscription}", - address.assume_checked() + destination.clone().assume_checked() )) .bitcoin_rpc_server(&bitcoin_rpc_server) .ord_rpc_server(&ord_rpc_server) diff --git a/tests/wallet/receive.rs b/tests/wallet/receive.rs index 448c19af52..51ec814422 100644 --- a/tests/wallet/receive.rs +++ b/tests/wallet/receive.rs @@ -12,5 +12,9 @@ fn receive() { .ord_rpc_server(&ord_rpc_server) .run_and_deserialize_output::(); - assert!(output.address.is_valid_for_network(Network::Bitcoin)); + assert!(output + .addresses + .first() + .unwrap() + .is_valid_for_network(Network::Bitcoin)); }