@@ -6,7 +6,8 @@ use graph::components::store::{EthereumCallCache, StoredDynamicDataSource};
66use graph:: components:: subgraph:: { HostMetrics , InstanceDSTemplateInfo , MappingError } ;
77use graph:: components:: trigger_processor:: RunnableTriggers ;
88use graph:: data_source:: common:: {
9- CallDecls , DeclaredCall , FindMappingABI , MappingABI , UnresolvedMappingABI ,
9+ AbiJson , CallDecls , DeclaredCall , FindMappingABI , MappingABI , UnresolvedCallDecls ,
10+ UnresolvedMappingABI ,
1011} ;
1112use graph:: data_source:: { CausalityRegion , MappingTrigger as MappingTriggerType } ;
1213use graph:: env:: ENV_VARS ;
@@ -800,7 +801,7 @@ impl DataSource {
800801 "transaction" => format!( "{}" , & transaction. hash) ,
801802 } ) ;
802803 let handler = event_handler. handler . clone ( ) ;
803- let calls = DeclaredCall :: from_log_trigger (
804+ let calls = DeclaredCall :: from_log_trigger_with_event (
804805 & self . mapping ,
805806 & event_handler. calls ,
806807 & log,
@@ -1200,6 +1201,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
12001201 resolver : & Arc < dyn LinkResolver > ,
12011202 logger : & Logger ,
12021203 manifest_idx : u32 ,
1204+ spec_version : & semver:: Version ,
12031205 ) -> Result < DataSource , anyhow:: Error > {
12041206 let UnresolvedDataSource {
12051207 kind,
@@ -1210,7 +1212,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
12101212 context,
12111213 } = self ;
12121214
1213- let mapping = mapping. resolve ( resolver, logger) . await . with_context ( || {
1215+ let mapping = mapping. resolve ( resolver, logger, spec_version ) . await . with_context ( || {
12141216 format ! (
12151217 "failed to resolve data source {} with source_address {:?} and source_start_block {}" ,
12161218 name, source. address, source. start_block
@@ -1221,7 +1223,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
12211223 }
12221224}
12231225
1224- #[ derive( Clone , Debug , Default , Hash , Eq , PartialEq , Deserialize ) ]
1226+ #[ derive( Clone , Debug , Default , Eq , PartialEq , Deserialize ) ]
12251227pub struct UnresolvedDataSourceTemplate {
12261228 pub kind : String ,
12271229 pub network : Option < String > ,
@@ -1247,6 +1249,7 @@ impl blockchain::UnresolvedDataSourceTemplate<Chain> for UnresolvedDataSourceTem
12471249 resolver : & Arc < dyn LinkResolver > ,
12481250 logger : & Logger ,
12491251 manifest_idx : u32 ,
1252+ spec_version : & semver:: Version ,
12501253 ) -> Result < DataSourceTemplate , anyhow:: Error > {
12511254 let UnresolvedDataSourceTemplate {
12521255 kind,
@@ -1257,7 +1260,7 @@ impl blockchain::UnresolvedDataSourceTemplate<Chain> for UnresolvedDataSourceTem
12571260 } = self ;
12581261
12591262 let mapping = mapping
1260- . resolve ( resolver, logger)
1263+ . resolve ( resolver, logger, spec_version )
12611264 . await
12621265 . with_context ( || format ! ( "failed to resolve data source template {}" , name) ) ?;
12631266
@@ -1294,7 +1297,7 @@ impl blockchain::DataSourceTemplate<Chain> for DataSourceTemplate {
12941297 }
12951298}
12961299
1297- #[ derive( Clone , Debug , Default , Hash , Eq , PartialEq , Deserialize ) ]
1300+ #[ derive( Clone , Debug , Default , Eq , PartialEq , Deserialize ) ]
12981301#[ serde( rename_all = "camelCase" ) ]
12991302pub struct UnresolvedMapping {
13001303 pub kind : String ,
@@ -1307,7 +1310,7 @@ pub struct UnresolvedMapping {
13071310 #[ serde( default ) ]
13081311 pub call_handlers : Vec < MappingCallHandler > ,
13091312 #[ serde( default ) ]
1310- pub event_handlers : Vec < MappingEventHandler > ,
1313+ pub event_handlers : Vec < UnresolvedMappingEventHandler > ,
13111314 pub file : Link ,
13121315}
13131316
@@ -1357,6 +1360,7 @@ impl UnresolvedMapping {
13571360 self ,
13581361 resolver : & Arc < dyn LinkResolver > ,
13591362 logger : & Logger ,
1363+ spec_version : & semver:: Version ,
13601364 ) -> Result < Mapping , anyhow:: Error > {
13611365 let UnresolvedMapping {
13621366 kind,
@@ -1376,9 +1380,7 @@ impl UnresolvedMapping {
13761380 // resolve each abi
13771381 abis. into_iter ( )
13781382 . map ( |unresolved_abi| async {
1379- Result :: < _ , Error > :: Ok ( Arc :: new (
1380- unresolved_abi. resolve ( resolver, logger) . await ?,
1381- ) )
1383+ Result :: < _ , Error > :: Ok ( unresolved_abi. resolve ( resolver, logger) . await ?)
13821384 } )
13831385 . collect :: < FuturesOrdered < _ > > ( )
13841386 . try_collect :: < Vec < _ > > ( ) ,
@@ -1390,15 +1392,35 @@ impl UnresolvedMapping {
13901392 . await
13911393 . with_context ( || format ! ( "failed to resolve mapping {}" , link. link) ) ?;
13921394
1395+ // Resolve event handlers with ABI context
1396+ let resolved_event_handlers = event_handlers
1397+ . into_iter ( )
1398+ . map ( |unresolved_handler| {
1399+ // Find the ABI for this event handler
1400+ let ( _, abi_json) = abis. first ( ) . ok_or_else ( || {
1401+ anyhow ! (
1402+ "No ABI found for event '{}' in event handler '{}'" ,
1403+ unresolved_handler. event,
1404+ unresolved_handler. handler
1405+ )
1406+ } ) ?;
1407+
1408+ unresolved_handler. resolve ( abi_json, & spec_version)
1409+ } )
1410+ . collect :: < Result < Vec < _ > , anyhow:: Error > > ( ) ?;
1411+
1412+ // Extract just the MappingABIs for the final Mapping struct
1413+ let mapping_abis = abis. into_iter ( ) . map ( |( abi, _) | Arc :: new ( abi) ) . collect ( ) ;
1414+
13931415 Ok ( Mapping {
13941416 kind,
13951417 api_version,
13961418 language,
13971419 entities,
1398- abis,
1420+ abis : mapping_abis ,
13991421 block_handlers : block_handlers. clone ( ) ,
14001422 call_handlers : call_handlers. clone ( ) ,
1401- event_handlers : event_handlers . clone ( ) ,
1423+ event_handlers : resolved_event_handlers ,
14021424 runtime,
14031425 link,
14041426 } )
@@ -1442,8 +1464,8 @@ pub struct MappingCallHandler {
14421464 pub handler : String ,
14431465}
14441466
1445- #[ derive( Clone , Debug , Hash , Eq , PartialEq , Deserialize ) ]
1446- pub struct MappingEventHandler {
1467+ #[ derive( Clone , Debug , Eq , PartialEq , Deserialize ) ]
1468+ pub struct UnresolvedMappingEventHandler {
14471469 pub event : String ,
14481470 pub topic0 : Option < H256 > ,
14491471 #[ serde( deserialize_with = "deserialize_h256_vec" , default ) ]
@@ -1456,6 +1478,41 @@ pub struct MappingEventHandler {
14561478 #[ serde( default ) ]
14571479 pub receipt : bool ,
14581480 #[ serde( default ) ]
1481+ pub calls : UnresolvedCallDecls ,
1482+ }
1483+
1484+ impl UnresolvedMappingEventHandler {
1485+ pub fn resolve (
1486+ self ,
1487+ abi_json : & AbiJson ,
1488+ spec_version : & semver:: Version ,
1489+ ) -> Result < MappingEventHandler , anyhow:: Error > {
1490+ let resolved_calls = self
1491+ . calls
1492+ . resolve ( abi_json, Some ( & self . event ) , spec_version) ?;
1493+
1494+ Ok ( MappingEventHandler {
1495+ event : self . event ,
1496+ topic0 : self . topic0 ,
1497+ topic1 : self . topic1 ,
1498+ topic2 : self . topic2 ,
1499+ topic3 : self . topic3 ,
1500+ handler : self . handler ,
1501+ receipt : self . receipt ,
1502+ calls : resolved_calls,
1503+ } )
1504+ }
1505+ }
1506+
1507+ #[ derive( Clone , Debug , Hash , Eq , PartialEq ) ]
1508+ pub struct MappingEventHandler {
1509+ pub event : String ,
1510+ pub topic0 : Option < H256 > ,
1511+ pub topic1 : Option < Vec < H256 > > ,
1512+ pub topic2 : Option < Vec < H256 > > ,
1513+ pub topic3 : Option < Vec < H256 > > ,
1514+ pub handler : String ,
1515+ pub receipt : bool ,
14591516 pub calls : CallDecls ,
14601517}
14611518
0 commit comments