1#!/usr/bin/env python3
2# Copyright (c) 2015-2016 The Bitcoin Core developers
3# Distributed under the MIT software license, see the accompanying
4# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6from test_framework.test_framework import BitcoinTestFramework
7from test_framework.util import *
8from test_framework.script import *
9from test_framework.mininode import *
10from test_framework.address import *
11from test_framework.qtum import *
12import sys
13import time
14
15class CreatecontractTest(BitcoinTestFramework):
16    def set_test_params(self):
17        self.setup_clean_chain = True
18        self.num_nodes = 1
19        self.extra_args = [['-txindex=1']]
20
21    def skip_test_if_missing_module(self):
22        self.skip_if_no_wallet()
23
24    def createcontract_simple_test(self):
25        """
26        pragma solidity ^0.4.0;
27
28        contract Test {
29            address owner;
30            function Test(){
31                owner=msg.sender;
32            }
33            function setOwner(address test) payable{
34                owner=msg.sender;
35            }
36            function getOwner() constant returns (address cOwner){
37                return owner;
38            }
39            function getSender() constant returns (address cSender){
40                return msg.sender;
41            }
42        }
43        """
44        ret = self.node.createcontract("6060604052341561000c57fe5b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6101c88061005f6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af4035146100515780635e01eb5a1461007f578063893d20e8146100d1575bfe5b61007d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610123565b005b341561008757fe5b61008f610168565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d957fe5b6100e1610171565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60003390505b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b905600a165627a7a7230582050b454be91cd91e08099814fc2192c5fded81b632733f6c808e4d75e85a766a50029", 1000000)
45        assert('txid' in ret)
46        assert('sender' in ret)
47        assert('hash160' in ret)
48        contract_address = ret['address']
49        sender = str(base58_to_byte(ret['sender'], 25)[1])[2:-1]
50        self.node.generate(1)
51
52        ret = self.node.getaccountinfo(contract_address)
53        expected_account_info = {
54          "address": contract_address,
55          "balance": 0,
56          "storage": {
57            "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": {
58              "0000000000000000000000000000000000000000000000000000000000000000": "000000000000000000000000" + sender
59            }
60          },
61          "code": "60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af4035146100515780635e01eb5a1461007f578063893d20e8146100d1575bfe5b61007d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610123565b005b341561008757fe5b61008f610168565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d957fe5b6100e1610171565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60003390505b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b905600a165627a7a7230582050b454be91cd91e08099814fc2192c5fded81b632733f6c808e4d75e85a766a50029"
62        }
63        assert_equal(ret, expected_account_info)
64
65    def createcontract_with_sender_test(self):
66        self.node.importprivkey("cQWxca9y9XBf4c6ohTwRQ9Kf4GZyRybhGBfzaFgkvRpw8HjbRC58")
67        self.node.sendtoaddress("qabmqZk3re5b9UpUcznxDkCnCsnKdmPktT", 0.1)
68        self.node.generate(1)
69
70        """
71        pragma solidity ^0.4.0;
72
73        contract Test {
74            address owner;
75            function Test(){
76                owner=msg.sender;
77            }
78            function setOwner(address test) payable{
79                owner=msg.sender;
80            }
81            function getOwner() constant returns (address cOwner){
82                return owner;
83            }
84            function getSender() constant returns (address cSender){
85                return msg.sender;
86            }
87        }
88        """
89        ret = self.node.createcontract("6060604052341561000c57fe5b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6101c88061005f6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af4035146100515780635e01eb5a1461007f578063893d20e8146100d1575bfe5b61007d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610123565b005b341561008757fe5b61008f610168565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d957fe5b6100e1610171565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60003390505b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b905600a165627a7a7230582050b454be91cd91e08099814fc2192c5fded81b632733f6c808e4d75e85a766a50029", 1000000, QTUM_MIN_GAS_PRICE_STR, "qabmqZk3re5b9UpUcznxDkCnCsnKdmPktT")
90        assert('txid' in ret)
91        assert('sender' in ret)
92        assert('hash160' in ret)
93        contract_address = ret['address']
94        self.node.generate(1)
95
96        ret = self.node.getaccountinfo(contract_address)
97        expected_account_info = {
98          "address": contract_address,
99          "balance": 0,
100          "storage": {
101            "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": {
102              "0000000000000000000000000000000000000000000000000000000000000000": "000000000000000000000000baede766c1a4844efea1326fffc5cd8c1c3e42ae"
103            }
104          },
105          "code": "60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af4035146100515780635e01eb5a1461007f578063893d20e8146100d1575bfe5b61007d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610123565b005b341561008757fe5b61008f610168565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d957fe5b6100e1610171565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60003390505b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b905600a165627a7a7230582050b454be91cd91e08099814fc2192c5fded81b632733f6c808e4d75e85a766a50029"
106        }
107        assert(ret == expected_account_info)
108
109    def createcontract_no_broadcast_test(self):
110        self.node.sendtoaddress("qabmqZk3re5b9UpUcznxDkCnCsnKdmPktT", 0.1)
111        self.node.generate(1)
112        """
113        pragma solidity ^0.4.0;
114
115        contract Test {
116            address owner;
117            function Test(){
118                owner=msg.sender;
119            }
120            function setOwner(address test) payable{
121                owner=msg.sender;
122            }
123            function getOwner() constant returns (address cOwner){
124                return owner;
125            }
126            function getSender() constant returns (address cSender){
127                return msg.sender;
128            }
129        }
130        """
131        ret = self.node.createcontract("6060604052341561000c57fe5b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6101c88061005f6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af4035146100515780635e01eb5a1461007f578063893d20e8146100d1575bfe5b61007d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610123565b005b341561008757fe5b61008f610168565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d957fe5b6100e1610171565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60003390505b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b905600a165627a7a7230582050b454be91cd91e08099814fc2192c5fded81b632733f6c808e4d75e85a766a50029", 1000000, QTUM_MIN_GAS_PRICE_STR, "qabmqZk3re5b9UpUcznxDkCnCsnKdmPktT", False)
132        assert('raw transaction' in ret)
133        assert(len(ret.keys()) == 1)
134        decoded_tx = self.node.decoderawtransaction(ret['raw transaction'])
135
136        # verify that at least one output has a scriptPubKey of type create
137        for out in decoded_tx['vout']:
138            if out['scriptPubKey']['type'] == 'create' or out['scriptPubKey']['type'] == 'create_sender':
139                return
140        assert(False)
141
142    def run_test(self):
143        self.nodes[0].generate(COINBASE_MATURITY+50)
144        self.node = self.nodes[0]
145        self.createcontract_simple_test()
146        self.createcontract_with_sender_test()
147        self.createcontract_no_broadcast_test()
148
149if __name__ == '__main__':
150    CreatecontractTest().main()