Skip to content

Commit 708c486

Browse files
add watching of entity deletion events
1 parent e6c6cab commit 708c486

File tree

5 files changed

+519
-28
lines changed

5 files changed

+519
-28
lines changed

src/arkiv/contract.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,44 +17,52 @@
1717

1818
CREATED_EVENT: Final[str] = "GolemBaseStorageEntityCreated"
1919
UPDATED_EVENT: Final[str] = "GolemBaseStorageEntityUpdated"
20-
DELETED_EVENT: Final[str] = "GolemBaseStorageEntityDeleted"
2120
EXTENDED_EVENT: Final[str] = "GolemBaseStorageEntityBTLExtended"
21+
DELETED_EVENT: Final[str] = "GolemBaseStorageEntityDeleted"
2222

23+
EVENTS: dict[str, str] = {
24+
"created": CREATED_EVENT,
25+
"updated": UPDATED_EVENT,
26+
"extended": EXTENDED_EVENT,
27+
"deleted": DELETED_EVENT,
28+
}
2329

30+
TYPE_EVENT = "event"
31+
TYPE_UINT = "uint256"
2432
EVENTS_ABI: Final[Sequence[dict[str, Any]]] = [
2533
{
2634
"anonymous": False,
2735
"inputs": [
28-
{"indexed": True, "name": "entityKey", "type": "uint256"},
29-
{"indexed": False, "name": "expirationBlock", "type": "uint256"},
36+
{"indexed": True, "name": "entityKey", "type": TYPE_UINT},
37+
{"indexed": False, "name": "expirationBlock", "type": TYPE_UINT},
3038
],
3139
"name": CREATED_EVENT,
32-
"type": "event",
40+
"type": TYPE_EVENT,
3341
},
3442
{
3543
"anonymous": False,
3644
"inputs": [
37-
{"indexed": True, "name": "entityKey", "type": "uint256"},
38-
{"indexed": False, "name": "expirationBlock", "type": "uint256"},
45+
{"indexed": True, "name": "entityKey", "type": TYPE_UINT},
46+
{"indexed": False, "name": "expirationBlock", "type": TYPE_UINT},
3947
],
4048
"name": UPDATED_EVENT,
41-
"type": "event",
49+
"type": TYPE_EVENT,
4250
},
4351
{
4452
"anonymous": False,
45-
"inputs": [{"indexed": True, "name": "entityKey", "type": "uint256"}],
53+
"inputs": [{"indexed": True, "name": "entityKey", "type": TYPE_UINT}],
4654
"name": DELETED_EVENT,
47-
"type": "event",
55+
"type": TYPE_EVENT,
4856
},
4957
{
5058
"anonymous": False,
5159
"inputs": [
52-
{"indexed": True, "name": "entityKey", "type": "uint256"},
53-
{"indexed": False, "name": "oldExpirationBlock", "type": "uint256"},
54-
{"indexed": False, "name": "newExpirationBlock", "type": "uint256"},
60+
{"indexed": True, "name": "entityKey", "type": TYPE_UINT},
61+
{"indexed": False, "name": "oldExpirationBlock", "type": TYPE_UINT},
62+
{"indexed": False, "name": "newExpirationBlock", "type": TYPE_UINT},
5563
],
5664
"name": EXTENDED_EVENT,
57-
"type": "event",
65+
"type": TYPE_EVENT,
5866
},
5967
]
6068

src/arkiv/events.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
from web3.contract.contract import ContractEvent
1212
from web3.types import EventData, LogReceipt
1313

