diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 65d7bae3a5..b88cb53180 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -318,6 +318,10 @@ bool IsIssuanceInMoneyRange(const CTransaction& tx) if (issuance.nAmount.IsExplicit() && !MoneyRange(issuance.nAmount.GetAmount())) { return false; } + // check the reissuance token is in range + if (!issuance.nInflationKeys.IsNull() && issuance.nInflationKeys.IsExplicit() && !MoneyRange(issuance.nInflationKeys.GetAmount())) { + return false; + } } return true; } diff --git a/test/functional/wallet_elements_21million.py b/test/functional/wallet_elements_21million.py index fb4d4a4695..73ef7feaa5 100755 --- a/test/functional/wallet_elements_21million.py +++ b/test/functional/wallet_elements_21million.py @@ -20,7 +20,7 @@ def set_test_params(self): self.extra_args = [ args + ["-acceptunlimitedissuances=1"], args + ["-acceptunlimitedissuances=1"], - args, # node 2 blocks unblinded issuances out of moneyrange + args, # node 2 blocks unblinded issuances out of moneyrange (default -acceptunlimitedissuances=0) ] def setup_network(self, split=False): @@ -61,6 +61,12 @@ def run_test(self): self.generate(self.nodes[0], 1) assert_equal(self.nodes[0].getbalance()[unblinded_asset], 500_000_000) + self.log.info("Issue more than 21 million of a unblinded reissuance token") + issuance = self.nodes[0].issueasset(300_000_000, 100_000_000, False) + self.generate(self.nodes[0], 1) + assert_equal(self.nodes[0].getbalance()[issuance['asset']], 300_000_000) + assert_equal(self.nodes[0].getbalance()[issuance['token']], 100_000_000) + # send more than 21 million of that asset addr = self.nodes[1].getnewaddress() self.nodes[0].sendtoaddress(address=addr, amount=22_000_000, assetlabel=asset) @@ -130,5 +136,40 @@ def run_test(self): assert(asset not in self.nodes[0].getbalance()) assert_equal(self.nodes[2].getbalance()[asset], 300_000_000) + self.log.info("Reissue more than 21 million of a unblinded non-policy asset on node 2 - rejected from mempool") + issuance = self.nodes[2].issueasset(3_000_000, 100, False) + asset = issuance['asset'] + unblinded_asset = issuance['asset'] + self.generate(self.nodes[2], 1) + assert_equal(self.nodes[2].getbalance()[unblinded_asset], 3_000_000) + reissuance = self.nodes[2].reissueasset(unblinded_asset, 200_000_000) + reissuance_tx = self.nodes[2].gettransaction(reissuance["txid"]) + assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, reissuance_tx['hex']) + # transaction should be accepted on node 0 + self.nodes[0].sendrawtransaction(reissuance_tx["hex"]) + assert(reissuance['txid'] in self.nodes[0].getrawmempool()) + assert(reissuance['txid'] not in self.nodes[2].getrawmempool()) + self.generate(self.nodes[0], 1) + assert(asset not in self.nodes[0].getbalance()) + assert_equal(self.nodes[2].getbalance()[asset], 203_000_000) + + self.log.info("Issue more than 21 million reissuance tokens on node 2 - rejected from mempool") + issuance = self.nodes[2].issueasset(3_000_000, 200_000_000, False) + asset = issuance['asset'] + token = issuance['token'] + issuance_tx = self.nodes[2].gettransaction(issuance["txid"]) + assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, issuance_tx['hex']) + self.generate(self.nodes[0], 1) + assert(asset not in self.nodes[2].getbalance()) + assert(token not in self.nodes[2].getbalance()) + # transaction should be accepted on node 0 + self.nodes[0].sendrawtransaction(issuance_tx["hex"]) + assert(issuance['txid'] in self.nodes[0].getrawmempool()) + assert(issuance['txid'] not in self.nodes[2].getrawmempool()) + self.generate(self.nodes[0], 1) + assert(asset not in self.nodes[0].getbalance()) + assert_equal(self.nodes[2].getbalance()[asset], 3_000_000) + assert_equal(self.nodes[2].getbalance()[token], 200_000_000) + if __name__ == '__main__': WalletTest().main()