예제 #1
0
    def test_score_invoke_failure(self):
        tx_hash = create_tx_hash()
        method = 'icx_sendTransaction'
        params = {
            'from': self.from_,
            'to': self._icon_score_address,
            'value': 0,
            'fee': 10**16,
            'timestamp': 1234567890,
            'txHash': tx_hash,
            'dataType': 'call',
            'data': {
                'method': 'transfer',
                'params': {
                    'to': self._to,
                    'value': 777
                }
            }
        }

        context = _create_context(IconScoreContextType.INVOKE)
        context.tx = Transaction(tx_hash=params['txHash'],
                                 origin=params['from'],
                                 index=0,
                                 timestamp=params['timestamp'],
                                 nonce=params.get('nonce', None))
        context.block = Mock(spec=Block)
        context.msg = Message(sender=params['from'], value=params['value'])
        context.cumulative_step_used = Mock(spec=int)
        context.cumulative_step_used.attach_mock(Mock(), '__add__')
        context.step_counter = Mock(spec=IconScoreStepCounter)
        context.event_logs = []
        context.traces = Mock(spec=list)

        raise_exception_start_tag("test_score_invoke_failure")
        tx_result = self._engine._call(context, method, params)
        raise_exception_end_tag("test_score_invoke_failure")
        self.assertTrue(isinstance(tx_result, TransactionResult))
        self.assertEqual(TransactionResult.FAILURE, tx_result.status)
        self.assertEqual(self._icon_score_address, tx_result.to)
        self.assertEqual(tx_hash, tx_result.tx_hash)
        self.assertIsNone(tx_result.score_address)
        context.traces.append.assert_called()

        context_factory.destroy(context)
    def test_deploy_invalid_score(self):
        self.import_white_list_enable()

        deploy_list = [
            'import_test/test_score_import_in_top_level',
            'import_test/test_score_import_in_method',
            'import_test/test_score_import_in_function',
            'import_test/test_score_import_in_class',
            'import_test/import_in_submodule',
            'import_test/import_in_indirect_submodule',
            'import_test/import_in_indirect_submodule_method',
            'import_test/test_score_exec_top_level',
            'import_test/test_score_exec_function',
            'import_test/test_score_exec_method',
            'import_test/test_score_eval_function',
            'import_test/test_score_eval_method',
            'import_test/test_score_compile_function',
            'import_test/test_score_compile_method',
            'import_test/exec_in_submodule',
            'import_test/exec_in_indirect_submodule',
            'import_test/as_test/test_score_import_in_top_level',
            'import_test/as_test/test_score_import_in_class',
            'import_test/as_test/test_score_import_in_method',
            'import_test/as_test/test_score_import_in_function',
            'import_test/as_test/test_in_submodule',
            'import_test/as_test/test_in_indirect_submodule',
            'import_test/as_test/test_in_indirect_submodule_method',
            'import_test/import_builtin', 'import_test/import_builtin2',
            'import_test/import_builtin3'
        ]

        tx_list = [
            self._make_deploy_tx('test_deploy_scores', deploy_name,
                                 self._addr_array[0], ZERO_SCORE_ADDRESS)
            for deploy_name in deploy_list
        ]

        raise_exception_start_tag("test_deploy_invalid_score")
        prev_block, tx_results = self._make_and_req_block(tx_list)
        raise_exception_end_tag("test_deploy_invalid_score")

        self._write_precommit_state(prev_block)

        for tx_result in tx_results:
            self.assertEqual(tx_result.status, int(False))
    def test_throw(self, IconServiceEngine_charge_transaction_fee):
        context = ContextContainer._get_context()

        self._icon_service_engine = IconServiceEngine()
        self._icon_service_engine._icx_engine = Mock(spec=IcxEngine)
        self._icon_service_engine._icon_score_deploy_engine = \
            Mock(spec=IconScoreDeployEngine)

        self._icon_service_engine._icon_pre_validator = Mock(
            spec=IconPreValidator)
        context.tx_batch = TransactionBatch()

        from_ = Mock(spec=Address)
        to_ = Mock(spec=Address)

        def intercept_charge_transaction_fee(*args, **kwargs):
            return Mock(spec=int), Mock(spec=int)

        IconServiceEngine_charge_transaction_fee.side_effect = \
            intercept_charge_transaction_fee

        self._icon_service_engine._icon_score_deploy_engine.attach_mock(
            Mock(return_value=False), 'is_data_type_supported')

        error = Mock(spec=str)
        code = ExceptionCode.INVALID_PARAMETER
        mock_exception = Mock(side_effect=InvalidParamsException(error))
        IconScoreEngine.invoke = Mock(side_effect=mock_exception)

        raise_exception_start_tag("test_throw")
        tx_result = self._icon_service_engine._handle_icx_send_transaction(
            context, {
                'version': 3,
                'from': from_,
                'to': to_
            })
        raise_exception_end_tag("test_throw")
        self.assertEqual(0, tx_result.status)

        IconServiceEngine_charge_transaction_fee.assert_called()
        context.traces.append.assert_called()
        trace = context.traces.append.call_args[0][0]
        self.assertEqual(TraceType.THROW, trace.trace)
        self.assertEqual(code, trace.data[0])
        self.assertEqual(error, trace.data[1])
