Skip to content

Commit ff529f8

Browse files
committed
gnd: Align scaffold output with graph-cli
Make `gnd init` generate scaffold files that match `graph-cli init` output for better compatibility when --index-events is not set (placeholder mode). Changes: - manifest: Put address before abi in source, use event names for entities (not ExampleEntity), remove blank lines between event handlers - schema: Use @entity(immutable: true), include first 2 event params with type comments, remove block fields from example entity - mapping: Import contract class and all events, generate handlers for all events (first with full code, rest empty stubs), use correct ID pattern with Bytes.fromByteArray, add extended comments with callable functions
1 parent 2649154 commit ff529f8

3 files changed

Lines changed: 422 additions & 48 deletions

File tree

gnd/src/scaffold/manifest.rs

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ pub fn generate_manifest(options: &ScaffoldOptions) -> String {
99
let mapping_file = format!("./src/{}.ts", super::to_kebab_case(contract_name));
1010
let abi_file = format!("./abis/{}.json", contract_name);
1111

12-
let mut source = format!(
13-
r#" abi: {contract_name}
14-
"#
15-
);
12+
let mut source = String::new();
1613

1714
if let Some(address) = &options.address {
1815
source.push_str(&format!(" address: \"{}\"\n", address));
1916
}
2017

18+
source.push_str(&format!(" abi: {contract_name}\n"));
19+
2120
if let Some(start_block) = options.start_block {
2221
source.push_str(&format!(" startBlock: {}\n", start_block));
2322
}
@@ -69,7 +68,7 @@ fn get_event_handlers(options: &ScaffoldOptions) -> String {
6968
for event in events {
7069
let handler_name = format!("handle{}", event.name);
7170
handlers.push_str(&format!(
72-
"\n - event: {}\n handler: {}\n",
71+
"\n - event: {}\n handler: {}",
7372
event.signature, handler_name
7473
));
7574
}
@@ -85,15 +84,12 @@ fn get_entities(options: &ScaffoldOptions) -> String {
8584
return "\n - ExampleEntity".to_string();
8685
}
8786

88-
if options.index_events {
89-
let mut entities = String::new();
90-
for event in events {
91-
entities.push_str(&format!("\n - {}", event.name));
92-
}
93-
entities
94-
} else {
95-
"\n - ExampleEntity".to_string()
87+
// Always use event names from ABI, regardless of index_events
88+
let mut entities = String::new();
89+
for event in events {
90+
entities.push_str(&format!("\n - {}", event.name));
9691
}
92+
entities
9793
}
9894

9995
/// Event info extracted from ABI.
@@ -215,6 +211,66 @@ mod tests {
215211
assert!(manifest.contains("name: MyToken"));
216212
assert!(manifest.contains("0x1234567890123456789012345678901234567890"));
217213
assert!(manifest.contains("startBlock: 12345678"));
214+
215+
// Verify address comes before abi
216+
let address_pos = manifest.find("address:").unwrap();
217+
let abi_pos = manifest.find("abi: MyToken").unwrap();
218+
assert!(address_pos < abi_pos, "address should come before abi");
219+
}
220+
221+
#[test]
222+
fn test_get_entities_uses_event_names() {
223+
let abi = json!([
224+
{
225+
"type": "event",
226+
"name": "Transfer",
227+
"inputs": []
228+
},
229+
{
230+
"type": "event",
231+
"name": "Approval",
232+
"inputs": []
233+
}
234+
]);
235+
236+
// Even with index_events=false, entities should be event names
237+
let options = ScaffoldOptions {
238+
abi: Some(abi),
239+
index_events: false,
240+
..Default::default()
241+
};
242+
243+
let manifest = generate_manifest(&options);
244+
assert!(manifest.contains("- Transfer"));
245+
assert!(manifest.contains("- Approval"));
246+
// Should NOT contain ExampleEntity
247+
assert!(!manifest.contains("ExampleEntity"));
248+
}
249+
250+
#[test]
251+
fn test_event_handlers_no_blank_lines() {
252+
let abi = json!([
253+
{
254+
"type": "event",
255+
"name": "Transfer",
256+
"inputs": []
257+
},
258+
{
259+
"type": "event",
260+
"name": "Approval",
261+
"inputs": []
262+
}
263+
]);
264+
265+
let options = ScaffoldOptions {
266+
abi: Some(abi),
267+
..Default::default()
268+
};
269+
270+
let manifest = generate_manifest(&options);
271+
272+
// Check there are no double newlines in the eventHandlers section
273+
assert!(!manifest.contains("handler: handleTransfer\n\n"));
218274
}
219275

220276
#[test]

0 commit comments

Comments
 (0)