@@ -7,12 +7,12 @@ use graph::{
7
7
semver,
8
8
} ;
9
9
use sha3:: { Digest , Keccak256 } ;
10
- use starknet_ff:: FieldElement ;
11
10
use std:: { collections:: HashSet , sync:: Arc } ;
12
11
13
12
use crate :: {
14
13
chain:: Chain ,
15
14
codec,
15
+ felt:: Felt ,
16
16
trigger:: { StarknetEventTrigger , StarknetTrigger } ,
17
17
} ;
18
18
@@ -49,8 +49,8 @@ pub struct UnresolvedDataSource {
49
49
pub struct Source {
50
50
pub start_block : BlockNumber ,
51
51
pub end_block : Option < BlockNumber > ,
52
- #[ serde( default , deserialize_with = "deserialize_address" ) ]
53
- pub address : Option < FieldElement > ,
52
+ #[ serde( default ) ]
53
+ pub address : Option < Felt > ,
54
54
}
55
55
56
56
#[ derive( Deserialize ) ]
@@ -71,7 +71,7 @@ pub struct MappingBlockHandler {
71
71
#[ derive( Clone , PartialEq , Eq , Deserialize ) ]
72
72
pub struct MappingEventHandler {
73
73
pub handler : String ,
74
- pub event_selector : FieldElement ,
74
+ pub event_selector : Felt ,
75
75
}
76
76
77
77
#[ derive( Clone , Deserialize ) ]
@@ -92,7 +92,7 @@ impl blockchain::DataSource<Chain> for DataSource {
92
92
}
93
93
94
94
fn address ( & self ) -> Option < & [ u8 ] > {
95
- None
95
+ self . source . address . as_ref ( ) . map ( |addr| addr . as_ref ( ) )
96
96
}
97
97
98
98
fn start_block ( & self ) -> BlockNumber {
@@ -218,11 +218,11 @@ impl DataSource {
218
218
/// if event.fromAddr matches the source address. Note this only supports the default
219
219
/// Starknet behavior of one key per event.
220
220
fn handler_for_event ( & self , event : & StarknetEventTrigger ) -> Option < MappingEventHandler > {
221
- let event_key = FieldElement :: from_byte_slice_be ( event. event . keys . first ( ) ?) . ok ( ) ? ;
221
+ let event_key: Felt = Self :: pad_to_32_bytes ( event. event . keys . first ( ) ?) ? . into ( ) ;
222
222
223
- // Always deocding first here seems fine as we expect most sources to define an address
223
+ // Always padding first here seems fine as we expect most sources to define an address
224
224
// filter anyways. Alternatively we can use lazy init here, which seems unnecessary.
225
- let event_from_addr = FieldElement :: from_byte_slice_be ( & event. event . from_addr ) . ok ( ) ? ;
225
+ let event_from_addr: Felt = Self :: pad_to_32_bytes ( & event. event . from_addr ) ? . into ( ) ;
226
226
227
227
return self
228
228
. mapping
@@ -241,6 +241,18 @@ impl DataSource {
241
241
} )
242
242
. cloned ( ) ;
243
243
}
244
+
245
+ /// We need to pad incoming event selectors and addresses to 32 bytes as our data source uses
246
+ /// padded 32 bytes.
247
+ fn pad_to_32_bytes ( slice : & [ u8 ] ) -> Option < [ u8 ; 32 ] > {
248
+ if slice. len ( ) > 32 {
249
+ None
250
+ } else {
251
+ let mut buffer = [ 0u8 ; 32 ] ;
252
+ buffer[ ( 32 - slice. len ( ) ) ..] . copy_from_slice ( slice) ;
253
+ Some ( buffer)
254
+ }
255
+ }
244
256
}
245
257
246
258
#[ async_trait]
@@ -314,16 +326,16 @@ impl blockchain::UnresolvedDataSourceTemplate<Chain> for UnresolvedDataSourceTem
314
326
315
327
// Adapted from:
316
328
// https://github.com/xJonathanLEI/starknet-rs/blob/f16271877c9dbf08bc7bf61e4fc72decc13ff73d/starknet-core/src/utils.rs#L110-L121
317
- fn get_selector_from_name ( func_name : & str ) -> graph:: anyhow:: Result < FieldElement > {
329
+ fn get_selector_from_name ( func_name : & str ) -> graph:: anyhow:: Result < Felt > {
318
330
const DEFAULT_ENTRY_POINT_NAME : & str = "__default__" ;
319
331
const DEFAULT_L1_ENTRY_POINT_NAME : & str = "__l1_default__" ;
320
332
321
333
if func_name == DEFAULT_ENTRY_POINT_NAME || func_name == DEFAULT_L1_ENTRY_POINT_NAME {
322
- Ok ( FieldElement :: ZERO )
334
+ Ok ( [ 0u8 ; 32 ] . into ( ) )
323
335
} else {
324
336
let name_bytes = func_name. as_bytes ( ) ;
325
337
if name_bytes. is_ascii ( ) {
326
- Ok ( starknet_keccak ( name_bytes) )
338
+ Ok ( starknet_keccak ( name_bytes) . into ( ) )
327
339
} else {
328
340
Err ( anyhow ! ( "the provided name contains non-ASCII characters" ) )
329
341
}
@@ -332,7 +344,7 @@ fn get_selector_from_name(func_name: &str) -> graph::anyhow::Result<FieldElement
332
344
333
345
// Adapted from:
334
346
// https://github.com/xJonathanLEI/starknet-rs/blob/f16271877c9dbf08bc7bf61e4fc72decc13ff73d/starknet-core/src/utils.rs#L98-L108
335
- fn starknet_keccak ( data : & [ u8 ] ) -> FieldElement {
347
+ fn starknet_keccak ( data : & [ u8 ] ) -> [ u8 ; 32 ] {
336
348
let mut hasher = Keccak256 :: new ( ) ;
337
349
hasher. update ( data) ;
338
350
let mut hash = hasher. finalize ( ) ;
@@ -341,12 +353,5 @@ fn starknet_keccak(data: &[u8]) -> FieldElement {
341
353
hash[ 0 ] &= 0b00000011 ;
342
354
343
355
// Because we know hash is always 32 bytes
344
- FieldElement :: from_bytes_be ( unsafe { & * ( hash[ ..] . as_ptr ( ) as * const [ u8 ; 32 ] ) } ) . unwrap ( )
345
- }
346
-
347
- fn deserialize_address < ' de , D > ( deserializer : D ) -> Result < Option < FieldElement > , D :: Error >
348
- where
349
- D : serde:: de:: Deserializer < ' de > ,
350
- {
351
- Ok ( Some ( serde:: Deserialize :: deserialize ( deserializer) ?) )
356
+ * unsafe { & * ( hash[ ..] . as_ptr ( ) as * const [ u8 ; 32 ] ) }
352
357
}
0 commit comments