1 #include <boost/test/unit_test.hpp>
2 #include <qtumtests/test_utils.h>
3 #include <script/standard.h>
4 #include <chainparams.h>
5
6 namespace dgpTest{
7
8 const std::vector<valtype> code = {
9 /*setInitialAdmin()*/
10 valtype(ParseHex("6fb81cbb")),
11 /*
12 contract gasSchedule{
13 uint32[39] _gasSchedule=[
14 10, //0: tierStepGas0
15 10, //1: tierStepGas1
16 10, //2: tierStepGas2
17 10, //3: tierStepGas3
18 10, //4: tierStepGas4
19 10, //5: tierStepGas5
20 10, //6: tierStepGas6
21 10, //7: tierStepGas7
22 10, //8: expGas
23 50, //9: expByteGas
24 30, //10: sha3Gas
25 6, //11: sha3WordGas
26 200, //12: sloadGas
27 20000, //13: sstoreSetGas
28 5000, //14: sstoreResetGas
29 15000, //15: sstoreRefundGas
30 1, //16: jumpdestGas
31 375, //17: logGas
32 8, //18: logDataGas
33 375, //19: logTopicGas
34 32000, //20: createGas
35 700, //21: callGas
36 2300, //22: callStipend
37 9000, //23: callValueTransferGas
38 25000, //24: callNewAccountGas
39 24000, //25: selfdestructRefundGas
40 3, //26: memoryGas
41 512, //27: quadCoeffDiv
42 200, //28: createDataGas
43 21000, //29: txGas
44 53000, //30: txCreateGas
45 4, //31: txDataZeroGas
46 68, //32: txDataNonZeroGas
47 3, //33: copyGas
48 700, //34: extcodesizeGas
49 700, //35: extcodecopyGas
50 400, //36: balanceGas
51 5000, //37: selfdestructGas
52 24576 //38: maxCodeSize
53 ];
54 function getSchedule() constant returns(uint32[39] _schedule){
55 return _gasSchedule;
56 }
57 }
58 */
59 valtype(ParseHex("60606040526104e060405190810160405280600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001603261ffff168152602001601e61ffff168152602001600661ffff16815260200160c861ffff168152602001614e2061ffff16815260200161138861ffff168152602001613a9861ffff168152602001600161ffff16815260200161017761ffff168152602001600861ffff16815260200161017761ffff168152602001617d0061ffff1681526020016102bc61ffff1681526020016108fc61ffff16815260200161232861ffff1681526020016161a861ffff168152602001615dc061ffff168152602001600361ffff16815260200161020061ffff16815260200160c861ffff16815260200161520861ffff16815260200161cf0861ffff168152602001600461ffff168152602001604461ffff168152602001600361ffff1681526020016102bc61ffff1681526020016102bc61ffff16815260200161019061ffff16815260200161138861ffff16815260200161600061ffff1681525060009060278260276007016008900481019282156102645791602002820160005b8382111561023257835183826101000a81548163ffffffff021916908361ffff16021790555092602001926004016020816003010492830192600103026101f0565b80156102625782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610232565b505b50905061029791905b8082111561029357600081816101000a81549063ffffffff02191690555060010161026d565b5090565b505034610000575b61015f806102ae6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806326fadbe21461003e575b610000565b346100005761004b610097565b6040518082602760200280838360008314610085575b80518252602083111561008557602082019150602081019050602083039250610061565b50505090500191505060405180910390f35b6104e0604051908101604052806027905b600063ffffffff168152602001906001900390816100a8579050506000602780602002604051908101604052809291908260278015610128576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100eb5790505b505050505090505b905600a165627a7a72305820d97944c56fa577d97d4b111b48437da64662431b4792b937dbe94f4e07d8e2380029")),
60 /*addAddressProposal(address,uint256)*/
61 valtype(ParseHex("bf5f1e83000000000000000000000000c4c1d7375918557df2ef8f1d1f0b2329cb248a150000000000000000000000000000000000000000000000000000000000000002")),
62 /*
63 contract gasSchedule{
64 uint32[39] _gasSchedule=[
65 13, //0: tierStepGas0
66 10, //1: tierStepGas1
67 10, //2: tierStepGas2
68 10, //3: tierStepGas3
69 10, //4: tierStepGas4
70 10, //5: tierStepGas5
71 10, //6: tierStepGas6
72 10, //7: tierStepGas7
73 10, //8: expGas
74 50, //9: expByteGas
75 30, //10: sha3Gas
76 6, //11: sha3WordGas
77 200, //12: sloadGas
78 20000, //13: sstoreSetGas
79 5000, //14: sstoreResetGas
80 15000, //15: sstoreRefundGas
81 1, //16: jumpdestGas
82 375, //17: logGas
83 8, //18: logDataGas
84 375, //19: logTopicGas
85 32000, //20: createGas
86 700, //21: callGas
87 2300, //22: callStipend
88 9000, //23: callValueTransferGas
89 25000, //24: callNewAccountGas
90 24000, //25: selfdestructRefundGas
91 3, //26: memoryGas
92 512, //27: quadCoeffDiv
93 200, //28: createDataGas
94 21000, //29: txGas
95 53000, //30: txCreateGas
96 4, //31: txDataZeroGas
97 68, //32: txDataNonZeroGas
98 3, //33: copyGas
99 700, //34: extcodesizeGas
100 700, //35: extcodecopyGas
101 400, //36: balanceGas
102 5000, //37: selfdestructGas
103 300 //38: maxCodeSize
104 ];
105 function getSchedule() constant returns(uint32[39] _schedule){
106 return _gasSchedule;
107 }
108 }
109 */
110 valtype(ParseHex("60606040526104e060405190810160405280600d61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001603261ffff168152602001601e61ffff168152602001600661ffff16815260200160c861ffff168152602001614e2061ffff16815260200161138861ffff168152602001613a9861ffff168152602001600161ffff16815260200161017761ffff168152602001600861ffff16815260200161017761ffff168152602001617d0061ffff1681526020016102bc61ffff1681526020016108fc61ffff16815260200161232861ffff1681526020016161a861ffff168152602001615dc061ffff168152602001600361ffff16815260200161020061ffff16815260200160c861ffff16815260200161520861ffff16815260200161cf0861ffff168152602001600461ffff168152602001604461ffff168152602001600361ffff1681526020016102bc61ffff1681526020016102bc61ffff16815260200161019061ffff16815260200161138861ffff16815260200161012c61ffff1681525060009060276101df9291906101f0565b5034156101eb57600080fd5b6102c4565b8260276007016008900481019282156102805791602002820160005b8382111561024e57835183826101000a81548163ffffffff021916908361ffff160217905550926020019260040160208160030104928301926001030261020c565b801561027e5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261024e565b505b50905061028d9190610291565b5090565b6102c191905b808211156102bd57600081816101000a81549063ffffffff021916905550600101610297565b5090565b90565b610163806102d36000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806326fadbe21461003e575b600080fd5b341561004957600080fd5b610051610090565b6040518082602760200280838360005b8381101561007d5780820151818401525b602081019050610061565b5050505090500191505060405180910390f35b610098610108565b60006027806020026040519081016040528092919082602780156100fd576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c05790505b505050505090505b90565b6104e0604051908101604052806027905b600063ffffffff1681526020019060019003908161011957905050905600a165627a7a7230582079c1e5b0792e2fe1427cf30f190dfc698bbda4a883da02b06f5baf0f9151e11d0029")),
111 /*addAddressProposal(address,uint256)*/
112 valtype(ParseHex("bf5f1e83000000000000000000000000c943d775eab8664c7b13f04ffa058bbc718329890000000000000000000000000000000000000000000000000000000000000002")),
113 /*
114 contract gasSchedule{
115 uint32[39] _gasSchedule=[
116 13, //0: tierStepGas0
117 13, //1: tierStepGas1
118 10, //2: tierStepGas2
119 10, //3: tierStepGas3
120 10, //4: tierStepGas4
121 10, //5: tierStepGas5
122 10, //6: tierStepGas6
123 10, //7: tierStepGas7
124 10, //8: expGas
125 50, //9: expByteGas
126 30, //10: sha3Gas
127 6, //11: sha3WordGas
128 200, //12: sloadGas
129 20000, //13: sstoreSetGas
130 5000, //14: sstoreResetGas
131 15000, //15: sstoreRefundGas
132 1, //16: jumpdestGas
133 375, //17: logGas
134 8, //18: logDataGas
135 375, //19: logTopicGas
136 32000, //20: createGas
137 700, //21: callGas
138 2300, //22: callStipend
139 9000, //23: callValueTransferGas
140 25000, //24: callNewAccountGas
141 24000, //25: selfdestructRefundGas
142 3, //26: memoryGas
143 512, //27: quadCoeffDiv
144 200, //28: createDataGas
145 21000, //29: txGas
146 53000, //30: txCreateGas
147 4, //31: txDataZeroGas
148 68, //32: txDataNonZeroGas
149 3, //33: copyGas
150 700, //34: extcodesizeGas
151 700, //35: extcodecopyGas
152 400, //36: balanceGas
153 600, //37: selfdestructGas
154 300 //38: maxCodeSize
155 ];
156 function getSchedule() constant returns(uint32[39] _schedule){
157 return _gasSchedule;
158 }
159 }
160 */
161 valtype(ParseHex("60606040526104e060405190810160405280600d61ffff168152602001600d61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001600a61ffff168152602001603261ffff168152602001601e61ffff168152602001600661ffff16815260200160c861ffff168152602001614e2061ffff16815260200161138861ffff168152602001613a9861ffff168152602001600161ffff16815260200161017761ffff168152602001600861ffff16815260200161017761ffff168152602001617d0061ffff1681526020016102bc61ffff1681526020016108fc61ffff16815260200161232861ffff1681526020016161a861ffff168152602001615dc061ffff168152602001600361ffff16815260200161020061ffff16815260200160c861ffff16815260200161520861ffff16815260200161cf0861ffff168152602001600461ffff168152602001604461ffff168152602001600361ffff1681526020016102bc61ffff1681526020016102bc61ffff16815260200161019061ffff16815260200161025861ffff16815260200161012c61ffff1681525060009060276101df9291906101f0565b5034156101eb57600080fd5b6102c4565b8260276007016008900481019282156102805791602002820160005b8382111561024e57835183826101000a81548163ffffffff021916908361ffff160217905550926020019260040160208160030104928301926001030261020c565b801561027e5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261024e565b505b50905061028d9190610291565b5090565b6102c191905b808211156102bd57600081816101000a81549063ffffffff021916905550600101610297565b5090565b90565b610163806102d36000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806326fadbe21461003e575b600080fd5b341561004957600080fd5b610051610090565b6040518082602760200280838360005b8381101561007d5780820151818401525b602081019050610061565b5050505090500191505060405180910390f35b610098610108565b60006027806020026040519081016040528092919082602780156100fd576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c05790505b505050505090505b90565b6104e0604051908101604052806027905b600063ffffffff1681526020019060019003908161011957905050905600a165627a7a723058205c544799034ae8d28755e0042259700a20f21c66a2c5131334ce69d08d36df270029")),
162 /*addAddressProposal(address,uint256)*/
163 valtype(ParseHex("bf5f1e8300000000000000000000000012feb9a596fadb1070d3aa60633658735ef34b790000000000000000000000000000000000000000000000000000000000000002")),
164 /*
165 contract blockSize{
166 uint32[1] _blockSize=[
167 1000000 //block size in bytes
168 ];
169 function getBlockSize() constant returns(uint32[1] _size){
170 return _blockSize;
171 }
172 }
173 */
174 valtype(ParseHex("6060604052602060405190810160405280620f424062ffffff16815250600090600161002c92919061003a565b50341561003557fe5b61010f565b8260016007016008900481019282156100cb5791602002820160005b8382111561009957835183826101000a81548163ffffffff021916908362ffffff1602179055509260200192600401602081600301049283019260010302610056565b80156100c95782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610099565b505b5090506100d891906100dc565b5090565b61010c91905b8082111561010857600081816101000a81549063ffffffff0219169055506001016100e2565b5090565b90565b6101698061011e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806392ac3c621461003b575bfe5b341561004357fe5b61004b610097565b6040518082600160200280838360008314610085575b80518252602083111561008557602082019150602081019050602083039250610061565b50505090500191505060405180910390f35b61009f61010f565b6000600180602002604051908101604052809291908260018015610104576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c75790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011f57905050905600a165627a7a723058200b657beb7573194625eb5be9fc9072280a82296a70274ce97ad54d6a9ad0ceb30029")),
175 /*
176 contract blockSize{
177 uint32[1] _blockSize=[
178 2000000 //block size in bytes
179 ];
180 function getBlockSize() constant returns(uint32[1] _size){
181 return _blockSize;
182 }
183 }
184 */
185 valtype(ParseHex("6060604052602060405190810160405280621e848062ffffff16815250600090600161002c92919061003a565b50341561003557fe5b61010f565b8260016007016008900481019282156100cb5791602002820160005b8382111561009957835183826101000a81548163ffffffff021916908362ffffff1602179055509260200192600401602081600301049283019260010302610056565b80156100c95782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610099565b505b5090506100d891906100dc565b5090565b61010c91905b8082111561010857600081816101000a81549063ffffffff0219169055506001016100e2565b5090565b90565b6101698061011e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806392ac3c621461003b575bfe5b341561004357fe5b61004b610097565b6040518082600160200280838360008314610085575b80518252602083111561008557602082019150602081019050602083039250610061565b50505090500191505060405180910390f35b61009f61010f565b6000600180602002604051908101604052809291908260018015610104576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c75790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011f57905050905600a165627a7a72305820b849e0a25b57c96e2ae1c2acf855080420b2c6123d3bd477695e3d189d047db20029")),
186 /*
187 contract blockSize{
188 uint32[1] _blockSize=[
189 500123 //block size in bytes
190 ];
191 function getBlockSize() constant returns(uint32[1] _size){
192 return _blockSize;
193 }
194 }
195 */
196 valtype(ParseHex("60606040526020604051908101604052806207a19b62ffffff16815250600090600161002c92919061003d565b50341561003857600080fd5b610112565b8260016007016008900481019282156100ce5791602002820160005b8382111561009c57835183826101000a81548163ffffffff021916908362ffffff1602179055509260200192600401602081600301049283019260010302610059565b80156100cc5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261009c565b505b5090506100db91906100df565b5090565b61010f91905b8082111561010b57600081816101000a81549063ffffffff0219169055506001016100e5565b5090565b90565b610162806101216000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806392ac3c621461003e575b600080fd5b341561004957600080fd5b610051610090565b6040518082600160200280838360005b8381101561007d5780820151818401525b602081019050610061565b5050505090500191505060405180910390f35b610098610108565b60006001806020026040519081016040528092919082600180156100fd576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c05790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011857905050905600a165627a7a72305820ee7f7c9b6420f2f5b76e514b8e4fbda9d2157592281d2be78d1321b6c4428f100029")),
197 /*
198 contract minGasPrice{
199 uint32[1] _minGasPrice=[
200 13 //min gas price in satoshis
201 ];
202 function getMinGasPrice() constant returns(uint32[1] _gasPrice){
203 return _minGasPrice;
204 }
205 }
206 */
207 valtype(ParseHex("6060604052602060405190810160405280600d60ff168152506000906001610028929190610036565b50341561003157fe5b610109565b8260016007016008900481019282156100c55791602002820160005b8382111561009357835183826101000a81548163ffffffff021916908360ff1602179055509260200192600401602081600301049283019260010302610052565b80156100c35782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610093565b505b5090506100d291906100d6565b5090565b61010691905b8082111561010257600081816101000a81549063ffffffff0219169055506001016100dc565b5090565b90565b610169806101186000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fb588191461003b575bfe5b341561004357fe5b61004b610097565b6040518082600160200280838360008314610085575b80518252602083111561008557602082019150602081019050602083039250610061565b50505090500191505060405180910390f35b61009f61010f565b6000600180602002604051908101604052809291908260018015610104576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c75790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011f57905050905600a165627a7a72305820cc36549938177e1eb1f75e1c29460e706caac3ba259710e09610baec608493650029")),
208 /*
209 contract minGasPrice{
210 uint32[1] _minGasPrice=[
211 9850 //min gas price in satoshis
212 ];
213 function getMinGasPrice() constant returns(uint32[1] _gasPrice){
214 return _minGasPrice;
215 }
216 }
217 */
218 valtype(ParseHex("606060405260206040519081016040528061267a61ffff16815250600090600161002a92919061003b565b50341561003657600080fd5b61010f565b8260016007016008900481019282156100cb5791602002820160005b8382111561009957835183826101000a81548163ffffffff021916908361ffff1602179055509260200192600401602081600301049283019260010302610057565b80156100c95782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610099565b505b5090506100d891906100dc565b5090565b61010c91905b8082111561010857600081816101000a81549063ffffffff0219169055506001016100e2565b5090565b90565b6101628061011e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fb588191461003e575b600080fd5b341561004957600080fd5b610051610090565b6040518082600160200280838360005b8381101561007d5780820151818401525b602081019050610061565b5050505090500191505060405180910390f35b610098610108565b60006001806020026040519081016040528092919082600180156100fd576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c05790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011857905050905600a165627a7a72305820f01192afe1c50ff7ea0b6f684092bf05620c47a1a48583935d04610d47c384a40029")),
219 /*
220 contract minGasPrice{
221 uint32[1] _minGasPrice=[
222 123 //min gas price in satoshis
223 ];
224 function getMinGasPrice() constant returns(uint32[1] _gasPrice){
225 return _minGasPrice;
226 }
227 }
228 */
229 valtype(ParseHex("6060604052602060405190810160405280607b60ff168152506000906001610028929190610036565b50341561003157fe5b610109565b8260016007016008900481019282156100c55791602002820160005b8382111561009357835183826101000a81548163ffffffff021916908360ff1602179055509260200192600401602081600301049283019260010302610052565b80156100c35782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610093565b505b5090506100d291906100d6565b5090565b61010691905b8082111561010257600081816101000a81549063ffffffff0219169055506001016100dc565b5090565b90565b610169806101186000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fb588191461003b575bfe5b341561004357fe5b61004b610097565b6040518082600160200280838360008314610085575b80518252602083111561008557602082019150602081019050602083039250610061565b50505090500191505060405180910390f35b61009f61010f565b6000600180602002604051908101604052809291908260018015610104576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116100c75790505b505050505090505b90565b6020604051908101604052806001905b600063ffffffff1681526020019060019003908161011f57905050905600a165627a7a72305820bfd8ad217275ac01e0ff45cf88c44acf60c31d36f6cf200711eb17d6831a54cc0029"))
230 };
231
232 struct EVMScheduleCustom : public dev::eth::EVMSchedule{
EVMScheduleCustomdgpTest::EVMScheduleCustom233 EVMScheduleCustom(bool v1,bool v2,bool v3,bool v4,std::array<unsigned, 8> v5,unsigned v6,unsigned v7,unsigned v8,unsigned v9,unsigned v10,unsigned v11,
234 unsigned v12,unsigned v13,unsigned v14,unsigned v15,unsigned v16,unsigned v17,unsigned v18,unsigned v19,unsigned v20,unsigned v21,
235 unsigned v22,unsigned v23,unsigned v24,unsigned v25,unsigned v26,unsigned v27,unsigned v28,unsigned v29,unsigned v30,unsigned v31,
236 unsigned v32,unsigned v33,unsigned v34,unsigned v35,unsigned v36)
237 {
238 exceptionalFailedCodeDeposit = v1;
239 haveDelegateCall = v2;
240 eip150Mode = v3;
241 eip158Mode = v4;
242 tierStepGas = v5;
243 expGas = v6;
244 expByteGas = v7;
245 sha3Gas = v8;
246 sha3WordGas = v9;
247 sloadGas = v10;
248 sstoreSetGas = v11;
249 sstoreResetGas = v12;
250 sstoreRefundGas = v13;
251 jumpdestGas = v14;
252 logGas = v15;
253 logDataGas = v16;
254 logTopicGas = v17;
255 createGas = v18;
256 callGas = v19;
257 callStipend = v20;
258 callValueTransferGas = v21;
259 callNewAccountGas = v22;
260 selfdestructRefundGas = v23;
261 memoryGas = v24;
262 quadCoeffDiv = v25;
263 createDataGas = v26;
264 txGas = v27;
265 txCreateGas = v28;
266 txDataZeroGas = v29;
267 txDataNonZeroGas = v30;
268 copyGas = v31;
269 extcodesizeGas = v32;
270 extcodecopyGas = v33;
271 balanceGas = v34;
272 selfdestructGas = v35;
273 maxCodeSize = v36;
274 }
275 };
276
277 const EVMScheduleCustom EVMScheduleContractGasSchedule(true,true,true,true,{{10,10,10,10,10,10,10,10}},10,50,30,6,200,20000,5000,15000,
278 1,375,8,375,32000,700,2300,9000,25000,24000,3,512,200,21000,53000,4,68,3,700,700,400,5000,24576);
279 const EVMScheduleCustom EVMScheduleContractGasSchedule2(true,true,true,true,{{13,10,10,10,10,10,10,10}},10,50,30,6,200,20000,5000,15000,
280 1,375,8,375,32000,700,2300,9000,25000,24000,3,512,200,21000,53000,4,68,3,700,700,400,5000,300);
281 const EVMScheduleCustom EVMScheduleContractGasSchedule3(true,true,true,true,{{13,13,10,10,10,10,10,10}},10,50,30,6,200,20000,5000,15000,
282 1,375,8,375,32000,700,2300,9000,25000,24000,3,512,200,21000,53000,4,68,3,700,700,400,600,300);
283
284 const dev::h256 hash = dev::h256(ParseHex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
285
contractLoading()286 void contractLoading(){
287 const CChainParams& chainparams = Params();
288 int coinbaseMaturity = chainparams.GetConsensus().CoinbaseMaturity(0);
289 dev::eth::ChainParams cp(chainparams.EVMGenesisInfo(coinbaseMaturity + 900));
290 globalState->populateFrom(cp.genesisState);
291 globalSealEngine = std::unique_ptr<dev::eth::SealEngineFace>(cp.createSealEngine());
292 globalState->db().commit();
293 }
294
compareEVMSchedule(const dev::eth::EVMSchedule & a,const dev::eth::EVMSchedule & b)295 bool compareEVMSchedule(const dev::eth::EVMSchedule& a, const dev::eth::EVMSchedule& b){
296 if(a.tierStepGas == b.tierStepGas && a.expGas == b.expGas && a.expByteGas == b.expByteGas &&
297 a.sha3Gas == b.sha3Gas && a.sha3WordGas == b.sha3WordGas && a.sloadGas == b.sloadGas &&
298 a.sstoreSetGas == b.sstoreSetGas && a.sstoreResetGas == b.sstoreResetGas && a.sstoreRefundGas == b.sstoreRefundGas &&
299 a.jumpdestGas == b.jumpdestGas && a.logGas == b.logGas && a.logDataGas == b.logDataGas &&
300 a.logTopicGas == b.logTopicGas && a.createGas == b.createGas && a.callGas == b.callGas &&
301 a.callStipend == b.callStipend && a.callValueTransferGas == b.callValueTransferGas &&
302 a.callNewAccountGas == b.callNewAccountGas && a.selfdestructRefundGas == b.selfdestructRefundGas &&
303 a.memoryGas == b.memoryGas && a.quadCoeffDiv == b.quadCoeffDiv && a.createDataGas == b.createDataGas &&
304 a.txGas == b.txGas && a.txCreateGas == b.txCreateGas && a.txDataZeroGas == b.txDataZeroGas &&
305 a.txDataNonZeroGas == b.txDataNonZeroGas && a.copyGas == b.copyGas && a.extcodesizeGas == b.extcodesizeGas &&
306 a.extcodecopyGas == b.extcodecopyGas && a.balanceGas == b.balanceGas && a.selfdestructGas == b.selfdestructGas &&
307 a.maxCodeSize == b.maxCodeSize && a.exceptionalFailedCodeDeposit == b.exceptionalFailedCodeDeposit &&
308 a.haveDelegateCall == b.haveDelegateCall && a.eip150Mode == b.eip150Mode && a.eip158Mode == b.eip158Mode&&
309 a.haveRevert == b.haveRevert && a.haveStaticCall == b.haveStaticCall && a.haveReturnData == b.haveReturnData &&
310 a.blockRewardOverwrite == b.blockRewardOverwrite)
311 return true;
312 return false;
313 }
314
compareUint64(const uint64_t & value1,const uint64_t & value2)315 bool compareUint64(const uint64_t& value1, const uint64_t& value2){
316 if(value1 == value2)
317 return true;
318 return false;
319 }
320
createTestContractsAndBlocks(TestChain100Setup * testChain100Setup,const valtype & code1,const valtype & code2,const valtype & code3,dev::Address addr)321 void createTestContractsAndBlocks(TestChain100Setup* testChain100Setup, const valtype& code1, const valtype& code2, const valtype& code3, dev::Address addr){
322 std::function<void(size_t n)> generateBlocks = [&](size_t n){
323 dev::h256 oldHashStateRoot = globalState->rootHash();
324 dev::h256 oldHashUTXORoot = globalState->rootHashUTXO();
325 for(size_t i = 0; i < n; i++)
326 testChain100Setup->CreateAndProcessBlock({}, GetScriptForRawPubKey(testChain100Setup->coinbaseKey.GetPubKey()));
327 globalState->setRoot(oldHashStateRoot);
328 globalState->setRootUTXO(oldHashUTXORoot);
329 };
330
331 dev::h256 hashTemp(hash);
332 std::vector<QtumTransaction> txs;
333 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, addr, 0));
334 txs.push_back(createQtumTransaction(code1, 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
335 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, addr, 0));
336 auto result = executeBC(txs);
337
338 generateBlocks(50);
339 txs.clear();
340 txs.push_back(createQtumTransaction(code2, 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
341 txs.push_back(createQtumTransaction(code[4], 0, dev::u256(500000), dev::u256(1), ++hashTemp, addr, 0));
342 result = executeBC(txs);
343
344 generateBlocks(50);
345 txs.clear();
346 txs.push_back(createQtumTransaction(code3, 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
347 txs.push_back(createQtumTransaction(code[6], 0, dev::u256(500000), dev::u256(1), ++hashTemp, addr, 0));
348 result = executeBC(txs);
349 }
350
351 template <typename T>
checkValue(T value,T value1,T value2,T value3,T value4,size_t i,std::function<bool (T &,T &)> func)352 void checkValue(T value, T value1, T value2, T value3, T value4, size_t i, std::function<bool(T&,T&)> func){
353 size_t coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(0);
354 if(i > (coinbaseMaturity + 99))
355 BOOST_CHECK(func(value, value4));
356 if((coinbaseMaturity + 99) > i && i > (coinbaseMaturity + 50))
357 BOOST_CHECK(func(value, value3));
358 if((coinbaseMaturity + 50) > i && i > (coinbaseMaturity + 1))
359 BOOST_CHECK(func(value, value2));
360 if((coinbaseMaturity + 1) > i && i > 0) // After initializing the tests, the height of the chain 502
361 BOOST_CHECK(func(value, value1));
362 }
363
BOOST_FIXTURE_TEST_SUITE(dgp_tests,TestChain100Setup)364 BOOST_FIXTURE_TEST_SUITE(dgp_tests, TestChain100Setup)
365
366 BOOST_AUTO_TEST_CASE(gas_schedule_default_state_test1){
367 initState();
368 contractLoading();
369 QtumDGP qtumDGP(globalState.get());
370 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(100);
371 BOOST_CHECK(compareEVMSchedule(schedule, dev::eth::EIP158Schedule));
372 }
373
BOOST_AUTO_TEST_CASE(gas_schedule_default_state_test2)374 BOOST_AUTO_TEST_CASE(gas_schedule_default_state_test2){
375 initState();
376 contractLoading();
377 QtumDGP qtumDGP(globalState.get());
378 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(0);
379 BOOST_CHECK(compareEVMSchedule(schedule, dev::eth::EIP158Schedule));
380 }
381
BOOST_AUTO_TEST_CASE(gas_schedule_default_state_test3)382 BOOST_AUTO_TEST_CASE(gas_schedule_default_state_test3){
383 initState();
384 contractLoading();
385 QtumDGP qtumDGP(globalState.get());
386 int coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(0);
387 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(coinbaseMaturity + 900);
388 BOOST_CHECK(compareEVMSchedule(schedule, dev::eth::IstanbulSchedule));
389 }
390
BOOST_AUTO_TEST_CASE(gas_schedule_one_paramsInstance_introductory_block_1_test1)391 BOOST_AUTO_TEST_CASE(gas_schedule_one_paramsInstance_introductory_block_1_test1){
392 initState();
393 contractLoading();
394
395 dev::h256 hashTemp(hash);
396 std::vector<QtumTransaction> txs;
397 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, GasScheduleDGP, 0));
398 txs.push_back(createQtumTransaction(code[1], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
399 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, GasScheduleDGP, 0));
400 auto result = executeBC(txs);
401
402 QtumDGP qtumDGP(globalState.get());
403 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(0);
404 BOOST_CHECK(compareEVMSchedule(schedule, dev::eth::EIP158Schedule));
405 }
406
BOOST_AUTO_TEST_CASE(gas_schedule_one_paramsInstance_introductory_block_1_test2)407 BOOST_AUTO_TEST_CASE(gas_schedule_one_paramsInstance_introductory_block_1_test2){
408 initState();
409 contractLoading();
410
411 dev::h256 hashTemp(hash);
412 std::vector<QtumTransaction> txs;
413 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, GasScheduleDGP, 0));
414 txs.push_back(createQtumTransaction(code[1], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
415 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, GasScheduleDGP, 0));
416 auto result = executeBC(txs);
417
418 QtumDGP qtumDGP(globalState.get());
419 int coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(0);
420 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(coinbaseMaturity + 2); // After initializing the tests, the height of the chain 502
421 BOOST_CHECK(compareEVMSchedule(schedule, EVMScheduleContractGasSchedule));
422 }
423
BOOST_AUTO_TEST_CASE(gas_schedule_passage_from_0_to_130_three_paramsInstance_test)424 BOOST_AUTO_TEST_CASE(gas_schedule_passage_from_0_to_130_three_paramsInstance_test){
425 // initState();
426 contractLoading();
427 createTestContractsAndBlocks(this, code[1], code[3], code[5], GasScheduleDGP);
428 QtumDGP qtumDGP(globalState.get());
429 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
430 for(size_t i = 0; i < sizeList; i++){
431 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(i);
432 std::function<bool(const dev::eth::EVMSchedule&, const dev::eth::EVMSchedule&)> func = compareEVMSchedule;
433 checkValue<dev::eth::EVMSchedule>(schedule, dev::eth::EIP158Schedule, EVMScheduleContractGasSchedule,
434 EVMScheduleContractGasSchedule2, EVMScheduleContractGasSchedule3, i, func);
435 }
436 }
437
BOOST_AUTO_TEST_CASE(gas_schedule_passage_from_130_to_0_three_paramsInstance_test)438 BOOST_AUTO_TEST_CASE(gas_schedule_passage_from_130_to_0_three_paramsInstance_test){
439 // initState();
440 contractLoading();
441
442 createTestContractsAndBlocks(this, code[1], code[3], code[5], GasScheduleDGP);
443 QtumDGP qtumDGP(globalState.get());
444 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
445 for(size_t i = sizeList; i > 0; i--){
446 dev::eth::EVMSchedule schedule = qtumDGP.getGasSchedule(i);
447 std::function<bool(const dev::eth::EVMSchedule&, const dev::eth::EVMSchedule&)> func = compareEVMSchedule;
448 checkValue<dev::eth::EVMSchedule>(schedule, dev::eth::EIP158Schedule, EVMScheduleContractGasSchedule,
449 EVMScheduleContractGasSchedule2, EVMScheduleContractGasSchedule3, i, func);
450 }
451 }
452
BOOST_AUTO_TEST_CASE(block_size_default_state_test1)453 BOOST_AUTO_TEST_CASE(block_size_default_state_test1){
454 initState();
455 contractLoading();
456 QtumDGP qtumDGP(globalState.get());
457 uint32_t nHeight = 100;
458 uint32_t blocktimeDownscaleFactor = Params().GetConsensus().BlocktimeDownscaleFactor(nHeight);
459 uint32_t blockSize = qtumDGP.getBlockSize(nHeight);
460 BOOST_CHECK(blockSize == DEFAULT_BLOCK_SIZE_DGP / blocktimeDownscaleFactor);
461 }
462
BOOST_AUTO_TEST_CASE(block_size_default_state_test2)463 BOOST_AUTO_TEST_CASE(block_size_default_state_test2){
464 initState();
465 contractLoading();
466 QtumDGP qtumDGP(globalState.get());
467 uint32_t nHeight = 0;
468 uint32_t blocktimeDownscaleFactor = Params().GetConsensus().BlocktimeDownscaleFactor(nHeight);
469 uint32_t blockSize = qtumDGP.getBlockSize(0);
470 BOOST_CHECK(blockSize == DEFAULT_BLOCK_SIZE_DGP / blocktimeDownscaleFactor);
471 }
472
BOOST_AUTO_TEST_CASE(block_size_one_paramsInstance_introductory_block_1_test1)473 BOOST_AUTO_TEST_CASE(block_size_one_paramsInstance_introductory_block_1_test1){
474 initState();
475 contractLoading();
476
477 dev::h256 hashTemp(hash);
478 std::vector<QtumTransaction> txs;
479 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, BlockSizeDGP, 0));
480 txs.push_back(createQtumTransaction(code[7], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
481 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, BlockSizeDGP, 0));
482 auto result = executeBC(txs);
483
484 QtumDGP qtumDGP(globalState.get());
485 uint32_t nHeight = 0;
486 uint32_t blocktimeDownscaleFactor = Params().GetConsensus().BlocktimeDownscaleFactor(nHeight);
487 uint32_t blockSize = qtumDGP.getBlockSize(nHeight);
488 BOOST_CHECK(blockSize == DEFAULT_BLOCK_SIZE_DGP / blocktimeDownscaleFactor);
489 }
490
BOOST_AUTO_TEST_CASE(block_size_one_paramsInstance_introductory_block_1_test2)491 BOOST_AUTO_TEST_CASE(block_size_one_paramsInstance_introductory_block_1_test2){
492 initState();
493 contractLoading();
494
495 dev::h256 hashTemp(hash);
496 std::vector<QtumTransaction> txs;
497 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, BlockSizeDGP, 0));
498 txs.push_back(createQtumTransaction(code[7], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
499 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, BlockSizeDGP, 0));
500 auto result = executeBC(txs);
501
502 QtumDGP qtumDGP(globalState.get());
503 int coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(0);
504 uint32_t blockSize = qtumDGP.getBlockSize(coinbaseMaturity + 2);
505 BOOST_CHECK(blockSize == 1000000);
506 }
507
BOOST_AUTO_TEST_CASE(block_size_passage_from_0_to_130_three_paramsInstance_test)508 BOOST_AUTO_TEST_CASE(block_size_passage_from_0_to_130_three_paramsInstance_test){
509 // initState();
510 contractLoading();
511
512 createTestContractsAndBlocks(this, code[7], code[8], code[9], BlockSizeDGP);
513 QtumDGP qtumDGP(globalState.get());
514 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
515 for(size_t i = 0; i < sizeList; i++){
516 uint32_t blocktimeDownscaleFactor = Params().GetConsensus().BlocktimeDownscaleFactor(i);
517 uint32_t blockSize = qtumDGP.getBlockSize(i);
518 std::function<bool(const uint64_t&, const uint64_t&)> func = compareUint64;
519 checkValue<uint64_t>(blockSize, DEFAULT_BLOCK_SIZE_DGP / blocktimeDownscaleFactor, 1000000, 2000000, 500123, i, func);
520 }
521 }
522
BOOST_AUTO_TEST_CASE(block_size_passage_from_130_to_0_three_paramsInstance_test)523 BOOST_AUTO_TEST_CASE(block_size_passage_from_130_to_0_three_paramsInstance_test){
524 // initState();
525 contractLoading();
526
527 createTestContractsAndBlocks(this, code[7], code[8], code[9], BlockSizeDGP);
528 QtumDGP qtumDGP(globalState.get());
529 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
530 for(size_t i = sizeList; i > 0; i--){
531 uint32_t blocktimeDownscaleFactor = Params().GetConsensus().BlocktimeDownscaleFactor(i);
532 uint32_t blockSize = qtumDGP.getBlockSize(i);
533 std::function<bool(const uint64_t&, const uint64_t&)> func = compareUint64;
534 checkValue<uint32_t>(blockSize, DEFAULT_BLOCK_SIZE_DGP / blocktimeDownscaleFactor, 1000000, 2000000, 500123, i, func);
535 }
536 }
537
BOOST_AUTO_TEST_CASE(min_gas_price_default_state_test1)538 BOOST_AUTO_TEST_CASE(min_gas_price_default_state_test1){
539 initState();
540 contractLoading();
541 QtumDGP qtumDGP(globalState.get());
542 uint64_t minGasPrice = qtumDGP.getMinGasPrice(100);
543 BOOST_CHECK(minGasPrice == DEFAULT_MIN_GAS_PRICE_DGP);
544 }
545
BOOST_AUTO_TEST_CASE(min_gas_price_default_state_test2)546 BOOST_AUTO_TEST_CASE(min_gas_price_default_state_test2){
547 initState();
548 contractLoading();
549 QtumDGP qtumDGP(globalState.get());
550 uint64_t minGasPrice = qtumDGP.getMinGasPrice(0);
551 BOOST_CHECK(minGasPrice == DEFAULT_MIN_GAS_PRICE_DGP);
552 }
553
BOOST_AUTO_TEST_CASE(min_gas_price_one_paramsInstance_introductory_block_1_test1)554 BOOST_AUTO_TEST_CASE(min_gas_price_one_paramsInstance_introductory_block_1_test1){
555 initState();
556 contractLoading();
557
558 dev::h256 hashTemp(hash);
559 std::vector<QtumTransaction> txs;
560 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, GasPriceDGP, 0));
561 txs.push_back(createQtumTransaction(code[10], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
562 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, GasPriceDGP, 0));
563 auto result = executeBC(txs);
564
565 QtumDGP qtumDGP(globalState.get());
566 uint64_t minGasPrice = qtumDGP.getMinGasPrice(0);
567 BOOST_CHECK(minGasPrice == DEFAULT_MIN_GAS_PRICE_DGP);
568 }
569
BOOST_AUTO_TEST_CASE(min_gas_price_one_paramsInstance_introductory_block_1_test2)570 BOOST_AUTO_TEST_CASE(min_gas_price_one_paramsInstance_introductory_block_1_test2){
571 initState();
572 contractLoading();
573
574 dev::h256 hashTemp(hash);
575 std::vector<QtumTransaction> txs;
576 txs.push_back(createQtumTransaction(code[0], 0, dev::u256(500000), dev::u256(1), hashTemp, GasPriceDGP, 0));
577 txs.push_back(createQtumTransaction(code[10], 0, dev::u256(500000), dev::u256(1), ++hashTemp, dev::Address(), 0));
578 txs.push_back(createQtumTransaction(code[2], 0, dev::u256(500000), dev::u256(1), ++hashTemp, GasPriceDGP, 0));
579 auto result = executeBC(txs);
580
581 QtumDGP qtumDGP(globalState.get());
582 int coinbaseMaturity = Params().GetConsensus().CoinbaseMaturity(0);
583 uint64_t minGasPrice = qtumDGP.getMinGasPrice(coinbaseMaturity + 2);
584 BOOST_CHECK(minGasPrice == 13);
585 }
586
BOOST_AUTO_TEST_CASE(min_gas_price_passage_from_0_to_130_three_paramsInstance_test)587 BOOST_AUTO_TEST_CASE(min_gas_price_passage_from_0_to_130_three_paramsInstance_test){
588 // initState();
589 contractLoading();
590
591 createTestContractsAndBlocks(this, code[10], code[11], code[12], GasPriceDGP);
592 QtumDGP qtumDGP(globalState.get());
593 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
594 for(size_t i = 0; i < sizeList; i++){
595 uint64_t minGasPrice = qtumDGP.getMinGasPrice(i);
596 std::function<bool(const uint64_t&, const uint64_t&)> func = compareUint64;
597 checkValue<uint64_t>(minGasPrice, DEFAULT_MIN_GAS_PRICE_DGP, 13, 9850, 123, i, func);
598 }
599 }
600
BOOST_AUTO_TEST_CASE(min_gas_price_passage_from_130_to_0_three_paramsInstance_test)601 BOOST_AUTO_TEST_CASE(min_gas_price_passage_from_130_to_0_three_paramsInstance_test){
602 // initState();
603 contractLoading();
604
605 createTestContractsAndBlocks(this, code[10], code[11], code[12], GasPriceDGP);
606 QtumDGP qtumDGP(globalState.get());
607 size_t sizeList = Params().GetConsensus().CoinbaseMaturity(0) + 800;
608 for(size_t i = sizeList; i > 0; i--){
609 uint64_t minGasPrice = qtumDGP.getMinGasPrice(i);
610 std::function<bool(const uint64_t&, const uint64_t&)> func = compareUint64;
611 checkValue<uint64_t>(minGasPrice, DEFAULT_MIN_GAS_PRICE_DGP, 13, 9850, 123, i, func);
612 }
613 }
614
615 BOOST_AUTO_TEST_SUITE_END()
616
617 }
618