예제 #4
0
    def test_revert(self, IconServiceEngine_charge_transaction_fee):
        context = ContextContainer._get_context()

        self._icon_service_engine = IconServiceEngine()
        self._icon_service_engine._flag = 0
        self._icon_service_engine._icx_engine = Mock(spec=IcxEngine)
        self._icon_service_engine._icon_score_deploy_engine = \
            Mock(spec=IconScoreDeployEngine)

        self._icon_service_engine._icon_score_engine = Mock(
            spec=IconScoreEngine)
        self._icon_service_engine._icon_pre_validator = Mock(
            spec=IconPreValidator)
        context.tx_batch = TransactionBatch()

        from_ = Mock(spec=Address)
        to_ = Mock(spec=Address)

        def intercept_charge_transaction_fee(*args, **kwargs):
            return Mock(spec=int), Mock(spec=int)

        IconServiceEngine_charge_transaction_fee.side_effect = \
            intercept_charge_transaction_fee

        self._icon_service_engine._icon_score_deploy_engine.attach_mock(
            Mock(return_value=False), 'is_data_type_supported')

        reason = Mock(spec=str)
        code = ExceptionCode.SCORE_ERROR
        mock_revert = Mock(side_effect=RevertException(reason))
        self._icon_service_engine._icon_score_engine.attach_mock(
            mock_revert, "invoke")

        raise_exception_start_tag("test_revert")
        tx_result = self._icon_service_engine._handle_icx_send_transaction(
            context, {'version': 3, 'from': from_, 'to': to_})
        raise_exception_end_tag("test_revert")
        self.assertEqual(0, tx_result.status)

        IconServiceEngine_charge_transaction_fee.assert_called()
        context.traces.append.assert_called()
        trace = context.traces.append.call_args[0][0]
        self.assertEqual(TraceType.REVERT, trace.trace)
        self.assertEqual(code, trace.data[0])
        self.assertEqual(reason, trace.data[1])
