Skip to content

Commit e29541c

Browse files
committed
feat: finish up indexer
1 parent 3cc38e9 commit e29541c

File tree

4 files changed

+122
-71
lines changed

4 files changed

+122
-71
lines changed

backend/spherre/indexer/service/event_handlers.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
from spherre.indexer.service.types import AccountCreationEvent
1+
from typing import Callable, Dict
2+
3+
from spherre.indexer.service.types import (
4+
AccountCreationEvent,
5+
BaseEventModel,
6+
EventEnum,
7+
)
28

39

410
class EventHandlers:
@@ -9,3 +15,9 @@ def handle_account_creation(cls, data: AccountCreationEvent):
915
@classmethod
1016
def handle_token_transafer(cls):
1117
pass
18+
19+
20+
DATA_HANDLERS: Dict[EventEnum, Callable[[BaseEventModel], None]] = {
21+
EventEnum.ACCOUNT_CREATION: EventHandlers.handle_account_creation,
22+
EventEnum.TOKEN_TRANSFER: EventHandlers.handle_token_transafer,
23+
}

backend/spherre/indexer/service/indexers.py

Lines changed: 44 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
31
from apibara.indexer import IndexerRunner, IndexerRunnerConfiguration, Info
42
from apibara.indexer.indexer import IndexerConfiguration
53
from apibara.protocol.proto.stream_pb2 import Cursor, DataFinality
@@ -10,17 +8,26 @@
108
from pydantic import ValidationError
119

1210
from spherre.indexer.config import NETWORK, SPHERRE_CONTRACT_ADDRESS
13-
from spherre.indexer.service.event_handlers import EventHandlers
11+
from spherre.indexer.service.event_handlers import DATA_HANDLERS
1412
from spherre.indexer.service.types import (
1513
EVENT_SELECTORS,
1614
AccountCreationEvent,
1715
EventEnum,
1816
)
17+
from spherre.indexer.service.utils import DATA_TRANSFORMERS
1918

2019

2120
class SpherreMainIndexer(StarkNetIndexer):
2221
def start_account_indexer(self, address: str):
23-
pass
22+
# create a new filter for the account address
23+
account_address = felt.from_hex(address)
24+
filter = (
25+
EventFilter()
26+
.with_from_address(account_address)
27+
.with_keys([EVENT_SELECTORS.values()])
28+
)
29+
# add the filter to the indexer
30+
self.update_filter(filter)
2431

2532
def indexer_id(self) -> str:
2633
return "spherre"
@@ -43,77 +50,44 @@ async def handle_data(self, info: Info, data: Block):
4350
for event_with_tx in data.events:
4451
tx_hash = felt.to_hex(event_with_tx.transaction.meta.hash)
4552
event = event_with_tx.event
46-
47-
account_address = felt.to_hex(event.data[0])
48-
owner = felt.to_hex(event.data[1])
49-
name = felt.to_hex(event.data[2])
50-
description = felt.to_hex(event.data[3])
51-
members_array_length = felt.to_int(event.data[4])
52-
members = []
53-
for i in range(5, members_array_length + 1 + 4):
54-
members.append(felt.to_hex(event.data[i]))
55-
threshold = felt.to_int(event.data[i + 1])
56-
deployer = felt.to_hex(event.data[i + 2])
57-
date_deployed = felt.to_int(event.data[i + 3])
58-
59-
print("Account Deployed")
60-
print("Transaction Hash:", tx_hash)
61-
print("Account Address:", account_address)
62-
print("Owner:", owner)
63-
print("Name:", name)
64-
print("Description:", description)
65-
print("Members:", members)
66-
print("Threshold:", threshold)
67-
print("Deployer:", deployer)
68-
print("Date Deployed:", date_deployed)
69-
70-
try:
71-
account_data = AccountCreationEvent(
72-
account_address=account_address,
73-
owner=owner,
74-
name=name,
75-
description=description,
76-
members=members,
77-
threshold=threshold,
78-
deployer=deployer,
79-
date_deployed=date_deployed,
80-
)
81-
# handle the account creation event
82-
EventHandlers.handle_account_creation(account_data)
83-
# start a new account indexer in another thread
84-
except ValidationError as err:
85-
logger.error("Error parsing account creation event data")
86-
logger.error(err)
53+
event_address = felt.to_hex(event.from_address)
54+
logger.info("Transaction Hash:", tx_hash)
55+
56+
if event_address != SPHERRE_CONTRACT_ADDRESS:
57+
event_type = event.keys
58+
event_enum = EVENT_SELECTORS.inverse[event_type]
59+
transformed_data = DATA_TRANSFORMERS[event_enum](event)
60+
if transformed_data:
61+
DATA_HANDLERS[event_enum](transformed_data)
62+
logger.info(
63+
f"Event with type '{event_type}' from address '{event_address}' handled"
64+
)
65+
else:
66+
logger.error(
67+
f"Failed to handle event of type '{event_type}' from address '{event_address}'"
68+
)
69+
else:
70+
event_type = event.keys
71+
if event_type == EVENT_SELECTORS[EventEnum.ACCOUNT_CREATION]:
72+
transformed_data = DATA_TRANSFORMERS[EventEnum.ACCOUNT_CREATION](
73+
event
74+
)
75+
if transformed_data:
76+
DATA_HANDLERS[EventEnum.ACCOUNT_CREATION](transformed_data)
77+
self.start_account_indexer(transformed_data.account_address)
78+
logger.info(
79+
f"Account created for address '{transformed_data.account_address}'"
80+
)
81+
else:
82+
account_address = felt.to_hex(event.data[0])
83+
logger.error(
84+
f"Failed to handle account creation event of address '{account_address}'"
85+
)
8786

