package test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; import ntp.NTP; import org.junit.Assert; import org.junit.Test; import qora.account.PrivateKeyAccount; import qora.assets.Asset; import qora.assets.Order; import qora.assets.Trade; import qora.block.GenesisBlock; import qora.crypto.Crypto; import qora.crypto.Ed25519; import qora.transaction.CreateOrderTransaction; import qora.transaction.GenesisTransaction; import qora.transaction.IssueAssetTransaction; import qora.transaction.Transaction; import qora.transaction.TransactionFactory; import database.DBSet; public class OrderTests { @Test public void validateSignatureOrderTransaction() { Ed25519.load(); //CREATE EMPTY MEMORY DATABASE DBSet databaseSet = DBSet.createEmptyDatabaseSet(); //CREATE KNOWN ACCOUNT byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount sender = new PrivateKeyAccount(privateKey); //PROCESS GENESIS TRANSACTION TO MAKE SURE SENDER HAS FUNDS Transaction transaction = new GenesisTransaction(sender, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(databaseSet); //CREATE SIGNATURE long timestamp = NTP.getTime(); byte[] signature = CreateOrderTransaction.generateSignature(databaseSet, sender, 1l, 2l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp); //CREATE ORDER TRANSACTION Transaction orderTransaction = new CreateOrderTransaction(sender, 1l, 2l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp, sender.getLastReference(databaseSet), signature); //CHECK IF ORDER CREATION SIGNATURE IS VALID assertEquals(true, orderTransaction.isSignatureValid()); //INVALID SIGNATURE orderTransaction = new CreateOrderTransaction(sender, 1l, 2l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp, sender.getLastReference(databaseSet), new byte[64]); //CHECK IF ORDER CREATION SIGNATURE IS INVALID assertEquals(false, orderTransaction.isSignatureValid()); } @Test public void validateCreateOrderTransaction() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //ADD QORA ASSET Asset qoraAsset = new Asset(new GenesisBlock().getGenerator(), "Qora", "This is the simulated Qora asset.", 10000000000L, true, new byte[64]); dbSet.getAssetMap().set(0l, qoraAsset); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount account = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(account, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset asset = new Asset(account, "a", "a", 50000l, false, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(account, asset, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), account.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CHECK VALID long timeStamp = System.currentTimeMillis(); CreateOrderTransaction orderCreation = new CreateOrderTransaction(account, 1l, 0l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); assertEquals(Transaction.VALIDATE_OKE, orderCreation.isValid(dbSet)); //CREATE INVALID ORDER CREATION HAVE EQUALS WANT orderCreation = new CreateOrderTransaction(account, 1l, 1l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); //CHECK IF ORDER CREATION INVALID assertEquals(Transaction.HAVE_EQUALS_WANT, orderCreation.isValid(dbSet)); //CREATE INVALID ORDER CREATION NOT ENOUGH BALANCE orderCreation = new CreateOrderTransaction(account, 1l, 0l, BigDecimal.valueOf(50001).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); //CHECK IF ORDER CREATION INVALID assertEquals(Transaction.NO_BALANCE, orderCreation.isValid(dbSet)); //CREATE INVALID ORDER CREATION INVALID AMOUNT orderCreation = new CreateOrderTransaction(account, 1l, 0l, BigDecimal.valueOf(50.01).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); //CHECK IF ORDER CREATION INVALID assertEquals(Transaction.INVALID_AMOUNT, orderCreation.isValid(dbSet)); //CREATE INVALID ORDER CREATION WANT DOES NOT EXIST orderCreation = new CreateOrderTransaction(account, 1l, 4l, BigDecimal.valueOf(50).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); //CHECK IF ORDER CREATION INVALID assertEquals(Transaction.ASSET_DOES_NOT_EXIST, orderCreation.isValid(dbSet)); //CREATE ORDER CREATION INVALID REFERENCE orderCreation = new CreateOrderTransaction(account, 1l, 0l, BigDecimal.valueOf(50).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timeStamp, new byte[]{1,2}, new byte[64]); //CHECK IF ORDER CREATION IS INVALID assertEquals(Transaction.INVALID_REFERENCE, orderCreation.isValid(dbSet)); //CREATE ORDER CREATION INVALID FEE orderCreation = new CreateOrderTransaction(account, 1l, 0l, BigDecimal.valueOf(50).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.ZERO.setScale(8), timeStamp, account.getLastReference(dbSet), new byte[64]); //CHECK IF ORDER CREATION IS INVALID assertEquals(Transaction.NEGATIVE_FEE, orderCreation.isValid(dbSet)); } @Test public void parseCreateOrderTransaction() { //CREATE EMPTY MEMORY DATABASE DBSet databaseSet = DBSet.createEmptyDatabaseSet(); //CREATE KNOWN ACCOUNT byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount sender = new PrivateKeyAccount(privateKey); //PROCESS GENESIS TRANSACTION TO MAKE SURE SENDER HAS FUNDS Transaction transaction = new GenesisTransaction(sender, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(databaseSet); //CREATE SIGNATURE long timestamp = NTP.getTime(); byte[] signature = CreateOrderTransaction.generateSignature(databaseSet, sender, 1l, 2l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp); //CREATE ORDER TRANSACTION CreateOrderTransaction orderCreation = new CreateOrderTransaction(sender, 1l, 2l, BigDecimal.valueOf(100).setScale(8), BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp, sender.getLastReference(databaseSet), signature); //CONVERT TO BYTES byte[] rawOrderCreation = orderCreation.toBytes(); try { //PARSE FROM BYTES CreateOrderTransaction parsedOrderCreation = (CreateOrderTransaction) TransactionFactory.getInstance().parse(rawOrderCreation); //CHECK INSTANCE assertEquals(true, parsedOrderCreation instanceof CreateOrderTransaction); //CHECK SIGNATURE assertEquals(true, Arrays.equals(orderCreation.getSignature(), parsedOrderCreation.getSignature())); //CHECK HAVE assertEquals(orderCreation.getOrder().getHave(), parsedOrderCreation.getOrder().getHave()); //CHECK WANT assertEquals(orderCreation.getOrder().getWant(), parsedOrderCreation.getOrder().getWant()); //CHECK AMOUNT assertEquals(0, orderCreation.getOrder().getAmount().compareTo(parsedOrderCreation.getOrder().getAmount())); //CHECK PRICE assertEquals(0, orderCreation.getOrder().getPrice().compareTo(parsedOrderCreation.getOrder().getPrice())); //CHECK FEE assertEquals(orderCreation.getFee(), parsedOrderCreation.getFee()); //CHECK REFERENCE assertEquals(true, Arrays.equals(orderCreation.getReference(), parsedOrderCreation.getReference())); //CHECK TIMESTAMP assertEquals(orderCreation.getTimestamp(), parsedOrderCreation.getTimestamp()); } catch (Exception e) { fail("Exception while parsing transaction."); } //PARSE TRANSACTION FROM WRONG BYTES rawOrderCreation = new byte[orderCreation.getDataLength()]; try { //PARSE FROM BYTES TransactionFactory.getInstance().parse(rawOrderCreation); //FAIL fail("this should throw an exception"); } catch (Exception e) { //EXCEPTION IS THROWN OKE } } @Test public void testOrderProcessingNonDivisible() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, false, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, false, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); createOrderTransaction.process(dbSet); //CREATE ORDER TWO (SELLING 1000 B FOR A AT A PRICE OF 5) //GENERATES TRADE 100 B FOR 1000 A createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{5, 6}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(100))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1000))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); Order orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(100))); Assert.assertEquals(false, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); Trade trade = orderB.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[64]))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(100))); //CREATE ORDER THREE (SELLING 24 A FOR B AT A PRICE OF 0.2) //GENERATES TRADE 20 A FOR 4 B createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(24).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{1, 2}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(48976))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(104))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1020))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(104))); Assert.assertEquals(false, orderB.isFulfilled()); Order orderC = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderC.getId())); Assert.assertEquals(0, orderC.getFulfilled().compareTo(BigDecimal.valueOf(20))); Assert.assertEquals(false, orderC.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderC.getInitiatedTrades(dbSet).size()); trade = orderC.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{1, 2}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(4))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(20))); } @Test public void testOrderProcessingWantDivisible() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, false, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); createOrderTransaction.process(dbSet); //CREATE ORDER TWO (SELLING 99.9 B FOR A AT A PRICE OF 5) //GENERATES TRADE 99,9 B FOR 999 A createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(99.9).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{5, 6}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49900.1))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(99.9))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(999))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = dbSet.getOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(999))); Assert.assertEquals(false, orderA.isFulfilled()); Order orderB = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(99.9))); Assert.assertEquals(true, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); Trade trade = orderB.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[64]))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(999))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(99.9))); //CREATE ORDER THREE (SELLING 99 A FOR B AT A PRICE OF 0.2) //GENERATED TRADE 99 A FOR 9.9 B createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(99).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{1, 2}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(48901))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49900.1))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(99.9))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(999))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = dbSet.getOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(999))); Assert.assertEquals(false, orderA.isFulfilled()); orderB = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(99.9))); Assert.assertEquals(true, orderB.isFulfilled()); Order orderC = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderC.getId())); Assert.assertEquals(0, orderC.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderC.isFulfilled()); //CHECK TRADES Assert.assertEquals(0, orderC.getInitiatedTrades(dbSet).size()); } @Test public void testOrderProcessingHaveDivisible() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, false, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); createOrderTransaction.process(dbSet); //CREATE ORDER TWO (SELLING 200 B FOR A AT A PRICE OF 5) //GENERATES TRADE 100 B FOR 1000 A createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(200).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{5, 6}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49800))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(100))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1000))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); Order orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(100))); Assert.assertEquals(false, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); Trade trade = orderB.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[64]))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(100))); //CREATE ORDER THREE (SELLING 99 A FOR B AT A PRICE OF 0.2) (I CAN BUY AT INCREMENTS OF 1) //GENERATED TRADE 95 A for 19 B createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(99).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{1, 2}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(48901))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49800))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(119))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1095))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(119))); Assert.assertEquals(false, orderB.isFulfilled()); Order orderC = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderC.getId())); Assert.assertEquals(0, orderC.getFulfilled().compareTo(BigDecimal.valueOf(95))); Assert.assertEquals(false, orderC.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); trade = orderC.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{1, 2}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(19))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(95))); } @Test public void testOrderProcessingDivisible() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); createOrderTransaction.process(dbSet); //CREATE ORDER TWO (SELLING 999 B FOR A AT A PRICE OF 5) (I CAN BUY AT INCREMENTS OF 0,00000010) //GENERATES TRADE 100 B FOR 1000 A createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(999).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{5, 6}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(49000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49001))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(100))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1000))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); Order orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(100))); Assert.assertEquals(false, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); Trade trade = orderB.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[64]))); Assert.assertEquals(0, trade.getAmount().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(0, trade.getPrice().compareTo(BigDecimal.valueOf(100))); //CREATE ORDER THREE (SELLING 99.99999999 A FOR B AT A PRICE OF 0.2) (I CAN BUY AT INCREMENTS OF 0,00000001) createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, new BigDecimal(BigInteger.valueOf(9999999999L), 8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{1, 2}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(new BigDecimal("48900.00000001"))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49001))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(new BigDecimal("119.99999999"))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(new BigDecimal("1099.99999995"))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[64])); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(new BigDecimal("119.99999999"))); Assert.assertEquals(false, orderB.isFulfilled()); Order orderC = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderC.getId())); Assert.assertEquals(0, orderC.getFulfilled().compareTo(new BigDecimal("99.99999995"))); Assert.assertEquals(false, orderC.isFulfilled()); //CHECK TRADES Assert.assertEquals(1, orderB.getInitiatedTrades(dbSet).size()); trade = orderC.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{1, 2}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getAmount().compareTo(new BigDecimal("19.99999999"))); Assert.assertEquals(0, trade.getPrice().compareTo(new BigDecimal("99.99999995"))); } @Test public void testOrderProcessingMultipleOrders() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{5,6}); createOrderTransaction.process(dbSet); //CREATE ORDER TWO (SELLING 1000 A FOR B AT A PRICE FOR 0.20) createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{1, 2}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(48000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(50000))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(0))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(0))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = dbSet.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderA.isFulfilled()); Order orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(0, orderB.getInitiatedTrades(dbSet).size()); //CREATE ORDER THREE (SELLING 150 B FOR A AT A PRICE OF 5) createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(150).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[]{3, 4}); createOrderTransaction.process(dbSet); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(48000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(49850))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, dbSet).compareTo(BigDecimal.valueOf(150))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, dbSet).compareTo(BigDecimal.valueOf(1250))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(1000))); Assert.assertEquals(true, orderA.isFulfilled()); orderB = dbSet.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, dbSet.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(250))); Assert.assertEquals(false, orderB.isFulfilled()); Order orderC = dbSet.getCompletedOrderMap().get(new BigInteger(new byte[]{3, 4})); Assert.assertEquals(false, dbSet.getOrderMap().contains(orderC.getId())); Assert.assertEquals(0, orderC.getFulfilled().compareTo(BigDecimal.valueOf(150))); Assert.assertEquals(true, orderC.isFulfilled()); //CHECK TRADES Assert.assertEquals(0, orderA.getInitiatedTrades(dbSet).size()); Assert.assertEquals(0, orderB.getInitiatedTrades(dbSet).size()); Assert.assertEquals(2, orderC.getInitiatedTrades(dbSet).size()); Trade trade = orderC.getInitiatedTrades(dbSet).get(1); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{3, 4}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[]{5, 6}))); Assert.assertEquals(0, trade.getAmount().compareTo(new BigDecimal("1000"))); Assert.assertEquals(0, trade.getPrice().compareTo(new BigDecimal("100"))); trade = orderC.getInitiatedTrades(dbSet).get(0); Assert.assertEquals(0, trade.getInitiator().compareTo(new BigInteger(new byte[]{3, 4}))); Assert.assertEquals(0, trade.getTarget().compareTo(new BigInteger(new byte[]{1, 2}))); Assert.assertEquals(0, trade.getAmount().compareTo(new BigDecimal("250"))); Assert.assertEquals(0, trade.getPrice().compareTo(new BigDecimal("50"))); } @Test public void testOrderProcessingForks() { Ed25519.load(); DBSet dbSet = DBSet.createEmptyDatabaseSet(); //CREATE ASSET A byte[] seed = Crypto.getInstance().digest("test".getBytes()); byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountA = new PrivateKeyAccount(privateKey); Transaction transaction = new GenesisTransaction(accountA, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetA = new Asset(accountA, "a", "a", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION Transaction issueAssetTransaction = new IssueAssetTransaction(accountA, assetA, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ASSET B seed = Crypto.getInstance().digest("testb".getBytes()); privateKey = Crypto.getInstance().createKeyPair(seed).getA(); PrivateKeyAccount accountB = new PrivateKeyAccount(privateKey); transaction = new GenesisTransaction(accountB, BigDecimal.valueOf(1000).setScale(8), NTP.getTime()); transaction.process(dbSet); //CREATE ASSET Asset assetB = new Asset(accountB, "b", "b", 50000l, true, new byte[64]); //CREATE ISSUE ASSET TRANSACTION issueAssetTransaction = new IssueAssetTransaction(accountB, assetB, BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountB.getLastReference(dbSet), new byte[64]); issueAssetTransaction.process(dbSet); //CREATE ORDER ONE (SELLING 1000 A FOR B AT A PRICE OF 0.10) DBSet fork1 = dbSet.fork(); CreateOrderTransaction createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.1).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(fork1), new byte[]{5,6}); createOrderTransaction.process(fork1); //CREATE ORDER TWO (SELLING 1000 A FOR B AT A PRICE FOR 0.20) DBSet fork2 = fork1.fork(); createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(fork2), new byte[]{1, 2}); createOrderTransaction.process(fork2); //CREATE ORDER THREE (SELLING 150 B FOR A AT A PRICE OF 5) DBSet fork3 = fork2.fork(); createOrderTransaction = new CreateOrderTransaction(accountB, 2l, 1l, BigDecimal.valueOf(150).setScale(8), BigDecimal.valueOf(5).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(fork3), new byte[]{3, 4}); createOrderTransaction.process(fork3); //ORPHAN ORDER THREE createOrderTransaction.orphan(fork3); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, fork3).compareTo(BigDecimal.valueOf(48000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, fork3).compareTo(BigDecimal.valueOf(50000))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, fork3).compareTo(BigDecimal.valueOf(0))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, fork3).compareTo(BigDecimal.valueOf(0))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS Order orderA = fork3.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, fork3.getCompletedOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderA.isFulfilled()); Order orderB = fork3.getOrderMap().get(new BigInteger(new byte[]{1, 2})); Assert.assertEquals(false, fork3.getCompletedOrderMap().contains(orderB.getId())); Assert.assertEquals(0, orderB.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderB.isFulfilled()); //CHECK TRADES Assert.assertEquals(0, orderB.getInitiatedTrades(fork3).size()); //ORPHAN ORDER TWO createOrderTransaction = new CreateOrderTransaction(accountA, 1l, 2l, BigDecimal.valueOf(1000).setScale(8), BigDecimal.valueOf(0.2).setScale(8), BigDecimal.ONE.setScale(8), System.currentTimeMillis(), accountA.getLastReference(fork2), new byte[]{1, 2}); createOrderTransaction.orphan(fork2); //CHECK BALANCES Assert.assertEquals(0, accountA.getConfirmedBalance(1l, fork2).compareTo(BigDecimal.valueOf(49000))); //BALANCE A FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(2l, fork2).compareTo(BigDecimal.valueOf(50000))); //BALANCE B FOR ACCOUNT B Assert.assertEquals(0, accountA.getConfirmedBalance(2l, fork2).compareTo(BigDecimal.valueOf(0))); //BALANCE B FOR ACCOUNT A Assert.assertEquals(0, accountB.getConfirmedBalance(1l, fork2).compareTo(BigDecimal.valueOf(0))); //BALANCE A FOR ACCOUNT B //CHECK ORDERS orderA = fork2.getOrderMap().get(new BigInteger(new byte[]{5, 6})); Assert.assertEquals(false, fork2.getCompletedOrderMap().contains(orderA.getId())); Assert.assertEquals(0, orderA.getFulfilled().compareTo(BigDecimal.valueOf(0))); Assert.assertEquals(false, orderA.isFulfilled()); Assert.assertEquals(false, fork2.getOrderMap().contains(new BigInteger(new byte[]{1, 2}))); Assert.assertEquals(false, fork2.getCompletedOrderMap().contains(new BigInteger(new byte[]{1, 2}))); } }