1#!/usr/bin/env python3
2
3from test_framework.test_framework import BitcoinTestFramework
4from test_framework.util import *
5from test_framework.script import *
6from test_framework.mininode import *
7from test_framework.address import *
8
9class QtumGlobalsStateChangerTest(BitcoinTestFramework):
10    def set_test_params(self):
11        self.setup_clean_chain = True
12        self.num_nodes = 1
13
14    def skip_test_if_missing_module(self):
15        self.skip_if_no_wallet()
16
17    def run_test(self):
18        self.node = self.nodes[0]
19        self.nodes[0].generate(10 + COINBASE_MATURITY)
20
21        """
22        pragma solidity ^0.4.12;
23
24        contract Test {
25            uint public stateChanger;
26
27            function blkblockhash() payable {
28                stateChanger = uint(block.blockhash(block.number-1));
29            }
30
31            function blkcoinbase() payable {
32                stateChanger = uint(block.coinbase);
33            }
34
35            function blkdifficulty() payable {
36                stateChanger = block.difficulty;
37            }
38
39            function blkgaslimit() payable {
40                stateChanger = block.gaslimit;
41            }
42
43            function blknumber() payable {
44                stateChanger = block.number;
45            }
46
47            function blktimestamp() payable {
48                stateChanger = block.timestamp;
49            }
50        }
51        73c9330d blkblockhash()
52        5facaf8e blkcoinbase()
53        009e8657 blkdifficulty()
54        49b573d4 blkgaslimit()
55        6bde2d73 blknumber()
56        c1a5257b blktimestamp()
57        6c7804b5 stateChanger()
58        """
59        contract_bytecode = "6060604052341561000f57600080fd5b5b6101738061001f6000396000f30060606040523615610080576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680629e86571461008557806349b573d41461008f5780635facaf8e146100995780636bde2d73146100a35780636c7804b5146100ad57806373c9330d146100d6578063c1a5257b146100e0575b600080fd5b61008d6100ea565b005b6100976100f4565b005b6100a16100fe565b005b6100ab61011e565b005b34156100b857600080fd5b6100c0610128565b6040518082815260200191505060405180910390f35b6100de61012e565b005b6100e861013d565b005b446000819055505b565b456000819055505b565b4173ffffffffffffffffffffffffffffffffffffffff166000819055505b565b436000819055505b565b60005481565b4340600190046000819055505b565b426000819055505b5600a165627a7a72305820a4033d29ccf12dc58fda987b64dec57272d205023628eb3be8ba613585453d770029"
60        contract_address = self.nodes[0].createcontract(contract_bytecode)['address']
61        self.node.generate(1)
62
63        print("State change based on block.blockhash")
64        block_count = self.node.getblockcount()
65        self.node.sendtocontract(contract_address, "73c9330d", 0, 1000000)
66        self.node.generate(1)
67        assert_equal(self.node.getblockcount(), block_count+1)
68
69        print("State change based on block.coinbase")
70        block_count = self.node.getblockcount()
71        self.node.sendtocontract(contract_address, "5facaf8e", 0, 1000000)
72        self.node.generate(1)
73        assert_equal(self.node.getblockcount(), block_count+1)
74
75        print("State change based on block.difficulty")
76        block_count = self.node.getblockcount()
77        self.node.sendtocontract(contract_address, "009e8657", 0, 1000000)
78        self.node.generate(1)
79        assert_equal(self.node.getblockcount(), block_count+1)
80
81        print("State change based on block.gaslimit")
82        block_count = self.node.getblockcount()
83        self.node.sendtocontract(contract_address, "49b573d4", 0, 1000000)
84        self.node.generate(1)
85        assert_equal(self.node.getblockcount(), block_count+1)
86
87        print("State change based on block.number")
88        block_count = self.node.getblockcount()
89        self.node.sendtocontract(contract_address, "6bde2d73", 0, 1000000)
90        self.node.generate(1)
91        assert_equal(self.node.getblockcount(), block_count+1)
92
93        print("State change based on block.timestamp")
94        block_count = self.node.getblockcount()
95        self.node.sendtocontract(contract_address, "c1a5257b", 0, 1000000)
96        self.node.generate(1)
97        assert_equal(self.node.getblockcount(), block_count+1)
98
99if __name__ == '__main__':
100    QtumGlobalsStateChangerTest().main()
101