diff --git a/core/src/main/java/org/bitcoinj/wallet/DefaultCoinSelector.java b/core/src/main/java/org/bitcoinj/wallet/DefaultCoinSelector.java index 164e57f88..e5bff5bfe 100644 --- a/core/src/main/java/org/bitcoinj/wallet/DefaultCoinSelector.java +++ b/core/src/main/java/org/bitcoinj/wallet/DefaultCoinSelector.java @@ -20,7 +20,7 @@ public class DefaultCoinSelector implements CoinSelector { @Override public CoinSelection select(Coin biTarget, List candidates) { long target = biTarget.value; - HashSet selected = new HashSet(); + ArrayList selected = new ArrayList(); // Sort the inputs by age*value so we get the highest "coindays" spent. // TODO: Consider changing the wallets internal format to track just outputs and keep them ordered. ArrayList sortedOutputs = new ArrayList(candidates); diff --git a/core/src/test/java/org/bitcoinj/wallet/DefaultCoinSelectorTest.java b/core/src/test/java/org/bitcoinj/wallet/DefaultCoinSelectorTest.java index 6fb018c8b..016db9f6b 100644 --- a/core/src/test/java/org/bitcoinj/wallet/DefaultCoinSelectorTest.java +++ b/core/src/test/java/org/bitcoinj/wallet/DefaultCoinSelectorTest.java @@ -29,6 +29,7 @@ import org.junit.Test; import java.net.InetAddress; import java.util.ArrayList; +import java.util.Arrays; import static org.bitcoinj.core.Coin.*; import static com.google.common.base.Preconditions.checkNotNull; @@ -113,4 +114,22 @@ public class DefaultCoinSelectorTest extends TestWithWallet { assertEquals(t1.getOutput(0), candidates.get(1)); assertEquals(t3.getOutput(0), candidates.get(2)); } + + @Test + public void identicalInputs() throws Exception { + // Add four outputs to a transaction with same value and destination. Select them all. + Transaction t = new Transaction(params); + java.util.List outputs = Arrays.asList( + new TransactionOutput(params, t, Coin.valueOf(30302787), myAddress), + new TransactionOutput(params, t, Coin.valueOf(30302787), myAddress), + new TransactionOutput(params, t, Coin.valueOf(30302787), myAddress), + new TransactionOutput(params, t, Coin.valueOf(30302787), myAddress) + ); + t.getConfidence().setConfidenceType(TransactionConfidence.ConfidenceType.BUILDING); + + DefaultCoinSelector selector = new DefaultCoinSelector(); + CoinSelection selection = selector.select(COIN.multiply(2), outputs); + + assertTrue(selection.gathered.size() == 4); + } }