Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add argument filter to batch #482

Merged
merged 1 commit into from
Feb 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions batch/indexer_token_holders.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]:
Expand Down
5 changes: 4 additions & 1 deletion batch/processor_create_utxo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
48 changes: 48 additions & 0 deletions tests/test_batch_indexer_token_holders.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
124 changes: 119 additions & 5 deletions tests/test_batch_processor_create_utxo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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",
Expand All @@ -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
)
Expand Down Expand Up @@ -504,9 +513,114 @@ def test_normal_4(self, mock_func, processor, db):
mock_func.assert_not_called()

# <Normal_5>
# 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)
])

# <Normal_6>
# 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(
Expand Down Expand Up @@ -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

# <Normal_6>
# <Normal_7>
# 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(
Expand Down