diff --git a/safe_locking_service/locking_events/indexers/safe_locking_events_indexer.py b/safe_locking_service/locking_events/indexers/safe_locking_events_indexer.py index 5580a63..b76b593 100644 --- a/safe_locking_service/locking_events/indexers/safe_locking_events_indexer.py +++ b/safe_locking_service/locking_events/indexers/safe_locking_events_indexer.py @@ -49,17 +49,26 @@ def process_decoded_events(self, decoded_events: List[EventData]): ethereum_tx, created = EthereumTx().create_from_decoded_event( event, block_timestamp ) + lock_event_instances = [] + unlock_event_instances = [] + withdrawn_event_instances = [] if event["event"] in "Locked": - LockEvent().create_from_decoded_event( - event, ethereum_tx, block_timestamp + lock_event_instances.append( + LockEvent.create_instance_from_decoded_event( + event, ethereum_tx, block_timestamp + ) ) elif event["event"] in "Unlocked": - UnlockEvent().create_from_decoded_event( - event, ethereum_tx, block_timestamp + unlock_event_instances.append( + UnlockEvent.create_instance_from_decoded_event( + event, ethereum_tx, block_timestamp + ) ) elif event["event"] in "Withdrawn": - WithdrawnEvent().create_from_decoded_event( - event, ethereum_tx, block_timestamp + withdrawn_event_instances.append( + WithdrawnEvent.create_instance_from_decoded_event( + event, ethereum_tx, block_timestamp + ) ) else: logger.ERROR( @@ -67,3 +76,10 @@ def process_decoded_events(self, decoded_events: List[EventData]): self.__class__.__name__, event["event"], ) + LockEvent.objects.bulk_create(lock_event_instances, ignore_conflicts=True) + UnlockEvent.objects.bulk_create( + unlock_event_instances, ignore_conflicts=True + ) + WithdrawnEvent.objects.bulk_create( + withdrawn_event_instances, ignore_conflicts=True + ) diff --git a/safe_locking_service/locking_events/migrations/0001_initial.py b/safe_locking_service/locking_events/migrations/0001_initial.py index 2f783ff..bdd1d48 100644 --- a/safe_locking_service/locking_events/migrations/0001_initial.py +++ b/safe_locking_service/locking_events/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.10 on 2024-02-27 17:41 +# Generated by Django 4.2.10 on 2024-03-01 10:06 import django.db.models.deletion from django.db import migrations, models @@ -27,7 +27,20 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( - name="UnlockEvent", + name="StatusEventsIndexer", + fields=[ + ( + "contract", + gnosis.eth.django.models.EthereumAddressV2Field( + primary_key=True, serialize=False, unique=True + ), + ), + ("deployed_block", models.PositiveIntegerField()), + ("last_indexed_block", models.PositiveIntegerField()), + ], + ), + migrations.CreateModel( + name="WithdrawnEvent", fields=[ ("id", models.AutoField(primary_key=True, serialize=False)), ("timestamp", models.DateTimeField()), @@ -45,13 +58,14 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( - name="WithdrawnEvent", + name="UnlockEvent", fields=[ ("id", models.AutoField(primary_key=True, serialize=False)), ("timestamp", models.DateTimeField()), ("log_index", models.PositiveIntegerField()), ("holder", gnosis.eth.django.models.EthereumAddressV2Field()), ("amount", gnosis.eth.django.models.Uint96Field()), + ("unlock_index", models.PositiveIntegerField()), ( "ethereum_tx", models.ForeignKey( @@ -59,13 +73,6 @@ class Migration(migrations.Migration): to="locking_events.ethereumtx", ), ), - ( - "unlock_index", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="locking_events.unlockevent", - ), - ), ], ), migrations.CreateModel( diff --git a/safe_locking_service/locking_events/migrations/0002_statuseventsindexer.py b/safe_locking_service/locking_events/migrations/0002_statuseventsindexer.py deleted file mode 100644 index 666f649..0000000 --- a/safe_locking_service/locking_events/migrations/0002_statuseventsindexer.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.2.10 on 2024-02-29 16:39 - -from django.db import migrations, models - -import gnosis.eth.django.models - - -class Migration(migrations.Migration): - dependencies = [ - ("locking_events", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="StatusEventsIndexer", - fields=[ - ( - "contract", - gnosis.eth.django.models.EthereumAddressV2Field( - primary_key=True, serialize=False - ), - ), - ("deployed_block", models.PositiveIntegerField()), - ("last_indexed_block", models.PositiveIntegerField()), - ], - ), - ] diff --git a/safe_locking_service/locking_events/models.py b/safe_locking_service/locking_events/models.py index a6e6c3b..56e3f44 100644 --- a/safe_locking_service/locking_events/models.py +++ b/safe_locking_service/locking_events/models.py @@ -58,10 +58,11 @@ class LockEvent(CommonEvent): def __str__(self): return "LockEvent: " + super().__str__() - def create_from_decoded_event( - self, decoded_event: EventData, ethereum_tx, block_timestamp + @classmethod + def create_instance_from_decoded_event( + cls, decoded_event: EventData, ethereum_tx, block_timestamp ): - return LockEvent.objects.create( + return cls( timestamp=block_timestamp, ethereum_tx=ethereum_tx, log_index=decoded_event["logIndex"], @@ -87,10 +88,11 @@ class Meta: def __str__(self): return "UnlockEvent: " + super().__str__() - def create_from_decoded_event( - self, decoded_event: EventData, ethereum_tx, block_timestamp + @classmethod + def create_instance_from_decoded_event( + cls, decoded_event: EventData, ethereum_tx, block_timestamp ): - return UnlockEvent.objects.create( + return cls( timestamp=block_timestamp, ethereum_tx=ethereum_tx, log_index=decoded_event["logIndex"], @@ -105,7 +107,7 @@ class WithdrawnEvent(CommonEvent): Model to store event Withdrawn(address indexed holder, uint32 indexed index, uint96 amount) """ - unlock_index = models.ForeignKey(UnlockEvent, on_delete=models.CASCADE) + unlock_index = models.PositiveIntegerField() class Meta: constraints = [ @@ -117,19 +119,17 @@ class Meta: def __str__(self): return "WithdrawnEvent: " + super().__str__() - def create_from_decoded_event( - self, decoded_event: EventData, ethereum_tx, block_timestamp + @classmethod + def create_instance_from_decoded_event( + cls, decoded_event: EventData, ethereum_tx, block_timestamp ): - return WithdrawnEvent.objects.create( + return cls( timestamp=block_timestamp, ethereum_tx=ethereum_tx, log_index=decoded_event["logIndex"], holder=decoded_event["args"]["holder"], amount=decoded_event["args"]["amount"], - unlock_index=UnlockEvent.objects.get( - holder=decoded_event["args"]["holder"], - unlock_index=decoded_event["args"]["index"], - ), + unlock_index=decoded_event["args"]["index"], )