예제 #5
0
    def test_deploy_invalid_score(self):

        deploy_list = [
            'import_test/sample_score_import_in_top_level',
            'import_test/sample_score_import_in_method',
            'import_test/sample_score_import_in_function',
            'import_test/sample_score_import_in_class',
            'import_test/import_in_submodule',
            'import_test/import_in_indirect_submodule',
            'import_test/import_in_indirect_submodule_method',
            'import_test/sample_score_exec_top_level',
            'import_test/sample_score_exec_function',
            'import_test/sample_score_exec_method',
            'import_test/sample_score_eval_function',
            'import_test/sample_score_eval_method',
            'import_test/sample_score_compile_function',
            'import_test/sample_score_compile_method',
            'import_test/exec_in_submodule',
            'import_test/exec_in_indirect_submodule',
            'import_test/as_test/sample_score_import_in_top_level',
            'import_test/as_test/sample_score_import_in_class',
            'import_test/as_test/sample_score_import_in_method',
            'import_test/as_test/sample_score_import_in_function',
            'import_test/as_test/sample_in_submodule',
            'import_test/as_test/sample_in_indirect_submodule',
            'import_test/as_test/sample_in_indirect_submodule_method',
            'import_test/import_builtin',
            'import_test/import_builtin2',
            'import_test/import_builtin3',
            'import_test/import_package',
            'import_test/import_system_score_package',
        ]

        tx_list = [
            self.create_deploy_score_tx(score_root='sample_deploy_scores',
                                        score_name=deploy_name,
                                        from_=self._accounts[0],
                                        to_=SYSTEM_SCORE_ADDRESS)
            for deploy_name in deploy_list
        ]

        raise_exception_start_tag("sample_deploy_invalid_score")
        self.process_confirm_block_tx(tx_list, expected_status=False)
        self.make_and_req_block(tx_list)
        raise_exception_end_tag("sample_deploy_invalid_score")
    def test_score_no_python(self):
        value1 = 1 * self._icx_factor

        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score_no_python",
                                   self._addr_array[0],
                                   ZERO_SCORE_ADDRESS,
                                   deploy_params={'value': hex(value1)})

        raise_exception_start_tag("test_score_no_python")
        prev_block, tx_results = self._make_and_req_block([tx1])
        raise_exception_end_tag("test_score_no_python")

        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code,
                         ExceptionCode.SERVER_ERROR)
예제 #7
0
    def test_score_no_external_func(self):
        self._update_governance()

        # 1. deploy same SCORE address (wait audit)
        value1 = 1 * self._icx_factor
        tx_result = self._deploy_score("install/test_score_no_external_func",
                                       value1)
        tx_hash1 = tx_result.tx_hash

        # 2. accept SCORE : tx_hash1
        raise_exception_start_tag("test_score_no_external_func")
        tx_result = self._accept_score(tx_hash1)
        raise_exception_end_tag("test_score_no_external_func")

        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.ILLEGAL_FORMAT)
        self.assertEqual(tx_result.failure.message,
                         "There is no external method in the SCORE")
예제 #8
0
    def test_governance_call_about_add_remove_auditor_invalid_address(self):
        self._update_governance()

        raise_exception_start_tag("addAuditor")
        tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS,
                                        'addAuditor', {"address": str("")})
        raise_exception_end_tag("addAuditor")
        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PARAMS)
        self.assertEqual(tx_result.failure.message, "Invalid address")

        raise_exception_start_tag("removeAuditor")
        tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS,
                                        'removeAuditor', {"address": str("")})
        raise_exception_end_tag("removeAuditor")
        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PARAMS)
        self.assertEqual(tx_result.failure.message, "Invalid address")
    def test_invalid_owner(self):
        params = {'serviceFlag': hex(IconServiceFlag.audit)}
        tx = self._make_score_call_tx(Address.from_prefix_and_int(
            AddressPrefix.CONTRACT, 2),
                                      GOVERNANCE_SCORE_ADDRESS,
                                      'updateServiceConfig',
                                      params=params)

        raise_exception_start_tag("test_invalid_owner")
        prev_block, tx_results = self._make_and_req_block([tx])
        raise_exception_end_tag("test_invalid_owner")

        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR)
        self.assertEqual(tx_results[0].failure.message,
                         f'Invalid sender: not owner')
