<p>I am working with watching wallet and Offline wallet using bitcoinj, 
  I created Watching Wallet using tpub key of Offline Wallet</p>

<p>I am receiving payment on watching wallet <strong>Fine</strong>, 
 now I want to spend coins from watching wallet after Signing my transaction from offline wallet</p>

<p>What I am doing is creating rawTx from the Watching Wallet and then signing it  with the private key from Offline Wallet but when I broadcast it, it throws an exception:</p>

<pre><code>InsufficientMoneyException
</code></pre>

<p>But my wallet balance is 0.23389 BTC
, its not spendable balance as my watching wallet shows</p>

<pre><code>Wallet containing 0.23389 BTC (spendable: 0.00 BTC)
</code></pre>

<p>This is not spendable because we cannot spend coins from watching wallet unless you sign it with the corresponding private key</p>

<p>Below is my code: As i am trying to sign transaction from my offline wallet, so i can spend coins from watching wallet</p>

<p><strong>For creating Raw Transaction from Watching Wallet</strong></p>

<pre><code>private void bla()
{
    Coin coin = Coin.parseCoin("0.01");
    Address address = Address.fromBase58(params, "n4oLPFUGvohSdDxvJS3amXvfE1GEdZBddd");
    Transaction tx = new Transaction(params);
    System.out.println("Raw TX: " + tx.toString());
    byte[] bytes = Script.createInputScript("5ff01d61e67c706cb79653aa1e7ad2c7254b841167e0a34055504c35c7240469".getBytes()); // tx hash 
    TransactionInput input = null;
    List&lt;Transaction&gt; list = kit.wallet().getTransactionsByTime();
    for(Transaction t: list)
    {
        input = t.getInput(0);
    }

    //Creates a scriptPubKey that encodes payment to the given address.
    Script scriptPubKey = ScriptBuilder.createOutputScript(address);
    // Signature Script
    Script scriptSig = input.getScriptSig();

    // Adding output that involves Amount and Script
    tx.addOutput(coin, scriptPubKey);
    System.out.println("Script pub key: " + scriptPubKey);

    //Adding input to the raw transaction
    tx.addInput(input);
    System.out.println("After adding inputs: " + tx.toString());
}
</code></pre>

<p><strong>Signing Transaction from Offline Wallet Using Private Key</strong></p>

<pre><code>private String signTx()
{
    // TX Hash from Watching wallet
    String unSignHash = "f348ceadcb66e811799aa543107b63b9c92afebda5bc47d11222ba218df6638f";
    // Signing Hash with private key
    System.out.println("Signed Hash from prv key: " + DatatypeConverter.printHexBinary(prvKey().sign(Sha256Hash.wrap(unSignHash)).encodeToDER()));
}
</code></pre>

<p><strong>Then I have added one more input in raw transaction</strong></p>

<pre><code> input.setScriptSig(ScriptBuilder.createInputScript(new TransactionSignature(OfflineWallet.prvKey().sign(hash), Transaction.SigHash.ALL, true), OfflineWallet.ecKey()));
        tx.addInput(input);
</code></pre>

<p><strong>After that my raw transaction looks like this</strong> </p>

