diff --git a/core/src/main/java/org/bitcoinj/core/PeerGroup.java b/core/src/main/java/org/bitcoinj/core/PeerGroup.java index bc2cd07d..39c66b4f 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerGroup.java +++ b/core/src/main/java/org/bitcoinj/core/PeerGroup.java @@ -873,6 +873,9 @@ public class PeerGroup extends AbstractExecutionThreadService implements Transac wallet.setTransactionBroadcaster(this); wallet.addEventListener(walletEventListener, Threading.SAME_THREAD); addPeerFilterProvider(wallet); + for (Peer peer : peers) { + peer.addWallet(wallet); + } } finally { lock.unlock(); } @@ -911,6 +914,9 @@ public class PeerGroup extends AbstractExecutionThreadService implements Transac peerFilterProviders.remove(wallet); wallet.removeEventListener(walletEventListener); wallet.setTransactionBroadcaster(null); + for (Peer peer : peers) { + peer.removeWallet(wallet); + } } public static enum FilterRecalculateMode { diff --git a/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java b/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java index 5d97fa8f..562d60d2 100644 --- a/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java +++ b/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java @@ -207,6 +207,44 @@ public class PeerGroupTest extends TestWithPeerGroup { peerGroup.awaitTerminated(); } + + @Test + public void receiveTxBroadcastOnAddedWallet() throws Exception { + // Check that when we receive transactions on all our peers, we do the right thing. + peerGroup.startAsync(); + peerGroup.awaitRunning(); + + // Create a peer. + InboundMessageQueuer p1 = connectPeer(1); + + Wallet wallet2 = new Wallet(unitTestParams); + ECKey key2 = wallet2.freshReceiveKey(); + Address address2 = key2.toAddress(unitTestParams); + + peerGroup.addWallet(wallet2); + blockChain.addWallet(wallet2); + + assertTrue(outbound(p1) instanceof BloomFilter); + assertTrue(outbound(p1) instanceof MemoryPoolMessage); + + Coin value = COIN; + Transaction t1 = FakeTxBuilder.createFakeTx(unitTestParams, value, address2); + InventoryMessage inv = new InventoryMessage(unitTestParams); + inv.addTransaction(t1); + + inbound(p1, inv); + assertTrue(outbound(p1) instanceof GetDataMessage); + inbound(p1, t1); + // Asks for dependency. + GetDataMessage getdata = (GetDataMessage) outbound(p1); + assertNotNull(getdata); + inbound(p1, new NotFoundMessage(unitTestParams, getdata.getItems())); + pingAndWait(p1); + assertEquals(value, wallet2.getBalance(Wallet.BalanceType.ESTIMATED)); + peerGroup.stopAsync(); + peerGroup.awaitTerminated(); + } + @Test public void singleDownloadPeer1() throws Exception { // Check that we don't attempt to retrieve blocks on multiple peers.