예제 #10
0
    def test_score_no_scorebase(self):
        self._update_governance()

        # 1. deploy same SCORE address (wait audit)
        value1 = 1 * self._icx_factor
        tx_result = self._deploy_score("install/test_score_no_scorebase",
                                       value1)
        tx_hash1 = tx_result.tx_hash

        # 2. accept SCORE : tx_hash1
        raise_exception_start_tag("test_score_no_scorebase")
        tx_result = self._accept_score(tx_hash1)
        raise_exception_end_tag("test_score_no_scorebase")

        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.SYSTEM_ERROR)
        self.assertEqual(tx_result.failure.message,
                         "'TestScore' object has no attribute 'owner'")
    def test_score_with_korean_comments(self):
        self._update_governance_score()

        # 1. deploy same SCORE address (wait audit)
        value1 = 1
        tx_results: List['TransactionResult'] = self._deploy_score(
            score_name="install/sample_score_with_korean_comments",
            value=value1)
        tx_hash1 = tx_results[0].tx_hash

        # 2. accept SCORE : tx_hash1
        raise_exception_start_tag("sample_score_with_korean_comments")
        tx_results: List['TransactionResult'] = self.accept_score(
            tx_hash=tx_hash1, expected_status=False)
        raise_exception_end_tag("sample_score_with_korean_comments")

        self.assertEqual(tx_results[0].failure.code,
                         ExceptionCode.SYSTEM_ERROR)
    def test_normal_score_fail1_fix_update_governance(self):
        self._update_governance()

        # 1. deploy (wait audit)
        tx_result = self._deploy_score("install/test_score", 1)
        self.assertEqual(tx_result.status, int(True))
        score_addr1 = tx_result.score_address
        tx_hash1 = tx_result.tx_hash

        expect_ret = {'next': {'status': 'pending', 'deployTxHash': tx_hash1}}

        # assert SCORE status
        self._assert_get_score_status(score_addr1, expect_ret)

        # 2. accpt SCORE : empty str
        raise_exception_start_tag("Invalid txHash")
        tx_result = self._accept_score("")
        raise_exception_end_tag("Invalid txHash")
        self.assertEqual(tx_result.status, int(False))
예제 #13
0
    def test_score_address_already_in_use(self):
        self._update_governance()

        # 1. deploy
        timestamp = 1
        value1 = 1 * self._icx_factor
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score",
                                   self._addr_array[0],
                                   ZERO_SCORE_ADDRESS,
                                   timestamp_us=timestamp,
                                   deploy_params={'value': hex(value1)})

        value2 = 2 * self._icx_factor
        tx2 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score",
                                   self._addr_array[0],
                                   ZERO_SCORE_ADDRESS,
                                   timestamp_us=timestamp,
                                   deploy_params={'value': hex(value2)})

        raise_exception_start_tag("test_score_address_already_in_use")
        prev_block, tx_results = self._make_and_req_block([tx1, tx2])
        raise_exception_end_tag("test_score_address_already_in_use")

        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(True))
        score_addr1 = tx_results[0].score_address

        self.assertEqual(tx_results[1].status, int(False))
        self.assertEqual(tx_results[1].failure.code, ExceptionCode.ACCESS_DENIED)
        self.assertEqual(tx_results[1].failure.message, f'SCORE address already in use: {str(score_addr1)}')

        # 2. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1)

        # 3. set value: value2
        value2 = 2 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value2)})

        # 4. assert get value: 2 * value2
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value2)
예제 #14
0
    def test_score_no_external_func(self):
        self._update_governance()

        # 1. install done
        value1 = 1 * self._icx_factor
        score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1)
        print(f'tx_hash1: {tx_hash1.hex()}\ntx_hash2: {tx_hash2.hex()}')

        # 2. deploy update (wait audit)
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score_no_external_func",
                                   self._addr_array[0],
                                   score_addr1,
                                   deploy_params={'value': hex(value1)})

        prev_block, tx_results = self._make_and_req_block([tx1])
        self._write_precommit_state(prev_block)
        self.assertEqual(tx_results[0].status, int(True))
        tx_hash2 = tx_results[0].tx_hash
        print(f'tx_hash3: {tx_hash2.hex()}')

        # 3. accept SCORE : tx_hash2
        raise_exception_start_tag("test_score_no_external_func")
        tx_result = self._accept_score(tx_hash2)
        raise_exception_end_tag("test_score_no_external_func")

        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.ILLEGAL_FORMAT)
        self.assertEqual(tx_result.failure.message,
                         "There is no external method in the SCORE")

        # 4. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value1)

        # 5. set value: value3
        value3 = 3 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value",
                        {"value": hex(value3)})

        # 6. assert get value: value3
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value3)
    def test_score_no_scorebase(self):
        self._update_governance_score()

        # 1. deploy same SCORE address (wait audit)
        value1 = 1
        tx_results: List['TransactionResult'] = self._deploy_score(
            score_name="install/sample_score_no_scorebase", value=value1)
        tx_hash1 = tx_results[0].tx_hash

        # 2. accept SCORE : tx_hash1
        raise_exception_start_tag("sample_score_no_scorebase")
        tx_results: List['TransactionResult'] = self.accept_score(
            tx_hash=tx_hash1, expected_status=False)
        raise_exception_end_tag("sample_score_no_scorebase")

        self.assertEqual(tx_results[0].failure.code,
                         ExceptionCode.SYSTEM_ERROR)
        self.assertEqual(tx_results[0].failure.message,
                         "'SampleScore' object has no attribute 'owner'")
    def test_governance_call_about_remove_auditor_not_yourself(self):
        self._update_governance()

        eoa_addr = create_address()

        tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS,
                                        'addAuditor',
                                        {"address": str(self._addr_array[0])})
        self.assertEqual(tx_result.status, int(True))

        raise_exception_start_tag("removeAuditor")
        tx_result = self._external_call(eoa_addr, GOVERNANCE_SCORE_ADDRESS,
                                        'removeAuditor',
                                        {"address": str(self._addr_array[0])})
        raise_exception_end_tag("removeAuditor")
        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.SCORE_ERROR)
        self.assertEqual(tx_result.failure.message,
                         f"Invalid sender: not yourself")
