1 #include <boost/test/unit_test.hpp>
2 #include <test/util/setup_common.h>
3 #include <consensus/merkle.h>
4 #include <chainparams.h>
5 #include <miner.h>
6 #include <validation.h>
7 #include <util/convert.h>
8 
9 //Tests data
10 const CAmount value(5000000000LL - 1000);
11 const dev::u256 gasPrice(3);
12 const dev::u256 gasLimit(655535);
13 const std::vector<unsigned char> address(ParseHex("abababababababababababababababababababab"));
14 const std::vector<unsigned char> data(ParseHex("6060604052346000575b60398060166000396000f30060606040525b600b5b5b565b0000a165627a7a72305820a5e02d6fa08a384e067a4c1f749729c502e7597980b427d287386aa006e49d6d0029"));
15 
createTX(std::vector<CTxOut> vout,uint256 hashprev=uint256 ())16 CMutableTransaction createTX(std::vector<CTxOut> vout, uint256 hashprev = uint256()){
17     CMutableTransaction tx;
18     tx.vin.resize(1);
19     tx.vin[0].scriptSig = CScript() << OP_1;
20     tx.vin[0].prevout.hash = hashprev;
21     tx.vin[0].prevout.n = 0;
22     tx.vout.resize(1);
23     tx.vout = vout;
24     return tx;
25 }
26 
checkResult(bool isCreation,std::vector<QtumTransaction> results,uint256 hash)27 void checkResult(bool isCreation, std::vector<QtumTransaction> results, uint256 hash){
28     for(size_t i = 0; i < results.size(); i++){
29         if(isCreation){
30             BOOST_CHECK(results[i].isCreation());
31             BOOST_CHECK(results[i].receiveAddress() == dev::Address());
32         } else {
33             BOOST_CHECK(!results[i].isCreation());
34             BOOST_CHECK(results[i].receiveAddress() == dev::Address(address));
35         }
36         BOOST_CHECK(results[i].data() == data);
37         BOOST_CHECK(results[i].value() == value);
38         BOOST_CHECK(results[i].gasPrice() == gasPrice);
39         BOOST_CHECK(results[i].gas() == gasLimit);
40         BOOST_CHECK(results[i].sender() == dev::Address(address));
41         BOOST_CHECK(results[i].getNVout() == i);
42         BOOST_CHECK(results[i].getHashWith() == uintToh256(hash));
43     }
44 }
45 
runTest(bool isCreation,size_t n,CScript & script1,CScript script2=CScript ())46 void runTest(bool isCreation, size_t n, CScript& script1, CScript script2 = CScript()){
47     mempool.clear();
48     TestMemPoolEntryHelper entry;
49     CMutableTransaction tx1, tx2;
50     std::vector<CTxOut> outs1 = {CTxOut(value, CScript() << OP_DUP << OP_HASH160 << address << OP_EQUALVERIFY << OP_CHECKSIG)};
51     tx1 = createTX(outs1);
52     uint256 hashParentTx = tx1.GetHash(); // save this txid for later use
53     mempool.addUnchecked(entry.Fee(1000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx1));
54     std::vector<CTxOut> outs2;
55     for(size_t i = 0; i < n; i++){
56         if(script2 == CScript()){
57             outs2.push_back(CTxOut(value, script1));
58         } else {
59             if(i < n / 2){
60                 outs2.push_back(CTxOut(value, script1));
61             } else {
62                 outs2.push_back(CTxOut(value, script2));
63             }
64         }
65     }
66     tx2 = createTX(outs2, hashParentTx);
67     CTransaction transaction(tx2);
68     QtumTxConverter converter(transaction, NULL);
69     ExtractQtumTX qtumTx;
70     BOOST_CHECK(converter.extractionQtumTransactions(qtumTx));
71     std::vector<QtumTransaction> result = qtumTx.first;
72     if(script2 == CScript()){
73         BOOST_CHECK(result.size() == n);
74     } else {
75         BOOST_CHECK(result.size() == n / 2);
76     }
77     checkResult(isCreation, result, tx2.GetHash());
78 }
79 
runFailingTest(bool isCreation,size_t n,CScript & script1,CScript script2=CScript ())80 void runFailingTest(bool isCreation, size_t n, CScript& script1, CScript script2 = CScript()){
81     mempool.clear();
82     TestMemPoolEntryHelper entry;
83     CMutableTransaction tx1, tx2;
84     std::vector<CTxOut> outs1 = {CTxOut(value, CScript() << OP_DUP << OP_HASH160 << address << OP_EQUALVERIFY << OP_CHECKSIG)};
85     tx1 = createTX(outs1);
86     uint256 hashParentTx = tx1.GetHash(); // save this txid for later use
87     mempool.addUnchecked(entry.Fee(1000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx1));
88     std::vector<CTxOut> outs2;
89     for(size_t i = 0; i < n; i++){
90         if(script2 == CScript()){
91             outs2.push_back(CTxOut(value, script1));
92         } else {
93             if(i < n / 2){
94                 outs2.push_back(CTxOut(value, script1));
95             } else {
96                 outs2.push_back(CTxOut(value, script2));
97             }
98         }
99     }
100     tx2 = createTX(outs2, hashParentTx);
101     CTransaction transaction(tx2);
102     QtumTxConverter converter(transaction, NULL);
103     ExtractQtumTX qtumTx;
104     BOOST_CHECK(!converter.extractionQtumTransactions(qtumTx));
105 }
106 
BOOST_FIXTURE_TEST_SUITE(qtumtxconverter_tests,TestingSetup)107 BOOST_FIXTURE_TEST_SUITE(qtumtxconverter_tests, TestingSetup)
108 
109 BOOST_AUTO_TEST_CASE(parse_txcreate){
110     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CREATE;
111     runTest(true, 1, script1);
112 }
113 
BOOST_AUTO_TEST_CASE(parse_txcall)114 BOOST_AUTO_TEST_CASE(parse_txcall){
115     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
116     runTest(false, 1, script1);
117 }
118 
BOOST_AUTO_TEST_CASE(parse_txcall_mixed)119 BOOST_AUTO_TEST_CASE(parse_txcall_mixed){
120     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
121     CScript script2 = CScript() << OP_TRUE;
122     runTest(false, 1, script1, script2);
123 }
124 
BOOST_AUTO_TEST_CASE(parse_txcreate_many_vout)125 BOOST_AUTO_TEST_CASE(parse_txcreate_many_vout){
126     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CREATE;
127     runTest(true, 120, script1);
128 }
BOOST_AUTO_TEST_CASE(parse_txcreate_many_vout_mixed)129 BOOST_AUTO_TEST_CASE(parse_txcreate_many_vout_mixed){
130     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CREATE;
131     CScript script2 = CScript() << OP_TRUE;
132     runTest(true, 120, script1, script2);
133 }
134 
BOOST_AUTO_TEST_CASE(parse_txcall_many_vout)135 BOOST_AUTO_TEST_CASE(parse_txcall_many_vout){
136     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
137     runTest(false, 120, script1);
138 }
139 
BOOST_AUTO_TEST_CASE(parse_incorrect_txcreate_many)140 BOOST_AUTO_TEST_CASE(parse_incorrect_txcreate_many){
141     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CREATE;
142     CScript script2 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CREATE;
143     runFailingTest(true, 120, script1, script2);
144 }
145 
BOOST_AUTO_TEST_CASE(parse_incorrect_txcreate_few)146 BOOST_AUTO_TEST_CASE(parse_incorrect_txcreate_few){
147     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CREATE;
148     CScript script2 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << OP_CREATE;
149     runFailingTest(true, 120, script1, script2);
150 }
151 
BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_many)152 BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_many){
153     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
154     CScript script2 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << address << OP_CALL;
155     runFailingTest(false, 120, script1, script2);
156 }
157 
BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_few)158 BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_few){
159     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
160     CScript script2 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << OP_CALL;
161     runFailingTest(false, 120, script1, script2);
162 }
163 
BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_overflow)164 BOOST_AUTO_TEST_CASE(parse_incorrect_txcall_overflow){
165     CScript script1 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(gasLimit)) << CScriptNum(int64_t(gasPrice)) << data << address << OP_CALL;
166     CScript script2 = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(int64_t(0x80841e0000000000)) << CScriptNum(int64_t(0x0100000000000000)) << data << address << OP_CALL;
167     runFailingTest(false, 120, script1, script2);
168 }
169 
170 BOOST_AUTO_TEST_SUITE_END()
171