<pre><code>310cc780e414c1c64a1d8ed190df10aa5489183e72a73c000e42ff7cc00e41bb
     in   PUSHDATA(64)[35666630316436316536376337303663623739363533616131653761643263373235346238343131363765306133343035353530346333356337323430343639]
          outpoint:83c02edc7d30a63fd123835e0d966d3287ee28729e01d01a7119c055d975fd83:0
     in   PUSHDATA(71)[30440220598202f4822d3c18853f08df4c75bc65f8b42e1c815c6bfeecf53e389c764de80220060b6df8b206eebbd01400f3cc902a0afb24b365b4313f00de87b744a986378501] PUSHDATA(33)[02a0fbbfc754cdda4bc84874af8d5d8bdb8b0271a08a847a856afb3d4e2cd657e0]
          outpoint:c90cb5e1149430b1c99983626ce57588666c7d4e595089235ec0b2496ecae525:1 hash160:ff63fce58aeea04b03bfe29b85ec1cb4827eafad
     in   PUSHDATA(72)[30450221009b12dae5c6edb6f34df18637b06ae742ecb448b6a6797aadb22b6fb728dcba3c02205c95d2553a5d14d6c5bf3891f2dbc7cc3d49ba97ed5fdb6180c3e6225ea88efb81] PUSHDATA(33)[02a656694f40553fe33c06161189f13038a44ab545548b8d2f988ba54b766215d7]
          outpoint:0000000000000000000000000000000000000000000000000000000000000000:4294967295
     out  DUP HASH160 PUSHDATA(20)[ff63fce58aeea04b03bfe29b85ec1cb4827eafad] EQUALVERIFY CHECKSIG 0.00001 BTC
     out  DUP HASH160 PUSHDATA(20)[ff63fce58aeea04b03bfe29b85ec1cb4827eafad] EQUALVERIFY CHECKSIG 0.00001 BTC
     prps UNKNOWN
</code></pre>

<p><strong>Then i am broadcasting it using</strong> </p>

<pre><code>try
        {
            kit.wallet().sendCoins(SendRequest.forTx(tx));
        }
        catch (InsufficientMoneyException e)
        {
            e.printStackTrace();
        }
</code></pre>

<p>I am getting the exception here.</p>

<p>I don't know what I am doing wrong here, as I think my tx hash is just fine, all I have to do is broadcast the transaction into the network from watching wallet, which I am also doing but cannot succeed.
I would really appreciate if someone helps me to find my mistake and broadcasting the signed transaction from watching wallet.</p>

CC BY-SA 4.0
2018-05-26T12:35:24.057Z
i'm not able to find used input, are you using vaild input with correct vout number?
Tailer
CC BY-SA 4.0
2018-05-26T13:58:29.280Z
i am creating input by invoking TransactionInput object, i think i didn't provide the vout and also no idea about it, how to use it here.
Zombie
<transactions><bitcoinj><java>
Broadcasting signed transaction from Watching wallet using bitcoinj
Zombie
# Broadcasting signed transaction from Watching wallet using bitcoinj

(Asked by: username_0 on 2018-05-24)

I am working with watching wallet and Offline wallet using bitcoinj,
I created Watching Wallet using tpub key of Offline Wallet

I am receiving payment on watching wallet **Fine**,
now I want to spend coins from watching wallet after Signing my transaction from offline wallet

What I am doing is creating rawTx from the Watching Wallet and then signing it with the private key from Offline Wallet but when I broadcast it, it throws an exception:

```
InsufficientMoneyException

```

But my wallet balance is 0.23389 BTC
, its not spendable balance as my watching wallet shows

```
Wallet containing 0.23389 BTC (spendable: 0.00 BTC)

```

This is not spendable because we cannot spend coins from watching wallet unless you sign it with the corresponding private key

Below is my code: As i am trying to sign transaction from my offline wallet, so i can spend coins from watching wallet

**For creating Raw Transaction from Watching Wallet**

```
private void bla()
{
    Coin coin = Coin.parseCoin("0.01");
    Address address = Address.fromBase58(params, "n4oLPFUGvohSdDxvJS3amXvfE1GEdZBddd");
    Transaction tx = new Transaction(params);
    System.out.println("Raw TX: " + tx.toString());
    byte[] bytes = Script.createInputScript("5ff01d61e67c706cb79653aa1e7ad2c7254b841167e0a34055504c35c7240469".getBytes()); // tx hash 
    TransactionInput input = null;
    List<Transaction> list = kit.wallet().getTransactionsByTime();
    for(Transaction t: list)
    {
        input = t.getInput(0);
    }

    //Creates a scriptPubKey that encodes payment to the given address.
    Script scriptPubKey = ScriptBuilder.createOutputScript(address);
    // Signature Script
    Script scriptSig = input.getScriptSig();

    // Adding output that involves Amount and Script
    tx.addOutput(coin, scriptPubKey);
    System.out.println("Script pub key: " + scriptPubKey);

    //Adding input to the raw transaction
    tx.addInput(input);
    System.out.println("After adding inputs: " + tx.toString());
}

```

