1-
2-
31from apibara .indexer import IndexerRunner , IndexerRunnerConfiguration , Info
42from apibara .indexer .indexer import IndexerConfiguration
53from apibara .protocol .proto .stream_pb2 import Cursor , DataFinality
108from pydantic import ValidationError
119
1210from 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
1412from spherre .indexer .service .types import (
1513 EVENT_SELECTORS ,
1614 AccountCreationEvent ,
1715 EventEnum ,
1816)
17+ from spherre .indexer .service .utils import DATA_TRANSFORMERS
1918
2019
2120class 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-
11791def run_in_thread (self ):
11892 pass
11993
0 commit comments