8887
async def handle_invalidate(self, _info: Info, _cursor: Cursor):
8988
raise ValueError("data must be finalized")
9089

9190

92-
class AccountIndexer(StarkNetIndexer):
93-
def __init__(self, account_address: str):
94-
self.account_address = account_address
95-
super().__init__()
96-
97-
def indexer_id(self) -> str:
98-
return self.account_address
99-
100-
def initial_configuration(self) -> Filter:
101-
# Return initial configuration of the indexer.
102-
address = felt.from_hex(self.account_address)
103-
return IndexerConfiguration(
104-
filter=Filter().add_event(
105-
EventFilter()
106-
.with_from_address(address)
107-
.with_keys(list(EVENT_SELECTORS.values()))
108-
),
109-
starting_cursor=starknet_cursor(10_000),
110-
finality=DataFinality.DATA_STATUS_ACCEPTED,
111-
)
112-
113-
def handle_data(self, info, data):
114-
pass
115-
116-
11791
def run_in_thread(self):
11892
pass
11993

backend/spherre/indexer/service/types.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,10 @@ class AccountCreationEvent(BaseEventModel):
7676
threshold: int
7777
deployer: int
7878
date_deployed: int
79+
80+
81+
class TokenTransferEvent(BaseEventModel):
82+
account_address: str
83+
from_address: str
84+
to_address: str
85+
amount: int
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from typing import Callable, Dict
2+
3+
from apibara.starknet import felt
4+
from apibara.starknet.proto.starknet_pb2 import Event
5+
from loguru import logger
6+
from pydantic import ValidationError
7+
8+
from spherre.indexer.service.types import (
9+
AccountCreationEvent,
10+
BaseEventModel,
11+
EventEnum,
12+
)
13+
14+
15+
class DataTransformer:
16+
@classmethod
17+
def transform_account_creation_event(cls, event: Event) -> AccountCreationEvent:
18+
account_address = felt.to_hex(event.data[0])
19+
owner = felt.to_hex(event.data[1])
20+
name = felt.to_hex(event.data[2])
21+
description = felt.to_hex(event.data[3])
22+
members_array_length = felt.to_int(event.data[4])
23+
members = []
24+
for i in range(5, members_array_length + 1 + 4):
25+
members.append(felt.to_hex(event.data[i]))
26+
threshold = felt.to_int(event.data[i + 1])
27+
deployer = felt.to_int(event.data[i + 2])
28+
date_deployed = felt.to_int(event.data[i + 3])
29+
print("Account Deployed")
30+
print("Account Address:", account_address)
31+
print("Owner:", owner)
32+
print("Name:", name)
33+
print("Description:", description)
34+
print("Members:", members)
35+
print("Threshold:", threshold)
36+
print("Deployer:", deployer)
37+
print("Date Deployed:", date_deployed)
38+
try:
39+
account_data = AccountCreationEvent(
40+
account_address=account_address,
41+
owner=owner,
42+
name=name,
43+
description=description,
44+
members=members,
45+
threshold=threshold,
46+
deployer=deployer,
47+
date_deployed=date_deployed,
48+
)
49+
except ValidationError as err:
50+
logger.error("Error parsing account creation event data")
51+
logger.error(err)
52+
return None
53+
return account_data
54+
55+
56+
DATA_TRANSFORMERS: Dict[EventEnum, Callable[[Event], BaseEventModel]] = {
57+
EventEnum.ACCOUNT_CREATION: DataTransformer.transform_account_creation_event,
58+
}

0 commit comments

Comments
 (0)