@@ -6,7 +6,8 @@ use graph::components::store::{EthereumCallCache, StoredDynamicDataSource};
6
6
use graph:: components:: subgraph:: { HostMetrics , InstanceDSTemplateInfo , MappingError } ;
7
7
use graph:: components:: trigger_processor:: RunnableTriggers ;
8
8
use graph:: data_source:: common:: {
9
- CallDecls , DeclaredCall , FindMappingABI , MappingABI , UnresolvedMappingABI ,
9
+ AbiJson , CallDecls , DeclaredCall , FindMappingABI , MappingABI , UnresolvedCallDecls ,
10
+ UnresolvedMappingABI ,
10
11
} ;
11
12
use graph:: data_source:: { CausalityRegion , MappingTrigger as MappingTriggerType } ;
12
13
use graph:: env:: ENV_VARS ;
@@ -800,7 +801,7 @@ impl DataSource {
800
801
"transaction" => format!( "{}" , & transaction. hash) ,
801
802
} ) ;
802
803
let handler = event_handler. handler . clone ( ) ;
803
- let calls = DeclaredCall :: from_log_trigger (
804
+ let calls = DeclaredCall :: from_log_trigger_with_event (
804
805
& self . mapping ,
805
806
& event_handler. calls ,
806
807
& log,
@@ -1200,6 +1201,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
1200
1201
resolver : & Arc < dyn LinkResolver > ,
1201
1202
logger : & Logger ,
1202
1203
manifest_idx : u32 ,
1204
+ spec_version : & semver:: Version ,
1203
1205
) -> Result < DataSource , anyhow:: Error > {
1204
1206
let UnresolvedDataSource {
1205
1207
kind,
@@ -1210,7 +1212,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
1210
1212
context,
1211
1213
} = self ;
1212
1214
1213
- let mapping = mapping. resolve ( resolver, logger) . await . with_context ( || {
1215
+ let mapping = mapping. resolve ( resolver, logger, spec_version ) . await . with_context ( || {
1214
1216
format ! (
1215
1217
"failed to resolve data source {} with source_address {:?} and source_start_block {}" ,
1216
1218
name, source. address, source. start_block
@@ -1221,7 +1223,7 @@ impl blockchain::UnresolvedDataSource<Chain> for UnresolvedDataSource {
1221
1223
}
1222
1224
}
1223
1225
1224
- #[ derive( Clone , Debug , Default , Hash , Eq , PartialEq , Deserialize ) ]
1226
+ #[ derive( Clone , Debug , Default , Eq , PartialEq , Deserialize ) ]
1225
1227
pub struct UnresolvedDataSourceTemplate {
1226
1228
pub kind : String ,
1227
1229
pub network : Option < String > ,
@@ -1247,6 +1249,7 @@ impl blockchain::UnresolvedDataSourceTemplate<Chain> for UnresolvedDataSourceTem
1247
1249
resolver : & Arc < dyn LinkResolver > ,
1248
1250
logger : & Logger ,
1249
1251
manifest_idx : u32 ,
1252
+ spec_version : & semver:: Version ,
1250
1253
) -> Result < DataSourceTemplate , anyhow:: Error > {
1251
1254
let UnresolvedDataSourceTemplate {
1252
1255
kind,
@@ -1257,7 +1260,7 @@ impl blockchain::UnresolvedDataSourceTemplate<Chain> for UnresolvedDataSourceTem
1257
1260
} = self ;
1258
1261
1259
1262
let mapping = mapping
1260
- . resolve ( resolver, logger)
1263
+ . resolve ( resolver, logger, spec_version )
1261
1264
. await
1262
1265
. with_context ( || format ! ( "failed to resolve data source template {}" , name) ) ?;
1263
1266
@@ -1294,7 +1297,7 @@ impl blockchain::DataSourceTemplate<Chain> for DataSourceTemplate {
1294
1297
}
1295
1298
}
1296
1299
1297
- #[ derive( Clone , Debug , Default , Hash , Eq , PartialEq , Deserialize ) ]
1300
+ #[ derive( Clone , Debug , Default , Eq , PartialEq , Deserialize ) ]
1298
1301
#[ serde( rename_all = "camelCase" ) ]
1299
1302
pub struct UnresolvedMapping {
1300
1303
pub kind : String ,
@@ -1307,7 +1310,7 @@ pub struct UnresolvedMapping {
1307
1310
#[ serde( default ) ]
1308
1311
pub call_handlers : Vec < MappingCallHandler > ,
1309
1312
#[ serde( default ) ]
1310
- pub event_handlers : Vec < MappingEventHandler > ,
1313
+ pub event_handlers : Vec < UnresolvedMappingEventHandler > ,
1311
1314
pub file : Link ,
1312
1315
}
1313
1316
@@ -1357,6 +1360,7 @@ impl UnresolvedMapping {
1357
1360
self ,
1358
1361
resolver : & Arc < dyn LinkResolver > ,
1359
1362
logger : & Logger ,
1363
+ spec_version : & semver:: Version ,
1360
1364
) -> Result < Mapping , anyhow:: Error > {
1361
1365
let UnresolvedMapping {
1362
1366
kind,
@@ -1376,9 +1380,7 @@ impl UnresolvedMapping {
1376
1380
// resolve each abi
1377
1381
abis. into_iter ( )
1378
1382
. 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 ?)
1382
1384
} )
1383
1385
. collect :: < FuturesOrdered < _ > > ( )
1384
1386
. try_collect :: < Vec < _ > > ( ) ,
@@ -1390,15 +1392,35 @@ impl UnresolvedMapping {
1390
1392
. await
1391
1393
. with_context ( || format ! ( "failed to resolve mapping {}" , link. link) ) ?;
1392
1394
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
+
1393
1415
Ok ( Mapping {
1394
1416
kind,
1395
1417
api_version,
1396
1418
language,
1397
1419
entities,
1398
- abis,
1420
+ abis : mapping_abis ,
1399
1421
block_handlers : block_handlers. clone ( ) ,
1400
1422
call_handlers : call_handlers. clone ( ) ,
1401
- event_handlers : event_handlers . clone ( ) ,
1423
+ event_handlers : resolved_event_handlers ,
1402
1424
runtime,
1403
1425
link,
1404
1426
} )
@@ -1442,8 +1464,8 @@ pub struct MappingCallHandler {
1442
1464
pub handler : String ,
1443
1465
}
1444
1466
1445
- #[ derive( Clone , Debug , Hash , Eq , PartialEq , Deserialize ) ]
1446
- pub struct MappingEventHandler {
1467
+ #[ derive( Clone , Debug , Eq , PartialEq , Deserialize ) ]
1468
+ pub struct UnresolvedMappingEventHandler {
1447
1469
pub event : String ,
1448
1470
pub topic0 : Option < H256 > ,
1449
1471
#[ serde( deserialize_with = "deserialize_h256_vec" , default ) ]
@@ -1456,6 +1478,41 @@ pub struct MappingEventHandler {
1456
1478
#[ serde( default ) ]
1457
1479
pub receipt : bool ,
1458
1480
#[ 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 ,
1459
1516
pub calls : CallDecls ,
1460
1517
}
1461
1518
0 commit comments