Add a unicity constraint on Accounts by address and blockchain
It is currently possible to have an Account
with the same address and blockchain pair. This can break the indexer:
2022-08-04 03:21:46,583 INFO Syncing transaction opRokd5B7u23F3yrncKNXPPXyFsM4bnaaVxrKKFautBxWgCYPrn
2022-08-04 03:21:47,037 ERROR Mainnet.provider.index() failure!
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/djwebdapp/management/commands/index.py", line 13, in handle
blockchain.provider.index()
File "/usr/lib/python3.10/site-packages/djwebdapp/provider.py", line 151, in index
self.index_level(current_level)
File "/usr/lib/python3.10/site-packages/djwebdapp_tezos/provider.py", line 69, in index_level
self.index_call(level, op, content, txgroup)
File "/usr/lib/python3.10/site-packages/djwebdapp_tezos/provider.py", line 110, in index_call
call.sender, _ = Account.objects.get_or_create(
File "/usr/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib/python3.10/site-packages/django/db/models/query.py", line 588, in get_or_create
return self.get(**kwargs), False
File "/usr/lib/python3.10/site-packages/django/db/models/query.py", line 443, in get
raise self.model.MultipleObjectsReturned(
djwebdapp.models.Account.MultipleObjectsReturned: get() returned more than one Account -- it returned 2!
Found 0 blockchain to index! check is_active
The code throws in djwebdapp_tezos.provider.index_call
:
call.sender, _ = Account.objects.get_or_create(
address=content['source'],
blockchain=self.blockchain,
)
It would nonetheless be interesting to figure out how two instances of this address were created.
Edited by Thomas Binétruy-Pic