Commit 4e29e4fb authored by Andreas Schildbach's avatar Andreas Schildbach

Wallet: Make SendRequest a top level class.

parent 1e66b9a8
...@@ -26,6 +26,7 @@ import org.bitcoinj.core.*; ...@@ -26,6 +26,7 @@ import org.bitcoinj.core.*;
import org.bitcoinj.crypto.TransactionSignature; import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.utils.Threading; import org.bitcoinj.utils.Threading;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener; import org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -239,7 +240,7 @@ public abstract class PaymentChannelClientState { ...@@ -239,7 +240,7 @@ public abstract class PaymentChannelClientState {
* channel. For example if you want it to only use specific coins, you can adjust the coin selector here. * channel. For example if you want it to only use specific coins, you can adjust the coin selector here.
* The default implementation does nothing. * The default implementation does nothing.
*/ */
protected void editContractSendRequest(Wallet.SendRequest req) { protected void editContractSendRequest(SendRequest req) {
} }
/** /**
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.bitcoinj.protocols.channels; package org.bitcoinj.protocols.channels;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
...@@ -215,13 +216,13 @@ public abstract class PaymentChannelServerState { ...@@ -215,13 +216,13 @@ public abstract class PaymentChannelServerState {
} }
// Create a payment transaction with valueToMe going back to us // Create a payment transaction with valueToMe going back to us
protected synchronized Wallet.SendRequest makeUnsignedChannelContract(Coin valueToMe) { protected synchronized SendRequest makeUnsignedChannelContract(Coin valueToMe) {
Transaction tx = new Transaction(wallet.getParams()); Transaction tx = new Transaction(wallet.getParams());
if (!getTotalValue().subtract(valueToMe).equals(Coin.ZERO)) { if (!getTotalValue().subtract(valueToMe).equals(Coin.ZERO)) {
tx.addOutput(getTotalValue().subtract(valueToMe), getClientKey().toAddress(wallet.getParams())); tx.addOutput(getTotalValue().subtract(valueToMe), getClientKey().toAddress(wallet.getParams()));
} }
tx.addInput(contract.getOutput(0)); tx.addInput(contract.getOutput(0));
return Wallet.SendRequest.forTx(tx); return SendRequest.forTx(tx);
} }
/** /**
...@@ -248,7 +249,7 @@ public abstract class PaymentChannelServerState { ...@@ -248,7 +249,7 @@ public abstract class PaymentChannelServerState {
if (newValueToMe.compareTo(bestValueToMe) < 0) if (newValueToMe.compareTo(bestValueToMe) < 0)
throw new ValueOutOfRangeException("Attempt to roll back payment on the channel."); throw new ValueOutOfRangeException("Attempt to roll back payment on the channel.");
Wallet.SendRequest req = makeUnsignedChannelContract(newValueToMe); SendRequest req = makeUnsignedChannelContract(newValueToMe);
if (!fullyUsedUp && refundSize.isLessThan(req.tx.getOutput(0).getMinNonDustValue())) if (!fullyUsedUp && refundSize.isLessThan(req.tx.getOutput(0).getMinNonDustValue()))
throw new ValueOutOfRangeException("Attempt to refund negative value or value too small to be accepted by the network"); throw new ValueOutOfRangeException("Attempt to refund negative value or value too small to be accepted by the network");
......
...@@ -23,6 +23,7 @@ import org.bitcoinj.crypto.TransactionSignature; ...@@ -23,6 +23,7 @@ import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.wallet.AllowUnconfirmedCoinSelector; import org.bitcoinj.wallet.AllowUnconfirmedCoinSelector;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.spongycastle.crypto.params.KeyParameter; import org.spongycastle.crypto.params.KeyParameter;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
...@@ -136,7 +137,7 @@ public class PaymentChannelV1ClientState extends PaymentChannelClientState { ...@@ -136,7 +137,7 @@ public class PaymentChannelV1ClientState extends PaymentChannelClientState {
TransactionOutput multisigOutput = template.addOutput(totalValue, ScriptBuilder.createMultiSigOutputScript(2, keys)); TransactionOutput multisigOutput = template.addOutput(totalValue, ScriptBuilder.createMultiSigOutputScript(2, keys));
if (multisigOutput.isDust()) if (multisigOutput.isDust())
throw new ValueOutOfRangeException("totalValue too small to use"); throw new ValueOutOfRangeException("totalValue too small to use");
Wallet.SendRequest req = Wallet.SendRequest.forTx(template); SendRequest req = SendRequest.forTx(template);
req.coinSelector = AllowUnconfirmedCoinSelector.get(); req.coinSelector = AllowUnconfirmedCoinSelector.get();
editContractSendRequest(req); editContractSendRequest(req);
req.shuffleOutputs = false; // TODO: Fix things so shuffling is usable. req.shuffleOutputs = false; // TODO: Fix things so shuffling is usable.
......
...@@ -21,6 +21,7 @@ import org.bitcoinj.core.*; ...@@ -21,6 +21,7 @@ import org.bitcoinj.core.*;
import org.bitcoinj.crypto.TransactionSignature; import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
...@@ -210,7 +211,7 @@ public class PaymentChannelV1ServerState extends PaymentChannelServerState { ...@@ -210,7 +211,7 @@ public class PaymentChannelV1ServerState extends PaymentChannelServerState {
} }
Transaction tx = null; Transaction tx = null;
try { try {
Wallet.SendRequest req = makeUnsignedChannelContract(bestValueToMe); SendRequest req = makeUnsignedChannelContract(bestValueToMe);
tx = req.tx; tx = req.tx;
// Provide a throwaway signature so that completeTx won't complain out about unsigned inputs it doesn't // Provide a throwaway signature so that completeTx won't complain out about unsigned inputs it doesn't
// know how to sign. Note that this signature does actually have to be valid, so we can't use a dummy // know how to sign. Note that this signature does actually have to be valid, so we can't use a dummy
......
...@@ -24,6 +24,7 @@ import org.bitcoinj.crypto.TransactionSignature; ...@@ -24,6 +24,7 @@ import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.wallet.AllowUnconfirmedCoinSelector; import org.bitcoinj.wallet.AllowUnconfirmedCoinSelector;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -110,7 +111,7 @@ public class PaymentChannelV2ClientState extends PaymentChannelClientState { ...@@ -110,7 +111,7 @@ public class PaymentChannelV2ClientState extends PaymentChannelClientState {
ScriptBuilder.createP2SHOutputScript(redeemScript)); ScriptBuilder.createP2SHOutputScript(redeemScript));
if (transactionOutput.isDust()) if (transactionOutput.isDust())
throw new ValueOutOfRangeException("totalValue too small to use"); throw new ValueOutOfRangeException("totalValue too small to use");
Wallet.SendRequest req = Wallet.SendRequest.forTx(template); SendRequest req = SendRequest.forTx(template);
req.coinSelector = AllowUnconfirmedCoinSelector.get(); req.coinSelector = AllowUnconfirmedCoinSelector.get();
editContractSendRequest(req); editContractSendRequest(req);
req.shuffleOutputs = false; // TODO: Fix things so shuffling is usable. req.shuffleOutputs = false; // TODO: Fix things so shuffling is usable.
......
...@@ -26,6 +26,7 @@ import org.bitcoinj.core.*; ...@@ -26,6 +26,7 @@ import org.bitcoinj.core.*;
import org.bitcoinj.crypto.TransactionSignature; import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -165,7 +166,7 @@ public class PaymentChannelV2ServerState extends PaymentChannelServerState { ...@@ -165,7 +166,7 @@ public class PaymentChannelV2ServerState extends PaymentChannelServerState {
} }
Transaction tx = null; Transaction tx = null;
try { try {
Wallet.SendRequest req = makeUnsignedChannelContract(bestValueToMe); SendRequest req = makeUnsignedChannelContract(bestValueToMe);
tx = req.tx; tx = req.tx;
// Provide a throwaway signature so that completeTx won't complain out about unsigned inputs it doesn't // Provide a throwaway signature so that completeTx won't complain out about unsigned inputs it doesn't
// know how to sign. Note that this signature does actually have to be valid, so we can't use a dummy // know how to sign. Note that this signature does actually have to be valid, so we can't use a dummy
......
...@@ -20,7 +20,7 @@ import org.bitcoinj.params.MainNetParams; ...@@ -20,7 +20,7 @@ import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.protocols.payments.PaymentProtocol.PkiVerificationData; import org.bitcoinj.protocols.payments.PaymentProtocol.PkiVerificationData;
import org.bitcoinj.uri.BitcoinURI; import org.bitcoinj.uri.BitcoinURI;
import org.bitcoinj.utils.Threading; import org.bitcoinj.utils.Threading;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.SendRequest;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
...@@ -293,13 +293,13 @@ public class PaymentSession { ...@@ -293,13 +293,13 @@ public class PaymentSession {
} }
/** /**
* Returns a {@link Wallet.SendRequest} suitable for broadcasting to the network. * Returns a {@link SendRequest} suitable for broadcasting to the network.
*/ */
public Wallet.SendRequest getSendRequest() { public SendRequest getSendRequest() {
Transaction tx = new Transaction(params); Transaction tx = new Transaction(params);
for (Protos.Output output : paymentDetails.getOutputsList()) for (Protos.Output output : paymentDetails.getOutputsList())
tx.addOutput(new TransactionOutput(params, tx, Coin.valueOf(output.getAmount()), output.getScript().toByteArray())); tx.addOutput(new TransactionOutput(params, tx, Coin.valueOf(output.getAmount()), output.getScript().toByteArray()));
return Wallet.SendRequest.forTx(tx).fromPaymentDetails(paymentDetails); return SendRequest.forTx(tx).fromPaymentDetails(paymentDetails);
} }
/** /**
......
...@@ -50,7 +50,7 @@ public interface EncryptableKeyChain extends KeyChain { ...@@ -50,7 +50,7 @@ public interface EncryptableKeyChain extends KeyChain {
/** /**
* Decrypt the key chain with the given AES key and whatever {@link KeyCrypter} is already set. Note that if you * Decrypt the key chain with the given AES key and whatever {@link KeyCrypter} is already set. Note that if you
* just want to spend money from an encrypted wallet, don't decrypt the whole thing first. Instead, set the * just want to spend money from an encrypted wallet, don't decrypt the whole thing first. Instead, set the
* {@link org.bitcoinj.wallet.Wallet.SendRequest#aesKey} field before asking the wallet to build the send. * {@link org.bitcoinj.wallet.SendRequest#aesKey} field before asking the wallet to build the send.
* *
* @param aesKey AES key to use (normally created using KeyCrypter#deriveKey and cached as it is time consuming to * @param aesKey AES key to use (normally created using KeyCrypter#deriveKey and cached as it is time consuming to
* create from a password) * create from a password)
......
This diff is collapsed.
...@@ -25,6 +25,7 @@ import org.bitcoinj.store.BlockStoreException; ...@@ -25,6 +25,7 @@ import org.bitcoinj.store.BlockStoreException;
import org.bitcoinj.store.FullPrunedBlockStore; import org.bitcoinj.store.FullPrunedBlockStore;
import org.bitcoinj.utils.BlockFileLoader; import org.bitcoinj.utils.BlockFileLoader;
import org.bitcoinj.utils.BriefLogFormatter; import org.bitcoinj.utils.BriefLogFormatter;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.bitcoinj.wallet.WalletTransaction; import org.bitcoinj.wallet.WalletTransaction;
import org.junit.Before; import org.junit.Before;
...@@ -327,7 +328,7 @@ public abstract class AbstractFullPrunedBlockChainTest { ...@@ -327,7 +328,7 @@ public abstract class AbstractFullPrunedBlockChainTest {
ECKey toKey2 = new ECKey(); ECKey toKey2 = new ECKey();
Coin amount2 = amount.divide(2); Coin amount2 = amount.divide(2);
Address address2 = new Address(PARAMS, toKey2.getPubKeyHash()); Address address2 = new Address(PARAMS, toKey2.getPubKeyHash());
Wallet.SendRequest req = Wallet.SendRequest.to(address2, amount2); SendRequest req = SendRequest.to(address2, amount2);
wallet.completeTx(req); wallet.completeTx(req);
wallet.commitTx(req.tx); wallet.commitTx(req.tx);
Coin fee = Coin.ZERO; Coin fee = Coin.ZERO;
......
...@@ -21,6 +21,7 @@ import com.google.common.util.concurrent.*; ...@@ -21,6 +21,7 @@ import com.google.common.util.concurrent.*;
import org.bitcoinj.core.listeners.TransactionConfidenceEventListener; import org.bitcoinj.core.listeners.TransactionConfidenceEventListener;
import org.bitcoinj.testing.*; import org.bitcoinj.testing.*;
import org.bitcoinj.utils.*; import org.bitcoinj.utils.*;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.junit.*; import org.junit.*;
import org.junit.runner.*; import org.junit.runner.*;
...@@ -244,7 +245,7 @@ public class TransactionBroadcastTest extends TestWithPeerGroup { ...@@ -244,7 +245,7 @@ public class TransactionBroadcastTest extends TestWithPeerGroup {
// Do the same thing with an offline transaction. // Do the same thing with an offline transaction.
peerGroup.removeWallet(wallet); peerGroup.removeWallet(wallet);
Wallet.SendRequest req = Wallet.SendRequest.to(dest, valueOf(2, 0)); SendRequest req = SendRequest.to(dest, valueOf(2, 0));
Transaction t3 = checkNotNull(wallet.sendCoinsOffline(req)); Transaction t3 = checkNotNull(wallet.sendCoinsOffline(req));
assertNull(outbound(p1)); // Nothing sent. assertNull(outbound(p1)); // Nothing sent.
// Add the wallet to the peer group (simulate initialization). Transactions should be announced. // Add the wallet to the peer group (simulate initialization). Transactions should be announced.
......
...@@ -19,7 +19,7 @@ import org.bitcoinj.params.MainNetParams; ...@@ -19,7 +19,7 @@ import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.testing.TestWithWallet; import org.bitcoinj.testing.TestWithWallet;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.SendRequest;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
...@@ -55,7 +55,7 @@ public class TransactionOutputTest extends TestWithWallet { ...@@ -55,7 +55,7 @@ public class TransactionOutputTest extends TestWithWallet {
Script scriptPubKey = ScriptBuilder.createMultiSigOutputScript(2, keys); Script scriptPubKey = ScriptBuilder.createMultiSigOutputScript(2, keys);
multiSigTransaction.addOutput(Coin.COIN, scriptPubKey); multiSigTransaction.addOutput(Coin.COIN, scriptPubKey);
Wallet.SendRequest req = Wallet.SendRequest.forTx(multiSigTransaction); SendRequest req = SendRequest.forTx(multiSigTransaction);
this.wallet.completeTx(req); this.wallet.completeTx(req);
TransactionOutput multiSigTransactionOutput = multiSigTransaction.getOutput(0); TransactionOutput multiSigTransactionOutput = multiSigTransaction.getOutput(0);
......
...@@ -20,8 +20,8 @@ import org.bitcoinj.core.*; ...@@ -20,8 +20,8 @@ import org.bitcoinj.core.*;
import org.bitcoinj.script.Script; import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptBuilder;
import org.bitcoinj.testing.TestWithWallet; import org.bitcoinj.testing.TestWithWallet;
import org.bitcoinj.wallet.SendRequest;
import org.bitcoinj.wallet.Wallet; import org.bitcoinj.wallet.Wallet;
import org.bitcoinj.wallet.Wallet.SendRequest;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
...@@ -340,7 +340,7 @@ public class PaymentChannelStateTest extends TestWithWallet { ...@@ -340,7 +340,7 @@ public class PaymentChannelStateTest extends TestWithWallet {
// we can broadcast the refund and get our balance back. // we can broadcast the refund and get our balance back.
// Spend the client wallet's one coin // Spend the client wallet's one coin
Transaction spendCoinTx = wallet.sendCoinsOffline(Wallet.SendRequest.to(new ECKey().toAddress(PARAMS), COIN)); Transaction spendCoinTx = wallet.sendCoinsOffline(SendRequest.to(new ECKey().toAddress(PARAMS), COIN));
assertEquals(Coin.ZERO, wallet.getBalance()); assertEquals(Coin.ZERO, wallet.getBalance());
chain.add(makeSolvedTestBlock(blockStore.getChainHead().getHeader(), spendCoinTx, createFakeTx(PARAMS, CENT, myAddress))); chain.add(makeSolvedTestBlock(blockStore.getChainHead().getHeader(), spendCoinTx, createFakeTx(PARAMS, CENT, myAddress)));
assertEquals(CENT, wallet.getBalance()); assertEquals(CENT, wallet.getBalance());
...@@ -691,7 +691,7 @@ public class PaymentChannelStateTest extends TestWithWallet { ...@@ -691,7 +691,7 @@ public class PaymentChannelStateTest extends TestWithWallet {
Context.propagate(new Context(PARAMS, 100, Coin.ZERO, true)); Context.propagate(new Context(PARAMS, 100, Coin.ZERO, true));
// Spend the client wallet's one coin // Spend the client wallet's one coin
final SendRequest request = Wallet.SendRequest.to(new ECKey().toAddress(PARAMS), COIN); final SendRequest request = SendRequest.to(new ECKey().toAddress(PARAMS), COIN);
request.ensureMinRequiredFee = false; request.ensureMinRequiredFee = false;
wallet.sendCoinsOffline(request); wallet.sendCoinsOffline(request);
assertEquals(Coin.ZERO, wallet.getBalance()); assertEquals(Coin.ZERO, wallet.getBalance());
...@@ -819,7 +819,7 @@ public class PaymentChannelStateTest extends TestWithWallet { ...@@ -819,7 +819,7 @@ public class PaymentChannelStateTest extends TestWithWallet {
case VERSION_1: case VERSION_1:
clientState = new PaymentChannelV1ClientState(wallet, myKey, ECKey.fromPublicOnly(serverKey.getPubKey()), CENT, EXPIRE_TIME) { clientState = new PaymentChannelV1ClientState(wallet, myKey, ECKey.fromPublicOnly(serverKey.getPubKey()), CENT, EXPIRE_TIME) {
@Override @Override
protected void editContractSendRequest(Wallet.SendRequest req) { protected void editContractSendRequest(SendRequest req) {
req.coinSelector = wallet.getCoinSelector(); req.coinSelector = wallet.getCoinSelector();
} }
}; };
...@@ -828,7 +828,7 @@ public class PaymentChannelStateTest extends TestWithWallet { ...@@ -828,7 +828,7 @@ public class PaymentChannelStateTest extends TestWithWallet {
case VERSION_2: case VERSION_2:
clientState = new PaymentChannelV2ClientState(wallet, myKey, ECKey.fromPublicOnly(serverKey.getPubKey()), CENT, EXPIRE_TIME) { clientState = new PaymentChannelV2ClientState(wallet, myKey, ECKey.fromPublicOnly(serverKey.getPubKey()), CENT, EXPIRE_TIME) {
@Override @Override
protected void editContractSendRequest(Wallet.SendRequest req) { protected void editContractSendRequest(SendRequest req) {
req.coinSelector = wallet.getCoinSelector(); req.coinSelector = wallet.getCoinSelector();
} }
}; };
......
...@@ -60,7 +60,6 @@ import com.google.common.collect.Lists; ...@@ -60,7 +60,6 @@ import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import org.bitcoinj.wallet.Protos.Wallet.EncryptionType; import org.bitcoinj.wallet.Protos.Wallet.EncryptionType;
import org.bitcoinj.wallet.Wallet.SendRequest;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
...@@ -307,7 +306,7 @@ public class WalletTest extends TestWithWallet { ...@@ -307,7 +306,7 @@ public class WalletTest extends TestWithWallet {
// Try to send too much and fail. // Try to send too much and fail.
Coin vHuge = valueOf(10, 0); Coin vHuge = valueOf(10, 0);
Wallet.SendRequest req = Wallet.SendRequest.to(destination, vHuge); SendRequest req = SendRequest.to(destination, vHuge);
try { try {
wallet.completeTx(req); wallet.completeTx(req);
fail(); fail();
...@@ -317,7 +316,7 @@ public class WalletTest extends TestWithWallet { ...@@ -317,7 +316,7 @@ public class WalletTest extends TestWithWallet {
// Prepare to send. // Prepare to send.
Coin v2 = valueOf(0, 50); Coin v2 = valueOf(0, 50);
req = Wallet.SendRequest.to(destination, v2); req = SendRequest.to(destination, v2);
if (encryptedWallet != null) { if (encryptedWallet != null) {
KeyCrypter keyCrypter = encryptedWallet.getKeyCrypter(); KeyCrypter keyCrypter = encryptedWallet.getKeyCrypter();
...@@ -334,7 +333,7 @@ public class WalletTest extends TestWithWallet { ...@@ -334,7 +333,7 @@ public class WalletTest extends TestWithWallet {
assertEquals("Wrong number of ALL", 1, wallet.getTransactions(true).size()); assertEquals("Wrong number of ALL", 1, wallet.getTransactions(true).size());
// Try to create a send with a fee but the wrong password (this should fail). // Try to create a send with a fee but the wrong password (this should fail).
req = Wallet.SendRequest.to(destination, v2); req = SendRequest.to(destination, v2);
req.aesKey = wrongAesKey; req.aesKey = wrongAesKey;
try { try {
...@@ -348,7 +347,7 @@ public class WalletTest extends TestWithWallet { ...@@ -348,7 +347,7 @@ public class WalletTest extends TestWithWallet {
assertEquals("Wrong number of ALL", 1, wallet.getTransactions(true).size()); assertEquals("Wrong number of ALL", 1, wallet.getTransactions(true).size());
// Create a send with a fee with the correct password (this should succeed). // Create a send with a fee with the correct password (this should succeed).
req = Wallet.SendRequest.to(destination, v2); req = SendRequest.to(destination, v2);
req.aesKey = aesKey; req.aesKey = aesKey;
} }
...@@ -446,7 +445,7 @@ public class WalletTest extends TestWithWallet { ...@@ -446,7 +445,7 @@ public class WalletTest extends TestWithWallet {
wallet = roundTrip(wallet); wallet = roundTrip(wallet);
Coin v3 = valueOf(0, 50); Coin v3 = valueOf(0, 50);
assertEquals(v3, wallet.getBalance()); assertEquals(v3, wallet.getBalance());
Wallet.SendRequest req = Wallet.SendRequest.to(OTHER_ADDRESS, valueOf(0, 48)); SendRequest req = SendRequest.to(OTHER_ADDRESS, valueOf(0, 48));
req.aesKey = aesKey; req.aesKey = aesKey;
req.shuffleOutputs = false; req.shuffleOutputs = false;
wallet.completeTx(req); wallet.completeTx(req);
...@@ -2106,7 +2105,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2106,7 +2105,7 @@ public class WalletTest extends TestWithWallet {
assertEquals(key.getPubKeyPoint(), encryptedWallet.getImportedKeys().get(0).getPubKeyPoint()); assertEquals(key.getPubKeyPoint(), encryptedWallet.getImportedKeys().get(0).getPubKeyPoint());
sendMoneyToWallet(encryptedWallet, AbstractBlockChain.NewBlockType.BEST_CHAIN, Coin.COIN, key.toAddress(PARAMS)); sendMoneyToWallet(encryptedWallet, AbstractBlockChain.NewBlockType.BEST_CHAIN, Coin.COIN, key.toAddress(PARAMS));
assertEquals(Coin.COIN, encryptedWallet.getBalance()); assertEquals(Coin.COIN, encryptedWallet.getBalance());
SendRequest req = Wallet.SendRequest.emptyWallet(OTHER_ADDRESS); SendRequest req = SendRequest.emptyWallet(OTHER_ADDRESS);
req.aesKey = checkNotNull(encryptedWallet.getKeyCrypter()).deriveKey(PASSWORD1); req.aesKey = checkNotNull(encryptedWallet.getKeyCrypter()).deriveKey(PASSWORD1);
encryptedWallet.sendCoinsOffline(req); encryptedWallet.sendCoinsOffline(req);
} }
...@@ -2141,7 +2140,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2141,7 +2140,7 @@ public class WalletTest extends TestWithWallet {
for (int i = 0; i < 3100; i++) { for (int i = 0; i < 3100; i++) {
tx.addOutput(v, new Address(PARAMS, bits)); tx.addOutput(v, new Address(PARAMS, bits));
} }
Wallet.SendRequest req = Wallet.SendRequest.forTx(tx); SendRequest req = SendRequest.forTx(tx);
wallet.completeTx(req); wallet.completeTx(req);
} }
...@@ -2153,7 +2152,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2153,7 +2152,7 @@ public class WalletTest extends TestWithWallet {
Coin messagePrice = Coin.ZERO; Coin messagePrice = Coin.ZERO;
Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes()); Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes());
tx.addOutput(messagePrice, script); tx.addOutput(messagePrice, script);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
request.ensureMinRequiredFee = true; request.ensureMinRequiredFee = true;
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2166,7 +2165,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2166,7 +2165,7 @@ public class WalletTest extends TestWithWallet {
Coin messagePrice = CENT; Coin messagePrice = CENT;
Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes()); Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes());
tx.addOutput(messagePrice, script); tx.addOutput(messagePrice, script);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2179,7 +2178,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2179,7 +2178,7 @@ public class WalletTest extends TestWithWallet {
Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes()); Script script = ScriptBuilder.createOpReturnScript("hello world!".getBytes());
tx.addOutput(CENT, OTHER_ADDRESS); tx.addOutput(CENT, OTHER_ADDRESS);
tx.addOutput(messagePrice, script); tx.addOutput(messagePrice, script);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2193,7 +2192,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2193,7 +2192,7 @@ public class WalletTest extends TestWithWallet {
Script script2 = ScriptBuilder.createOpReturnScript("hello world 2!".getBytes()); Script script2 = ScriptBuilder.createOpReturnScript("hello world 2!".getBytes());
tx.addOutput(messagePrice, script1); tx.addOutput(messagePrice, script1);
tx.addOutput(messagePrice, script2); tx.addOutput(messagePrice, script2);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
request.ensureMinRequiredFee = true; request.ensureMinRequiredFee = true;
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2203,7 +2202,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2203,7 +2202,7 @@ public class WalletTest extends TestWithWallet {
// Tests sending dust, should throw DustySendRequested. // Tests sending dust, should throw DustySendRequested.
Transaction tx = new Transaction(PARAMS); Transaction tx = new Transaction(PARAMS);
tx.addOutput(Transaction.MIN_NONDUST_OUTPUT.subtract(SATOSHI), OTHER_ADDRESS); tx.addOutput(Transaction.MIN_NONDUST_OUTPUT.subtract(SATOSHI), OTHER_ADDRESS);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
request.ensureMinRequiredFee = true; request.ensureMinRequiredFee = true;
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2217,7 +2216,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2217,7 +2216,7 @@ public class WalletTest extends TestWithWallet {
tx.addOutput(c, OTHER_ADDRESS); tx.addOutput(c, OTHER_ADDRESS);
tx.addOutput(c, OTHER_ADDRESS); tx.addOutput(c, OTHER_ADDRESS);
tx.addOutput(c, OTHER_ADDRESS); tx.addOutput(c, OTHER_ADDRESS);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2228,7 +2227,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2228,7 +2227,7 @@ public class WalletTest extends TestWithWallet {
Transaction tx = new Transaction(PARAMS); Transaction tx = new Transaction(PARAMS);
tx.addOutput(Coin.ZERO, ScriptBuilder.createOpReturnScript("hello world!".getBytes())); tx.addOutput(Coin.ZERO, ScriptBuilder.createOpReturnScript("hello world!".getBytes()));
tx.addOutput(Coin.SATOSHI, OTHER_ADDRESS); tx.addOutput(Coin.SATOSHI, OTHER_ADDRESS);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
request.ensureMinRequiredFee = true; request.ensureMinRequiredFee = true;
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -2240,7 +2239,7 @@ public class WalletTest extends TestWithWallet { ...@@ -2240,7 +2239,7 @@ public class WalletTest extends TestWithWallet {
Transaction tx = new Transaction(PARAMS); Transaction tx = new Transaction(PARAMS);
tx.addOutput(Coin.CENT, ScriptBuilder.createOpReturnScript("hello world!".getBytes())); tx.addOutput(Coin.CENT, ScriptBuilder.createOpReturnScript("hello world!".getBytes()));
tx.addOutput(Transaction.MIN_NONDUST_OUTPUT.subtract(SATOSHI), OTHER_ADDRESS); tx.addOutput(Transaction.MIN_NONDUST_OUTPUT.subtract(SATOSHI), OTHER_ADDRESS);
SendRequest request = Wallet.SendRequest.forTx(tx); SendRequest request = SendRequest.forTx(tx);
request.ensureMinRequiredFee = true; request.ensureMinRequiredFee = true;
wallet.completeTx(request); wallet.completeTx(request);
} }
...@@ -3148,7 +3147,7 @@ public class WalletTest extends TestWithWallet { ...@@ -3148,7 +3147,7 @@ public class WalletTest extends TestWithWallet {
for (TransactionInput input : req.tx.getInputs()) for (TransactionInput input : req.tx.getInputs())
input.clearScriptBytes(); input.clearScriptBytes();
Wallet watching = Wallet.fromWatchingKey(PARAMS, wallet.getWatchingKey().dropParent().dropPrivateBytes()); Wallet watching = Wallet.fromWatchingKey(PARAMS, wallet.getWatchingKey().dropParent().dropPrivateBytes());
watching.completeTx(Wallet.SendRequest.forTx(req.tx)); watching.completeTx(SendRequest.forTx(req.tx));
} }
@Test @Test
...@@ -3175,7 +3174,7 @@ public class WalletTest extends TestWithWallet { ...@@ -3175,7 +3174,7 @@ public class WalletTest extends TestWithWallet {
myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS); myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS);
sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, COIN, myAddress); sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, COIN, myAddress);
Wallet.SendRequest req = Wallet.SendRequest.emptyWallet(OTHER_ADDRESS); SendRequest req = SendRequest.emptyWallet(OTHER_ADDRESS);
wallet.completeTx(req); wallet.completeTx(req);
} }
...@@ -3185,7 +3184,7 @@ public class WalletTest extends TestWithWallet { ...@@ -3185,7 +3184,7 @@ public class WalletTest extends TestWithWallet {
myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS); myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS);
sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, COIN, myAddress); sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, COIN, myAddress);
Wallet.SendRequest req = Wallet.SendRequest.emptyWallet(OTHER_ADDRESS); SendRequest req = SendRequest.emptyWallet(OTHER_ADDRESS);
req.missingSigsMode = missSigMode; req.missingSigsMode = missSigMode;
wallet.completeTx(req); wallet.completeTx(req);
TransactionInput input = req.tx.getInput(0); TransactionInput input = req.tx.getInput(0);
...@@ -3214,7 +3213,7 @@ public class WalletTest extends TestWithWallet { ...@@ -3214,7 +3213,7 @@ public class WalletTest extends TestWithWallet {
Transaction t2 = sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, CENT, pub); Transaction t2 = sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, CENT, pub);
Transaction t3 = sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, CENT, priv2); Transaction t3 = sendMoneyToWallet(AbstractBlockChain.NewBlockType.BEST_CHAIN, CENT, priv2);
Wallet.SendRequest req = Wallet.SendRequest.emptyWallet(OTHER_ADDRESS); SendRequest req = SendRequest.emptyWallet(OTHER_ADDRESS);
req.missingSigsMode = missSigMode; req.missingSigsMode = missSigMode;
wallet.completeTx(req); wallet.completeTx(req);
byte[] dummySig = TransactionSignature.dummy().encodeToBitcoin(); byte[] dummySig = TransactionSignature.dummy().encodeToBitcoin();
...@@ -3397,7 +3396,7 @@ public class WalletTest extends TestWithWallet { ...@@ -3397,7 +3396,7 @@ public class WalletTest extends TestWithWallet {
Address myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS); Address myAddress = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS);
sendMoneyToWallet(wallet, AbstractBlockChain.NewBlockType.BEST_CHAIN, COIN, myAddress); sendMoneyToWallet(wallet, AbstractBlockChain.NewBlockType.