Skip to content

Commit 35a0b1e

Browse files
dastardlychimpbrentzundel
authored andcommitted
TOK-330 Add test for minting limits (#140)
Confirmed 10 billion tokens can be minted. Replaced string utxo fields with constants. ## Note A ValueError thrown when a number above i64 is passed in the request. Signed-off-by: dastardlychimp <darien.hess@evernym.com>
1 parent 530167a commit 35a0b1e

1 file changed

Lines changed: 61 additions & 28 deletions

File tree

sovtoken/sovtoken/test/test_public_mint.py

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44
import pytest
55

66
from plenum.common.exceptions import (RequestNackedException,
7-
RequestRejectedException)
7+
RequestRejectedException,
8+
PoolLedgerTimeoutException)
89
from plenum.common.txn_util import get_seq_no
910
from sovtoken.test.conftest import build_wallets_from_data
11+
from sovtoken.constants import ADDRESS, AMOUNT, SEQNO
12+
13+
14+
TOKENAMT = int(1e8)
15+
BILLION = int(1e9)
1016

1117

1218
@pytest.fixture
@@ -31,19 +37,19 @@ def test_trustee_invalid_minting(helpers, addresses):
3137
"""
3238
[address1, address2, *_] = addresses
3339

34-
outputs = [{"address": address1, "amount": -20}, {"address": address2, "amount": 100}]
40+
outputs = [{ADDRESS: address1, AMOUNT: -20}, {ADDRESS: address2, AMOUNT: 100}]
3541
with pytest.raises(RequestNackedException):
3642
helpers.general.do_mint(outputs)
3743

38-
outputs = [{"address": address1, "amount": "100"}, {"address": address2, "amount": 100}]
44+
outputs = [{ADDRESS: address1, AMOUNT: "100"}, {ADDRESS: address2, AMOUNT: 100}]
3945
with pytest.raises(RequestNackedException):
4046
helpers.general.do_mint(outputs)
4147

42-
outputs = [{"address": address1, "amount": 0}, {"address": address2, "amount": 100}]
48+
outputs = [{ADDRESS: address1, AMOUNT: 0}, {ADDRESS: address2, AMOUNT: 100}]
4349
with pytest.raises(RequestNackedException):
4450
helpers.general.do_mint(outputs)
4551

46-
outputs = [{"address": address1, "amount": 20.5}, {"address": address2, "amount": 100}]
52+
outputs = [{ADDRESS: address1, AMOUNT: 20.5}, {ADDRESS: address2, AMOUNT: 100}]
4753
with pytest.raises(RequestNackedException):
4854
helpers.general.do_mint(outputs)
4955

@@ -54,7 +60,7 @@ def test_non_trustee_minting(helpers, steward_wallets, addresses):
5460
Non trustees (stewards in this case) should not be able to mint new tokens
5561
"""
5662
[address1, address2, *_] = addresses
57-
outputs = [{"address": address1, "amount": 100}, {"address": address2, "amount": 60}]
63+
outputs = [{ADDRESS: address1, AMOUNT: 100}, {ADDRESS: address2, AMOUNT: 60}]
5864
request = helpers.request.mint(outputs)
5965
request.signatures = {}
6066
request = helpers.wallet.sign_request(request, steward_wallets)
@@ -72,7 +78,7 @@ def test_less_than_min_trustee_minting(helpers, addresses):
7278
hence the txn fails
7379
"""
7480
[address1, address2, *_] = addresses
75-
outputs = [{"address": address1, "amount": 100}, {"address": address2, "amount": 60}]
81+
outputs = [{ADDRESS: address1, AMOUNT: 100}, {ADDRESS: address2, AMOUNT: 60}]
7682
request = helpers.request.mint(outputs)
7783
# Remove one signature.
7884
request.signatures.popitem()
@@ -83,7 +89,7 @@ def test_less_than_min_trustee_minting(helpers, addresses):
8389
def test_stewards_with_trustees(helpers, addresses, steward_wallets):
8490
[address1, address2, *_] = addresses
8591

86-
outputs = [{"address": address1, "amount": 1000}, {"address": address2, "amount": 1000}]
92+
outputs = [{ADDRESS: address1, AMOUNT: 1000}, {ADDRESS: address2, AMOUNT: 1000}]
8793
request = helpers.request.mint(outputs)
8894
# Remove 1 Trustees' signature, assumption is that there were exactly the number of trustees required
8995
request.signatures.popitem()
@@ -102,15 +108,15 @@ def test_non_existant_did_with_trustees(
102108
[address1, address2, *_] = addresses
103109
signing_wallets = wallets_non_existant_dids[0:1]
104110

105-
outputs = [{"address": address1, "amount": 1000}, {"address": address2, "amount": 1000}]
111+
outputs = [{ADDRESS: address1, AMOUNT: 1000}, {ADDRESS: address2, AMOUNT: 1000}]
106112
request = helpers.request.mint(outputs)
107113
request = helpers.wallet.sign_request(request, signing_wallets)
108114

109115

110116
def test_non_existant_dids(helpers, addresses, wallets_non_existant_dids):
111117
[address1, address2, *_] = addresses
112118

113-
outputs = [{"address": address1, "amount": 1000}, {"address": address2, "amount": 1000}]
119+
outputs = [{ADDRESS: address1, AMOUNT: 1000}, {ADDRESS: address2, AMOUNT: 1000}]
114120
request = helpers.request.mint(outputs)
115121

116122
request.signatures = {}
@@ -125,7 +131,7 @@ def test_repeat_trustee(helpers, addresses):
125131
Should not be possible to use the same trustee more than once
126132
"""
127133
[address1, address2, *_] = addresses
128-
outputs = [{"address": address1, "amount": 100}, {"address": address2, "amount": 60}]
134+
outputs = [{ADDRESS: address1, AMOUNT: 100}, {ADDRESS: address2, AMOUNT: 60}]
129135
request = helpers.request.mint(outputs)
130136
request.signatures.popitem()
131137
(did, sig) = request.signatures.popitem()
@@ -141,10 +147,10 @@ def test_trustee_valid_minting(helpers, addresses):
141147
and seller_address
142148
"""
143149
[address1, address2, *_] = addresses
144-
total_mint = 1000000000000000000
145-
sf_master_gets = 600000000000000000
150+
total_mint = 10 * BILLION * TOKENAMT
151+
sf_master_gets = 6 * BILLION * TOKENAMT
146152
remaining = total_mint - sf_master_gets
147-
outputs = [{"address": address1, "amount": sf_master_gets}, {"address": address2, "amount": remaining}]
153+
outputs = [{ADDRESS: address1, AMOUNT: sf_master_gets}, {ADDRESS: address2, AMOUNT: remaining}]
148154
result = helpers.general.do_mint(outputs)
149155
mint_seq_no = get_seq_no(result)
150156

@@ -153,15 +159,15 @@ def test_trustee_valid_minting(helpers, addresses):
153159
address2_utxos
154160
] = helpers.general.get_utxo_addresses([address1, address2])
155161

156-
assert address1_utxos == [{"address": address1, "seqNo": mint_seq_no, "amount": sf_master_gets}]
157-
assert address2_utxos == [{"address": address2, "seqNo": mint_seq_no, "amount": remaining}]
162+
assert address1_utxos == [{ADDRESS: address1, SEQNO: mint_seq_no, AMOUNT: sf_master_gets}]
163+
assert address2_utxos == [{ADDRESS: address2, SEQNO: mint_seq_no, AMOUNT: remaining}]
158164

159165

160166
def test_two_mints_to_same_address(addresses, helpers):
161167

162-
outputs = [{"address": address, "amount": 100} for address in addresses]
168+
outputs = [{ADDRESS: address, AMOUNT: 100} for address in addresses]
163169
first_mint_result = helpers.general.do_mint(outputs)
164-
outputs = [{"address": address, "amount": 200} for address in addresses]
170+
outputs = [{ADDRESS: address, AMOUNT: 200} for address in addresses]
165171
second_mint_result = helpers.general.do_mint(outputs)
166172
first_mint_seq_no = get_seq_no(first_mint_result)
167173
second_mint_seq_no = get_seq_no(second_mint_result)
@@ -179,22 +185,49 @@ def test_two_mints_to_same_address(addresses, helpers):
179185
assert first_mint_seq_no != second_mint_seq_no
180186

181187
assert address1_utxos == [
182-
{"address": address1, "seqNo": first_mint_seq_no, "amount": 100},
183-
{"address": address1, "seqNo": second_mint_seq_no, "amount": 200},
188+
{ADDRESS: address1, SEQNO: first_mint_seq_no, AMOUNT: 100},
189+
{ADDRESS: address1, SEQNO: second_mint_seq_no, AMOUNT: 200},
184190
]
185191
assert address2_utxos == [
186-
{"address": address2, "seqNo": first_mint_seq_no, "amount": 100},
187-
{"address": address2, "seqNo": second_mint_seq_no, "amount": 200},
192+
{ADDRESS: address2, SEQNO: first_mint_seq_no, AMOUNT: 100},
193+
{ADDRESS: address2, SEQNO: second_mint_seq_no, AMOUNT: 200},
188194
]
189195
assert address3_utxos == [
190-
{"address": address3, "seqNo": first_mint_seq_no, "amount": 100},
191-
{"address": address3, "seqNo": second_mint_seq_no, "amount": 200},
196+
{ADDRESS: address3, SEQNO: first_mint_seq_no, AMOUNT: 100},
197+
{ADDRESS: address3, SEQNO: second_mint_seq_no, AMOUNT: 200},
192198
]
193199
assert address4_utxos == [
194-
{"address": address4, "seqNo": first_mint_seq_no, "amount": 100},
195-
{"address": address4, "seqNo": second_mint_seq_no, "amount": 200},
200+
{ADDRESS: address4, SEQNO: first_mint_seq_no, AMOUNT: 100},
201+
{ADDRESS: address4, SEQNO: second_mint_seq_no, AMOUNT: 200},
196202
]
197203
assert address5_utxos == [
198-
{"address": address5, "seqNo": first_mint_seq_no, "amount": 100},
199-
{"address": address5, "seqNo": second_mint_seq_no, "amount": 200},
204+
{ADDRESS: address5, SEQNO: first_mint_seq_no, AMOUNT: 100},
205+
{ADDRESS: address5, SEQNO: second_mint_seq_no, AMOUNT: 200},
200206
]
207+
208+
209+
def test_different_mint_amounts(helpers):
210+
211+
i64 = 9223372036854775807
212+
213+
def assert_valid_minting(helpers, amount):
214+
address = helpers.wallet.create_address()
215+
outputs = [{ADDRESS: address, AMOUNT: amount}]
216+
result = helpers.general.do_mint(outputs)
217+
utxos = helpers.general.get_utxo_addresses([address])[0]
218+
219+
expected = {ADDRESS: address, SEQNO: get_seq_no(result), AMOUNT: amount}
220+
matches = [utxo for utxo in utxos if utxo is expected]
221+
222+
# 1 sovatom
223+
assert_valid_minting(helpers, 1)
224+
225+
# 10 billion tokens
226+
assert_valid_minting(helpers, 10 * BILLION * TOKENAMT)
227+
228+
# i64 max sovatoms.
229+
assert_valid_minting(helpers, i64)
230+
231+
# ujson has a limit at deserializing i64.
232+
with pytest.raises(PoolLedgerTimeoutException):
233+
assert_valid_minting(helpers, i64 + 1)

0 commit comments

Comments
 (0)