Exemplo n.º 1
0
    def test_timestamp(self):
        contract_a = make_contract("", "uint256")
        vm = create_evm_vm([contract_a], False, False)

        arbsys = contract_templates.get_arbsys()
        arbsys_abi = ContractABI(arbsys)

        arbinfo = contract_templates.get_info_contract()
        arbinfo_abi = ContractABI(arbinfo)
        output_handler = create_output_handler([contract_a, arbinfo_abi])
        inbox = value.Tuple([])
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [0, address,
                         arbsys_abi.timestampUpperBound(0, 0)]), 0)),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [0, address,
                         arbsys_abi.currentMessageTimestamp(1, 0)]),
                    0,
                    543,
                )),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple([
                        CALL_TX_TYPE, address,
                        arbsys_abi.call_timestampUpperBound()
                    ]),
                    34,
                )),
        )

        vm.env.messages = inbox
        run_until_block(vm, self)
        self.assertEqual(len(vm.logs), 3)
        parsed_out0 = output_handler(vm.logs[0])
        parsed_out1 = output_handler(vm.logs[1])
        parsed_out2 = output_handler(vm.logs[2])

        self.assertIsInstance(parsed_out0, EVMReturn)
        self.assertIsInstance(parsed_out1, EVMReturn)
        self.assertIsInstance(parsed_out2, EVMReturn)

        self.assertEqual(parsed_out0.output_values[0], 73657336)
        self.assertEqual(parsed_out1.output_values[0], 543)
        self.assertEqual(parsed_out2.output_values[0], 73657336)
Exemplo n.º 2
0
    def test_clone(self):
        evm_code = make_simple_code()
        contract_a = make_contract(evm_code, "uint256")
        arbsys = contract_templates.get_arbsys()
        arbsys_abi = ContractABI(arbsys)

        vm = create_evm_vm([contract_a], False, False)
        output_handler = create_output_handler([contract_a, arbsys_abi])
        inbox = value.Tuple([])
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [0, address, contract_a.testMethod(0, 0)]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            0,
                            address,
                            arbsys_abi.cloneContract(1, 0, contract_a.address_string),
                        ]
                    )  # type  # sender
                )
            ),
        )
        vm.env.messages = inbox
        run_until_block(vm, self)
        self.assertEqual(len(vm.logs), 2)
        parsed_out0 = output_handler(vm.logs[0])
        parsed_out1 = output_handler(vm.logs[1])
        self.assertIsInstance(parsed_out0, EVMReturn)
        self.assertIsInstance(parsed_out1, EVMReturn)

        correct_value = parsed_out0.output_values[0]
        created_contract_address = parsed_out1.output_values[0]
        created_contract = make_contract(evm_code, "uint256", created_contract_address)
        fake_contract = make_contract(
            evm_code, "uint256", "0x3c1b4360234d8e65a9e162ef82d70bee71324512"
        )
        output_handler = create_output_handler(
            [contract_a, arbsys_abi, created_contract, fake_contract]
        )

        inbox = value.Tuple([])
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [0, address, fake_contract.testMethod(2, 0)]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [0, address, created_contract.testMethod(3, 0)]
                    )  # type  # sender
                )
            ),
        )
        vm.env.messages = inbox
        run_until_block(vm, self)
        self.assertEqual(len(vm.logs), 4)
        parsed_out2 = output_handler(vm.logs[2])
        parsed_out3 = output_handler(vm.logs[3])
        self.assertIsInstance(parsed_out2, EVMStop)
        self.assertIsInstance(parsed_out3, EVMReturn)
        self.assertEqual(parsed_out3.output_values[0], correct_value)
Exemplo n.º 3
0
    def test_seq(self):
        contract_a = make_contract("", "uint256")
        vm = create_evm_vm([contract_a], False, False)

        arbsys = contract_templates.get_arbsys()
        arbsys_abi = ContractABI(arbsys)

        output_handler = create_output_handler([contract_a])
        inbox = value.Tuple([])
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [1, 2345, value.Tuple([address, 100000])]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            CALL_TX_TYPE,
                            address,
                            arbsys_abi.call_getTransactionCount(address_string),
                        ]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            0,
                            address,
                            arbsys_abi.withdrawEth(0, 0, dest_address_string, 50000),
                        ]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            CALL_TX_TYPE,
                            address,
                            arbsys_abi.call_getTransactionCount(address_string),
                        ]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            0,
                            address,
                            arbsys_abi.withdrawEth(5, 0, dest_address_string, 50000),
                        ]
                    )  # type  # sender
                )
            ),
        )
        inbox = messagestack.addMessage(
            inbox,
            value.Tuple(
                make_msg_val(
                    value.Tuple(
                        [
                            0,
                            address,
                            arbsys_abi.withdrawEth(1, 0, dest_address_string, 50000),
                        ]
                    )  # type  # sender
                )
            ),
        )
        vm.env.messages = inbox
        run_until_block(vm, self)
        self.assertEqual(len(vm.logs), 6)
        parsed_out0 = output_handler(vm.logs[0])
        parsed_out1 = output_handler(vm.logs[1])
        parsed_out2 = output_handler(vm.logs[2])
        parsed_out3 = output_handler(vm.logs[3])
        parsed_out4 = output_handler(vm.logs[4])
        parsed_out5 = output_handler(vm.logs[5])
        self.assertIsInstance(parsed_out0, EVMStop)
        self.assertIsInstance(parsed_out1, EVMReturn)
        self.assertIsInstance(parsed_out2, EVMStop)
        self.assertIsInstance(parsed_out3, EVMReturn)
        self.assertIsInstance(parsed_out4, EVMInvalidSequence)
        self.assertIsInstance(parsed_out5, EVMStop)

        self.assertEqual(parsed_out1.output_values[0], 0)
        self.assertEqual(parsed_out3.output_values[0], 1)

        self.assertEqual(len(vm.sent_messages), 2)
        self.assertEqual(
            vm.sent_messages[0],
            value.Tuple([1, address, value.Tuple([dest_address, 50000])]),
        )
        self.assertEqual(
            vm.sent_messages[1],
            value.Tuple([1, address, value.Tuple([dest_address, 50000])]),
        )