예제 #17
0
    def test_invalid_owner_update_governance(self):
        self._update_governance()

        # 1. install done
        value1 = 1 * self._icx_factor
        score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1)

        # 2. deploy update (wait audit)
        value2 = 2 * self._icx_factor
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "update/test_score",
                                   self._addr_array[1],
                                   score_addr1,
                                   deploy_params={'value': hex(value2)})

        raise_exception_start_tag("test_invalid_owner1")
        prev_block, tx_results = self._make_and_req_block([tx1])
        raise_exception_end_tag("test_invalid_owner1")
        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.SERVER_ERROR)
        self.assertEqual(tx_results[0].failure.message,
                         f'Invalid owner: {str(self._addr_array[0])} != {str(self._addr_array[1])}')
        tx_hash2 = tx_results[0].tx_hash

        # 3. accept SCORE : tx_hash2
        raise_exception_start_tag("test_invalid_owner2")
        tx_result = self._accept_score(tx_hash2)
        raise_exception_end_tag("test_invalid_owner2")
        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.SCORE_ERROR)
        self.assertEqual(tx_result.failure.message, "Invalid txHash: None")

        # 4. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1)

        # 5. set value: value3
        value3 = 3 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)})

        # 6. assert get value: value3
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
예제 #18
0
    def test_score_tbears_mode(self):
        self._update_governance()
        # 1. deploy
        value1 = 1 * self._icx_factor
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score",
                                   self._addr_array[0],
                                   ZERO_SCORE_ADDRESS,
                                   deploy_params={'value': hex(value1)},
                                   is_sys=True)

        raise_exception_start_tag("test_score_tbears_mode")
        prev_block, tx_results = self._make_and_req_block([tx1])
        raise_exception_end_tag("test_score_tbears_mode")

        self._write_precommit_state(prev_block)
        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PARAMETER)
        self.assertIsInstance(tx_results[0].failure.message, str)
