Skip to content

Commit a700d7f

Browse files
author
Tom Trevethan
committed
add reissuance token moneyrange check
1 parent eb7d626 commit a700d7f

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/policy/policy.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ bool IsIssuanceInMoneyRange(const CTransaction& tx)
318318
if (issuance.nAmount.IsExplicit() && !MoneyRange(issuance.nAmount.GetAmount())) {
319319
return false;
320320
}
321+
// check the reissuance token is in range
322+
if (!issuance.nInflationKeys.IsNull() && issuance.nInflationKeys.IsExplicit() && !MoneyRange(issuance.nInflationKeys.GetAmount())) {
323+
return false;
324+
}
321325
}
322326
return true;
323327
}

test/functional/wallet_elements_21million.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def set_test_params(self):
2020
self.extra_args = [
2121
args + ["-acceptunlimitedissuances=1"],
2222
args + ["-acceptunlimitedissuances=1"],
23-
args, # node 2 blocks unblinded issuances out of moneyrange
23+
args, # node 2 blocks unblinded issuances out of moneyrange (default -acceptunlimitedissuances=0)
2424
]
2525

2626
def setup_network(self, split=False):
@@ -61,6 +61,12 @@ def run_test(self):
6161
self.generate(self.nodes[0], 1)
6262
assert_equal(self.nodes[0].getbalance()[unblinded_asset], 500_000_000)
6363

64+
self.log.info("Issue more than 21 million of a unblinded reissuance token")
65+
issuance = self.nodes[0].issueasset(300_000_000, 100_000_000, False)
66+
self.generate(self.nodes[0], 1)
67+
assert_equal(self.nodes[0].getbalance()[issuance['asset']], 300_000_000)
68+
assert_equal(self.nodes[0].getbalance()[issuance['token']], 100_000_000)
69+
6470
# send more than 21 million of that asset
6571
addr = self.nodes[1].getnewaddress()
6672
self.nodes[0].sendtoaddress(address=addr, amount=22_000_000, assetlabel=asset)
@@ -130,5 +136,40 @@ def run_test(self):
130136
assert(asset not in self.nodes[0].getbalance())
131137
assert_equal(self.nodes[2].getbalance()[asset], 300_000_000)
132138

139+
self.log.info("Reissue more than 21 million of a unblinded non-policy asset on node 2 - rejected from mempool")
140+
issuance = self.nodes[2].issueasset(3_000_000, 100, False)
141+
asset = issuance['asset']
142+
unblinded_asset = issuance['asset']
143+
self.generate(self.nodes[2], 1)
144+
assert_equal(self.nodes[2].getbalance()[unblinded_asset], 3_000_000)
145+
reissuance = self.nodes[2].reissueasset(unblinded_asset, 200_000_000)
146+
reissuance_tx = self.nodes[2].gettransaction(reissuance["txid"])
147+
assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, reissuance_tx['hex'])
148+
# transaction should be accepted on node 0
149+
self.nodes[0].sendrawtransaction(reissuance_tx["hex"])
150+
assert(reissuance['txid'] in self.nodes[0].getrawmempool())
151+
assert(reissuance['txid'] not in self.nodes[2].getrawmempool())
152+
self.generate(self.nodes[0], 1)
153+
assert(asset not in self.nodes[0].getbalance())
154+
assert_equal(self.nodes[2].getbalance()[asset], 203_000_000)
155+
156+
self.log.info("Issue more than 21 million reissuance tokens on node 2 - rejected from mempool")
157+
issuance = self.nodes[2].issueasset(3_000_000, 200_000_000, False)
158+
asset = issuance['asset']
159+
token = issuance['token']
160+
issuance_tx = self.nodes[2].gettransaction(issuance["txid"])
161+
assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, issuance_tx['hex'])
162+
self.generate(self.nodes[0], 1)
163+
assert(asset not in self.nodes[2].getbalance())
164+
assert(token not in self.nodes[2].getbalance())
165+
# transaction should be accepted on node 0
166+
self.nodes[0].sendrawtransaction(issuance_tx["hex"])
167+
assert(issuance['txid'] in self.nodes[0].getrawmempool())
168+
assert(issuance['txid'] not in self.nodes[2].getrawmempool())
169+
self.generate(self.nodes[0], 1)
170+
assert(asset not in self.nodes[0].getbalance())
171+
assert_equal(self.nodes[2].getbalance()[asset], 3_000_000)
172+
assert_equal(self.nodes[2].getbalance()[token], 200_000_000)
173+
133174
if __name__ == '__main__':
134175
WalletTest().main()

0 commit comments

Comments
 (0)