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()