예제 #19
0
    def test_score_no_zip(self):
        self._update_governance()

        # 1. deploy
        value1 = 1 * self._icx_factor
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score",
                                   self._addr_array[0],
                                   ZERO_SCORE_ADDRESS,
                                   data=b'invalid',
                                   deploy_params={'value': hex(value1)})

        raise_exception_start_tag("test_score_no_zip")
        prev_block, tx_results = self._make_and_req_block([tx1])
        raise_exception_end_tag("test_score_no_zip")
        self._write_precommit_state(prev_block)
        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PACKAGE)
        self.assertEqual(tx_results[0].failure.message, f'Bad zip file.')
    def test_score_no_external_func(self):
        self._update_governance_score()

        # 1. deploy same SCORE address (wait audit)
        value1 = 1
        tx_results: List['TransactionResult'] = self._deploy_score(
            score_name="install/sample_score_no_external_func", value=value1)
        tx_hash1 = tx_results[0].tx_hash

        # 2. accept SCORE : tx_hash1
        raise_exception_start_tag("sample_score_no_external_func")
        tx_results: List['TransactionResult'] = self.accept_score(
            tx_hash=tx_hash1, expected_status=False)
        raise_exception_end_tag("sample_score_no_external_func")

        self.assertEqual(tx_results[0].failure.code,
                         ExceptionCode.ILLEGAL_FORMAT)
        self.assertEqual(tx_results[0].failure.message,
                         "There is no external method in the SCORE")
    def test_apply_score_multiply_import(self):
        self.import_white_list_enable()

        # add import whitelist
        tx1 = self._make_score_call_tx(
            self._admin, GOVERNANCE_SCORE_ADDRESS, 'addImportWhiteList',
            {"importStmt": "{'struct': ['pack', 'unpack']}"})

        tx2 = self._make_deploy_tx("test_deploy_scores",
                                   'import_test/import_multiply',
                                   self._addr_array[0], ZERO_SCORE_ADDRESS)

        raise_exception_start_tag("test_apply_score_import_white_list")
        prev_block, tx_results = self._make_and_req_block([tx1, tx2])
        raise_exception_end_tag("test_apply_score_import_white_list")

        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(True))
        self.assertEqual(tx_results[1].status, int(True))
예제 #22
0
    def test_normal_score_fail1_fix_update_governance(self):
        self._update_governance_score()

        # 1. deploy (wait audit)
        tx_results: List['TransactionResult'] = self._deploy_score(
            "install/sample_score", 1)
        score_addr1: 'Address' = tx_results[0].score_address
        tx_hash1: bytes = tx_results[0].tx_hash

        expect_ret = {'next': {'status': 'pending', 'deployTxHash': tx_hash1}}

        # assert SCORE status
        self._assert_get_score_status(score_addr1, expect_ret)

        # 2. accpt SCORE : empty str
        raise_exception_start_tag(
            "test_normal_score_fail1_fix_update_governance")
        self.accept_score("", expected_status=False)
        raise_exception_end_tag(
            "test_normal_score_fail1_fix_update_governance")
예제 #23
0
    def test_governance_call_about_remove_auditor_not_yourself(self):
        self._update_governance_score()

        self.score_call(from_=self._admin,
                        to_=GOVERNANCE_SCORE_ADDRESS,
                        func_name="addAuditor",
                        params={"address": str(self._accounts[0].address)})

        raise_exception_start_tag("removeAuditor")
        eoa_addr = create_address()
        tx_results: List['TransactionResult'] = self.score_call(
            from_=eoa_addr,
            to_=GOVERNANCE_SCORE_ADDRESS,
            func_name="removeAuditor",
            params={"address": str(self._accounts[0].address)},
            expected_status=False)
        raise_exception_end_tag("removeAuditor")
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR)
        self.assertEqual(tx_results[0].failure.message,
                         f"Invalid sender: not yourself")
