Skip to content

Commit 9f57384

Browse files
committed
fix: dependency events not being applied to the correct contract
1 parent 616d841 commit 9f57384

File tree

5 files changed

+66
-20
lines changed

5 files changed

+66
-20
lines changed

core/src/indexer/dependency.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,17 @@ impl ContractEventDependencies {
272272
if has_dependency {
273273
return Some(d.contract_name.to_string());
274274
}
275+
276+
// check if it's a filter event
277+
let has_dependency =
278+
d.event_dependencies.has_dependency(&ContractEventMapping {
279+
// TODO - this is a hacky way to check if it's a filter event
280+
contract_name: contract_name.to_string().replace("Filter", ""),
281+
event_name: event_name.to_string(),
282+
});
283+
if has_dependency {
284+
return Some(d.contract_name.to_string());
285+
}
275286
}
276287
None
277288
})
@@ -293,24 +304,23 @@ impl ContractEventsDependenciesConfig {
293304
}
294305

295306
pub fn add_to_event_or_new_entry(
296-
contract_name: &str,
297307
dependency_event_processing_configs: &mut Vec<ContractEventsDependenciesConfig>,
298308
event_processing_config: Arc<EventProcessingConfig>,
299309
dependencies: &[ContractEventDependencies],
300310
) {
301311
match dependency_event_processing_configs
302312
.iter_mut()
303-
.find(|c| c.contract_name == contract_name)
313+
.find(|c| c.contract_name == event_processing_config.contract_name)
304314
{
305315
Some(contract_events_config) => {
306316
contract_events_config.add_event_config(event_processing_config)
307317
}
308318
None => {
309319
dependency_event_processing_configs.push(ContractEventsDependenciesConfig {
310-
contract_name: contract_name.to_string(),
320+
contract_name: event_processing_config.contract_name.clone(),
311321
event_dependencies: dependencies
312322
.iter()
313-
.find(|d| d.contract_name == contract_name)
323+
.find(|d| d.contract_name == event_processing_config.contract_name)
314324
.expect("Failed to find contract dependencies")
315325
.event_dependencies
316326
.clone(),

core/src/indexer/process.rs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ pub enum ProcessContractEventsWithDependenciesError {
107107
#[error("Could not build filter: {0}")]
108108
BuildFilterError(#[from] BuildRindexerFilterError),
109109

110-
#[error("Event config not found")]
111-
EventConfigNotFound,
110+
#[error("Event config not found for contract: {0} and event: {1}")]
111+
EventConfigNotFound(String, String),
112112

113113
#[error("Could not run all the logs processes {0}")]
114114
JoinError(#[from] JoinError),
@@ -118,6 +118,7 @@ pub enum ProcessContractEventsWithDependenciesError {
118118
pub struct OrderedLiveIndexingDetails {
119119
pub filter: RindexerEventFilter,
120120
pub last_seen_block_number: U64,
121+
pub last_no_new_block_log_time: Instant,
121122
}
122123

123124
async fn process_contract_events_with_dependencies(
@@ -141,10 +142,15 @@ async fn process_contract_events_with_dependencies(
141142
let event_processing_config = event_processing_config
142143
.iter()
143144
.find(|e| {
144-
e.contract_name == dependency.contract_name &&
145+
// TODO - this is a hacky way to check if it's a filter event
146+
(e.contract_name == dependency.contract_name ||
147+
e.contract_name.replace("Filter", "") == dependency.contract_name) &&
145148
e.event_name == dependency.event_name
146149
})
147-
.ok_or(ProcessContractEventsWithDependenciesError::EventConfigNotFound)?;
150+
.ok_or(ProcessContractEventsWithDependenciesError::EventConfigNotFound(
151+
dependency.contract_name,
152+
dependency.event_name,
153+
))?;
148154

149155
// forces live indexing off as it has to handle it a bit differently
150156
process_event_logs(Arc::clone(event_processing_config), true).await?;
@@ -165,9 +171,18 @@ async fn process_contract_events_with_dependencies(
165171

166172
let results = join_all(tasks).await;
167173
for result in results {
168-
if let Err(e) = result {
169-
error!("Error processing logs: {:?}", e);
170-
return Err(ProcessContractEventsWithDependenciesError::JoinError(e));
174+
match result {
175+
Ok(result) => match result {
176+
Ok(_) => {}
177+
Err(e) => {
178+
error!("Error processing logs due to dependencies error: {:?}", e);
179+
return Err(e);
180+
}
181+
},
182+
Err(e) => {
183+
error!("Error processing logs: {:?}", e);
184+
return Err(ProcessContractEventsWithDependenciesError::JoinError(e));
185+
}
171186
}
172187
}
173188

@@ -210,12 +225,15 @@ async fn live_indexing_for_contract_event_dependencies<'a>(
210225

211226
ordering_live_indexing_details_map.insert(
212227
config.topic_id,
213-
Arc::new(Mutex::new(OrderedLiveIndexingDetails { filter, last_seen_block_number })),
228+
Arc::new(Mutex::new(OrderedLiveIndexingDetails {
229+
filter,
230+
last_seen_block_number,
231+
last_no_new_block_log_time: Instant::now(),
232+
})),
214233
);
215234
}
216235

217236
// this is used for less busy chains to make sure they know rindexer is still alive
218-
let mut last_no_new_block_log_time = Instant::now();
219237
let log_no_new_block_interval = Duration::from_secs(20);
220238

221239
loop {
@@ -243,15 +261,24 @@ async fn live_indexing_for_contract_event_dependencies<'a>(
243261
&config.info_log_name,
244262
IndexingEventProgressStatus::Live.log()
245263
);
246-
if last_no_new_block_log_time.elapsed() >= log_no_new_block_interval
264+
if ordering_live_indexing_details
265+
.last_no_new_block_log_time
266+
.elapsed() >=
267+
log_no_new_block_interval
247268
{
248269
info!(
249270
"{} - {} - No new blocks published in the last 20 seconds - latest block number {}",
250271
&config.info_log_name,
251272
IndexingEventProgressStatus::Live.log(),
252273
latest_block_number
253274
);
254-
last_no_new_block_log_time = Instant::now();
275+
ordering_live_indexing_details.last_no_new_block_log_time =
276+
Instant::now();
277+
*ordering_live_indexing_details_map
278+
.get(&config.topic_id)
279+
.expect("Failed to get ordering_live_indexing_details_map")
280+
.lock()
281+
.await = ordering_live_indexing_details;
255282
}
256283
continue;
257284
}

core/src/indexer/start.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ pub async fn start_indexing(
107107
.iter()
108108
.find(|c| c.name == event.contract.name)
109109
.and_then(|c| c.streams.as_ref());
110+
110111
for network_contract in event.contract.details.iter() {
111112
let config = SyncConfig {
112113
project_path,
@@ -209,8 +210,8 @@ pub async fn start_indexing(
209210
};
210211

211212
let dependencies_status = ContractEventDependencies::dependencies_status(
212-
&event.contract.name,
213-
&event.event_name,
213+
&event_processing_config.contract_name,
214+
&event_processing_config.event_name,
214215
dependencies,
215216
);
216217

@@ -232,7 +233,6 @@ pub async fn start_indexing(
232233
}
233234

234235
ContractEventsDependenciesConfig::add_to_event_or_new_entry(
235-
&event.contract.name,
236236
&mut dependency_event_processing_configs,
237237
event_processing_config_arc,
238238
dependencies,
@@ -247,7 +247,6 @@ pub async fn start_indexing(
247247
// apply dependency events config after processing to avoid ordering issues
248248
for apply in apply_cross_contract_dependency_events_config_after_processing {
249249
let (dependency_in_other_contract, event_processing_config) = apply;
250-
251250
ContractEventsDependenciesConfig::add_to_event_or_panic(
252251
&dependency_in_other_contract,
253252
&mut dependency_event_processing_configs,

core/src/manifest/yaml.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ pub enum ValidateManifestError {
3939
#[error("Contract names {0} must be unique")]
4040
ContractNameMustBeUnique(String),
4141

42+
#[error("Contract name {0} can not include 'Filter' in the name as it is a reserved word")]
43+
ContractNameCanNotIncludeFilter(String),
44+
4245
#[error("Invalid network mapped to contract: network - {0} contract - {1}")]
4346
InvalidNetworkMappedToContract(String, String),
4447

@@ -88,6 +91,12 @@ fn validate_manifest(
8891
}
8992

9093
for contract in &manifest.contracts {
94+
if contract.name.to_lowercase().contains("filter") {
95+
return Err(ValidateManifestError::ContractNameCanNotIncludeFilter(
96+
contract.name.clone(),
97+
));
98+
}
99+
91100
let events = ABIItem::read_abi_items(project_path, contract)
92101
.map_err(|e| ValidateManifestError::InvalidABI(contract.name.clone(), e.to_string()))?;
93102

@@ -266,7 +275,7 @@ pub fn read_manifest(file_path: &PathBuf) -> Result<Manifest, ReadManifestError>
266275
let manifest_before_transform: Manifest = serde_yaml::from_str(&contents)?;
267276

268277
contents = substitute_env_variables(&contents)?;
269-
278+
270279
let mut manifest_after_transform: Manifest = serde_yaml::from_str(&contents)?;
271280

272281
// as we don't want to inject the RPC URL in rust projects in clear text we should change

documentation/docs/pages/docs/changelog.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
### Bug fixes
1111
-------------------------------------------------
12+
- fix: dependency events not being applied to the correct contract
1213

1314
### Breaking changes
1415
-------------------------------------------------

0 commit comments

Comments
 (0)