bench.old (10774B)
1 # standard imports 2 import os 3 import unittest 4 import json 5 import logging 6 7 # third-party imports 8 import web3 9 import eth_tester 10 import eth_abi 11 12 logging.basicConfig(level=logging.DEBUG) 13 logg = logging.getLogger() 14 15 logging.getLogger('web3').setLevel(logging.WARNING) 16 logging.getLogger('eth.vm').setLevel(logging.WARNING) 17 18 testdir = os.path.dirname(__file__) 19 20 TAX_LEVEL = 10000 * 2 # 2% 21 22 23 class Test(unittest.TestCase): 24 25 contract = None 26 27 def setUp(self): 28 eth_params = eth_tester.backends.pyevm.main.get_default_genesis_params({ 29 'gas_limit': 9000000, 30 }) 31 32 f = open(os.path.join(testdir, '../../solidity/RedistributedDemurrageToken.bin'), 'r') 33 self.bytecode = f.read() 34 f.close() 35 36 f = open(os.path.join(testdir, '../../solidity/RedistributedDemurrageToken.json'), 'r') 37 self.abi = json.load(f) 38 f.close() 39 40 backend = eth_tester.PyEVMBackend(eth_params) 41 self.eth_tester = eth_tester.EthereumTester(backend) 42 provider = web3.Web3.EthereumTesterProvider(self.eth_tester) 43 self.w3 = web3.Web3(provider) 44 self.sink_address = self.w3.eth.accounts[9] 45 46 def tearDown(self): 47 pass 48 49 50 def test_construct(self): 51 period = 10 52 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 53 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 54 r = self.w3.eth.getTransactionReceipt(tx_hash) 55 print('construct: {}'.format(r['gasUsed'])) 56 57 58 def test_gas_changeperiod(self): 59 period = 43200 60 for i in range(5): 61 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 62 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 63 r = self.w3.eth.getTransactionReceipt(tx_hash) 64 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 65 66 start_block = self.w3.eth.blockNumber 67 b = self.w3.eth.getBlock(start_block) 68 start_time = b['timestamp'] 69 70 period_seconds = period * 60 71 self.eth_tester.time_travel(start_time + period_seconds + (60 * (10 ** i))) 72 tx_hash = contract.functions.changePeriod().transact() 73 r = self.w3.eth.getTransactionReceipt(tx_hash) 74 75 print('changePeriod {} ({}): {}'.format(i, 60 * (10 ** i), r['gasUsed'])) 76 77 78 def test_mint(self): 79 period = 10 80 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 81 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 82 r = self.w3.eth.getTransactionReceipt(tx_hash) 83 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 84 85 start_block = self.w3.eth.blockNumber 86 b = self.w3.eth.getBlock(start_block) 87 start_time = b['timestamp'] 88 89 tx_hash = contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact({'from': self.w3.eth.accounts[0]}) 90 r = self.w3.eth.getTransactionReceipt(tx_hash) 91 print ('mintTo: {}'.format(r['gasUsed'])) 92 93 94 def test_transfer(self): 95 period = 10 96 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 97 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 98 r = self.w3.eth.getTransactionReceipt(tx_hash) 99 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 100 101 start_block = self.w3.eth.blockNumber 102 b = self.w3.eth.getBlock(start_block) 103 start_time = b['timestamp'] 104 105 contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact({'from': self.w3.eth.accounts[0]}) 106 107 tx_hash = contract.functions.transfer(self.w3.eth.accounts[2], 1000000).transact({'from': self.w3.eth.accounts[1]}) 108 r = self.w3.eth.getTransactionReceipt(tx_hash) 109 print ('transfer: {}'.format(r['gasUsed'])) 110 111 112 def test_approve(self): 113 period = 10 114 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 115 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 116 r = self.w3.eth.getTransactionReceipt(tx_hash) 117 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 118 119 start_block = self.w3.eth.blockNumber 120 b = self.w3.eth.getBlock(start_block) 121 start_time = b['timestamp'] 122 123 contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact({'from': self.w3.eth.accounts[0]}) 124 125 tx_hash = contract.functions.approve(self.w3.eth.accounts[2], 1000000).transact({'from': self.w3.eth.accounts[1]}) 126 r = self.w3.eth.getTransactionReceipt(tx_hash) 127 print ('approve: {}'.format(r['gasUsed'])) 128 129 130 def test_transferfrom(self): 131 period = 10 132 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 133 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 134 r = self.w3.eth.getTransactionReceipt(tx_hash) 135 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 136 137 start_block = self.w3.eth.blockNumber 138 b = self.w3.eth.getBlock(start_block) 139 start_time = b['timestamp'] 140 141 contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact({'from': self.w3.eth.accounts[0]}) 142 143 contract.functions.approve(self.w3.eth.accounts[2], 1000000).transact({'from': self.w3.eth.accounts[1]}) 144 145 tx_hash = contract.functions.transferFrom(self.w3.eth.accounts[1], self.w3.eth.accounts[3], 1000000).transact({'from': self.w3.eth.accounts[2]}) 146 r = self.w3.eth.getTransactionReceipt(tx_hash) 147 print ('transferFrom: {}'.format(r['gasUsed'])) 148 149 150 def test_redistribute_default(self): 151 period = 10 152 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 153 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 154 r = self.w3.eth.getTransactionReceipt(tx_hash) 155 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 156 157 start_block = self.w3.eth.blockNumber 158 b = self.w3.eth.getBlock(start_block) 159 start_time = b['timestamp'] 160 161 for i in range(100): 162 addr = web3.Web3.toChecksumAddress('0x' + os.urandom(20).hex()) 163 contract.functions.mintTo(addr, 1000000 * (i+1)).transact({'from': self.w3.eth.accounts[0]}) 164 165 self.eth_tester.time_travel(start_time + period * 60 + 1) 166 redistribution = contract.functions.redistributions(0).call() 167 tx_hash = contract.functions.changePeriod().transact({'from': self.w3.eth.accounts[2]}) 168 r = self.w3.eth.getTransactionReceipt(tx_hash) 169 print ('chainPeriod -> defaultRedistribution: {}'.format(r['gasUsed'])) 170 171 172 def test_redistribution_account(self): 173 period = 10 174 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 175 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 176 r = self.w3.eth.getTransactionReceipt(tx_hash) 177 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 178 179 start_block = self.w3.eth.blockNumber 180 b = self.w3.eth.getBlock(start_block) 181 start_time = b['timestamp'] 182 183 contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact({'from': self.w3.eth.accounts[0]}) 184 contract.functions.transfer(self.w3.eth.accounts[2], 1000000).transact({'from': self.w3.eth.accounts[1]}) 185 186 for i in range(100): 187 addr = web3.Web3.toChecksumAddress('0x' + os.urandom(20).hex()) 188 contract.functions.mintTo(addr, 1000000 * (i+1)).transact({'from': self.w3.eth.accounts[0]}) 189 190 self.eth_tester.time_travel(start_time + period * 60 + 1) 191 redistribution = contract.functions.redistributions(0).call() 192 tx_hash = contract.functions.applyRedistributionOnAccount(self.w3.eth.accounts[1]).transact({'from': self.w3.eth.accounts[2]}) 193 r = self.w3.eth.getTransactionReceipt(tx_hash) 194 self.assertEqual(r.logs[0].topics[0].hex(), '0x9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3') 195 print ('redistribute account: {}'.format(r['gasUsed'])) 196 197 198 def test_redistribution_account_transfer(self): 199 period = 10 200 c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) 201 tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), period, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) 202 r = self.w3.eth.getTransactionReceipt(tx_hash) 203 contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) 204 205 start_block = self.w3.eth.blockNumber 206 b = self.w3.eth.getBlock(start_block) 207 start_time = b['timestamp'] 208 209 contract.functions.mintTo(self.w3.eth.accounts[1], 2000000).transact({'from': self.w3.eth.accounts[0]}) 210 contract.functions.transfer(self.w3.eth.accounts[2], 1000000).transact({'from': self.w3.eth.accounts[1]}) 211 212 for i in range(10): 213 addr = web3.Web3.toChecksumAddress('0x' + os.urandom(20).hex()) 214 contract.functions.mintTo(addr, 1000000 * (i+1)).transact({'from': self.w3.eth.accounts[0]}) 215 216 self.eth_tester.time_travel(start_time + period * 60 + 1) 217 redistribution = contract.functions.redistributions(0).call() 218 contract.functions.changePeriod().transact({'from': self.w3.eth.accounts[0]}) 219 tx_hash = contract.functions.transfer(self.w3.eth.accounts[3], 100000).transact({'from': self.w3.eth.accounts[1]}) 220 r = self.w3.eth.getTransactionReceipt(tx_hash) 221 self.assertEqual(r.logs[0].topics[0].hex(), '0x9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3') 222 print ('redistribute account: {}'.format(r['gasUsed'])) 223 224 225 if __name__ == '__main__': 226 unittest.main() 227 228