diff --git a/src/main/java/org/qortal/asset/Order.java b/src/main/java/org/qortal/asset/Order.java index 4bc40ba1..d2ea1d7b 100644 --- a/src/main/java/org/qortal/asset/Order.java +++ b/src/main/java/org/qortal/asset/Order.java @@ -11,7 +11,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; -import org.qortal.block.BlockChain; import org.qortal.data.asset.AssetData; import org.qortal.data.asset.OrderData; import org.qortal.data.asset.TradeData; @@ -29,7 +28,6 @@ public class Order { private OrderData orderData; // Used quite a bit - private final boolean isOurOrderNewPricing; private final long haveAssetId; private final long wantAssetId; @@ -47,7 +45,6 @@ public class Order { this.repository = repository; this.orderData = orderData; - this.isOurOrderNewPricing = this.orderData.getTimestamp() >= BlockChain.getInstance().getNewAssetPricingTimestamp(); this.haveAssetId = this.orderData.getHaveAssetId(); this.wantAssetId = this.orderData.getWantAssetId(); } @@ -130,7 +127,7 @@ public class Order { /** Calculate price pair. (e.g. QORT/GOLD) *

- * Under 'new' pricing scheme, lowest-assetID asset is first, + * Lowest-assetID asset is first, * so if QORT has assetID 0 and GOLD has assetID 10, then * the pricing pair is QORT/GOLD. *

@@ -141,7 +138,7 @@ public class Order { AssetData haveAssetData = getHaveAsset(); AssetData wantAssetData = getWantAsset(); - if (isOurOrderNewPricing && haveAssetId > wantAssetId) + if (haveAssetId > wantAssetId) cachedPricePair = wantAssetData.getName() + "/" + haveAssetData.getName(); else cachedPricePair = haveAssetData.getName() + "/" + wantAssetData.getName(); @@ -151,8 +148,8 @@ public class Order { private BigDecimal calcHaveAssetCommittment() { BigDecimal committedCost = this.orderData.getAmount(); - // If 'new' pricing and "amount" is in want-asset then we need to convert - if (isOurOrderNewPricing && haveAssetId < wantAssetId) + // If "amount" is in want-asset then we need to convert + if (haveAssetId < wantAssetId) committedCost = committedCost.multiply(this.orderData.getPrice()).setScale(8, RoundingMode.HALF_UP); return committedCost; @@ -162,8 +159,8 @@ public class Order { private BigDecimal calcHaveAssetRefund() { BigDecimal refund = getAmountLeft(); - // If 'new' pricing and "amount" is in want-asset then we need to convert - if (isOurOrderNewPricing && haveAssetId < wantAssetId) + // If "amount" is in want-asset then we need to convert + if (haveAssetId < wantAssetId) refund = refund.multiply(this.orderData.getPrice()).setScale(8, RoundingMode.HALF_UP); return refund; @@ -192,27 +189,19 @@ public class Order { /** * Returns AssetData for asset in effect for "amount" field. *

- * For 'old' pricing, this is the have-asset.
- * For 'new' pricing, this is the asset with highest assetID. + * This is the asset with highest assetID. */ public AssetData getAmountAsset() throws DataException { - if (isOurOrderNewPricing && wantAssetId > haveAssetId) - return getWantAsset(); - else - return getHaveAsset(); + return (wantAssetId > haveAssetId) ? getWantAsset() : getHaveAsset(); } /** * Returns AssetData for other (return) asset traded. *

- * For 'old' pricing, this is the want-asset.
- * For 'new' pricing, this is the asset with lowest assetID. + * This is the asset with lowest assetID. */ public AssetData getReturnAsset() throws DataException { - if (isOurOrderNewPricing && haveAssetId < wantAssetId) - return getHaveAsset(); - else - return getWantAsset(); + return (haveAssetId < wantAssetId) ? getHaveAsset() : getWantAsset(); } // Processing @@ -227,8 +216,6 @@ public class Order { // NOTE: the following values are specific to passed orderData, not the same as class instance values! - final boolean isOrderNewAssetPricing = orderData.getTimestamp() >= BlockChain.getInstance().getNewAssetPricingTimestamp(); - // Cached for readability final long _haveAssetId = orderData.getHaveAssetId(); final long _wantAssetId = orderData.getWantAssetId(); @@ -236,15 +223,15 @@ public class Order { final AssetData haveAssetData = this.repository.getAssetRepository().fromAssetId(_haveAssetId); final AssetData wantAssetData = this.repository.getAssetRepository().fromAssetId(_wantAssetId); - final long amountAssetId = (isOurOrderNewPricing && _wantAssetId > _haveAssetId) ? _wantAssetId : _haveAssetId; - final long returnAssetId = (isOurOrderNewPricing && _haveAssetId < _wantAssetId) ? _haveAssetId : _wantAssetId; + final long amountAssetId = (_wantAssetId > _haveAssetId) ? _wantAssetId : _haveAssetId; + final long returnAssetId = (_haveAssetId < _wantAssetId) ? _haveAssetId : _wantAssetId; final AssetData amountAssetData = this.repository.getAssetRepository().fromAssetId(amountAssetId); final AssetData returnAssetData = this.repository.getAssetRepository().fromAssetId(returnAssetId); LOGGER.debug(String.format("%s %s", orderPrefix, Base58.encode(orderData.getOrderId()))); - LOGGER.trace(String.format("%s have %s, want %s. '%s' pricing scheme.", weThey, haveAssetData.getName(), wantAssetData.getName(), isOrderNewAssetPricing ? "new" : "old")); + LOGGER.trace(String.format("%s have %s, want %s.", weThey, haveAssetData.getName(), wantAssetData.getName())); LOGGER.trace(String.format("%s amount: %s (ordered) - %s (fulfilled) = %s %s left", ourTheir, orderData.getAmount().stripTrailingZeros().toPlainString(), @@ -266,9 +253,9 @@ public class Order { AssetData wantAssetData = getWantAsset(); /** The asset while working out amount that matches. */ - AssetData matchingAssetData = isOurOrderNewPricing ? getAmountAsset() : wantAssetData; + AssetData matchingAssetData = getAmountAsset(); /** The return asset traded if trade completes. */ - AssetData returnAssetData = isOurOrderNewPricing ? getReturnAsset() : haveAssetData; + AssetData returnAssetData = getReturnAsset(); // Subtract have-asset from creator Account creator = new PublicKeyAccount(this.repository, this.orderData.getCreatorPublicKey()); @@ -281,7 +268,7 @@ public class Order { // Fetch corresponding open orders that might potentially match, hence reversed want/have assetIDs. // Returned orders are sorted with lowest "price" first. - List orders = assetRepository.getOpenOrdersForTrading(wantAssetId, haveAssetId, isOurOrderNewPricing ? this.orderData.getPrice() : null); + List orders = assetRepository.getOpenOrdersForTrading(wantAssetId, haveAssetId, this.orderData.getPrice()); LOGGER.trace("Open orders fetched from repository: " + orders.size()); if (orders.isEmpty()) @@ -290,27 +277,7 @@ public class Order { // Attempt to match orders /* - * Potential matching order example ("old"): - * - * Our order: - * haveAssetId=[GOLD], wantAssetId=0 (QORT), amount=40 (GOLD), price=486 (QORT/GOLD) - * This translates to "we have 40 GOLD and want QORT at a price of 486 QORT per GOLD" - * If our order matched, we'd end up with 40 * 486 = 19,440 QORT. - * - * Their order: - * haveAssetId=0 (QORT), wantAssetId=[GOLD], amount=20,000 (QORT), price=0.00205761 (GOLD/QORT) - * This translates to "they have 20,000 QORT and want GOLD at a price of 0.00205761 GOLD per QORT" - * - * Their price, converted into 'our' units of QORT/GOLD, is: 1 / 0.00205761 = 486.00074844 QORT/GOLD. - * This is better than our requested 486 QORT/GOLD so this order matches. - * - * Using their price, we end up with 40 * 486.00074844 = 19440.02993760 QORT. They end up with 40 GOLD. - * - * If their order had 19,440 QORT left, only 19,440 * 0.00205761 = 39.99993840 GOLD would be traded. - */ - - /* - * Potential matching order example ("new"): + * Potential matching order example: * * Our order: * haveAssetId=[GOLD], wantAssetId=0 (QORT), amount=40 (GOLD), price=486 (QORT/GOLD) @@ -333,44 +300,21 @@ public class Order { for (OrderData theirOrderData : orders) { logOrder("Considering order", false, theirOrderData); - // Not used: - // boolean isTheirOrderNewAssetPricing = theirOrderData.getTimestamp() >= BlockChain.getInstance().getNewAssetPricingTimestamp(); - // Determine their order price BigDecimal theirPrice; - if (isOurOrderNewPricing) { - // Pricing units are the same way round for both orders, so no conversion needed. - // Orders under 'old' pricing have been converted during repository update. - theirPrice = theirOrderData.getPrice(); - LOGGER.trace(String.format("Their price: %s %s", theirPrice.toPlainString(), getPricePair())); - } else { - // If our order is 'old' pricing then all other existing orders must be 'old' pricing too - // Their order pricing will be inverted, so convert - theirPrice = BigDecimal.ONE.setScale(8).divide(theirOrderData.getPrice(), RoundingMode.DOWN); - LOGGER.trace(String.format("Their price: %s %s per %s", theirPrice.toPlainString(), wantAssetData.getName(), haveAssetData.getName())); - } + // Pricing units are the same way round for both orders, so no conversion needed. + theirPrice = theirOrderData.getPrice(); + LOGGER.trace(String.format("Their price: %s %s", theirPrice.toPlainString(), getPricePair())); // If their price is worse than what we're willing to accept then we're done as prices only get worse as we iterate through list of orders - if (isOurOrderNewPricing) { - if (haveAssetId < wantAssetId && theirPrice.compareTo(ourPrice) > 0) - break; - if (haveAssetId > wantAssetId && theirPrice.compareTo(ourPrice) < 0) - break; - } else { - // 'old' pricing scheme - if (theirPrice.compareTo(ourPrice) < 0) - break; - } + if (haveAssetId < wantAssetId && theirPrice.compareTo(ourPrice) > 0) + break; + if (haveAssetId > wantAssetId && theirPrice.compareTo(ourPrice) < 0) + break; - // Calculate how much we could buy at their price. - BigDecimal ourMaxAmount; - if (isOurOrderNewPricing) - // In 'new' pricing scheme, "amount" is expressed in terms of asset with highest assetID - ourMaxAmount = this.getAmountLeft(); - else - // In 'old' pricing scheme, "amount" is expressed in terms of our want-asset. - ourMaxAmount = this.getAmountLeft().multiply(theirPrice).setScale(8, RoundingMode.DOWN); + // Calculate how much we could buy at their price, "amount" is expressed in terms of asset with highest assetID. + BigDecimal ourMaxAmount = this.getAmountLeft(); LOGGER.trace("ourMaxAmount (max we could trade at their price): " + ourMaxAmount.stripTrailingZeros().toPlainString() + " " + matchingAssetData.getName()); // How much is remaining available in their order. @@ -421,11 +365,11 @@ public class Order { throw new DataException(message); } - BigDecimal tradedWantAmount = (isOurOrderNewPricing && haveAssetId > wantAssetId) ? returnAmountTraded : matchedAmount; - BigDecimal tradedHaveAmount = (isOurOrderNewPricing && haveAssetId > wantAssetId) ? matchedAmount : returnAmountTraded; + BigDecimal tradedWantAmount = (haveAssetId > wantAssetId) ? returnAmountTraded : matchedAmount; + BigDecimal tradedHaveAmount = (haveAssetId > wantAssetId) ? matchedAmount : returnAmountTraded; - // We also need to know how much have-asset to refund based on price improvement ('new' pricing only and only one direction applies) - BigDecimal haveAssetRefund = isOurOrderNewPricing && haveAssetId < wantAssetId ? ourPrice.subtract(theirPrice).abs().multiply(matchedAmount).setScale(8, RoundingMode.DOWN) : BigDecimal.ZERO; + // We also need to know how much have-asset to refund based on price improvement (only one direction applies) + BigDecimal haveAssetRefund = haveAssetId < wantAssetId ? ourPrice.subtract(theirPrice).abs().multiply(matchedAmount).setScale(8, RoundingMode.DOWN) : BigDecimal.ZERO; LOGGER.trace(String.format("We traded %s %s (have-asset) for %s %s (want-asset), saving %s %s (have-asset)", tradedHaveAmount.toPlainString(), haveAssetData.getName(), @@ -440,7 +384,7 @@ public class Order { trade.process(); // Update our order in terms of fulfilment, etc. but do not save into repository as that's handled by Trade above - BigDecimal amountFulfilled = isOurOrderNewPricing ? matchedAmount : returnAmountTraded; + BigDecimal amountFulfilled = matchedAmount; this.orderData.setFulfilled(this.orderData.getFulfilled().add(amountFulfilled)); LOGGER.trace("Updated our order's fulfilled amount to: " + this.orderData.getFulfilled().stripTrailingZeros().toPlainString() + " " + matchingAssetData.getName()); LOGGER.trace("Our order's amount remaining: " + this.getAmountLeft().stripTrailingZeros().toPlainString() + " " + matchingAssetData.getName()); diff --git a/src/main/java/org/qortal/asset/Trade.java b/src/main/java/org/qortal/asset/Trade.java index 1f29cdc2..18943b78 100644 --- a/src/main/java/org/qortal/asset/Trade.java +++ b/src/main/java/org/qortal/asset/Trade.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; -import org.qortal.block.BlockChain; import org.qortal.data.asset.OrderData; import org.qortal.data.asset.TradeData; import org.qortal.repository.AssetRepository; @@ -17,12 +16,11 @@ public class Trade { private Repository repository; private TradeData tradeData; - private boolean isNewPricing; private AssetRepository assetRepository; private OrderData initiatingOrder; private OrderData targetOrder; - private BigDecimal newPricingFulfilled; + private BigDecimal fulfilled; // Constructors @@ -30,7 +28,6 @@ public class Trade { this.repository = repository; this.tradeData = tradeData; - this.isNewPricing = this.tradeData.getTimestamp() > BlockChain.getInstance().getNewAssetPricingTimestamp(); this.assetRepository = this.repository.getAssetRepository(); } @@ -43,9 +40,9 @@ public class Trade { // Note: targetAmount is amount traded FROM target order // Note: initiatorAmount is amount traded FROM initiating order - // Under 'new' pricing scheme, "amount" and "fulfilled" are the same asset for both orders + // "amount" and "fulfilled" are the same asset for both orders // which is the matchedAmount in asset with highest assetID - this.newPricingFulfilled = (initiatingOrder.getHaveAssetId() < initiatingOrder.getWantAssetId()) ? this.tradeData.getTargetAmount() : this.tradeData.getInitiatorAmount(); + this.fulfilled = (initiatingOrder.getHaveAssetId() < initiatingOrder.getWantAssetId()) ? this.tradeData.getTargetAmount() : this.tradeData.getInitiatorAmount(); } public void process() throws DataException { @@ -55,16 +52,16 @@ public class Trade { // Note: targetAmount is amount traded FROM target order // Note: initiatorAmount is amount traded FROM initiating order - // Update corresponding Orders on both sides of trade commonPrep(); - initiatingOrder.setFulfilled(initiatingOrder.getFulfilled().add(isNewPricing ? newPricingFulfilled : tradeData.getInitiatorAmount())); + // Update corresponding Orders on both sides of trade + initiatingOrder.setFulfilled(initiatingOrder.getFulfilled().add(fulfilled)); initiatingOrder.setIsFulfilled(Order.isFulfilled(initiatingOrder)); // Set isClosed to true if isFulfilled now true initiatingOrder.setIsClosed(initiatingOrder.getIsFulfilled()); assetRepository.save(initiatingOrder); - targetOrder.setFulfilled(targetOrder.getFulfilled().add(isNewPricing ? newPricingFulfilled : tradeData.getTargetAmount())); + targetOrder.setFulfilled(targetOrder.getFulfilled().add(fulfilled)); targetOrder.setIsFulfilled(Order.isFulfilled(targetOrder)); // Set isClosed to true if isFulfilled now true targetOrder.setIsClosed(targetOrder.getIsFulfilled()); @@ -89,16 +86,16 @@ public class Trade { // Note: targetAmount is amount traded FROM target order // Note: initiatorAmount is amount traded FROM initiating order - // Revert corresponding Orders on both sides of trade commonPrep(); - initiatingOrder.setFulfilled(initiatingOrder.getFulfilled().subtract(isNewPricing ? newPricingFulfilled : tradeData.getInitiatorAmount())); + // Revert corresponding Orders on both sides of trade + initiatingOrder.setFulfilled(initiatingOrder.getFulfilled().subtract(fulfilled)); initiatingOrder.setIsFulfilled(Order.isFulfilled(initiatingOrder)); // Set isClosed to false if isFulfilled now false initiatingOrder.setIsClosed(initiatingOrder.getIsFulfilled()); assetRepository.save(initiatingOrder); - targetOrder.setFulfilled(targetOrder.getFulfilled().subtract(isNewPricing ? newPricingFulfilled : tradeData.getTargetAmount())); + targetOrder.setFulfilled(targetOrder.getFulfilled().subtract(fulfilled)); targetOrder.setIsFulfilled(Order.isFulfilled(targetOrder)); // Set isClosed to false if isFulfilled now false targetOrder.setIsClosed(targetOrder.getIsFulfilled()); diff --git a/src/main/java/org/qortal/at/AT.java b/src/main/java/org/qortal/at/AT.java index a59970b3..b02307a4 100644 --- a/src/main/java/org/qortal/at/AT.java +++ b/src/main/java/org/qortal/at/AT.java @@ -1,11 +1,9 @@ package org.qortal.at; import java.math.BigDecimal; -import java.nio.ByteBuffer; import java.util.List; import org.ciyam.at.MachineState; -import org.qortal.asset.Asset; import org.qortal.crypto.Crypto; import org.qortal.data.at.ATData; import org.qortal.data.at.ATStateData; @@ -42,66 +40,18 @@ public class AT { int height = this.repository.getBlockRepository().getBlockchainHeight() + 1; byte[] creatorPublicKey = deployATTransactionData.getCreatorPublicKey(); long creation = deployATTransactionData.getTimestamp(); - - byte[] creationBytes = deployATTransactionData.getCreationBytes(); long assetId = deployATTransactionData.getAssetId(); - short version = (short) ((creationBytes[0] & 0xff) | (creationBytes[1] << 8)); // Little-endian - if (version >= 2) { - MachineState machineState = new MachineState(deployATTransactionData.getCreationBytes()); + MachineState machineState = new MachineState(deployATTransactionData.getCreationBytes()); - this.atData = new ATData(atAddress, creatorPublicKey, creation, machineState.version, assetId, machineState.getCodeBytes(), - machineState.getIsSleeping(), machineState.getSleepUntilHeight(), machineState.getIsFinished(), machineState.getHadFatalError(), - machineState.getIsFrozen(), machineState.getFrozenBalance()); + this.atData = new ATData(atAddress, creatorPublicKey, creation, machineState.version, assetId, machineState.getCodeBytes(), + machineState.getIsSleeping(), machineState.getSleepUntilHeight(), machineState.getIsFinished(), machineState.getHadFatalError(), + machineState.getIsFrozen(), machineState.getFrozenBalance()); - byte[] stateData = machineState.toBytes(); - byte[] stateHash = Crypto.digest(stateData); + byte[] stateData = machineState.toBytes(); + byte[] stateHash = Crypto.digest(stateData); - this.atStateData = new ATStateData(atAddress, height, creation, stateData, stateHash, BigDecimal.ZERO.setScale(8)); - } else { - // Legacy v1 AT - // We would deploy these in 'dead' state as they will never be run on Qortal - // but this breaks import from Qora1 so something else will have to mark them dead at hard-fork - - // Extract code bytes length - ByteBuffer byteBuffer = ByteBuffer.wrap(deployATTransactionData.getCreationBytes()); - - // v1 AT header is: version, reserved, code-pages, data-pages, call-stack-pages, user-stack-pages (all shorts) - - // Number of code pages - short numCodePages = byteBuffer.get(2 + 2); - - // Skip header and also "minimum activation amount" (long) - byteBuffer.position(6 * 2 + 8); - - int codeLen = 0; - - // Extract actual code length, stored in minimal-size form (byte, short or int) - if (numCodePages * 256 < 257) { - codeLen = byteBuffer.get() & 0xff; - } else if (numCodePages * 256 < Short.MAX_VALUE + 1) { - codeLen = byteBuffer.getShort() & 0xffff; - } else if (numCodePages * 256 <= Integer.MAX_VALUE) { - codeLen = byteBuffer.getInt(); - } - - // Extract code bytes - byte[] codeBytes = new byte[codeLen]; - byteBuffer.get(codeBytes); - - // Create AT - boolean isSleeping = false; - Integer sleepUntilHeight = null; - boolean isFinished = false; - boolean hadFatalError = false; - boolean isFrozen = false; - Long frozenBalance = null; - - this.atData = new ATData(atAddress, creatorPublicKey, creation, version, Asset.QORT, codeBytes, isSleeping, sleepUntilHeight, isFinished, - hadFatalError, isFrozen, frozenBalance); - - this.atStateData = new ATStateData(atAddress, height, creation, null, null, BigDecimal.ZERO.setScale(8)); - } + this.atStateData = new ATStateData(atAddress, height, creation, stateData, stateHash, BigDecimal.ZERO.setScale(8)); } // Getters / setters @@ -116,9 +66,7 @@ public class AT { ATRepository atRepository = this.repository.getATRepository(); atRepository.save(this.atData); - // For version 2+ we also store initial AT state data - if (this.atData.getVersion() >= 2) - atRepository.save(this.atStateData); + atRepository.save(this.atStateData); } public void undeploy() throws DataException { diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 4614c81c..5d4956b5 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -473,6 +473,9 @@ public class Block { /** * Return the next block's version. + *

+ * We're starting with version 4 as a nod to being newer than successor Qora, + * whose latest block version was 3. * * @return 1, 2, 3 or 4 */ @@ -480,14 +483,7 @@ public class Block { if (this.blockData.getHeight() == null) throw new IllegalStateException("Can't determine next block's version as this block has no height set"); - if (this.blockData.getHeight() < BlockChain.getInstance().getATReleaseHeight()) - return 1; - else if (this.blockData.getTimestamp() < BlockChain.getInstance().getPowFixReleaseTimestamp()) - return 2; - else if (this.blockData.getTimestamp() < BlockChain.getInstance().getQortalTimestamp()) - return 3; - else - return 4; + return 4; } /** diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index f6c7aac4..90fc98ef 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -71,15 +71,6 @@ public class BlockChain { private GenesisBlock.GenesisInfo genesisInfo; public enum FeatureTrigger { - messageHeight, // block height when MESSAGE transactions are enabled - atHeight, // block height when CIYAM automated transactions are enabled - assetsTimestamp, // timestamp when assets (issue/transfer/payments) are enabled - votingTimestamp, // timestamp when voting is enabled - arbitraryTimestamp, // timestamp when arbitrary transactions are enabled - powfixTimestamp, // timestamp when various legacy fixes come into effect - qortalTimestamp, // timestamp when Qortal changes come into effect - newAssetPricingTimestamp, // timestamp when new asset pricing comes into effect - groupApprovalTimestamp; // timestamp when transaction approval comes into effect } /** Map of which blockchain features are enabled when (height/timestamp) */ @@ -357,42 +348,6 @@ public class BlockChain { // Convenience methods for specific blockchain feature triggers - public long getMessageReleaseHeight() { - return featureTriggers.get("messageHeight"); - } - - public long getATReleaseHeight() { - return featureTriggers.get("atHeight"); - } - - public long getPowFixReleaseTimestamp() { - return featureTriggers.get("powfixTimestamp"); - } - - public long getAssetsReleaseTimestamp() { - return featureTriggers.get("assetsTimestamp"); - } - - public long getVotingReleaseTimestamp() { - return featureTriggers.get("votingTimestamp"); - } - - public long getArbitraryReleaseTimestamp() { - return featureTriggers.get("arbitraryTimestamp"); - } - - public long getQortalTimestamp() { - return featureTriggers.get("qortalTimestamp"); - } - - public long getNewAssetPricingTimestamp() { - return featureTriggers.get("newAssetPricingTimestamp"); - } - - public long getGroupApprovalTimestamp() { - return featureTriggers.get("groupApprovalTimestamp"); - } - // More complex getters for aspects that change by height or timestamp public BigDecimal getRewardAtHeight(int ourHeight) { diff --git a/src/main/java/org/qortal/data/transaction/CreateAssetOrderTransactionData.java b/src/main/java/org/qortal/data/transaction/CreateAssetOrderTransactionData.java index 6c6966f6..fede447c 100644 --- a/src/main/java/org/qortal/data/transaction/CreateAssetOrderTransactionData.java +++ b/src/main/java/org/qortal/data/transaction/CreateAssetOrderTransactionData.java @@ -7,7 +7,6 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; -import org.qortal.block.BlockChain; import org.qortal.transaction.Transaction.TransactionType; import io.swagger.v3.oas.annotations.media.Schema; @@ -54,25 +53,16 @@ public class CreateAssetOrderTransactionData extends TransactionData { // Called before converting to JSON for API public void beforeMarshal(Marshaller m) { - final boolean isNewPricing = this.timestamp > BlockChain.getInstance().getNewAssetPricingTimestamp(); - - this.amountAssetId = (isNewPricing && this.haveAssetId < this.wantAssetId) ? this.wantAssetId : this.haveAssetId; + this.amountAssetId = Math.max(this.haveAssetId, this.wantAssetId); // If we don't have the extra asset name fields then we can't fill in the others if (this.haveAssetName == null) return; - if (isNewPricing) { - // 'new' pricing scheme - if (this.haveAssetId < this.wantAssetId) { - this.amountAssetName = this.wantAssetName; - this.pricePair = this.haveAssetName + "/" + this.wantAssetName; - } else { - this.amountAssetName = this.haveAssetName; - this.pricePair = this.wantAssetName + "/" + this.haveAssetName; - } + if (this.haveAssetId < this.wantAssetId) { + this.amountAssetName = this.wantAssetName; + this.pricePair = this.haveAssetName + "/" + this.wantAssetName; } else { - // 'old' pricing scheme is simpler this.amountAssetName = this.haveAssetName; this.pricePair = this.wantAssetName + "/" + this.haveAssetName; } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java index 4f88842b..359145c9 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java @@ -677,12 +677,12 @@ public class HSQLDBDatabaseUpdates { stmt.execute("SET TIME ZONE INTERVAL '0:00' HOUR TO MINUTE"); // Normalize amount/fulfilled to asset with highest assetID, BEFORE price correction stmt.execute("UPDATE AssetOrders SET amount = amount * price, fulfilled = fulfilled * price " - + "WHERE ordered < timestamp(" + BlockChain.getInstance().getNewAssetPricingTimestamp() + ") " + + "WHERE ordered < timestamp(" + 0 /* was BlockChain.getInstance().getNewAssetPricingTimestamp() */ + ") " + "AND have_asset_id < want_asset_id"); // Normalize price into lowest-assetID/highest-assetID price-pair, e.g. QORT/asset100 // Note: HSQLDB uses BigDecimal's dividend.divide(divisor, RoundingMode.DOWN) too stmt.execute("UPDATE AssetOrders SET price = CAST(1 AS QortalAmount) / price " - + "WHERE ordered < timestamp(" + BlockChain.getInstance().getNewAssetPricingTimestamp() + ") " + + "WHERE ordered < timestamp(" + 0 /* was BlockChain.getInstance().getNewAssetPricingTimestamp() */ + ") " + "AND have_asset_id < want_asset_id"); // Revert time zone change above stmt.execute("SET TIME ZONE LOCAL"); diff --git a/src/main/java/org/qortal/transaction/ArbitraryTransaction.java b/src/main/java/org/qortal/transaction/ArbitraryTransaction.java index b1419c37..1b8f02b4 100644 --- a/src/main/java/org/qortal/transaction/ArbitraryTransaction.java +++ b/src/main/java/org/qortal/transaction/ArbitraryTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.ArbitraryTransactionData; import org.qortal.data.transaction.TransactionData; @@ -91,13 +90,6 @@ public class ArbitraryTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are arbitrary transactions even allowed at this point? - if (arbitraryTransactionData.getVersion() != Transaction.getVersionByTimestamp(arbitraryTransactionData.getTimestamp())) - return ValidationResult.NOT_YET_RELEASED; - - if (this.arbitraryTransactionData.getTimestamp() < BlockChain.getInstance().getArbitraryReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Check data length if (arbitraryTransactionData.getData().length < 1 || arbitraryTransactionData.getData().length > MAX_DATA_SIZE) return ValidationResult.INVALID_DATA_LENGTH; diff --git a/src/main/java/org/qortal/transaction/CreateAssetOrderTransaction.java b/src/main/java/org/qortal/transaction/CreateAssetOrderTransaction.java index 2c982fc7..21dbd230 100644 --- a/src/main/java/org/qortal/transaction/CreateAssetOrderTransaction.java +++ b/src/main/java/org/qortal/transaction/CreateAssetOrderTransaction.java @@ -8,7 +8,6 @@ import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; import org.qortal.asset.Order; -import org.qortal.block.BlockChain; import org.qortal.data.asset.AssetData; import org.qortal.data.asset.OrderData; import org.qortal.data.transaction.CreateAssetOrderTransactionData; @@ -106,42 +105,27 @@ public class CreateAssetOrderTransaction extends Transaction { Account creator = getCreator(); - boolean isNewPricing = createOrderTransactionData.getTimestamp() >= BlockChain.getInstance().getNewAssetPricingTimestamp(); - BigDecimal committedCost; BigDecimal maxOtherAmount; - if (isNewPricing) { - /* - * This is different under "new" pricing scheme as "amount" might be either have-asset or want-asset, - * whichever has the highest assetID. - * - * e.g. with assetID 11 "GOLD": - * haveAssetId: 0 (QORT), wantAssetId: 11 (GOLD), amount: 123 (GOLD), price: 400 (QORT/GOLD) - * stake 49200 QORT, return 123 GOLD - * - * haveAssetId: 11 (GOLD), wantAssetId: 0 (QORT), amount: 123 (GOLD), price: 400 (QORT/GOLD) - * stake 123 GOLD, return 49200 QORT - */ - boolean isAmountWantAsset = haveAssetId < wantAssetId; + /* + * "amount" might be either have-asset or want-asset, whichever has the highest assetID. + * + * e.g. with assetID 11 "GOLD": + * haveAssetId: 0 (QORT), wantAssetId: 11 (GOLD), amount: 123 (GOLD), price: 400 (QORT/GOLD) + * stake 49200 QORT, return 123 GOLD + * + * haveAssetId: 11 (GOLD), wantAssetId: 0 (QORT), amount: 123 (GOLD), price: 400 (QORT/GOLD) + * stake 123 GOLD, return 49200 QORT + */ + boolean isAmountWantAsset = haveAssetId < wantAssetId; - if (isAmountWantAsset) { - // have/commit 49200 QORT, want/return 123 GOLD - committedCost = createOrderTransactionData.getAmount().multiply(createOrderTransactionData.getPrice()); - maxOtherAmount = createOrderTransactionData.getAmount(); - } else { - // have/commit 123 GOLD, want/return 49200 QORT - committedCost = createOrderTransactionData.getAmount(); - maxOtherAmount = createOrderTransactionData.getAmount().multiply(createOrderTransactionData.getPrice()); - } + if (isAmountWantAsset) { + // have/commit 49200 QORT, want/return 123 GOLD + committedCost = createOrderTransactionData.getAmount().multiply(createOrderTransactionData.getPrice()); + maxOtherAmount = createOrderTransactionData.getAmount(); } else { - /* - * Under "old" pricing scheme, "amount" is always have-asset and price is always want-per-have. - * - * e.g. with assetID 11 "GOLD": - * haveAssetId: 0 (QORT), wantAssetId: 11 (GOLD), amount: 49200 (QORT), price: 0.00250000 (GOLD/QORT) - * haveAssetId: 11 (GOLD), wantAssetId: 0 (QORT), amount: 123 (GOLD), price: 400 (QORT/GOLD) - */ + // have/commit 123 GOLD, want/return 49200 QORT committedCost = createOrderTransactionData.getAmount(); maxOtherAmount = createOrderTransactionData.getAmount().multiply(createOrderTransactionData.getPrice()); } @@ -166,9 +150,7 @@ public class CreateAssetOrderTransaction extends Transaction { return ValidationResult.NO_BALANCE; // Check creator has enough funds for fee in QORT - // NOTE: in Gen1 pre-POWFIX-RELEASE transactions didn't have this check - if (createOrderTransactionData.getTimestamp() >= BlockChain.getInstance().getPowFixReleaseTimestamp() - && creator.getConfirmedBalance(Asset.QORT).compareTo(createOrderTransactionData.getFee()) < 0) + if (creator.getConfirmedBalance(Asset.QORT).compareTo(createOrderTransactionData.getFee()) < 0) return ValidationResult.NO_BALANCE; } diff --git a/src/main/java/org/qortal/transaction/CreatePollTransaction.java b/src/main/java/org/qortal/transaction/CreatePollTransaction.java index a3ee855f..67c45232 100644 --- a/src/main/java/org/qortal/transaction/CreatePollTransaction.java +++ b/src/main/java/org/qortal/transaction/CreatePollTransaction.java @@ -8,7 +8,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.transaction.CreatePollTransactionData; import org.qortal.data.transaction.TransactionData; @@ -78,11 +77,6 @@ public class CreatePollTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are CreatePollTransactions even allowed at this point? - // In gen1 this used NTP.getTime() but surely the transaction's timestamp should be used - if (this.createPollTransactionData.getTimestamp() < BlockChain.getInstance().getVotingReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Check owner address is valid if (!Crypto.isValidAddress(createPollTransactionData.getOwner())) return ValidationResult.INVALID_ADDRESS; diff --git a/src/main/java/org/qortal/transaction/DeployAtTransaction.java b/src/main/java/org/qortal/transaction/DeployAtTransaction.java index 191adeec..715e49cb 100644 --- a/src/main/java/org/qortal/transaction/DeployAtTransaction.java +++ b/src/main/java/org/qortal/transaction/DeployAtTransaction.java @@ -11,7 +11,6 @@ import org.ciyam.at.MachineState; import org.qortal.account.Account; import org.qortal.asset.Asset; import org.qortal.at.AT; -import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.asset.AssetData; import org.qortal.data.transaction.DeployAtTransactionData; @@ -124,9 +123,6 @@ public class DeployAtTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - if (this.repository.getBlockRepository().getBlockchainHeight() < BlockChain.getInstance().getATReleaseHeight()) - return ValidationResult.NOT_YET_RELEASED; - // Check name size bounds int nameLength = Utf8.encodedLength(deployATTransactionData.getName()); if (nameLength < 1 || nameLength > MAX_NAME_SIZE) diff --git a/src/main/java/org/qortal/transaction/IssueAssetTransaction.java b/src/main/java/org/qortal/transaction/IssueAssetTransaction.java index c10c3b37..fafdaa13 100644 --- a/src/main/java/org/qortal/transaction/IssueAssetTransaction.java +++ b/src/main/java/org/qortal/transaction/IssueAssetTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.transaction.IssueAssetTransactionData; import org.qortal.data.transaction.TransactionData; @@ -76,23 +75,11 @@ public class IssueAssetTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are IssueAssetTransactions even allowed at this point? - // In gen1 this used NTP.getTime() but surely the transaction's timestamp should be used - if (this.issueAssetTransactionData.getTimestamp() < BlockChain.getInstance().getAssetsReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - - // "data" field is only allowed in v2 + // Check data field String data = this.issueAssetTransactionData.getData(); - if (this.issueAssetTransactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) { - // v2 so check data field properly - int dataLength = Utf8.encodedLength(data); - if (data == null || dataLength < 1 || dataLength > Asset.MAX_DATA_SIZE) - return ValidationResult.INVALID_DATA_LENGTH; - } else { - // pre-v2 so disallow data field - if (data != null && !data.isEmpty()) - return ValidationResult.NOT_YET_RELEASED; - } + int dataLength = Utf8.encodedLength(data); + if (data == null || dataLength < 1 || dataLength > Asset.MAX_DATA_SIZE) + return ValidationResult.INVALID_DATA_LENGTH; // Check owner address is valid if (!Crypto.isValidAddress(issueAssetTransactionData.getOwner())) @@ -128,10 +115,9 @@ public class IssueAssetTransaction extends Transaction { @Override public ValidationResult isProcessable() throws DataException { - // Check the asset name isn't already taken. This check is not present in gen1. - if (issueAssetTransactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - if (this.repository.getAssetRepository().assetExists(issueAssetTransactionData.getAssetName())) - return ValidationResult.ASSET_ALREADY_EXISTS; + // Check the asset name isn't already taken. + if (this.repository.getAssetRepository().assetExists(issueAssetTransactionData.getAssetName())) + return ValidationResult.ASSET_ALREADY_EXISTS; return ValidationResult.OK; } diff --git a/src/main/java/org/qortal/transaction/MessageTransaction.java b/src/main/java/org/qortal/transaction/MessageTransaction.java index 59adcfad..f01fe75e 100644 --- a/src/main/java/org/qortal/transaction/MessageTransaction.java +++ b/src/main/java/org/qortal/transaction/MessageTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.MessageTransactionData; import org.qortal.data.transaction.TransactionData; @@ -89,13 +88,6 @@ public class MessageTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are message transactions even allowed at this point? - if (messageTransactionData.getVersion() != Transaction.getVersionByTimestamp(messageTransactionData.getTimestamp())) - return ValidationResult.NOT_YET_RELEASED; - - if (this.repository.getBlockRepository().getBlockchainHeight() < BlockChain.getInstance().getMessageReleaseHeight()) - return ValidationResult.NOT_YET_RELEASED; - // Check data length if (messageTransactionData.getData().length < 1 || messageTransactionData.getData().length > MAX_DATA_SIZE) return ValidationResult.INVALID_DATA_LENGTH; diff --git a/src/main/java/org/qortal/transaction/MultiPaymentTransaction.java b/src/main/java/org/qortal/transaction/MultiPaymentTransaction.java index ff0172c2..f3abcac3 100644 --- a/src/main/java/org/qortal/transaction/MultiPaymentTransaction.java +++ b/src/main/java/org/qortal/transaction/MultiPaymentTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.MultiPaymentTransactionData; import org.qortal.data.transaction.TransactionData; @@ -90,10 +89,6 @@ public class MultiPaymentTransaction extends Transaction { public ValidationResult isValid() throws DataException { List payments = multiPaymentTransactionData.getPayments(); - // Are MultiPaymentTransactions even allowed at this point? - if (this.multiPaymentTransactionData.getTimestamp() < BlockChain.getInstance().getAssetsReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Check number of payments if (payments.isEmpty() || payments.size() > MAX_PAYMENTS_COUNT) return ValidationResult.INVALID_PAYMENTS_COUNT; @@ -102,9 +97,7 @@ public class MultiPaymentTransaction extends Transaction { Account sender = getSender(); // Check sender has enough funds for fee - // NOTE: in Gen1 pre-POWFIX-RELEASE transactions didn't have this check - if (multiPaymentTransactionData.getTimestamp() >= BlockChain.getInstance().getPowFixReleaseTimestamp() - && sender.getConfirmedBalance(Asset.QORT).compareTo(multiPaymentTransactionData.getFee()) < 0) + if (sender.getConfirmedBalance(Asset.QORT).compareTo(multiPaymentTransactionData.getFee()) < 0) return ValidationResult.NO_BALANCE; return new Payment(this.repository).isValid(multiPaymentTransactionData.getSenderPublicKey(), payments, multiPaymentTransactionData.getFee()); diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index cd12aea0..4edd8596 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -354,18 +354,15 @@ public abstract class Transaction { /** * Return the transaction version number that should be used, based on passed timestamp. + *

+ * We're starting with version 4 as a nod to being newer than successor Qora, + * whose latest transaction version was 3. * * @param timestamp - * @return transaction version number, likely 1 or 3 + * @return transaction version number */ public static int getVersionByTimestamp(long timestamp) { - if (timestamp < BlockChain.getInstance().getPowFixReleaseTimestamp()) { - return 1; - } else if (timestamp < BlockChain.getInstance().getQortalTimestamp()) { - return 3; - } else { - return 4; - } + return 4; } /** @@ -803,10 +800,6 @@ public abstract class Transaction { if (!this.transactionData.getType().needsApproval) return false; - // Is group-approval even in effect yet? - if (this.transactionData.getTimestamp() < BlockChain.getInstance().getGroupApprovalTimestamp()) - return false; - int txGroupId = this.transactionData.getTxGroupId(); if (txGroupId == Group.NO_GROUP) diff --git a/src/main/java/org/qortal/transaction/TransferAssetTransaction.java b/src/main/java/org/qortal/transaction/TransferAssetTransaction.java index 4374f7f8..c87be6a6 100644 --- a/src/main/java/org/qortal/transaction/TransferAssetTransaction.java +++ b/src/main/java/org/qortal/transaction/TransferAssetTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.TransferAssetTransactionData; @@ -83,11 +82,6 @@ public class TransferAssetTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are TransferAssetTransactions even allowed at this point? - // In gen1 this used NTP.getTime() but surely the transaction's timestamp should be used - if (this.transferAssetTransactionData.getTimestamp() < BlockChain.getInstance().getAssetsReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Wrap asset transfer as a payment and delegate final payment checks to Payment class return new Payment(this.repository).isValid(transferAssetTransactionData.getSenderPublicKey(), getPaymentData(), transferAssetTransactionData.getFee()); } diff --git a/src/main/java/org/qortal/transaction/UpdateAssetTransaction.java b/src/main/java/org/qortal/transaction/UpdateAssetTransaction.java index 8f4c2d09..fc0760f5 100644 --- a/src/main/java/org/qortal/transaction/UpdateAssetTransaction.java +++ b/src/main/java/org/qortal/transaction/UpdateAssetTransaction.java @@ -7,7 +7,6 @@ import java.util.List; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.asset.AssetData; import org.qortal.data.transaction.TransactionData; @@ -75,10 +74,6 @@ public class UpdateAssetTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // V2-only transaction - if (this.updateAssetTransactionData.getTimestamp() < BlockChain.getInstance().getQortalTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Check asset actually exists AssetData assetData = this.repository.getAssetRepository().fromAssetId(updateAssetTransactionData.getAssetId()); if (assetData == null) diff --git a/src/main/java/org/qortal/transaction/VoteOnPollTransaction.java b/src/main/java/org/qortal/transaction/VoteOnPollTransaction.java index 0c8fc9ca..de19da8a 100644 --- a/src/main/java/org/qortal/transaction/VoteOnPollTransaction.java +++ b/src/main/java/org/qortal/transaction/VoteOnPollTransaction.java @@ -9,7 +9,6 @@ import org.apache.logging.log4j.Logger; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.VoteOnPollTransactionData; import org.qortal.data.voting.PollData; @@ -69,11 +68,6 @@ public class VoteOnPollTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { - // Are VoteOnPollTransactions even allowed at this point? - // In gen1 this used NTP.getTime() but surely the transaction's timestamp should be used - if (this.voteOnPollTransactionData.getTimestamp() < BlockChain.getInstance().getVotingReleaseTimestamp()) - return ValidationResult.NOT_YET_RELEASED; - // Check name size bounds int pollNameLength = Utf8.encodedLength(voteOnPollTransactionData.getPollName()); if (pollNameLength < 1 || pollNameLength > Poll.MAX_NAME_SIZE) diff --git a/src/main/java/org/qortal/transform/transaction/AccountFlagsTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/AccountFlagsTransactionTransformer.java index 032356fd..5ba1ebbc 100644 --- a/src/main/java/org/qortal/transform/transaction/AccountFlagsTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/AccountFlagsTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.AccountFlagsTransactionData; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; @@ -45,9 +44,7 @@ public class AccountFlagsTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/AccountLevelTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/AccountLevelTransactionTransformer.java index ede34e72..e0e14fc9 100644 --- a/src/main/java/org/qortal/transform/transaction/AccountLevelTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/AccountLevelTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.AccountLevelTransactionData; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; @@ -40,9 +39,7 @@ public class AccountLevelTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/AddGroupAdminTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/AddGroupAdminTransactionTransformer.java index 6b9f8059..d597322e 100644 --- a/src/main/java/org/qortal/transform/transaction/AddGroupAdminTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/AddGroupAdminTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.AddGroupAdminTransactionData; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; @@ -41,9 +40,7 @@ public class AddGroupAdminTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/ArbitraryTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/ArbitraryTransactionTransformer.java index 1dc62e22..1ba22c3c 100644 --- a/src/main/java/org/qortal/transform/transaction/ArbitraryTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/ArbitraryTransactionTransformer.java @@ -5,10 +5,8 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.PaymentData; import org.qortal.data.transaction.ArbitraryTransactionData; @@ -32,7 +30,7 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { private static final int DATA_SIZE_LENGTH = INT_LENGTH; private static final int NUMBER_PAYMENTS_LENGTH = INT_LENGTH; - private static final int EXTRAS_LENGTH = SERVICE_LENGTH + DATA_SIZE_LENGTH; + private static final int EXTRAS_LENGTH = SERVICE_LENGTH + DATA_TYPE_LENGTH + DATA_SIZE_LENGTH; protected static final TransactionLayout layout; @@ -43,14 +41,14 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { layout.add("transaction's groupID", TransformationType.INT); layout.add("reference", TransformationType.SIGNATURE); layout.add("sender's public key", TransformationType.PUBLIC_KEY); - layout.add("number of payments (v3+)", TransformationType.INT); + layout.add("number of payments", TransformationType.INT); layout.add("* recipient", TransformationType.ADDRESS); layout.add("* asset ID of payment", TransformationType.LONG); layout.add("* payment amount", TransformationType.AMOUNT); layout.add("service ID", TransformationType.INT); - layout.add("is data raw? (v4+)", TransformationType.BOOLEAN); + layout.add("is data raw?", TransformationType.BOOLEAN); layout.add("data length", TransformationType.INT); layout.add("data", TransformationType.DATA); layout.add("fee", TransformationType.AMOUNT); @@ -62,9 +60,7 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { int version = Transaction.getVersionByTimestamp(timestamp); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -82,14 +78,10 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { int service = byteBuffer.getInt(); - // With V4+ we might be receiving hash of data instead of actual raw data - DataType dataType = DataType.RAW_DATA; - if (version >= 4) { - boolean isRaw = byteBuffer.get() != 0; + // We might be receiving hash of data instead of actual raw data + boolean isRaw = byteBuffer.get() != 0; - if (!isRaw) - dataType = DataType.DATA_HASH; - } + DataType dataType = isRaw ? DataType.RAW_DATA : DataType.DATA_HASH; int dataSize = byteBuffer.getInt(); // Don't allow invalid dataSize here to avoid run-time issues @@ -114,13 +106,8 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { int length = getBaseLength(transactionData) + EXTRAS_LENGTH + arbitraryTransactionData.getData().length; - // V4+ transactions have data type - if (arbitraryTransactionData.getVersion() >= 4) - length += DATA_TYPE_LENGTH; - - // V3+ transactions have optional payments - if (arbitraryTransactionData.getVersion() >= 3) - length += NUMBER_PAYMENTS_LENGTH + arbitraryTransactionData.getPayments().size() * PaymentTransformer.getDataLength(); + // Optional payments + length += NUMBER_PAYMENTS_LENGTH + arbitraryTransactionData.getPayments().size() * PaymentTransformer.getDataLength(); return length; } @@ -133,19 +120,15 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { transformCommonBytes(transactionData, bytes); - if (arbitraryTransactionData.getVersion() != 1) { - List payments = arbitraryTransactionData.getPayments(); - bytes.write(Ints.toByteArray(payments.size())); + List payments = arbitraryTransactionData.getPayments(); + bytes.write(Ints.toByteArray(payments.size())); - for (PaymentData paymentData : payments) - bytes.write(PaymentTransformer.toBytes(paymentData)); - } + for (PaymentData paymentData : payments) + bytes.write(PaymentTransformer.toBytes(paymentData)); bytes.write(Ints.toByteArray(arbitraryTransactionData.getService())); - // V4+ also has data type - if (arbitraryTransactionData.getVersion() >= 4) - bytes.write((byte) (arbitraryTransactionData.getDataType() == DataType.RAW_DATA ? 1 : 0)); + bytes.write((byte) (arbitraryTransactionData.getDataType() == DataType.RAW_DATA ? 1 : 0)); bytes.write(Ints.toByteArray(arbitraryTransactionData.getData().length)); bytes.write(arbitraryTransactionData.getData()); @@ -162,38 +145,15 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { } /** - * In Qora v1, the bytes used for verification are really mangled so we need to test for v1-ness and adjust the bytes accordingly. + * Signature for ArbitraryTransactions always uses hash of data, not raw data itself. * * @param transactionData * @return byte[] * @throws TransformationException */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { + protected static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { ArbitraryTransactionData arbitraryTransactionData = (ArbitraryTransactionData) transactionData; - // For v4, signature uses hash of data, not raw data itself - if (arbitraryTransactionData.getVersion() == 4) - return toBytesForSigningImplV4(arbitraryTransactionData); - - byte[] bytes = TransactionTransformer.toBytesForSigningImpl(transactionData); - if (arbitraryTransactionData.getVersion() == 1 || transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return bytes; - - // Special v1 version - - // In v1, a coding error means that all bytes prior to final payment entry are lost! - // If there are no payments then we can skip mangling - if (arbitraryTransactionData.getPayments().isEmpty()) - return bytes; - - // So we're left with: final payment entry, service, data size, data, fee - int v1Length = PaymentTransformer.getDataLength() + SERVICE_LENGTH + DATA_SIZE_LENGTH + arbitraryTransactionData.getData().length + FEE_LENGTH; - int v1Start = bytes.length - v1Length; - - return Arrays.copyOfRange(bytes, v1Start, bytes.length); - } - - private static byte[] toBytesForSigningImplV4(ArbitraryTransactionData arbitraryTransactionData) throws TransformationException { try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); @@ -210,6 +170,8 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { bytes.write(Ints.toByteArray(arbitraryTransactionData.getService())); bytes.write(Ints.toByteArray(arbitraryTransactionData.getData().length)); + + // Signature uses hash of data, not raw data itself switch (arbitraryTransactionData.getDataType()) { case DATA_HASH: bytes.write(arbitraryTransactionData.getData()); @@ -228,7 +190,6 @@ public class ArbitraryTransactionTransformer extends TransactionTransformer { } catch (IOException | ClassCastException e) { throw new TransformationException(e); } - } } diff --git a/src/main/java/org/qortal/transform/transaction/BuyNameTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/BuyNameTransactionTransformer.java index 1eb384a6..d0e6e1e0 100644 --- a/src/main/java/org/qortal/transform/transaction/BuyNameTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/BuyNameTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.BuyNameTransactionData; import org.qortal.data.transaction.TransactionData; @@ -45,9 +44,7 @@ public class BuyNameTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CancelAssetOrderTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CancelAssetOrderTransactionTransformer.java index f694536a..14a93f70 100644 --- a/src/main/java/org/qortal/transform/transaction/CancelAssetOrderTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CancelAssetOrderTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CancelAssetOrderTransactionData; import org.qortal.data.transaction.TransactionData; @@ -37,9 +36,7 @@ public class CancelAssetOrderTransactionTransformer extends TransactionTransform public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CancelGroupBanTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CancelGroupBanTransactionTransformer.java index 3c0aa0d4..f2ab25dc 100644 --- a/src/main/java/org/qortal/transform/transaction/CancelGroupBanTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CancelGroupBanTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CancelGroupBanTransactionData; import org.qortal.data.transaction.TransactionData; @@ -41,9 +40,7 @@ public class CancelGroupBanTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CancelGroupInviteTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CancelGroupInviteTransactionTransformer.java index 58b01440..bd42307b 100644 --- a/src/main/java/org/qortal/transform/transaction/CancelGroupInviteTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CancelGroupInviteTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CancelGroupInviteTransactionData; import org.qortal.data.transaction.TransactionData; @@ -41,9 +40,7 @@ public class CancelGroupInviteTransactionTransformer extends TransactionTransfor public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CancelSellNameTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CancelSellNameTransactionTransformer.java index deac57c6..1f766d76 100644 --- a/src/main/java/org/qortal/transform/transaction/CancelSellNameTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CancelSellNameTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CancelSellNameTransactionData; import org.qortal.data.transaction.TransactionData; @@ -41,9 +40,7 @@ public class CancelSellNameTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CreateAssetOrderTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CreateAssetOrderTransactionTransformer.java index add1cfa6..ab56f3b9 100644 --- a/src/main/java/org/qortal/transform/transaction/CreateAssetOrderTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CreateAssetOrderTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CreateAssetOrderTransactionData; import org.qortal.data.transaction.TransactionData; @@ -13,7 +12,6 @@ import org.qortal.transaction.Transaction.TransactionType; import org.qortal.transform.TransformationException; import org.qortal.utils.Serialization; -import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; public class CreateAssetOrderTransactionTransformer extends TransactionTransformer { @@ -44,9 +42,7 @@ public class CreateAssetOrderTransactionTransformer extends TransactionTransform public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -102,41 +98,4 @@ public class CreateAssetOrderTransactionTransformer extends TransactionTransform } } - /** - * In Qora v1, the bytes used for verification have mangled price so we need to test for v1-ness and adjust the bytes accordingly. - * - * @param transactionData - * @return byte[] - * @throws TransformationException - */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return TransactionTransformer.toBytesForSigningImpl(transactionData); - - // Special v1 version - try { - CreateAssetOrderTransactionData createOrderTransactionData = (CreateAssetOrderTransactionData) transactionData; - - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - - bytes.write(Ints.toByteArray(createOrderTransactionData.getType().value)); - bytes.write(Longs.toByteArray(createOrderTransactionData.getTimestamp())); - bytes.write(createOrderTransactionData.getReference()); - - bytes.write(createOrderTransactionData.getCreatorPublicKey()); - bytes.write(Longs.toByteArray(createOrderTransactionData.getHaveAssetId())); - bytes.write(Longs.toByteArray(createOrderTransactionData.getWantAssetId())); - Serialization.serializeBigDecimal(bytes, createOrderTransactionData.getAmount(), AMOUNT_LENGTH); - - // This is the crucial difference - Serialization.serializeBigDecimal(bytes, createOrderTransactionData.getPrice(), FEE_LENGTH); - - Serialization.serializeBigDecimal(bytes, createOrderTransactionData.getFee()); - - return bytes.toByteArray(); - } catch (IOException | ClassCastException e) { - throw new TransformationException(e); - } - } - } diff --git a/src/main/java/org/qortal/transform/transaction/CreateGroupTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CreateGroupTransactionTransformer.java index e65b4db8..845b0220 100644 --- a/src/main/java/org/qortal/transform/transaction/CreateGroupTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CreateGroupTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CreateGroupTransactionData; import org.qortal.data.transaction.TransactionData; @@ -56,9 +55,7 @@ public class CreateGroupTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/CreatePollTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/CreatePollTransactionTransformer.java index 5795edc3..b324ff57 100644 --- a/src/main/java/org/qortal/transform/transaction/CreatePollTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/CreatePollTransactionTransformer.java @@ -7,7 +7,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CreatePollTransactionData; import org.qortal.data.transaction.TransactionData; @@ -54,9 +53,7 @@ public class CreatePollTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -78,13 +75,6 @@ public class CreatePollTransactionTransformer extends TransactionTransformer { String optionName = Serialization.deserializeSizedString(byteBuffer, Poll.MAX_NAME_SIZE); pollOptions.add(new PollOptionData(optionName)); - - // V1 only: voter count also present - if (timestamp < BlockChain.getInstance().getQortalTimestamp()) { - int voterCount = byteBuffer.getInt(); - if (voterCount != 0) - throw new TransformationException("Unexpected voter count in byte data for CreatePollTransaction"); - } } BigDecimal fee = Serialization.deserializeBigDecimal(byteBuffer); @@ -104,15 +94,10 @@ public class CreatePollTransactionTransformer extends TransactionTransformer { + Utf8.encodedLength(createPollTransactionData.getDescription()); // Add lengths for each poll options - for (PollOptionData pollOptionData : createPollTransactionData.getPollOptions()) { + for (PollOptionData pollOptionData : createPollTransactionData.getPollOptions()) // option-string-length, option-string dataLength += INT_LENGTH + Utf8.encodedLength(pollOptionData.getOptionName()); - if (transactionData.getTimestamp() < BlockChain.getInstance().getQortalTimestamp()) - // v1 only: voter-count (should always be zero) - dataLength += INT_LENGTH; - } - return dataLength; } @@ -133,16 +118,9 @@ public class CreatePollTransactionTransformer extends TransactionTransformer { List pollOptions = createPollTransactionData.getPollOptions(); bytes.write(Ints.toByteArray(pollOptions.size())); - for (PollOptionData pollOptionData : pollOptions) { + for (PollOptionData pollOptionData : pollOptions) Serialization.serializeSizedString(bytes, pollOptionData.getOptionName()); - if (transactionData.getTimestamp() < BlockChain.getInstance().getQortalTimestamp()) { - // In v1, CreatePollTransaction uses Poll.toBytes which serializes voters too. - // Zero voters as this is a new poll. - bytes.write(Ints.toByteArray(0)); - } - } - Serialization.serializeBigDecimal(bytes, createPollTransactionData.getFee()); if (createPollTransactionData.getSignature() != null) @@ -154,26 +132,4 @@ public class CreatePollTransactionTransformer extends TransactionTransformer { } } - /** - * In Qora v1, the bytes used for verification have transaction type set to REGISTER_NAME_TRANSACTION so we need to test for v1-ness and adjust the bytes - * accordingly. - * - * @param transactionData - * @return byte[] - * @throws TransformationException - */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { - byte[] bytes = TransactionTransformer.toBytesForSigningImpl(transactionData); - - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return bytes; - - // Special v1 version - - // Replace transaction type with incorrect Register Name value - System.arraycopy(Ints.toByteArray(TransactionType.REGISTER_NAME.value), 0, bytes, 0, INT_LENGTH); - - return bytes; - } - } diff --git a/src/main/java/org/qortal/transform/transaction/DeployAtTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/DeployAtTransactionTransformer.java index ea571739..4ff7e886 100644 --- a/src/main/java/org/qortal/transform/transaction/DeployAtTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/DeployAtTransactionTransformer.java @@ -5,13 +5,10 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.DeployAtTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.transaction.DeployAtTransaction; -import org.qortal.transaction.Transaction; import org.qortal.transaction.Transaction.TransactionType; import org.qortal.transform.TransformationException; import org.qortal.utils.Serialization; @@ -32,7 +29,7 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { private static final int ASSET_ID_LENGTH = LONG_LENGTH; private static final int EXTRAS_LENGTH = NAME_SIZE_LENGTH + DESCRIPTION_SIZE_LENGTH + AT_TYPE_SIZE_LENGTH + TAGS_SIZE_LENGTH + CREATION_BYTES_SIZE_LENGTH - + AMOUNT_LENGTH; + + AMOUNT_LENGTH + ASSET_ID_LENGTH; protected static final TransactionLayout layout; @@ -60,11 +57,7 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int version = Transaction.getVersionByTimestamp(timestamp); - - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -88,9 +81,7 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { BigDecimal amount = Serialization.deserializeBigDecimal(byteBuffer); - long assetId = Asset.QORT; - if (version >= 4) - assetId = byteBuffer.getLong(); + long assetId = byteBuffer.getLong(); BigDecimal fee = Serialization.deserializeBigDecimal(byteBuffer); @@ -107,12 +98,6 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { int dataLength = getBaseLength(transactionData) + EXTRAS_LENGTH; - int version = Transaction.getVersionByTimestamp(transactionData.getTimestamp()); - - // V4+ have assetId too - if (version >= 4) - dataLength += ASSET_ID_LENGTH; - dataLength += Utf8.encodedLength(deployATTransactionData.getName()) + Utf8.encodedLength(deployATTransactionData.getDescription()) + Utf8.encodedLength(deployATTransactionData.getAtType()) + Utf8.encodedLength(deployATTransactionData.getTags()) + deployATTransactionData.getCreationBytes().length; @@ -124,8 +109,6 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { try { DeployAtTransactionData deployATTransactionData = (DeployAtTransactionData) transactionData; - int version = Transaction.getVersionByTimestamp(transactionData.getTimestamp()); - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); transformCommonBytes(transactionData, bytes); @@ -144,8 +127,7 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { Serialization.serializeBigDecimal(bytes, deployATTransactionData.getAmount()); - if (version >= 4) - bytes.write(Longs.toByteArray(deployATTransactionData.getAssetId())); + bytes.write(Longs.toByteArray(deployATTransactionData.getAssetId())); Serialization.serializeBigDecimal(bytes, deployATTransactionData.getFee()); @@ -158,51 +140,4 @@ public class DeployAtTransactionTransformer extends TransactionTransformer { } } - /** - * In Qora v1, the bytes used for verification omit AT-type and tags so we need to test for v1-ness and adjust the bytes accordingly. - * - * @param transactionData - * @return byte[] - * @throws TransformationException - */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return TransactionTransformer.toBytesForSigningImpl(transactionData); - - // Special v1 version - - // Easier to start from scratch - try { - DeployAtTransactionData deployATTransactionData = (DeployAtTransactionData) transactionData; - - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - - bytes.write(Ints.toByteArray(deployATTransactionData.getType().value)); - bytes.write(Longs.toByteArray(deployATTransactionData.getTimestamp())); - bytes.write(deployATTransactionData.getReference()); - - bytes.write(deployATTransactionData.getCreatorPublicKey()); - - Serialization.serializeSizedString(bytes, deployATTransactionData.getName()); - - Serialization.serializeSizedString(bytes, deployATTransactionData.getDescription()); - - // Omitted: Serialization.serializeSizedString(bytes, deployATTransactionData.getATType()); - - // Omitted: Serialization.serializeSizedString(bytes, deployATTransactionData.getTags()); - - byte[] creationBytes = deployATTransactionData.getCreationBytes(); - bytes.write(Ints.toByteArray(creationBytes.length)); - bytes.write(creationBytes); - - Serialization.serializeBigDecimal(bytes, deployATTransactionData.getAmount()); - - Serialization.serializeBigDecimal(bytes, deployATTransactionData.getFee()); - - return bytes.toByteArray(); - } catch (IOException | ClassCastException e) { - throw new TransformationException(e); - } - } - } diff --git a/src/main/java/org/qortal/transform/transaction/GenesisTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/GenesisTransactionTransformer.java index 77068ec1..1f8cf918 100644 --- a/src/main/java/org/qortal/transform/transaction/GenesisTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/GenesisTransactionTransformer.java @@ -6,8 +6,6 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; import org.qortal.account.GenesisAccount; -import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.GenesisTransactionData; import org.qortal.data.transaction.TransactionData; @@ -28,6 +26,8 @@ public class GenesisTransactionTransformer extends TransactionTransformer { private static final int AMOUNT_LENGTH = LONG_LENGTH; private static final int ASSET_ID_LENGTH = LONG_LENGTH; + private static final int TOTAL_LENGTH = TYPE_LENGTH + TIMESTAMP_LENGTH + RECIPIENT_LENGTH + AMOUNT_LENGTH + ASSET_ID_LENGTH; + protected static final TransactionLayout layout; static { @@ -47,9 +47,7 @@ public class GenesisTransactionTransformer extends TransactionTransformer { BigDecimal amount = Serialization.deserializeBigDecimal(byteBuffer); - long assetId = Asset.QORT; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - assetId = byteBuffer.getLong(); + long assetId = byteBuffer.getLong(); BaseTransactionData baseTransactionData = new BaseTransactionData(timestamp, Group.NO_GROUP, null, GenesisAccount.PUBLIC_KEY, BigDecimal.ZERO, null); @@ -57,11 +55,7 @@ public class GenesisTransactionTransformer extends TransactionTransformer { } public static int getDataLength(TransactionData transactionData) throws TransformationException { - if (transactionData.getTimestamp() < BlockChain.getInstance().getQortalTimestamp()) - return TYPE_LENGTH + TIMESTAMP_LENGTH + RECIPIENT_LENGTH + AMOUNT_LENGTH; - - // Qortal - return TYPE_LENGTH + TIMESTAMP_LENGTH + RECIPIENT_LENGTH + AMOUNT_LENGTH + ASSET_ID_LENGTH; + return TOTAL_LENGTH; } public static byte[] toBytes(TransactionData transactionData) throws TransformationException { @@ -78,8 +72,7 @@ public class GenesisTransactionTransformer extends TransactionTransformer { Serialization.serializeBigDecimal(bytes, genesisTransactionData.getAmount()); - if (genesisTransactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - bytes.write(Longs.toByteArray(genesisTransactionData.getAssetId())); + bytes.write(Longs.toByteArray(genesisTransactionData.getAssetId())); return bytes.toByteArray(); } catch (IOException | ClassCastException e) { diff --git a/src/main/java/org/qortal/transform/transaction/GroupApprovalTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/GroupApprovalTransactionTransformer.java index 4f7414db..5eec7d54 100644 --- a/src/main/java/org/qortal/transform/transaction/GroupApprovalTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/GroupApprovalTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.GroupApprovalTransactionData; import org.qortal.data.transaction.TransactionData; @@ -39,9 +38,7 @@ public class GroupApprovalTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/GroupBanTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/GroupBanTransactionTransformer.java index 7e92f6f3..f9ddfae6 100644 --- a/src/main/java/org/qortal/transform/transaction/GroupBanTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/GroupBanTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.GroupBanTransactionData; import org.qortal.data.transaction.TransactionData; @@ -48,9 +47,7 @@ public class GroupBanTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/GroupInviteTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/GroupInviteTransactionTransformer.java index ecf10236..f0384e47 100644 --- a/src/main/java/org/qortal/transform/transaction/GroupInviteTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/GroupInviteTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.GroupInviteTransactionData; import org.qortal.data.transaction.TransactionData; @@ -43,9 +42,7 @@ public class GroupInviteTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/GroupKickTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/GroupKickTransactionTransformer.java index cc85fdb3..8c07c658 100644 --- a/src/main/java/org/qortal/transform/transaction/GroupKickTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/GroupKickTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.GroupKickTransactionData; import org.qortal.data.transaction.TransactionData; @@ -46,9 +45,7 @@ public class GroupKickTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/IssueAssetTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/IssueAssetTransactionTransformer.java index f9445bdc..f4419fb0 100644 --- a/src/main/java/org/qortal/transform/transaction/IssueAssetTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/IssueAssetTransactionTransformer.java @@ -4,10 +4,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.util.Arrays; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.IssueAssetTransactionData; import org.qortal.data.transaction.TransactionData; @@ -26,12 +24,11 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { private static final int DESCRIPTION_SIZE_LENGTH = INT_LENGTH; private static final int QUANTITY_LENGTH = LONG_LENGTH; private static final int IS_DIVISIBLE_LENGTH = BOOLEAN_LENGTH; - private static final int ASSET_REFERENCE_LENGTH = REFERENCE_LENGTH; private static final int DATA_SIZE_LENGTH = INT_LENGTH; private static final int IS_UNSPENDABLE_LENGTH = BOOLEAN_LENGTH; private static final int EXTRAS_LENGTH = OWNER_LENGTH + NAME_SIZE_LENGTH + DESCRIPTION_SIZE_LENGTH + QUANTITY_LENGTH - + IS_DIVISIBLE_LENGTH; + + IS_DIVISIBLE_LENGTH + DATA_SIZE_LENGTH + IS_UNSPENDABLE_LENGTH; protected static final TransactionLayout layout; @@ -59,9 +56,7 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -78,18 +73,9 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { boolean isDivisible = byteBuffer.get() != 0; - byte[] assetReference = new byte[ASSET_REFERENCE_LENGTH]; - String data = ""; - boolean isUnspendable = false; + String data = Serialization.deserializeSizedString(byteBuffer, Asset.MAX_DATA_SIZE); - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) { - // in v2, assets have additional fields - data = Serialization.deserializeSizedString(byteBuffer, Asset.MAX_DATA_SIZE); - isUnspendable = byteBuffer.get() != 0; - } else { - // In v1, IssueAssetTransaction uses Asset.parse which also deserializes reference. - byteBuffer.get(assetReference); - } + boolean isUnspendable = byteBuffer.get() != 0; BigDecimal fee = Serialization.deserializeBigDecimal(byteBuffer); @@ -104,19 +90,10 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { public static int getDataLength(TransactionData transactionData) throws TransformationException { IssueAssetTransactionData issueAssetTransactionData = (IssueAssetTransactionData) transactionData; - int dataLength = getBaseLength(transactionData) + EXTRAS_LENGTH + return getBaseLength(transactionData) + EXTRAS_LENGTH + Utf8.encodedLength(issueAssetTransactionData.getAssetName()) - + Utf8.encodedLength(issueAssetTransactionData.getDescription()); - - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) { - // In v2, assets have additional fields. - dataLength += DATA_SIZE_LENGTH + Utf8.encodedLength(issueAssetTransactionData.getData()) + IS_UNSPENDABLE_LENGTH; - } else { - // In v1, IssueAssetTransaction uses Asset.toBytes which also serializes reference. - dataLength += ASSET_REFERENCE_LENGTH; - } - - return dataLength; + + Utf8.encodedLength(issueAssetTransactionData.getDescription()) + + Utf8.encodedLength(issueAssetTransactionData.getData()); } public static byte[] toBytes(TransactionData transactionData) throws TransformationException { @@ -136,20 +113,9 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { bytes.write(Longs.toByteArray(issueAssetTransactionData.getQuantity())); bytes.write((byte) (issueAssetTransactionData.getIsDivisible() ? 1 : 0)); - // In v2, assets have additional fields. - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) { - Serialization.serializeSizedString(bytes, issueAssetTransactionData.getData()); - bytes.write((byte) (issueAssetTransactionData.getIsUnspendable() ? 1 : 0)); - } else { - // In v1, IssueAssetTransaction uses Asset.toBytes which also - // serializes Asset's reference which is the IssueAssetTransaction's - // signature - byte[] assetReference = issueAssetTransactionData.getSignature(); - if (assetReference != null) - bytes.write(assetReference); - else - bytes.write(new byte[ASSET_REFERENCE_LENGTH]); - } + Serialization.serializeSizedString(bytes, issueAssetTransactionData.getData()); + + bytes.write((byte) (issueAssetTransactionData.getIsUnspendable() ? 1 : 0)); Serialization.serializeBigDecimal(bytes, issueAssetTransactionData.getFee()); @@ -162,32 +128,4 @@ public class IssueAssetTransactionTransformer extends TransactionTransformer { } } - /** - * In Qora v1, the bytes used for verification have asset's reference zeroed - * so we need to test for v1-ness and adjust the bytes accordingly. - * - * @param transactionData - * @return byte[] - * @throws TransformationException - */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { - byte[] bytes = TransactionTransformer.toBytesForSigningImpl(transactionData); - - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return bytes; - - // Special v1 version - - // Zero duplicate signature/reference - int start = bytes.length - ASSET_REFERENCE_LENGTH - FEE_LENGTH; // before - // asset - // reference - // (and - // fee) - int end = start + ASSET_REFERENCE_LENGTH; - Arrays.fill(bytes, start, end, (byte) 0); - - return bytes; - } - } diff --git a/src/main/java/org/qortal/transform/transaction/JoinGroupTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/JoinGroupTransactionTransformer.java index 7070683a..8ccbedcf 100644 --- a/src/main/java/org/qortal/transform/transaction/JoinGroupTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/JoinGroupTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.JoinGroupTransactionData; import org.qortal.data.transaction.TransactionData; @@ -39,9 +38,7 @@ public class JoinGroupTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/LeaveGroupTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/LeaveGroupTransactionTransformer.java index 69384ff8..9e0cc1a4 100644 --- a/src/main/java/org/qortal/transform/transaction/LeaveGroupTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/LeaveGroupTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.LeaveGroupTransactionData; import org.qortal.data.transaction.TransactionData; @@ -39,9 +38,7 @@ public class LeaveGroupTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/MessageTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/MessageTransactionTransformer.java index eabd8890..48ff742f 100644 --- a/src/main/java/org/qortal/transform/transaction/MessageTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/MessageTransactionTransformer.java @@ -5,8 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.MessageTransactionData; import org.qortal.data.transaction.TransactionData; @@ -29,7 +27,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { private static final int IS_TEXT_LENGTH = BOOLEAN_LENGTH; private static final int IS_ENCRYPTED_LENGTH = BOOLEAN_LENGTH; - private static final int EXTRAS_LENGTH = RECIPIENT_LENGTH + AMOUNT_LENGTH + DATA_SIZE_LENGTH + IS_ENCRYPTED_LENGTH + IS_TEXT_LENGTH; + private static final int EXTRAS_LENGTH = RECIPIENT_LENGTH + ASSET_ID_LENGTH + AMOUNT_LENGTH + DATA_SIZE_LENGTH + IS_ENCRYPTED_LENGTH + IS_TEXT_LENGTH; protected static final TransactionLayout layout; @@ -41,7 +39,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { layout.add("reference", TransformationType.SIGNATURE); layout.add("sender's public key", TransformationType.PUBLIC_KEY); layout.add("recipient", TransformationType.ADDRESS); - layout.add("asset ID of payment (v2+)", TransformationType.LONG); + layout.add("asset ID of payment", TransformationType.LONG); layout.add("payment (can be zero)", TransformationType.AMOUNT); layout.add("message length", TransformationType.INT); layout.add("message", TransformationType.DATA); @@ -56,9 +54,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { int version = Transaction.getVersionByTimestamp(timestamp); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -67,11 +63,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { String recipient = Serialization.deserializeAddress(byteBuffer); - long assetId; - if (version == 1) - assetId = Asset.QORT; - else - assetId = byteBuffer.getLong(); + long assetId = byteBuffer.getLong(); BigDecimal amount = Serialization.deserializeBigDecimal(byteBuffer); @@ -100,13 +92,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { public static int getDataLength(TransactionData transactionData) throws TransformationException { MessageTransactionData messageTransactionData = (MessageTransactionData) transactionData; - int dataLength = getBaseLength(transactionData) + EXTRAS_LENGTH + messageTransactionData.getData().length; - - // V3+ has assetID for amount - if (messageTransactionData.getVersion() != 1) - dataLength += ASSET_ID_LENGTH; - - return dataLength; + return getBaseLength(transactionData) + EXTRAS_LENGTH + messageTransactionData.getData().length; } public static byte[] toBytes(TransactionData transactionData) throws TransformationException { @@ -119,8 +105,7 @@ public class MessageTransactionTransformer extends TransactionTransformer { Serialization.serializeAddress(bytes, messageTransactionData.getRecipient()); - if (messageTransactionData.getVersion() != 1) - bytes.write(Longs.toByteArray(messageTransactionData.getAssetId())); + bytes.write(Longs.toByteArray(messageTransactionData.getAssetId())); Serialization.serializeBigDecimal(bytes, messageTransactionData.getAmount()); diff --git a/src/main/java/org/qortal/transform/transaction/MultiPaymentTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/MultiPaymentTransactionTransformer.java index ec282b8f..1d7612f3 100644 --- a/src/main/java/org/qortal/transform/transaction/MultiPaymentTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/MultiPaymentTransactionTransformer.java @@ -5,10 +5,8 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.MultiPaymentTransactionData; @@ -47,9 +45,7 @@ public class MultiPaymentTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); @@ -103,27 +99,4 @@ public class MultiPaymentTransactionTransformer extends TransactionTransformer { } } - /** - * In Qora v1, the bytes used for verification are really mangled so we need to test for v1-ness and adjust the bytes accordingly. - * - * @param transactionData - * @return byte[] - * @throws TransformationException - */ - public static byte[] toBytesForSigningImpl(TransactionData transactionData) throws TransformationException { - byte[] bytes = TransactionTransformer.toBytesForSigningImpl(transactionData); - - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - return bytes; - - // Special v1 version - - // In v1, a coding error means that all bytes prior to final payment entry are lost! - // So we're left with: final payment entry and fee. Signature has already been stripped - int v1Length = PaymentTransformer.getDataLength() + FEE_LENGTH; - int v1Start = bytes.length - v1Length; - - return Arrays.copyOfRange(bytes, v1Start, bytes.length); - } - } diff --git a/src/main/java/org/qortal/transform/transaction/PaymentTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/PaymentTransactionTransformer.java index 8b55764a..c38b5e8e 100644 --- a/src/main/java/org/qortal/transform/transaction/PaymentTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/PaymentTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.PaymentTransactionData; import org.qortal.data.transaction.TransactionData; @@ -39,9 +38,7 @@ public class PaymentTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/RegisterNameTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/RegisterNameTransactionTransformer.java index f6235c60..ce15e46e 100644 --- a/src/main/java/org/qortal/transform/transaction/RegisterNameTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/RegisterNameTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.RegisterNameTransactionData; import org.qortal.data.transaction.TransactionData; @@ -46,9 +45,7 @@ public class RegisterNameTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/RemoveGroupAdminTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/RemoveGroupAdminTransactionTransformer.java index 752d209b..6d7de32e 100644 --- a/src/main/java/org/qortal/transform/transaction/RemoveGroupAdminTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/RemoveGroupAdminTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.RemoveGroupAdminTransactionData; import org.qortal.data.transaction.TransactionData; @@ -41,9 +40,7 @@ public class RemoveGroupAdminTransactionTransformer extends TransactionTransform public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/RewardShareTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/RewardShareTransactionTransformer.java index 44f3228d..0114fa3b 100644 --- a/src/main/java/org/qortal/transform/transaction/RewardShareTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/RewardShareTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.RewardShareTransactionData; import org.qortal.data.transaction.TransactionData; @@ -40,9 +39,7 @@ public class RewardShareTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/SellNameTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/SellNameTransactionTransformer.java index 26f3b4dd..211de889 100644 --- a/src/main/java/org/qortal/transform/transaction/SellNameTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/SellNameTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.SellNameTransactionData; import org.qortal.data.transaction.TransactionData; @@ -43,9 +42,7 @@ public class SellNameTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/SetGroupTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/SetGroupTransactionTransformer.java index 12a0f01a..f110a33a 100644 --- a/src/main/java/org/qortal/transform/transaction/SetGroupTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/SetGroupTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.SetGroupTransactionData; import org.qortal.data.transaction.TransactionData; @@ -39,9 +38,7 @@ public class SetGroupTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/TransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/TransactionTransformer.java index 820c1bdd..96b35cb0 100644 --- a/src/main/java/org/qortal/transform/transaction/TransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/TransactionTransformer.java @@ -18,7 +18,6 @@ import javax.xml.bind.annotation.XmlElement; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.account.PrivateKeyAccount; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.TransactionData; import org.qortal.transaction.Transaction; import org.qortal.transaction.Transaction.TransactionType; @@ -222,13 +221,8 @@ public abstract class TransactionTransformer extends Transformer { } protected static int getBaseLength(TransactionData transactionData) { - // All transactions have at least txType, timestamp, reference, tx creator's public key and also fee and signature (on the end) - int baseLength = TYPE_LENGTH + TIMESTAMP_LENGTH + REFERENCE_LENGTH + PUBLIC_KEY_LENGTH + FEE_LENGTH + SIGNATURE_LENGTH; - - if (transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp()) - baseLength += GROUPID_LENGTH; - - return baseLength; + // All transactions have at least txType, timestamp, txGroupId, reference, tx creator's public key and also fee and signature (on the end) + return TYPE_LENGTH + TIMESTAMP_LENGTH + GROUPID_LENGTH + REFERENCE_LENGTH + PUBLIC_KEY_LENGTH + FEE_LENGTH + SIGNATURE_LENGTH; } public static int getDataLength(TransactionData transactionData) throws TransformationException { @@ -309,17 +303,14 @@ public abstract class TransactionTransformer extends Transformer { } protected static void transformCommonBytes(TransactionData transactionData, ByteArrayOutputStream bytes) throws IOException { - boolean v2 = transactionData.getTimestamp() >= BlockChain.getInstance().getQortalTimestamp(); - // Transaction type bytes.write(Ints.toByteArray(transactionData.getType().value)); // Timestamp bytes.write(Longs.toByteArray(transactionData.getTimestamp())); - if (v2) - // Transaction's groupID - bytes.write(Ints.toByteArray(transactionData.getTxGroupId())); + // Transaction's groupID + bytes.write(Ints.toByteArray(transactionData.getTxGroupId())); // Reference bytes.write(transactionData.getReference()); diff --git a/src/main/java/org/qortal/transform/transaction/TransferAssetTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/TransferAssetTransactionTransformer.java index 9e1f59f2..ff07c026 100644 --- a/src/main/java/org/qortal/transform/transaction/TransferAssetTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/TransferAssetTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.TransferAssetTransactionData; @@ -43,9 +42,7 @@ public class TransferAssetTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/TransferPrivsTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/TransferPrivsTransactionTransformer.java index 66fcaf3a..47fa4d0d 100644 --- a/src/main/java/org/qortal/transform/transaction/TransferPrivsTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/TransferPrivsTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.TransferPrivsTransactionData; @@ -37,9 +36,7 @@ public class TransferPrivsTransactionTransformer extends TransactionTransformer public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/UpdateAssetTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/UpdateAssetTransactionTransformer.java index c0d2b70b..250c1bdc 100644 --- a/src/main/java/org/qortal/transform/transaction/UpdateAssetTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/UpdateAssetTransactionTransformer.java @@ -6,7 +6,6 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.UpdateAssetTransactionData; @@ -50,9 +49,7 @@ public class UpdateAssetTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/UpdateGroupTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/UpdateGroupTransactionTransformer.java index ac587c20..7fa2320e 100644 --- a/src/main/java/org/qortal/transform/transaction/UpdateGroupTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/UpdateGroupTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.UpdateGroupTransactionData; @@ -56,9 +55,7 @@ public class UpdateGroupTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/UpdateNameTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/UpdateNameTransactionTransformer.java index 41b7c216..e9e843cc 100644 --- a/src/main/java/org/qortal/transform/transaction/UpdateNameTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/UpdateNameTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.UpdateNameTransactionData; @@ -46,9 +45,7 @@ public class UpdateNameTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/main/java/org/qortal/transform/transaction/VoteOnPollTransactionTransformer.java b/src/main/java/org/qortal/transform/transaction/VoteOnPollTransactionTransformer.java index 8bb577ab..e256d290 100644 --- a/src/main/java/org/qortal/transform/transaction/VoteOnPollTransactionTransformer.java +++ b/src/main/java/org/qortal/transform/transaction/VoteOnPollTransactionTransformer.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.ByteBuffer; -import org.qortal.block.BlockChain; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.VoteOnPollTransactionData; @@ -44,9 +43,7 @@ public class VoteOnPollTransactionTransformer extends TransactionTransformer { public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException { long timestamp = byteBuffer.getLong(); - int txGroupId = 0; - if (timestamp >= BlockChain.getInstance().getQortalTimestamp()) - txGroupId = byteBuffer.getInt(); + int txGroupId = byteBuffer.getInt(); byte[] reference = new byte[REFERENCE_LENGTH]; byteBuffer.get(reference); diff --git a/src/test/java/org/qortal/test/CompatibilityTests.java b/src/test/java/org/qortal/test/CompatibilityTests.java deleted file mode 100644 index e3de07b1..00000000 --- a/src/test/java/org/qortal/test/CompatibilityTests.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.qortal.test; - -import org.junit.Test; -import org.qortal.data.transaction.TransactionData; -import org.qortal.repository.DataException; -import org.qortal.settings.Settings; -import org.qortal.test.common.Common; -import org.qortal.transaction.CreateAssetOrderTransaction; -import org.qortal.transaction.CreatePollTransaction; -import org.qortal.transaction.IssueAssetTransaction; -import org.qortal.transform.TransformationException; -import org.qortal.transform.transaction.TransactionTransformer; -import org.qortal.utils.NTP; - -import static org.junit.Assert.*; - -import org.junit.Before; - -import com.google.common.hash.HashCode; - -public class CompatibilityTests extends Common { - - @Before - public void beforeTest() throws DataException { - Common.useSettings("test-settings-v1.json"); - NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); - } - - @Test - public void testCreateOrderTransactionSignature() throws TransformationException { - // 4EsGzQ87rXqXw2nic8LiihGCrM5iNErK53u9TRo2AJv4FWWyCK7bUKrCmswnrBbkB7Dsk7wfzi9hM2TGGqm6LVpd - byte[] rawTx = HashCode - .fromString("0000000d" + "000001489be3ef8e" - + "10b52b229c73afb40a56df4f1c9f65072041011cf9ae25a053397d9fc5578bc8f1412eb404de4e318e24302863fc52889eb848af65a6b17cfc964267388f5802" - + "bf497fa72ed16894f3acab6c4a101fd8b5fd42f0420dad45474388d5492d38d0" + "0000000000000000" + "0000000000000001" - + "000000000000000005f5e100" + "000000000000000005f5e100" + "0000000005f5e100" - + "a2025bfde5c90254e16150db6aef6189bb2856df51940b6a15b1d5f174451236062c982af4da3429941337abc7002a862782fb9c726bfc95aea31e30bf66a502") - .asBytes(); - - TransactionData transactionData = TransactionTransformer.fromBytes(rawTx); - - CreateAssetOrderTransaction transaction = new CreateAssetOrderTransaction(null, transactionData); - assertTrue(transaction.isSignatureValid()); - } - - @Test - public void testCreatePollTransactionSignature() throws TransformationException { - // 5xo8YxDVTFVR1pdmtxYkRbq3PkcKVttyH7wCVAfgqokDMKE1XW6zrqFgJG8vRQz9qi5r8cqBoSgFKLnQRoSyzpgF - byte[] rawTx = HashCode - .fromString("00000008" + "00000146d4237f03" - + "c201817ee2d4363801b63cbe154f6796719feb5a9673758dfda7b5e616cddd1263bbb75ce6a14ca116abe2d34ea68f353379d0c0d48da62180677053792f3b00" - + "ef893a99782612754157d868fc4194577cca8ca5dd264c90855829f0e4bbec3a" + "3a91655f3c70d7a38980b449ccf7acd84de41f99dae6215ed5" + "0000000a" - + "746869736973706f6c6c" + "00000004" + "74657374" + "00000002" + "00000011" + "546869732069732073706f6e6765626f62" + "00000000" - + "0000000f" + "54686973206973207061747269636b" + "00000000" + "0000000005f5e100" - + "f82f0c7421333c2cae5d0d0200e7f4726cda60baecad4ba067c7da17c681e2fb20612991f75763791b228c258f79ec2ecc40788fdda71b8f11a9032417ec7e08") - .asBytes(); - - TransactionData transactionData = TransactionTransformer.fromBytes(rawTx); - - CreatePollTransaction transaction = new CreatePollTransaction(null, transactionData); - assertTrue(transaction.isSignatureValid()); - } - - @Test - public void testIssueAssetTransactionSignature() throws TransformationException { - // 3JeJ8yGnG8RCQH51S2qYJT5nfbokjHnBmM7KZsj61HPRy8K3ZWkGHh99QQ6HbRHxnknnjjAsffHRaeca1ap3tcFv - byte[] rawTx = HashCode - .fromString( - "0000000b000001489376bea34d4cbdb644be00b5848a2beeee087fdb98de49a010e686de9540f7d83720cdd182ca6efd1a6225f72f2821ed8a19f236002aef33afa4e2e419fe641c2bc4800a8dd3440f3ce0526c924f2cc15f3fdc1afcf4d57e4502c7a13bfed9851e81abc93a6a24ae1a453205b39d0c3bd24fb5eb675cd199e7cb5b316c00000003787878000000117878787878787878787878787878787878000000000000006400733fa8fa762c404ca1ddd799e93cc8ea292cd9fdd84d5c8b094050d4f576ea56071055f9fe337bf610624514f673e66462f8719759242b5635f19da088b311050000000005f5e100733fa8fa762c404ca1ddd799e93cc8ea292cd9fdd84d5c8b094050d4f576ea56071055f9fe337bf610624514f673e66462f8719759242b5635f19da088b31105") - .asBytes(); - - TransactionData transactionData = TransactionTransformer.fromBytes(rawTx); - - IssueAssetTransaction transaction = new IssueAssetTransaction(null, transactionData); - assertTrue(transaction.isSignatureValid()); - } - -} diff --git a/src/test/java/org/qortal/test/assets/MixedPricingTests.java b/src/test/java/org/qortal/test/assets/MixedPricingTests.java deleted file mode 100644 index c4294468..00000000 --- a/src/test/java/org/qortal/test/assets/MixedPricingTests.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.qortal.test.assets; - -import org.junit.After; -import org.junit.Before; -import org.qortal.repository.DataException; -import org.qortal.test.common.Common; - -public class MixedPricingTests extends Common{ - - @Before - public void beforeTest() throws DataException { - Common.useSettings("test-settings-old-asset.json"); - } - - @After - public void afterTest() throws DataException { - Common.orphanCheck(); - } - - /** - * Check order matching between 'old' pricing order and 'new' pricing order. - *

- * In this test, the order created under 'old' pricing scheme has - * "amount" in have-asset? - */ - -} diff --git a/src/test/java/org/qortal/test/assets/OldTradingTests.java b/src/test/java/org/qortal/test/assets/OldTradingTests.java deleted file mode 100644 index 6a4752cf..00000000 --- a/src/test/java/org/qortal/test/assets/OldTradingTests.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.qortal.test.assets; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.qortal.repository.DataException; -import org.qortal.repository.Repository; -import org.qortal.repository.RepositoryManager; -import org.qortal.settings.Settings; -import org.qortal.test.common.AccountUtils; -import org.qortal.test.common.AssetUtils; -import org.qortal.test.common.Common; -import org.qortal.utils.NTP; - -import java.math.BigDecimal; -import java.util.Map; - -public class OldTradingTests extends Common { - - @Before - public void beforeTest() throws DataException { - Common.useSettings("test-settings-old-asset.json"); - NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); - } - - @After - public void afterTest() throws DataException { - Common.orphanCheck(); - } - - /** - * Check matching of indivisible amounts. - *

- * We use orders similar to some found in legacy qora1 blockchain - * to test for expected results with indivisible assets. - *

- * In addition, although the 3rd "further" order would match up to 999 RUB.iPLZ, - * granularity at that price reduces matched amount to 493 RUB.iPLZ. - */ - @Test - public void testOldIndivisible() throws DataException { - // Issue some indivisible assets - long asset112Id; - long asset113Id; - try (Repository repository = RepositoryManager.getRepository()) { - // Issue indivisible asset - asset112Id = AssetUtils.issueAsset(repository, "alice", "RUB.iPLZ", 999999999999L, false); - - // Issue another indivisible asset - asset113Id = AssetUtils.issueAsset(repository, "bob", "RU.GZP.V123", 10000L, false); - } - - // Transfer some assets so orders can be created - try (Repository repository = RepositoryManager.getRepository()) { - AssetUtils.transferAsset(repository, "alice", "bob", asset112Id, BigDecimal.valueOf(5000L).setScale(8)); - AssetUtils.transferAsset(repository, "bob", "alice", asset113Id, BigDecimal.valueOf(5000L).setScale(8)); - } - - final BigDecimal asset113Amount = new BigDecimal("1000").setScale(8); - final BigDecimal asset112Price = new BigDecimal("1.00000000").setScale(8); - - final BigDecimal asset112Amount = new BigDecimal("2000").setScale(8); - final BigDecimal asset113Price = new BigDecimal("0.98600000").setScale(8); - - final BigDecimal asset112Matched = new BigDecimal("1000").setScale(8); - final BigDecimal asset113Matched = new BigDecimal("1000").setScale(8); - - AssetUtils.genericTradeTest(asset113Id, asset112Id, asset113Amount, asset112Price, asset112Amount, asset113Price, asset113Amount, asset112Amount, asset112Matched, asset113Matched, BigDecimal.ZERO); - - // Further trade - final BigDecimal asset113Amount2 = new BigDecimal("986").setScale(8); - final BigDecimal asset112Price2 = new BigDecimal("1.00000000").setScale(8); - - final BigDecimal asset112Matched2 = new BigDecimal("500").setScale(8); - final BigDecimal asset113Matched2 = new BigDecimal("493").setScale(8); - - try (Repository repository = RepositoryManager.getRepository()) { - Map> initialBalances = AccountUtils.getBalances(repository, asset112Id, asset113Id); - - // Create further order - byte[] furtherOrderId = AssetUtils.createOrder(repository, "alice", asset113Id, asset112Id, asset113Amount2, asset112Price2); - - // Check balances to check expected outcome - BigDecimal expectedBalance; - - // Alice asset 113 - expectedBalance = initialBalances.get("alice").get(asset113Id).subtract(asset113Amount2); - AccountUtils.assertBalance(repository, "alice", asset113Id, expectedBalance); - - // Alice asset 112 - expectedBalance = initialBalances.get("alice").get(asset112Id).add(asset112Matched2); - AccountUtils.assertBalance(repository, "alice", asset112Id, expectedBalance); - - BigDecimal expectedFulfilled = asset113Matched2; - BigDecimal actualFulfilled = repository.getAssetRepository().fromOrderId(furtherOrderId).getFulfilled(); - assertEqualBigDecimals("Order fulfilled incorrect", expectedFulfilled, actualFulfilled); - } - } - - /** - * Check legacy partial matching of orders with prices that - * can't be represented in floating binary. - *

- * For example, sell 2 GOLD for 24 OTHER so - * unit price is 2 / 24 or 0.08333333. - *

- * This inexactness causes the match amount to be - * only 1.99999992 instead of the expected 2.00000000. - *

- * However this behaviour is "grandfathered" in legacy/"old" - * mode so we need to test. - */ - @Test - public void testOldNonExactFraction() throws DataException { - final BigDecimal aliceAmount = new BigDecimal("24.00000000").setScale(8); - final BigDecimal alicePrice = new BigDecimal("0.08333333").setScale(8); - - final BigDecimal bobAmount = new BigDecimal("2.00000000").setScale(8); - final BigDecimal bobPrice = new BigDecimal("12.00000000").setScale(8); - - final BigDecimal aliceCommitment = aliceAmount; - final BigDecimal bobCommitment = bobAmount; - - // Due to rounding these are the expected traded amounts. - final BigDecimal aliceReturn = new BigDecimal("1.99999992").setScale(8); - final BigDecimal bobReturn = new BigDecimal("24.00000000").setScale(8); - - AssetUtils.genericTradeTest(AssetUtils.goldAssetId, AssetUtils.otherAssetId, aliceAmount, alicePrice, bobAmount, bobPrice, aliceCommitment, bobCommitment, aliceReturn, bobReturn, BigDecimal.ZERO); - } - - /** - * Check legacy qora1 blockchain matching behaviour. - */ - @Test - public void testQora1Compat() throws DataException { - // Asset 61 [ATFunding] was issued by QYsLsfwMRBPnunmuWmFkM4hvGsfooY8ssU with 250,000,000 quantity and was divisible. - - // Target order 2jMinWSBjxaLnQvhcEoWGs2JSdX7qbwxMTZenQXXhjGYDHCJDL6EjXPz5VXYuUfZM5LvRNNbcaeBbM6Xhb4tN53g - // Creator was QZyuTa3ygjThaPRhrCp1BW4R5Sed6uAGN8 at 2014-10-23 11:14:42.525000+0:00 - // Have: 150000 [ATFunding], Price: 1.7000000 QORA - - // Initiating order 3Ufqi52nDL3Gi7KqVXpgebVN5FmLrdq2XyUJ11BwSV4byxQ2z96Q5CQeawGyanhpXS4XkYAaJTrNxsDDDxyxwbMN - // Creator was QMRoD3RS5vJ4DVNBhBgGtQG4KT3PhkNALH at 2015-03-27 12:24:02.945000+0:00 - // Have: 2 QORA, Price: 0.58 [ATFunding] - - // Trade: 1.17647050 [ATFunding] for 1.99999985 QORA - - // We'll use GOLD test asset instead of ATFunding, and OTHER test asset instead of QORA - - final BigDecimal aliceAmount = new BigDecimal("150000").setScale(8); - final BigDecimal alicePrice = new BigDecimal("1.70000000").setScale(8); - - final BigDecimal bobAmount = new BigDecimal("2.00000000").setScale(8); - final BigDecimal bobPrice = new BigDecimal("0.58000000").setScale(8); - - final BigDecimal aliceCommitment = aliceAmount; - final BigDecimal bobCommitment = bobAmount; - - final BigDecimal aliceReturn = new BigDecimal("1.99999985").setScale(8); - final BigDecimal bobReturn = new BigDecimal("1.17647050").setScale(8); - - AssetUtils.genericTradeTest(AssetUtils.goldAssetId, AssetUtils.otherAssetId, aliceAmount, alicePrice, bobAmount, bobPrice, aliceCommitment, bobCommitment, aliceReturn, bobReturn, BigDecimal.ZERO); - } - - /** - * Check legacy qora1 blockchain matching behaviour. - */ - @Test - public void testQora1Compat2() throws DataException { - // Asset 95 [Bitcoin] was issued by QiGx93L9rNHSNWCY1bJnQTPwB3nhxYTCUj with 21000000 quantity and was divisible. - // Asset 96 [BitBTC] was issued by QiGx93L9rNHSNWCY1bJnQTPwB3nhxYTCUj with 21000000 quantity and was divisible. - - // Target order 3jinKPHEak9xrjeYtCaE1PawwRZeRkhYA6q4A7sqej7f3jio8WwXwXpfLWVZkPQ3h6cVdwPhcDFNgbbrBXcipHee - // Creator was QiGx93L9rNHSNWCY1bJnQTPwB3nhxYTCUj at 2015-06-10 20:31:44.840000+0:00 - // Have: 1000000 [BitBTC], Price: 0.90000000 [Bitcoin] - - // Initiating order Jw1UfgspZ344waF8qLhGJanJXVa32FBoVvMW5ByFkyHvZEumF4fPqbaGMa76ba1imC4WX5t3Roa7r23Ys6rhKAA - // Creator was QiGx93L9rNHSNWCY1bJnQTPwB3nhxYTCUj at 2015-06-14 17:49:41.410000+0:00 - // Have: 73251 [Bitcoin], Price: 1.01 [BitBTC] - - // Trade: 81389.99991860 [BitBTC] for 73250.99992674 [Bitcoin] - - // We'll use TEST test asset instead of BitBTC, and OTHER test asset instead of Bitcoin - - final BigDecimal aliceAmount = new BigDecimal("1000000").setScale(8); - final BigDecimal alicePrice = new BigDecimal("0.90000000").setScale(8); - - final BigDecimal bobAmount = new BigDecimal("73251").setScale(8); - final BigDecimal bobPrice = new BigDecimal("1.01000000").setScale(8); - - final BigDecimal aliceCommitment = aliceAmount; - final BigDecimal bobCommitment = bobAmount; - - final BigDecimal aliceReturn = new BigDecimal("73250.99992674").setScale(8); - final BigDecimal bobReturn = new BigDecimal("81389.99991860").setScale(8); - - AssetUtils.genericTradeTest(AssetUtils.testAssetId, AssetUtils.otherAssetId, aliceAmount, alicePrice, bobAmount, bobPrice, aliceCommitment, bobCommitment, aliceReturn, bobReturn, BigDecimal.ZERO); - } - -} \ No newline at end of file diff --git a/src/test/java/org/qortal/test/assets/NewTradingTests.java b/src/test/java/org/qortal/test/assets/TradingTests.java similarity index 99% rename from src/test/java/org/qortal/test/assets/NewTradingTests.java rename to src/test/java/org/qortal/test/assets/TradingTests.java index 80003d83..d307e41d 100644 --- a/src/test/java/org/qortal/test/assets/NewTradingTests.java +++ b/src/test/java/org/qortal/test/assets/TradingTests.java @@ -15,7 +15,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Map; -public class NewTradingTests extends Common { +public class TradingTests extends Common { @Before public void beforeTest() throws DataException { diff --git a/src/test/java/org/qortal/test/common/AssetUtils.java b/src/test/java/org/qortal/test/common/AssetUtils.java index d16ffa0a..66930ddf 100644 --- a/src/test/java/org/qortal/test/common/AssetUtils.java +++ b/src/test/java/org/qortal/test/common/AssetUtils.java @@ -7,7 +7,6 @@ import java.util.Base64; import java.util.Base64.Encoder; import org.qortal.account.PrivateKeyAccount; -import org.qortal.block.BlockChain; import org.qortal.data.asset.OrderData; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.CancelAssetOrderTransactionData; @@ -113,8 +112,6 @@ public class AssetUtils { OrderData targetOrderData = repository.getAssetRepository().fromOrderId(targetOrderId); OrderData initiatingOrderData = repository.getAssetRepository().fromOrderId(initiatingOrderId); - boolean isNewPricing = initiatingOrderData.getTimestamp() > BlockChain.getInstance().getNewAssetPricingTimestamp(); - // Alice selling have asset expectedBalance = initialBalances.get("alice").get(haveAssetId).subtract(aliceCommitment); AccountUtils.assertBalance(repository, "alice", haveAssetId, expectedBalance); @@ -132,17 +129,14 @@ public class AssetUtils { AccountUtils.assertBalance(repository, "bob", haveAssetId, expectedBalance); // Check orders - BigDecimal expectedFulfilled; - BigDecimal newPricingAmount = (initiatingOrderData.getHaveAssetId() < initiatingOrderData.getWantAssetId()) ? bobReturn : aliceReturn; + BigDecimal expectedFulfilled = (initiatingOrderData.getHaveAssetId() < initiatingOrderData.getWantAssetId()) ? bobReturn : aliceReturn; // Check matching order assertNotNull("matching order missing", initiatingOrderData); - expectedFulfilled = isNewPricing ? newPricingAmount : aliceReturn; Common.assertEqualBigDecimals(String.format("Bob's order \"fulfilled\" incorrect"), expectedFulfilled, initiatingOrderData.getFulfilled()); // Check initial order assertNotNull("initial order missing", targetOrderData); - expectedFulfilled = isNewPricing ? newPricingAmount : bobReturn; Common.assertEqualBigDecimals(String.format("Alice's order \"fulfilled\" incorrect"), expectedFulfilled, targetOrderData.getFulfilled()); } } diff --git a/src/test/resources/test-chain-old-asset.json b/src/test/resources/test-chain-old-asset.json deleted file mode 100644 index 08bb6a6a..00000000 --- a/src/test/resources/test-chain-old-asset.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "isTestChain": true, - "blockTimestampMargin": 500, - "transactionExpiryPeriod": 86400000, - "maxBlockSize": 2097152, - "maxBytesPerUnitFee": 1024, - "unitFee": "0.1", - "requireGroupForApproval": false, - "minAccountLevelToRewardShare": 5, - "maxRewardSharesPerMintingAccount": 20, - "founderEffectiveMintingLevel": 10, - "onlineAccountSignaturesMinLifetime": 3600000, - "onlineAccountSignaturesMaxLifetime": 86400000, - "rewardsByHeight": [ - { "height": 1, "reward": 100 }, - { "height": 11, "reward": 10 }, - { "height": 21, "reward": 1 } - ], - "sharesByLevel": [ - { "levels": [ 1, 2 ], "share": 0.05 }, - { "levels": [ 3, 4 ], "share": 0.10 }, - { "levels": [ 5, 6 ], "share": 0.15 }, - { "levels": [ 7, 8 ], "share": 0.20 }, - { "levels": [ 9, 10 ], "share": 0.25 } - ], - "qoraHoldersShare": 0.20, - "qoraPerQortReward": 250, - "blocksNeededByLevel": [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ], - "blockTimingsByHeight": [ - { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } - ], - "featureTriggers": { - "messageHeight": 0, - "atHeight": 0, - "assetsTimestamp": 0, - "votingTimestamp": 0, - "arbitraryTimestamp": 0, - "powfixTimestamp": 0, - "v2Timestamp": 0, - "newAssetPricingTimestamp": 1600000000000, - "groupApprovalTimestamp": 0 - }, - "genesisInfo": { - "version": 4, - "timestamp": 0, - "transactions": [ - { "type": "ISSUE_ASSET", "owner": "QUwGVHPPxJNJ2dq95abQNe79EyBN2K26zM", "assetName": "QORT", "description": "QORT native coin", "data": "", "quantity": 0, "isDivisible": true, "fee": 0, "reference": "3Verk6ZKBJc3WTTVfxFC9icSjKdM8b92eeJEpJP8qNizG4ZszNFq8wdDYdSjJXq2iogDFR1njyhsBdVpbvDfjzU7" }, - { "type": "ISSUE_ASSET", "owner": "QUwGVHPPxJNJ2dq95abQNe79EyBN2K26zM", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, - { "type": "ISSUE_ASSET", "owner": "QUwGVHPPxJNJ2dq95abQNe79EyBN2K26zM", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, - - { "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000", "fee": 0 }, - - { "type": "ISSUE_ASSET", "owner": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "assetName": "TEST", "description": "test asset", "data": "", "quantity": 1000000, "isDivisible": true, "fee": 0 }, - { "type": "ISSUE_ASSET", "owner": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "assetName": "OTHER", "description": "other test asset", "data": "", "quantity": 1000000, "isDivisible": true, "fee": 0 }, - { "type": "ISSUE_ASSET", "owner": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "assetName": "GOLD", "description": "gold test asset", "data": "", "quantity": 1000000, "isDivisible": true, "fee": 0 }, - - { "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 }, - { "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": 100 } - ] - } -} diff --git a/src/test/resources/test-chain-v1.json b/src/test/resources/test-chain-v1.json deleted file mode 100644 index f3685db1..00000000 --- a/src/test/resources/test-chain-v1.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "isTestChain": true, - "blockTimestampMargin": 500, - "transactionExpiryPeriod": 86400000, - "maxBlockSize": 2097152, - "maxBytesPerUnitFee": 1024, - "unitFee": "0.1", - "requireGroupForApproval": false, - "minAccountLevelToRewardShare": 5, - "maxRewardSharesPerMintingAccount": 20, - "founderEffectiveMintingLevel": 10, - "onlineAccountSignaturesMinLifetime": 3600000, - "onlineAccountSignaturesMaxLifetime": 86400000, - "rewardsByHeight": [ - { "height": 1, "reward": 100 }, - { "height": 11, "reward": 10 }, - { "height": 21, "reward": 1 } - ], - "sharesByLevel": [ - { "levels": [ 1, 2 ], "share": 0.05 }, - { "levels": [ 3, 4 ], "share": 0.10 }, - { "levels": [ 5, 6 ], "share": 0.15 }, - { "levels": [ 7, 8 ], "share": 0.20 }, - { "levels": [ 9, 10 ], "share": 0.25 } - ], - "qoraHoldersShare": 0.20, - "qoraPerQortReward": 250, - "blocksNeededByLevel": [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ], - "blockTimingsByHeight": [ - { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } - ], - "featureTriggers": { - "messageHeight": 0, - "atHeight": 0, - "assetsTimestamp": 0, - "votingTimestamp": 0, - "arbitraryTimestamp": 0, - "powfixTimestamp": 0, - "qortalTimestamp": 1600000000000, - "newAssetPricingTimestamp": 1600000000000, - "groupApprovalTimestamp": 0 - }, - "genesisInfo": { - "version": 1, - "timestamp": 1400247274336, - "transactions": [ - { "type": "ISSUE_ASSET", "owner": "QcFmNxSArv5tWEzCtTKb2Lqc5QkKuQ7RNs", "assetName": "QORA", "description": "QORA native coin", "data": "", "quantity": 10000000000, "isDivisible": true, "fee": 0, "reference": "3Verk6ZKBJc3WTTVfxFC9icSjKdM8b92eeJEpJP8qNizG4ZszNFq8wdDYdSjJXq2iogDFR1njyhsBdVpbvDfjzU7" }, - { "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000", "fee": 0 }, - { "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000", "fee": 0 } - ] - } -} diff --git a/src/test/resources/test-settings-old-asset.json b/src/test/resources/test-settings-old-asset.json deleted file mode 100644 index 587a880c..00000000 --- a/src/test/resources/test-settings-old-asset.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "restrictedApi": false, - "blockchainConfig": "src/test/resources/test-chain-old-asset.json", - "wipeUnconfirmedOnStart": false, - "minPeers": 0 -} diff --git a/src/test/resources/test-settings-v1.json b/src/test/resources/test-settings-v1.json deleted file mode 100644 index 675d0c51..00000000 --- a/src/test/resources/test-settings-v1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "restrictedApi": false, - "blockchainConfig": "src/test/resources/test-chain-v1.json", - "wipeUnconfirmedOnStart": false, - "minPeers": 0 -}