14-
from .contract import CREATED_EVENT, EXTENDED_EVENT, UPDATED_EVENT
14+
from .contract import EVENTS
1515
from .types import (
1616
CreateCallback,
1717
CreateEvent,
18+
DeleteCallback,
19+
DeleteEvent,
1820
EventType,
1921
ExtendCallback,
2022
ExtendEvent,
@@ -34,7 +36,7 @@ def __init__(
3436
self,
3537
contract: Contract,
3638
event_type: EventType,
37-
callback: CreateCallback | UpdateCallback | ExtendCallback,
39+
callback: CreateCallback | UpdateCallback | ExtendCallback | DeleteCallback,
3840
from_block: str | int = "latest",
3941
auto_start: bool = True,
4042
) -> None:
@@ -50,7 +52,9 @@ def __init__(
5052
"""
5153
self.contract: Contract = contract
5254
self.event_type: EventType = event_type
53-
self.callback: CreateCallback | UpdateCallback | ExtendCallback = callback
55+
self.callback: (
56+
CreateCallback | UpdateCallback | ExtendCallback | DeleteCallback
57+
) = callback
5458
self.from_block: str | int = from_block
5559

5660
# Internal state
@@ -74,14 +78,9 @@ def start(self) -> None:
7478

7579
# Create the Web3 filter
7680
contract_event: ContractEvent
77-
if self.event_type == "created":
78-
contract_event = self.contract.events[CREATED_EVENT]
79-
self._filter = contract_event.create_filter(from_block=self.from_block)
80-
elif self.event_type == "updated":
81-
contract_event = self.contract.events[UPDATED_EVENT]
82-
self._filter = contract_event.create_filter(from_block=self.from_block)
83-
elif self.event_type == "extended":
84-
contract_event = self.contract.events[EXTENDED_EVENT]
81+
if self.event_type in EVENTS.keys():
82+
event_name = EVENTS[self.event_type]
83+
contract_event = self.contract.events[event_name]
8584
self._filter = contract_event.create_filter(from_block=self.from_block)
8685
else:
8786
raise NotImplementedError(
@@ -204,6 +203,12 @@ def _process_event(self, event_data: EventData) -> None:
204203
cast(ExtendCallback, self.callback), extend_event, tx_hash
205204
)
206205

206+
elif self.event_type == "deleted":
207+
delete_event = DeleteEvent(entity_key=entity_key)
208+
self._trigger_callback(
209+
cast(DeleteCallback, self.callback), delete_event, tx_hash
210+
)
211+
207212
else:
208213
logger.warning(f"Unknown event type: {self.event_type}")
209214

@@ -224,8 +229,8 @@ def _extract_tx_hash(self, event_data: EventData) -> TxHash:
224229

225230
def _trigger_callback(
226231
self,
227-
callback: CreateCallback | UpdateCallback | ExtendCallback,
228-
event: CreateEvent | UpdateEvent | ExtendEvent,
232+
callback: CreateCallback | UpdateCallback | ExtendCallback | DeleteCallback,
233+
event: CreateEvent | UpdateEvent | ExtendEvent | DeleteEvent,
229234
tx_hash: TxHash,
230235
) -> None:
231236
"""

src/arkiv/module.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,26 @@ def watch_entity_extended(
449449
"extended", callback, from_block=from_block, auto_start=auto_start
450450
)
451451

452+
def watch_entity_deleted(
453+
self,
454+
callback: ExtendCallback,
455+
*,
456+
from_block: str | int = "latest",
457+
auto_start: bool = True,
458+
) -> EventFilter:
459+
"""
460+
Watch for entity deletion events.
461+
462+
Creates an event filter that monitors entity deletion events. The
463+
callback receives (DeleteEvent, TxHash) for each deleted entity.
464+
465+
See `_watch_entity_event` for detailed documentation on parameters, return
466+
value, error handling, and usage examples.
467+
"""
468+
return self._watch_entity_event(
469+
"deleted", callback, from_block=from_block, auto_start=auto_start
470+
)
471+
452472
def cleanup_filters(self) -> None:
453473
"""
454474
Stop and uninstall all active event filters.
@@ -494,10 +514,10 @@ def _watch_entity_event(
494514
occurs, receiving details about the event and the transaction hash.
495515
496516
Args:
497-
event_type: Type of event to watch for ("created", "updated", "extended")
517+
event_type: Type of event to watch for ("created", "updated", "extended", "deleted")
498518
callback: Function to call when an event is detected.
499519
Receives (Event, TxHash) as arguments where Event is one of:
500-
CreateEvent, UpdateEvent, or ExtendEvent depending on event_type.
520+
CreateEvent, UpdateEvent, ExtendEvent, or DeleteEvent depending on event_type.
501521
from_block: Starting block for the filter. Can be:
502522
- "latest": Only watch for new events (default)
503523
- Block number (int): Watch from a specific historical block

0 commit comments

Comments
 (0)