**Signing Transaction from Offline Wallet Using Private Key**

```
private String signTx()
{
    // TX Hash from Watching wallet
    String unSignHash = "f348ceadcb66e811799aa543107b63b9c92afebda5bc47d11222ba218df6638f";
    // Signing Hash with private key
    System.out.println("Signed Hash from prv key: " + DatatypeConverter.printHexBinary(prvKey().sign(Sha256Hash.wrap(unSignHash)).encodeToDER()));
}

```

**Then I have added one more input in raw transaction**

```
 input.setScriptSig(ScriptBuilder.createInputScript(new TransactionSignature(OfflineWallet.prvKey().sign(hash), Transaction.SigHash.ALL, true), OfflineWallet.ecKey()));
        tx.addInput(input);

```

**After that my raw transaction looks like this**

```
310cc780e414c1c64a1d8ed190df10aa5489183e72a73c000e42ff7cc00e41bb
     in   PUSHDATA(64)[35666630316436316536376337303663623739363533616131653761643263373235346238343131363765306133343035353530346333356337323430343639]
          outpoint:83c02edc7d30a63fd123835e0d966d3287ee28729e01d01a7119c055d975fd83:0
     in   PUSHDATA(71)[30440220598202f4822d3c18853f08df4c75bc65f8b42e1c815c6bfeecf53e389c764de80220060b6df8b206eebbd01400f3cc902a0afb24b365b4313f00de87b744a986378501] PUSHDATA(33)[02a0fbbfc754cdda4bc84874af8d5d8bdb8b0271a08a847a856afb3d4e2cd657e0]
          outpoint:c90cb5e1149430b1c99983626ce57588666c7d4e595089235ec0b2496ecae525:1 hash160:ff63fce58aeea04b03bfe29b85ec1cb4827eafad
     in   PUSHDATA(72)[30450221009b12dae5c6edb6f34df18637b06ae742ecb448b6a6797aadb22b6fb728dcba3c02205c95d2553a5d14d6c5bf3891f2dbc7cc3d49ba97ed5fdb6180c3e6225ea88efb81] PUSHDATA(33)[02a656694f40553fe33c06161189f13038a44ab545548b8d2f988ba54b766215d7]
          outpoint:0000000000000000000000000000000000000000000000000000000000000000:4294967295
     out  DUP HASH160 PUSHDATA(20)[ff63fce58aeea04b03bfe29b85ec1cb4827eafad] EQUALVERIFY CHECKSIG 0.00001 BTC
     out  DUP HASH160 PUSHDATA(20)[ff63fce58aeea04b03bfe29b85ec1cb4827eafad] EQUALVERIFY CHECKSIG 0.00001 BTC
     prps UNKNOWN

```

**Then i am broadcasting it using**

```
try
        {
            kit.wallet().sendCoins(SendRequest.forTx(tx));
        }
        catch (InsufficientMoneyException e)
        {
            e.printStackTrace();
        }

```

I am getting the exception here.

I don't know what I am doing wrong here, as I think my tx hash is just fine, all I have to do is broadcast the transaction into the network from watching wallet, which I am also doing but cannot succeed.
I would really appreciate if someone helps me to find my mistake and broadcasting the signed transaction from watching wallet.

**Tags:** transactions, bitcoinj, java

> **Comments:**
> **username_1**: i'm not able to find used input, are you using vaild input with correct vout number?  
> **username_0**: i am creating input by invoking TransactionInput object, i think i didn't provide the vout and also no idea about it, how to use it here.  

---

## 0 answers

