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