예제 #24
0
    def test_score_no_scorebase(self):
        self._update_governance()

        # 1. install done
        value1 = 1 * self._icx_factor
        score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1)

        # 2. deploy update (wait audit)
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "install/test_score_no_scorebase",
                                   self._addr_array[0],
                                   score_addr1,
                                   deploy_params={'value': hex(value1)})

        prev_block, tx_results = self._make_and_req_block([tx1])
        self._write_precommit_state(prev_block)
        self.assertEqual(tx_results[0].status, int(True))
        tx_hash2 = tx_results[0].tx_hash

        # 3. accept SCORE : tx_hash2
        raise_exception_start_tag("test_score_no_scorebase")
        tx_result = self._accept_score(tx_hash2)
        raise_exception_end_tag("test_score_no_scorebase")

        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.SYSTEM_ERROR)
        self.assertEqual(tx_result.failure.message,
                         "'TestScore' object has no attribute 'owner'")

        # 4. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value1)

        # 5. set value: value3
        value3 = 3 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value",
                        {"value": hex(value3)})

        # 6. assert get value: value3
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value3)
예제 #25
0
    def test_score_no_zip(self):
        self._update_governance()

        # 1. install done
        value1 = 1 * self._icx_factor
        score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1)

        # 2. deploy update (wait audit)
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "update/test_score",
                                   self._addr_array[0],
                                   score_addr1,
                                   data=b'invalid',
                                   deploy_params={'value': hex(value1)})

        prev_block, tx_results = self._make_and_req_block([tx1])
        self._write_precommit_state(prev_block)
        self.assertEqual(tx_results[0].status, int(True))
        tx_hash2 = tx_results[0].tx_hash

        # 3. accept SCORE : tx_hash2
        raise_exception_start_tag("test_score_no_zip")
        tx_result = self._accept_score(tx_hash2)
        raise_exception_end_tag("test_score_no_zip")

        self.assertEqual(tx_result.status, int(False))
        self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PACKAGE)
        self.assertEqual(tx_result.failure.message, f'Bad zip file.')

        # 4. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value1)

        # 5. set value: value3
        value3 = 3 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value",
                        {"value": hex(value3)})

        # 6. assert get value: value3
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value3)
    def test_invalid_owner_update_governance(self):
        self._update_governance_score()

        # 1. install done
        value1 = 1
        score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1)

        # 2. deploy update (wait audit)
        value2 = 2
        tx_results: List['TransactionResult'] = self.deploy_score(score_root="sample_deploy_scores",
                                                                  score_name="update/sample_score",
                                                                  from_=self._accounts[1],
                                                                  deploy_params={'value': hex(value2 * ICX_IN_LOOP)},
                                                                  to_=score_addr1,
                                                                  expected_status=False)
        tx_hash3 = tx_results[0].tx_hash
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.ACCESS_DENIED)
        self.assertEqual(tx_results[0].failure.message,
                         f'Invalid owner: {str(self._accounts[0].address)} '
                         f'!= {str(self._accounts[1].address)}')

        # 3. accept SCORE : tx_hash3
        raise_exception_start_tag("test_invalid_owner -2")
        tx_results: List['TransactionResult'] = self.accept_score(tx_hash=tx_hash3,
                                                                  expected_status=False)
        raise_exception_end_tag("test_invalid_owner -2")
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR)
        self.assertEqual(tx_results[0].failure.message, "Invalid txHash: None")

        # 4. assert get value: value1
        self._assert_get_value(self._accounts[0], score_addr1, "get_value", value1)

        # 5. set value: value3
        value3 = 3
        self.score_call(from_=self._accounts[0],
                        to_=score_addr1,
                        func_name="set_value",
                        params={"value": hex(value3 * ICX_IN_LOOP)})

        # 6. assert get value: value3
        self._assert_get_value(self._accounts[0], score_addr1, "get_value", value3)
예제 #27
0
    def test_tx_failure(self, score_invoke):
        score_invoke.side_effect = Mock(side_effect=InvalidParamsException("error"))

        from_ = Address.from_data(AddressPrefix.EOA, os.urandom(20))
        to_ = Address.from_data(AddressPrefix.CONTRACT, os.urandom(20))
        tx_index = randrange(0, 100)
        self._mock_context.tx = Transaction(os.urandom(32), tx_index, from_, to_, 0)
        self._mock_context.msg = Message(from_)
        self._mock_context.tx_batch = TransactionBatch()

        raise_exception_start_tag("test_tx_failure")
        tx_result = self._icon_service_engine._handle_icx_send_transaction(
            self._mock_context, {'from': from_, 'to': to_})
        raise_exception_end_tag("test_tx_failure")

        self._icon_service_engine._charge_transaction_fee.assert_called()
        self.assertEqual(0, tx_result.status)
        self.assertEqual(tx_index, tx_result.tx_index)
        self.assertIsNone(tx_result.score_address)
        camel_dict = tx_result.to_dict(to_camel_case)
        self.assertNotIn('scoreAddress', camel_dict)
