diff --git a/src/chain.rs b/src/chain.rs index c39fc93111..0137c56e72 100644 --- a/src/chain.rs +++ b/src/chain.rs @@ -12,7 +12,7 @@ pub(crate) enum Chain { } impl Chain { - fn network(self) -> bitcoin::Network { + pub(crate) fn network(self) -> bitcoin::Network { match self { Self::Mainnet => bitcoin::Network::Bitcoin, Self::Testnet => bitcoin::Network::Testnet, diff --git a/src/subcommand/wallet/send.rs b/src/subcommand/wallet/send.rs index 91e447eee8..76f6bed168 100644 --- a/src/subcommand/wallet/send.rs +++ b/src/subcommand/wallet/send.rs @@ -10,6 +10,14 @@ impl Send { pub(crate) fn run(self, options: Options) -> Result { let client = options.bitcoin_rpc_client_for_wallet_command("ord wallet send")?; + if !self.address.is_valid_for_network(options.chain.network()) { + bail!( + "Address `{}` is not valid for {}", + self.address, + options.chain + ); + } + let index = Index::open(&options)?; index.index()?; diff --git a/tests/wallet.rs b/tests/wallet.rs index 6026802b70..43ab9fcc5b 100644 --- a/tests/wallet.rs +++ b/tests/wallet.rs @@ -53,9 +53,25 @@ fn send_on_mainnnet_refuses_to_work_with_wallet_name_foo() { let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Bitcoin, "foo"); rpc_server.mine_blocks(1); + CommandBuilder::new( + "wallet send 5000000000 bc1qzjeg3h996kw24zrg69nge97fw8jc4v7v7yznftzk06j3429t52vse9tkp9", + ) + .rpc_server(&rpc_server) + .expected_stderr("error: `ord wallet send` may only be used on mainnet with a wallet named `ord` or whose name starts with `ord-`\n") + .expected_exit_code(1) + .run(); +} + +#[test] +fn send_addresses_must_be_valid_for_network() { + let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Bitcoin, "ord"); + rpc_server.mine_blocks_with_subsidy(1, 1_000_000); + CommandBuilder::new("wallet send 5000000000 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw") .rpc_server(&rpc_server) - .expected_stderr("error: `ord wallet send` may only be used on mainnet with a wallet named `ord` or whose name starts with `ord-`\n") + .expected_stderr( + "error: Address `tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw` is not valid for mainnet\n", + ) .expected_exit_code(1) .run(); } @@ -66,7 +82,7 @@ fn send_on_mainnnet_works_with_wallet_named_ord() { rpc_server.mine_blocks_with_subsidy(1, 1_000_000); let output = - CommandBuilder::new("wallet send 5000000000 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw") + CommandBuilder::new("wallet send 5000000000 bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh") .rpc_server(&rpc_server) .stdout_regex(r".*") .run(); @@ -81,7 +97,7 @@ fn send_on_mainnnet_works_with_wallet_whose_name_starts_with_ord() { rpc_server.mine_blocks_with_subsidy(1, 1_000_000); let output = - CommandBuilder::new("wallet send 5000000000 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw") + CommandBuilder::new("wallet send 5000000000 bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh") .rpc_server(&rpc_server) .stdout_regex(r".*") .run(); @@ -95,7 +111,7 @@ fn send_on_mainnnet_refuses_to_work_with_wallet_with_high_balance() { let rpc_server = test_bitcoincore_rpc::spawn_with(Network::Bitcoin, "ord"); rpc_server.mine_blocks_with_subsidy(1, 1_000_001); - CommandBuilder::new("wallet send 5000000000 tb1qx4gf3ya0cxfcwydpq8vr2lhrysneuj5d7lqatw") + CommandBuilder::new("wallet send 5000000000 bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh") .rpc_server(&rpc_server) .expected_stderr( "error: `ord wallet send` may not be used on mainnet with wallets containing more than 1,000,000 sats\n",