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