diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 8551e4e7..34a87e9a 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -176,19 +176,26 @@ public class Block { * * @return account-level share "bin" from blockchain config, or null if founder / none found */ - public AccountLevelShareBin getShareBin() { + public AccountLevelShareBin getShareBin(int blockHeight) { if (this.isMinterFounder) return null; final int accountLevel = this.mintingAccountData.getLevel(); if (accountLevel <= 0) - return null; + return null; // level 0 isn't included in any share bins - final AccountLevelShareBin[] shareBinsByLevel = BlockChain.getInstance().getShareBinsByAccountLevel(); + final BlockChain blockChain = BlockChain.getInstance(); + final AccountLevelShareBin[] shareBinsByLevel = blockChain.getShareBinsByAccountLevel(); if (accountLevel > shareBinsByLevel.length) return null; - return shareBinsByLevel[accountLevel]; + if (blockHeight < blockChain.getShareBinFixHeight()) + // Off-by-one bug still in effect + return shareBinsByLevel[accountLevel]; + + // level 1 stored at index 0, level 2 stored at index 1, etc. + return shareBinsByLevel[accountLevel-1]; + } public long distribute(long accountAmount, Map balanceChanges) { @@ -1783,7 +1790,7 @@ public class Block { // Find all accounts in share bin. getShareBin() returns null for minter accounts that are also founders, so they are effectively filtered out. AccountLevelShareBin accountLevelShareBin = accountLevelShareBins.get(binIndex); // Object reference compare is OK as all references are read-only from blockchain config. - List binnedAccounts = expandedAccounts.stream().filter(accountInfo -> accountInfo.getShareBin() == accountLevelShareBin).collect(Collectors.toList()); + List binnedAccounts = expandedAccounts.stream().filter(accountInfo -> accountInfo.getShareBin(this.blockData.getHeight()) == accountLevelShareBin).collect(Collectors.toList()); // No online accounts in this bin? Skip to next one if (binnedAccounts.isEmpty()) diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index b3221619..a91a33d1 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -71,7 +71,8 @@ public class BlockChain { public enum FeatureTrigger { atFindNextTransactionFix, - newBlockSigHeight; + newBlockSigHeight, + shareBinFix; } /** Map of which blockchain features are enabled when (height/timestamp) */ @@ -381,6 +382,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.newBlockSigHeight.name()).intValue(); } + public int getShareBinFixHeight() { + return this.featureTriggers.get(FeatureTrigger.shareBinFix.name()).intValue(); + } + // More complex getters for aspects that change by height or timestamp public long getRewardAtHeight(int ourHeight) { diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index 92d4ad86..363b80cb 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -49,7 +49,8 @@ }, "featureTriggers": { "atFindNextTransactionFix": 275000, - "newBlockSigHeight": 320000 + "newBlockSigHeight": 320000, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-founder-rewards.json b/src/test/resources/test-chain-v2-founder-rewards.json index 6f3c5fff..ab082d9a 100644 --- a/src/test/resources/test-chain-v2-founder-rewards.json +++ b/src/test/resources/test-chain-v2-founder-rewards.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-leftover-reward.json b/src/test/resources/test-chain-v2-leftover-reward.json index 53e13915..2db28f99 100644 --- a/src/test/resources/test-chain-v2-leftover-reward.json +++ b/src/test/resources/test-chain-v2-leftover-reward.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-minting.json b/src/test/resources/test-chain-v2-minting.json index a5c841a0..13ed7009 100644 --- a/src/test/resources/test-chain-v2-minting.json +++ b/src/test/resources/test-chain-v2-minting.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-extremes.json b/src/test/resources/test-chain-v2-qora-holder-extremes.json index 883e36fe..1e6948ba 100644 --- a/src/test/resources/test-chain-v2-qora-holder-extremes.json +++ b/src/test/resources/test-chain-v2-qora-holder-extremes.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder.json b/src/test/resources/test-chain-v2-qora-holder.json index a06dda7f..89c461ba 100644 --- a/src/test/resources/test-chain-v2-qora-holder.json +++ b/src/test/resources/test-chain-v2-qora-holder.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-scaling.json b/src/test/resources/test-chain-v2-reward-scaling.json index 91d6a36b..f7c47c78 100644 --- a/src/test/resources/test-chain-v2-reward-scaling.json +++ b/src/test/resources/test-chain-v2-reward-scaling.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index dd8377be..b5e9f3bf 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -46,7 +46,8 @@ "newAssetPricingTimestamp": 0, "groupApprovalTimestamp": 0, "atFindNextTransactionFix": 0, - "newBlockSigHeight": 999999 + "newBlockSigHeight": 999999, + "shareBinFix": 999999 }, "genesisInfo": { "version": 4,