From e5dd0f3c51e17f2bedd4f6aed8bd1d205304edcb Mon Sep 17 00:00:00 2001 From: Yosuke Otosu Date: Fri, 24 Feb 2023 14:19:00 +0900 Subject: [PATCH] feat: add argument filter --- batch/indexer_token_holders.py | 3 + batch/processor_create_utxo.py | 5 +- tests/test_batch_indexer_token_holders.py | 48 +++++++++ tests/test_batch_processor_create_utxo.py | 124 +++++++++++++++++++++- 4 files changed, 174 insertions(+), 6 deletions(-) diff --git a/batch/indexer_token_holders.py b/batch/indexer_token_holders.py index 4256a5c9..0232332f 100644 --- a/batch/indexer_token_holders.py +++ b/batch/indexer_token_holders.py @@ -242,6 +242,9 @@ def __process_transfer(self, block_from: int, block_to: int): event="HolderChanged", block_from=block_from, block_to=block_to, + argument_filters={ + "token": self.token_contract.address + } ) for _event in holder_changed_events: if self.token_contract.address == _event["args"]["token"]: diff --git a/batch/processor_create_utxo.py b/batch/processor_create_utxo.py index 58110923..4f5669c8 100644 --- a/batch/processor_create_utxo.py +++ b/batch/processor_create_utxo.py @@ -177,7 +177,10 @@ def __process_transfer(self, db_session: Session, token_contract: Contract, bloc contract=exchange_contract, event="HolderChanged", block_from=block_from, - block_to=block_to + block_to=block_to, + argument_filters={ + "token": token_contract.address + } ) tmp_events = [] for _event in exchange_contract_events: diff --git a/tests/test_batch_indexer_token_holders.py b/tests/test_batch_indexer_token_holders.py index fef39c0c..98d271ba 100644 --- a/tests/test_batch_indexer_token_holders.py +++ b/tests/test_batch_indexer_token_holders.py @@ -297,6 +297,28 @@ def test_normal_1( STContractUtils.lock(token_contract.address, user_address_1, user_pk_1, [issuer_address, 3000, ""]) # user1: (hold: 13000, locked: 3000) user2: 44000 + # Issuer issues other token to create exchange event + other_token_contract = deploy_bond_token_contract( + issuer_address, + issuer_private_key, + personal_info_contract.address, + tradable_exchange_contract_address=exchange_contract.address, + transfer_approval_required=False, + ) + STContractUtils.transfer(other_token_contract.address, issuer_address, issuer_private_key, [user_address_1, 10000]) + STContractUtils.transfer(other_token_contract.address, user_address_1, user_pk_1, [exchange_contract.address, 10000]) + STContractUtils.transfer(other_token_contract.address, issuer_address, issuer_private_key, [exchange_contract.address, 10000]) + + IbetExchangeContractTestUtils.create_order( + exchange_contract.address, user_address_1, user_pk_1, [other_token_contract.address, 10000, 100, False, issuer_address] + ) + latest_order_id = IbetExchangeContractTestUtils.get_latest_order_id(exchange_contract.address) + IbetExchangeContractTestUtils.execute_order(exchange_contract.address, user_address_2, user_pk_2, [latest_order_id, 10000, True]) + latest_agreement_id = IbetExchangeContractTestUtils.get_latest_agreementid(exchange_contract.address, latest_order_id) + IbetExchangeContractTestUtils.confirm_agreement( + exchange_contract.address, issuer_address, issuer_private_key, [latest_order_id, latest_agreement_id] + ) + # Insert collection record with above token and current block number list_id = str(uuid.uuid4()) block_number = web3.eth.block_number @@ -680,6 +702,32 @@ def test_normal_4( STContractUtils.lock(token_contract.address, user_address_1, user_pk_1, [issuer_address, 3000, ""]) # user1: (hold: 3000, locked: 3000) user2: 44000 + # Issuer issues other token to create exchange event + other_token_contract = deploy_bond_token_contract( + issuer_address, + issuer_private_key, + personal_info_contract.address, + tradable_exchange_contract_address=exchange_contract.address, + transfer_approval_required=False, + ) + + PersonalInfoContractTestUtils.register(personal_info_contract.address, user_address_1, user_pk_1, [issuer_address, ""]) + PersonalInfoContractTestUtils.register(personal_info_contract.address, issuer_address, issuer_private_key, [issuer_address, ""]) + + STContractUtils.transfer(other_token_contract.address, issuer_address, issuer_private_key, [user_address_1, 10000]) + STContractUtils.transfer(other_token_contract.address, user_address_1, user_pk_1, [exchange_contract.address, 10000]) + STContractUtils.transfer(other_token_contract.address, issuer_address, issuer_private_key, [exchange_contract.address, 10000]) + + IbetExchangeContractTestUtils.create_order( + exchange_contract.address, user_address_1, user_pk_1, [other_token_contract.address, 10000, 100, False, issuer_address] + ) + latest_order_id = IbetExchangeContractTestUtils.get_latest_order_id(exchange_contract.address) + IbetExchangeContractTestUtils.execute_order(exchange_contract.address, user_address_2, user_pk_2, [latest_order_id, 10000, True]) + latest_agreement_id = IbetExchangeContractTestUtils.get_latest_agreementid(exchange_contract.address, latest_order_id) + IbetExchangeContractTestUtils.confirm_agreement( + exchange_contract.address, issuer_address, issuer_private_key, [latest_order_id, latest_agreement_id] + ) + # Insert collection record with above token and current block number list_id = str(uuid.uuid4()) block_number = web3.eth.block_number diff --git a/tests/test_batch_processor_create_utxo.py b/tests/test_batch_processor_create_utxo.py index f5bc8438..fc251b4a 100644 --- a/tests/test_batch_processor_create_utxo.py +++ b/tests/test_batch_processor_create_utxo.py @@ -59,6 +59,11 @@ from app.utils.contract_utils import ContractUtils from batch.processor_create_utxo import Processor from tests.account_config import config_eth_account +from tests.utils.contract_utils import ( + IbetSecurityTokenContractTestUtils as STContractUtils, + PersonalInfoContractTestUtils, + IbetExchangeContractTestUtils +) web3 = Web3(Web3.HTTPProvider(WEB3_HTTP_PROVIDER)) web3.middleware_onion.inject(geth_poa_middleware, layer=0) @@ -69,7 +74,7 @@ def processor(db): return Processor() -def deploy_bond_token_contract(address, private_key): +def deploy_bond_token_contract(address, private_key, personal_info_contract_address=None, tradable_exchange_contract_address=None): arguments = [ "token.name", "token.symbol", @@ -84,7 +89,11 @@ def deploy_bond_token_contract(address, private_key): bond_contrat = IbetStraightBondContract() contract_address, _, _ = bond_contrat.create(arguments, address, private_key) bond_contrat.update( - IbetStraightBondUpdateParams(transferable=True), + IbetStraightBondUpdateParams( + transferable=True, + personal_info_contract_address=personal_info_contract_address, + tradable_exchange_contract_address=tradable_exchange_contract_address, + ), address, private_key ) @@ -504,9 +513,114 @@ def test_normal_4(self, mock_func, processor, db): mock_func.assert_not_called() # + # Holder Changed + @mock.patch("batch.processor_create_utxo.create_ledger") + def test_normal_5(self, mock_func, processor, db, personal_info_contract, ibet_exchange_contract): + user_1 = config_eth_account("user1") + issuer_address = user_1["address"] + issuer_private_key = decode_keyfile_json(raw_keyfile_json=user_1["keyfile_json"], password="password".encode("utf-8")) + user_2 = config_eth_account("user2") + user_address_1 = user_2["address"] + user_pk_1 = decode_keyfile_json(raw_keyfile_json=user_2["keyfile_json"], password="password".encode("utf-8")) + user_3 = config_eth_account("user3") + user_address_2 = user_3["address"] + user_pk_2 = decode_keyfile_json(raw_keyfile_json=user_3["keyfile_json"], password="password".encode("utf-8")) + + # prepare data + token_address_1 = deploy_bond_token_contract( + issuer_address, issuer_private_key, + personal_info_contract_address=personal_info_contract.address, + tradable_exchange_contract_address=ibet_exchange_contract.address + ) + _token_1 = Token() + _token_1.type = TokenType.IBET_STRAIGHT_BOND.value + _token_1.tx_hash = "" + _token_1.issuer_address = issuer_address + _token_1.token_address = token_address_1 + _token_1.abi = {} + db.add(_token_1) + + PersonalInfoContractTestUtils.register(personal_info_contract.address, user_address_1, user_pk_1, [issuer_address, ""]) + PersonalInfoContractTestUtils.register(personal_info_contract.address, user_address_2, user_pk_2, [issuer_address, ""]) + PersonalInfoContractTestUtils.register(personal_info_contract.address, issuer_address, issuer_private_key, [issuer_address, ""]) + + STContractUtils.transfer(token_address_1, issuer_address, issuer_private_key, [user_address_1, 10]) + STContractUtils.transfer(token_address_1, issuer_address, issuer_private_key, [user_address_2, 10]) + STContractUtils.transfer(token_address_1, user_address_1, user_pk_1, [ibet_exchange_contract.address, 10]) + STContractUtils.transfer(token_address_1, issuer_address, issuer_private_key, [ibet_exchange_contract.address, 10]) + + IbetExchangeContractTestUtils.create_order( + ibet_exchange_contract.address, user_address_1, user_pk_1, [token_address_1, 10, 100, False, issuer_address] + ) + latest_order_id = IbetExchangeContractTestUtils.get_latest_order_id(ibet_exchange_contract.address) + IbetExchangeContractTestUtils.execute_order(ibet_exchange_contract.address, user_address_2, user_pk_2, [latest_order_id, 10, True]) + latest_agreement_id = IbetExchangeContractTestUtils.get_latest_agreementid(ibet_exchange_contract.address, latest_order_id) + IbetExchangeContractTestUtils.confirm_agreement( + ibet_exchange_contract.address, issuer_address, issuer_private_key, [latest_order_id, latest_agreement_id] + ) + + # prepare other data + other_token_address = deploy_bond_token_contract( + issuer_address, issuer_private_key, + personal_info_contract_address=personal_info_contract.address, + tradable_exchange_contract_address=ibet_exchange_contract.address + ) + STContractUtils.transfer(other_token_address, issuer_address, issuer_private_key, [user_address_1, 10]) + STContractUtils.transfer(other_token_address, user_address_1, user_pk_1, [ibet_exchange_contract.address, 10]) + STContractUtils.transfer(other_token_address, issuer_address, issuer_private_key, [ibet_exchange_contract.address, 10]) + + IbetExchangeContractTestUtils.create_order( + ibet_exchange_contract.address, user_address_1, user_pk_1, [other_token_address, 10, 100, False, issuer_address] + ) + latest_order_id = IbetExchangeContractTestUtils.get_latest_order_id(ibet_exchange_contract.address) + IbetExchangeContractTestUtils.execute_order(ibet_exchange_contract.address, user_address_2, user_pk_2, [latest_order_id, 10, True]) + latest_agreement_id = IbetExchangeContractTestUtils.get_latest_agreementid(ibet_exchange_contract.address, latest_order_id) + IbetExchangeContractTestUtils.confirm_agreement( + ibet_exchange_contract.address, issuer_address, issuer_private_key, [latest_order_id, latest_agreement_id] + ) + + db.commit() + + # Execute batch + # Assume: Not Create UTXO and Ledger + processor.process() + + # assertion + db.rollback() + _utox_list = db.query(UTXO).order_by(UTXO.created).all() + + assert len(_utox_list) == 3 + _utox = _utox_list[0] + assert _utox.transaction_hash is not None + assert _utox.account_address == user_address_1 + assert _utox.token_address == token_address_1 + assert _utox.amount == 0 + assert _utox.block_number < _utox_list[1].block_number + assert _utox.block_timestamp <= _utox_list[1].block_timestamp + _utox = _utox_list[1] + assert _utox.transaction_hash is not None + assert _utox.account_address == user_address_2 + assert _utox.token_address == token_address_1 + assert _utox.amount == 10 + assert _utox.block_number < _utox_list[2].block_number + assert _utox.block_timestamp <= _utox_list[2].block_timestamp + _utox = _utox_list[2] + assert _utox.transaction_hash is not None + assert _utox.account_address == user_address_2 + assert _utox.token_address == token_address_1 + assert _utox.amount == 10 + + _utox_block_number = db.query(UTXOBlockNumber).first() + assert _utox_block_number.latest_block_number >= _utox_list[1].block_number + + mock_func.assert_has_calls([ + call(token_address=token_address_1, db=ANY) + ]) + + # # Additional Issue @mock.patch("batch.processor_create_utxo.create_ledger") - def test_normal_5(self, mock_func, processor, db): + def test_normal_6(self, mock_func, processor, db): user_1 = config_eth_account("user1") issuer_address = user_1["address"] issuer_private_key = decode_keyfile_json( @@ -577,10 +691,10 @@ def test_normal_5(self, mock_func, processor, db): _utox_block_number = db.query(UTXOBlockNumber).first() assert _utox_block_number.latest_block_number == latest_block - # + # # Redeem @mock.patch("batch.processor_create_utxo.create_ledger") - def test_normal_6(self, mock_func, processor, db): + def test_normal_7(self, mock_func, processor, db): user_1 = config_eth_account("user1") issuer_address = user_1["address"] issuer_private_key = decode_keyfile_json(