/****************************************************************************** * Copyright © 2013-2016 The Nxt Core Developers. * * * * See the AUTHORS.txt, DEVELOPER-AGREEMENT.txt and LICENSE.txt files at * * the top-level directory of this distribution for the individual copyright * * holder information and the developer policies on copyright and licensing. * * * * Unless otherwise agreed in a custom licensing agreement, no part of the * * Nxt software, including this file, may be copied, modified, propagated, * * or distributed except according to the terms contained in the LICENSE.txt * * file. * * * * Removal or modification of this copyright notice is prohibited. * * * ******************************************************************************/ package nxt.http.shuffling; import nxt.BlockchainTest; import nxt.Constants; import nxt.Nxt; import nxt.Shuffling; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.junit.Assert; import org.junit.Test; import static nxt.http.shuffling.ShufflingUtil.ALICE_RECIPIENT; import static nxt.http.shuffling.ShufflingUtil.BOB_RECIPIENT; import static nxt.http.shuffling.ShufflingUtil.CHUCK_RECIPIENT; import static nxt.http.shuffling.ShufflingUtil.DAVE_RECIPIENT; import static nxt.http.shuffling.ShufflingUtil.broadcast; import static nxt.http.shuffling.ShufflingUtil.cancel; import static nxt.http.shuffling.ShufflingUtil.create; import static nxt.http.shuffling.ShufflingUtil.createAssetShuffling; import static nxt.http.shuffling.ShufflingUtil.createCurrencyShuffling; import static nxt.http.shuffling.ShufflingUtil.defaultHoldingShufflingAmount; import static nxt.http.shuffling.ShufflingUtil.defaultShufflingAmount; import static nxt.http.shuffling.ShufflingUtil.getShuffling; import static nxt.http.shuffling.ShufflingUtil.getShufflingParticipants; import static nxt.http.shuffling.ShufflingUtil.process; import static nxt.http.shuffling.ShufflingUtil.register; import static nxt.http.shuffling.ShufflingUtil.shufflingAsset; import static nxt.http.shuffling.ShufflingUtil.shufflingCurrency; import static nxt.http.shuffling.ShufflingUtil.verify; public class TestShuffling extends BlockchainTest { @Test public void successfulShuffling() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); Assert.assertEquals(-Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); verify(shufflingId, CHUCK, shufflingStateHash); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.DONE.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertNull(shufflingAssignee); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), BOB.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(defaultShufflingAmount + 12 * Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(defaultShufflingAmount, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void successfulAssetShuffling() { JSONObject shufflingCreate = createAssetShuffling(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); verify(shufflingId, CHUCK, shufflingStateHash); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.DONE.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertNull(shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), BOB.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultHoldingShufflingAmount, ALICE_RECIPIENT.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, ALICE_RECIPIENT.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, BOB_RECIPIENT.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, BOB_RECIPIENT.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, CHUCK_RECIPIENT.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, CHUCK_RECIPIENT.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, DAVE_RECIPIENT.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(defaultHoldingShufflingAmount, DAVE_RECIPIENT.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, ALICE.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, ALICE.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, BOB.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, BOB.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, CHUCK.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, CHUCK.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, DAVE.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(-defaultHoldingShufflingAmount, DAVE.getUnconfirmedAssetQuantityDiff(shufflingAsset)); } @Test public void successfulCurrencyShuffling() { JSONObject shufflingCreate = createCurrencyShuffling(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); verify(shufflingId, CHUCK, shufflingStateHash); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.DONE.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertNull(shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), BOB.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(Constants.SHUFFLING_DEPOSIT_NQT, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getBalanceDiff()); Assert.assertEquals(48 * Constants.ONE_NXT, FORGY.getUnconfirmedBalanceDiff()); Assert.assertEquals(defaultHoldingShufflingAmount, ALICE_RECIPIENT.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, ALICE_RECIPIENT.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, BOB_RECIPIENT.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, BOB_RECIPIENT.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, CHUCK_RECIPIENT.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, CHUCK_RECIPIENT.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, DAVE_RECIPIENT.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(defaultHoldingShufflingAmount, DAVE_RECIPIENT.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, ALICE.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, ALICE.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, BOB.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, BOB.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, CHUCK.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, CHUCK.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, DAVE.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(-defaultHoldingShufflingAmount, DAVE.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); } @Test public void registrationNotFinished() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); for (int i = 0; i < 9; i++) { generateBlock(); } JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(2, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertNull(shufflingAssignee); Assert.assertEquals(-Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertEquals(2 * Constants.ONE_NXT, FORGY.getBalanceDiff()); Assert.assertEquals(2 * Constants.ONE_NXT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void registrationNotFinishedAsset() { JSONObject shufflingCreate = createAssetShuffling(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); for (int i = 0; i < 9; i++) { generateBlock(); } JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(2, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertNull(shufflingAssignee); Assert.assertEquals(-Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(0, ALICE.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(0, BOB.getAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(0, BOB.getUnconfirmedAssetQuantityDiff(shufflingAsset)); Assert.assertEquals(2 * Constants.ONE_NXT, FORGY.getBalanceDiff()); Assert.assertEquals(2 * Constants.ONE_NXT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void processingNotStarted() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); for (int i = 0; i < 10; i++) { generateBlock(); } JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(ALICE.getStrId(), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(4 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(4 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void processingNotStartedCurrency() { JSONObject shufflingCreate = createCurrencyShuffling(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); for (int i = 0; i < 10; i++) { generateBlock(); } JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(ALICE.getStrId(), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, ALICE.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, BOB.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, BOB.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, CHUCK.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, CHUCK.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, DAVE.getCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(0, DAVE.getUnconfirmedCurrencyUnitsDiff(shufflingCurrency)); Assert.assertEquals(4 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(4 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void tooManyParticipants() { JSONObject shufflingCreate = create(ALICE, 3); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); register(shufflingFullHash, CHUCK); register(shufflingFullHash, DAVE); register(shufflingFullHash, FORGY); for (int i = 0; i < 10; i++) { generateBlock(); } Nxt.getTransactionProcessor().clearUnconfirmedTransactions(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(3, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(ALICE.getStrId(), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE.getBalanceDiff()); Assert.assertEquals(0, DAVE.getUnconfirmedBalanceDiff()); Assert.assertEquals(3 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(3 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); } @Test public void processingNotFinished() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); for (int i = 0; i < 10; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(34 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(34 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void verifyNotStarted() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(45 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(45 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void verifyNotFinished() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-12 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(47 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(47 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void cancelAfterVerifyChuck() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); cancel(shufflingId, CHUCK, shufflingStateHash, 0); generateBlock(); getShufflingResponse = getShuffling(shufflingId); shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); cancel(shufflingId, ALICE, shufflingStateHash, CHUCK.getId()); cancel(shufflingId, BOB, shufflingStateHash, CHUCK.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-22 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void cancelAfterVerifyChuckInvalidKeys() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); JSONObject cancelResponse = cancel(shufflingId, CHUCK, shufflingStateHash, 0, false); JSONObject transactionJSON = (JSONObject)cancelResponse.get("transactionJSON"); JSONArray keySeeds = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("keySeeds"); String s = (String)keySeeds.get(0); keySeeds.set(0, "0000000000" + s.substring(10)); broadcast(transactionJSON, CHUCK); generateBlock(); getShufflingResponse = getShuffling(shufflingId); shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); cancel(shufflingId, ALICE, shufflingStateHash, CHUCK.getId()); cancel(shufflingId, BOB, shufflingStateHash, CHUCK.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-22 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void cancelAfterVerifyChuckInvalidKeysAlice() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); cancel(shufflingId, CHUCK, shufflingStateHash, 0); generateBlock(); getShufflingResponse = getShuffling(shufflingId); shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); JSONObject cancelResponse = cancel(shufflingId, ALICE, shufflingStateHash, CHUCK.getId(), false); JSONObject transactionJSON = (JSONObject)cancelResponse.get("transactionJSON"); JSONArray keySeeds = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("keySeeds"); String s = (String)keySeeds.get(0); keySeeds.set(0, "0000000000" + s.substring(10)); broadcast(transactionJSON, ALICE); generateBlock(); cancel(shufflingId, BOB, shufflingStateHash, CHUCK.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 22 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 22 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void cancelAfterVerifyChuckInvalidKeysAlice2() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); verify(shufflingId, ALICE, shufflingStateHash); verify(shufflingId, BOB, shufflingStateHash); cancel(shufflingId, CHUCK, shufflingStateHash, 0); generateBlock(); getShufflingResponse = getShuffling(shufflingId); shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); JSONObject cancelResponse = cancel(shufflingId, ALICE, shufflingStateHash, CHUCK.getId(), false); JSONObject transactionJSON = (JSONObject)cancelResponse.get("transactionJSON"); JSONArray keySeeds = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("keySeeds"); String s = (String)keySeeds.get(1); keySeeds.set(1, "0000000000" + s.substring(10)); broadcast(transactionJSON, ALICE); generateBlock(); cancel(shufflingId, BOB, shufflingStateHash, CHUCK.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 22 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 22 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-22 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNotNull(ALICE_RECIPIENT.getAccount()); Assert.assertNotNull(BOB_RECIPIENT.getAccount()); Assert.assertNotNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNotNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(0, ALICE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, ALICE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, BOB_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, CHUCK_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getBalanceDiff()); Assert.assertEquals(0, DAVE_RECIPIENT.getUnconfirmedBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(77 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void badProcessDataAlice() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); JSONObject processResponse = process(shufflingId, ALICE, ALICE_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("data"); String s = (String)data.get(0); data.set(0, "8080808080" + s.substring(10)); broadcast(transactionJSON, ALICE); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.BLAME.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(BOB.getId()), shufflingAssignee); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), ALICE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 11 * Constants.ONE_NXT), ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(24 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(24 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void modifiedProcessDataBob() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); JSONObject processResponse = process(shufflingId, BOB, BOB_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("data"); String s = (String)data.get(0); data.set(0, "8080808080" + s.substring(10)); broadcast(transactionJSON, BOB); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.BLAME.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, ALICE, shufflingStateHash, CHUCK.getId()); JSONObject cancelResponse = cancel(shufflingId, BOB, shufflingStateHash, CHUCK.getId()); boolean bobCancelFailed = cancelResponse.get("error") != null; // if he happened to modify his own piece for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(BOB.getId()), shufflingAssignee); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + (bobCancelFailed ? 11 : 21) * Constants.ONE_NXT), BOB.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + (bobCancelFailed ? 11 : 21) * Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals((bobCancelFailed ? 44 : 54) * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals((bobCancelFailed ? 44 : 54) * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void modifiedProcessDataChuck() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); JSONObject processResponse = process(shufflingId, CHUCK, CHUCK_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("data"); String s = (String)data.get(0); data.set(0, "8080808080" + s.substring(10)); broadcast(transactionJSON, CHUCK); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.BLAME.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, ALICE, shufflingStateHash, DAVE.getId()); cancel(shufflingId, BOB, shufflingStateHash, DAVE.getId()); JSONObject cancelResponse = cancel(shufflingId, CHUCK, shufflingStateHash, DAVE.getId()); boolean chuckCancelFailed = cancelResponse.get("error") != null; // if he happened to modify his own piece for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + (chuckCancelFailed ? 11 : 21) * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + (chuckCancelFailed ? 11 : 21) * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals((chuckCancelFailed ? 65 : 75) * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals((chuckCancelFailed ? 65 : 75) * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void modifiedRecipientKeysDave() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); JSONObject processResponse = process(shufflingId, DAVE, DAVE_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("recipientPublicKeys"); String s = (String)data.get(0); if (!s.equals(DAVE_RECIPIENT.getPublicKeyStr())) { data.set(0, "0000000000" + s.substring(10)); } else { s = (String)data.get(1); data.set(1, "0000000000" + s.substring(10)); } broadcast(transactionJSON, DAVE); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.VERIFICATION.getCode(), getShufflingResponse.get("stage")); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, ALICE, shufflingStateHash, 0); generateBlock(); getShufflingResponse = getShuffling(shufflingId); shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, BOB, shufflingStateHash, ALICE.getId()); cancel(shufflingId, CHUCK, shufflingStateHash, ALICE.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 12 * Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertTrue(ALICE_RECIPIENT.getAccount() == null || ALICE_RECIPIENT.getBalanceDiff() == 0); Assert.assertTrue(ALICE_RECIPIENT.getAccount() == null || ALICE_RECIPIENT.getUnconfirmedBalanceDiff() == 0); Assert.assertTrue(BOB_RECIPIENT.getAccount() == null || BOB_RECIPIENT.getBalanceDiff() == 0); Assert.assertTrue(BOB_RECIPIENT.getAccount() == null || BOB_RECIPIENT.getUnconfirmedBalanceDiff() == 0); Assert.assertTrue(CHUCK_RECIPIENT.getAccount() == null || CHUCK_RECIPIENT.getBalanceDiff() == 0); Assert.assertTrue(CHUCK_RECIPIENT.getAccount() == null || CHUCK_RECIPIENT.getUnconfirmedBalanceDiff() == 0); Assert.assertTrue(DAVE_RECIPIENT.getAccount() == null || DAVE_RECIPIENT.getBalanceDiff() == 0); Assert.assertTrue(DAVE_RECIPIENT.getAccount() == null || DAVE_RECIPIENT.getUnconfirmedBalanceDiff() == 0); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void duplicateRecipientKeysDave() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); JSONObject processResponse = process(shufflingId, DAVE, DAVE_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("recipientPublicKeys"); String s = (String)data.get(0); data.set(1, s); JSONObject broadcastResponse = broadcast(transactionJSON, DAVE); Assert.assertTrue(broadcastResponse.get("error") != null); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), DAVE.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(34 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(34 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void duplicateProcessDataChuck() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); JSONObject processResponse = process(shufflingId, CHUCK, CHUCK_RECIPIENT, false); JSONObject transactionJSON = (JSONObject)processResponse.get("transactionJSON"); JSONArray data = (JSONArray)((JSONObject)transactionJSON.get("attachment")).get("data"); String s = (String)data.get(0); data.set(1, s); JSONObject broadcastResponse = broadcast(transactionJSON, CHUCK); Assert.assertTrue(broadcastResponse.get("error") != null); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-11 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-1 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(24 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(24 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void duplicateRecipientsBobChuck() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, BOB_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, BOB_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.BLAME.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, ALICE, shufflingStateHash, DAVE.getId()); cancel(shufflingId, BOB, shufflingStateHash, DAVE.getId()); cancel(shufflingId, CHUCK, shufflingStateHash, DAVE.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(CHUCK.getId()), shufflingAssignee); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } @Test public void duplicateRecipientsAliceBob() { JSONObject shufflingCreate = create(ALICE); String shufflingId = (String)shufflingCreate.get("transaction"); String shufflingFullHash = (String)shufflingCreate.get("fullHash"); generateBlock(); register(shufflingFullHash, BOB); generateBlock(); register(shufflingFullHash, CHUCK); generateBlock(); register(shufflingFullHash, DAVE); generateBlock(); JSONObject getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.PROCESSING.getCode(), getShufflingResponse.get("stage")); JSONObject getParticipantsResponse = getShufflingParticipants(shufflingId); JSONArray participants = (JSONArray)getParticipantsResponse.get("participants"); Assert.assertEquals(4, participants.size()); String shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(ALICE.getId()), shufflingAssignee); process(shufflingId, ALICE, ALICE_RECIPIENT); generateBlock(); process(shufflingId, BOB, ALICE_RECIPIENT); generateBlock(); process(shufflingId, CHUCK, CHUCK_RECIPIENT); generateBlock(); process(shufflingId, DAVE, DAVE_RECIPIENT); generateBlock(); getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.BLAME.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(DAVE.getId()), shufflingAssignee); String shufflingStateHash = (String)getShufflingResponse.get("shufflingStateHash"); cancel(shufflingId, ALICE, shufflingStateHash, DAVE.getId()); cancel(shufflingId, BOB, shufflingStateHash, DAVE.getId()); cancel(shufflingId, CHUCK, shufflingStateHash, DAVE.getId()); for (int i = 0; i < 14; i++) { generateBlock(); } getShufflingResponse = getShuffling(shufflingId); Assert.assertEquals((long) Shuffling.Stage.CANCELLED.getCode(), getShufflingResponse.get("stage")); shufflingAssignee = (String) getShufflingResponse.get("assignee"); Assert.assertEquals(Long.toUnsignedString(BOB.getId()), shufflingAssignee); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, ALICE.getUnconfirmedBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), BOB.getBalanceDiff()); Assert.assertEquals(-(Constants.SHUFFLING_DEPOSIT_NQT + 21 * Constants.ONE_NXT), BOB.getUnconfirmedBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getBalanceDiff()); Assert.assertEquals(-21 * Constants.ONE_NXT, CHUCK.getUnconfirmedBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getBalanceDiff()); Assert.assertEquals(-12 * Constants.ONE_NXT, DAVE.getUnconfirmedBalanceDiff()); Assert.assertNull(ALICE_RECIPIENT.getAccount()); Assert.assertNull(BOB_RECIPIENT.getAccount()); Assert.assertNull(CHUCK_RECIPIENT.getAccount()); Assert.assertNull(DAVE_RECIPIENT.getAccount()); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getBalanceDiff()); Assert.assertEquals(75 * Constants.ONE_NXT + Constants.SHUFFLING_DEPOSIT_NQT, FORGY.getUnconfirmedBalanceDiff()); } }