public void claim() throws Exception {
        // Check the wallet notices when its pledge has been claimed and understands the current state.
        WalletTestObjects objects1 = new WalletTestObjects(() -> new PledgingWallet(UnitTestParams.get()));
        PledgingWallet wallet1 = (PledgingWallet) objects1.wallet;
        Project project = new Project(makeProject(wallet1, 1_000_000));
        objects1.sendAmounts(1_000_000);
        PledgingWallet.PendingPledge ppledge1 = wallet1.createPledge(project, 500_000, null);
        LHProtos.Pledge pledge1 = ppledge1.commit(true);
        {
            final MockTransactionBroadcaster.TxFuturePair txFuturePair = objects1.broadcaster.waitForTxFuture();
            txFuturePair.succeed();
        }
        WalletTestObjects objects2 = new WalletTestObjects(() -> new PledgingWallet(UnitTestParams.get()));
        PledgingWallet wallet2 = (PledgingWallet) objects2.wallet;
        objects2.sendAmounts(1_000_000);
        PledgingWallet.PendingPledge ppledge2 = wallet2.createPledge(project, 500_000, null);
        LHProtos.Pledge pledge2 = ppledge2.commit(true);
        {
            final MockTransactionBroadcaster.TxFuturePair txFuturePair = objects2.broadcaster.waitForTxFuture();
            txFuturePair.succeed();
        }
        LHProtos.Pledge[] claimedPledge = new LHProtos.Pledge[1];
        Transaction[] claimTx = new Transaction[1];
        wallet1.addOnClaimHandler((p, tx) -> {
            claimedPledge[0] = p;
            claimTx[0] = tx;
        }, Threading.SAME_THREAD);
        // We now have two wallets that have made two separate pledges, which is sufficient to complete the project.
        Transaction contract = project.completeContract(ImmutableSet.of(pledge1, pledge2));
        objects1.receiveViaBlock(contract);
        assertEquals(pledge1, claimedPledge[0]);
        assertEquals(2, claimTx[0].getInputs().size());
        assertEquals(project.getOutputs(), claimTx[0].getOutputs());
    }