예제 #28
0
    def test_score_tbears_mode(self):
        self.update_governance()

        # 1. deploy
        value1 = 1
        tx1 = self.create_deploy_score_tx("sample_deploy_scores",
                                          "install/sample_score",
                                          self._accounts[0],
                                          ZERO_SCORE_ADDRESS,
                                          deploy_params={'value': hex(value1)},
                                          is_sys=True)

        raise_exception_start_tag("test_score_tbears_mode")
        prev_block, hash_list = self.make_and_req_block([tx1])
        raise_exception_end_tag("test_score_tbears_mode")

        self._write_precommit_state(prev_block)
        tx_results: List['TransactionResult'] = self.get_tx_results(hash_list)
        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PARAMETER)
        self.assertIsInstance(tx_results[0].failure.message, str)
예제 #29
0
    def test_invalid_owner(self):
        self._update_governance()

        # 1. install done
        value1 = 1 * self._icx_factor
        score_addr1, tx_hash1 = self._install_normal_score(value1)

        # 2. deploy update
        value2 = 2 * self._icx_factor
        tx1 = self._make_deploy_tx("test_deploy_scores",
                                   "update/test_score",
                                   self._addr_array[1],
                                   score_addr1,
                                   deploy_params={'value': hex(value2)})

        raise_exception_start_tag("test_invalid_owner1")
        prev_block, tx_results = self._make_and_req_block([tx1])
        raise_exception_end_tag("test_invalid_owner1")
        self._write_precommit_state(prev_block)

        self.assertEqual(tx_results[0].status, int(False))
        self.assertEqual(tx_results[0].failure.code,
                         ExceptionCode.ACCESS_DENIED)
        self.assertEqual(
            tx_results[0].failure.message,
            f'Invalid owner: {str(self._addr_array[0])} != {str(self._addr_array[1])}'
        )

        # 3. assert get value: value1
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value1)

        # 4. set value: value3
        value3 = 3 * self._icx_factor
        self._set_value(self._addr_array[0], score_addr1, "set_value",
                        {"value": hex(value3)})

        # 5. assert get value: value3
        self._assert_get_value(self._addr_array[0], score_addr1, "get_value",
                               value3)
    def test_score_address_already_in_use(self):
        self.update_governance()

        # 1. deploy
        timestamp = 1
        value1 = 1
        tx1: dict = self._create_deploy_score_tx_with_timestamp(
            timestamp=timestamp, value=value1)
        tx2: dict = self._create_deploy_score_tx_with_timestamp(
            timestamp=timestamp, value=value1)

        raise_exception_start_tag("test_score_address_already_in_use")
        prev_block, hash_list = self.make_and_req_block([tx1, tx2])
        raise_exception_end_tag("test_score_address_already_in_use")

        self._write_precommit_state(prev_block)
        tx_results: List['TransactionResult'] = self.get_tx_results(hash_list)
        self.assertEqual(tx_results[0].status, int(True))
        score_addr1: 'Address' = tx_results[0].score_address

        self.assertEqual(tx_results[1].status, int(False))
        self.assertEqual(tx_results[1].failure.code,
                         ExceptionCode.ACCESS_DENIED)
        self.assertEqual(tx_results[1].failure.message,
                         f'SCORE address already in use: {str(score_addr1)}')

        # 2. assert get value: value1
        self._assert_get_value(self._accounts[0], score_addr1, "get_value",
                               value1)

        # 3. set value: value2
        value2 = 2
        self.score_call(from_=self._accounts[0],
                        to_=score_addr1,
                        func_name="set_value",
                        params={"value": hex(value2 * ICX_IN_LOOP)})

        # 4. assert get value: 2 * value2
        self._assert_get_value(self._accounts[0], score_addr1, "get_value",
                               value2)