@@ -618,7 +618,7 @@ impl UnresolvedCallDecls {
618618 self ,
619619 mapping : & MappingABI ,
620620 event_name : Option < & str > ,
621- spec_version : Option < & semver:: Version > ,
621+ spec_version : & semver:: Version ,
622622 ) -> Result < CallDecls , anyhow:: Error > {
623623 let decls: Result < Vec < CallDecl > , anyhow:: Error > = self
624624 . raw_decls
@@ -630,7 +630,7 @@ impl UnresolvedCallDecls {
630630 expr,
631631 readonly : ( ) ,
632632 } )
633- . with_context ( || format ! ( "Error in delcared call '{}':" , label) )
633+ . with_context ( || format ! ( "Error in declared call '{}':" , label) )
634634 } )
635635 . collect ( ) ;
636636
@@ -698,7 +698,7 @@ impl CallExpr {
698698 s : & str ,
699699 mapping : & MappingABI ,
700700 event_name : Option < & str > ,
701- spec_version : Option < & semver:: Version > ,
701+ spec_version : & semver:: Version ,
702702 ) -> Result < Self , anyhow:: Error > {
703703 // Parse the expression manually to inject ABI context for field name resolution
704704 // Format: Contract[address].function(arg1, arg2, ...)
@@ -953,7 +953,7 @@ impl CallArg {
953953 s : & str ,
954954 mapping_abi : & MappingABI ,
955955 event_name : Option < & str > ,
956- spec_version : Option < & semver:: Version > ,
956+ spec_version : & semver:: Version ,
957957 ) -> Result < Self , anyhow:: Error > {
958958 // Handle hex addresses first
959959 if ADDR_RE . is_match ( s) {
@@ -974,16 +974,14 @@ impl CallArg {
974974 } else {
975975 // Struct field access: event.params.foo.bar.0.baz...
976976 // Validate spec version before allowing any struct field access
977- if let Some ( spec_ver) = spec_version {
978- if spec_ver < & SPEC_VERSION_1_4_0 {
977+ if spec_version < & SPEC_VERSION_1_4_0 {
979978 return Err ( anyhow ! (
980979 "Struct field access 'event.params.{}.*' in declarative calls is only supported for specVersion >= 1.4.0, current version is {}. Event: '{}'" ,
981980 param,
982- spec_ver ,
981+ spec_version ,
983982 event_name. unwrap_or( "unknown" )
984983 ) ) ;
985984 }
986- }
987985
988986 // Resolve field names to indices using ABI context
989987 let mut field_indices = Vec :: new ( ) ;
@@ -1713,7 +1711,7 @@ mod tests {
17131711 "TestContract[event.params.asset.addr].name()" ,
17141712 & mapping_abi,
17151713 Some ( "Transfer" ) ,
1716- None ,
1714+ & SPEC_VERSION_1_4_0 ,
17171715 )
17181716 . unwrap ( ) ;
17191717
@@ -1730,7 +1728,7 @@ mod tests {
17301728 "TestContract[event.address].transfer(event.params.asset.amount, event.params.asset.1)" ,
17311729 & mapping_abi,
17321730 Some ( "Transfer" ) ,
1733- None ,
1731+ & SPEC_VERSION_1_4_0 ,
17341732 )
17351733 . unwrap ( ) ;
17361734
@@ -1755,7 +1753,7 @@ mod tests {
17551753 "TestContract[event.params.asset.invalid].name()" ,
17561754 & mapping_abi,
17571755 Some ( "Transfer" ) ,
1758- None ,
1756+ & SPEC_VERSION_1_4_0 ,
17591757 ) ;
17601758 assert ! ( result. is_err( ) ) ;
17611759 let error = result. unwrap_err ( ) ;
@@ -1768,7 +1766,7 @@ mod tests {
17681766 "TestContract[event.params.asset.addr].name()" ,
17691767 & mapping_abi,
17701768 None , // No event name
1771- None ,
1769+ & SPEC_VERSION_1_4_0 ,
17721770 ) ;
17731771 assert ! ( result. is_err( ) ) ;
17741772 let error = result. unwrap_err ( ) ;
@@ -1850,6 +1848,8 @@ mod tests {
18501848 use ethabi:: Contract ;
18511849 use std:: collections:: HashMap ;
18521850
1851+ const SV : & semver:: Version = & SPEC_VERSION_1_4_0 ;
1852+
18531853 // Create a minimal ABI for testing
18541854 let abi_json = r#"[{"anonymous": false, "inputs": [], "name": "Test", "type": "event"}]"# ;
18551855 let contract = Contract :: load ( abi_json. as_bytes ( ) ) . unwrap ( ) ;
@@ -1860,59 +1860,44 @@ mod tests {
18601860 } ;
18611861
18621862 // Test 1: Missing opening bracket
1863- let result = CallExpr :: parse (
1864- "TestContract event.address].test()" ,
1865- & mapping_abi,
1866- None ,
1867- None ,
1868- ) ;
1863+ let result = CallExpr :: parse ( "TestContract event.address].test()" , & mapping_abi, None , SV ) ;
18691864 assert ! ( result. is_err( ) ) ;
18701865 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
18711866 assert ! ( error_msg. contains( "Invalid call expression" ) ) ;
18721867 assert ! ( error_msg. contains( "missing '[' after contract name" ) ) ;
18731868
18741869 // Test 2: Missing closing bracket
1875- let result = CallExpr :: parse (
1876- "TestContract[event.address.test()" ,
1877- & mapping_abi,
1878- None ,
1879- None ,
1880- ) ;
1870+ let result = CallExpr :: parse ( "TestContract[event.address.test()" , & mapping_abi, None , SV ) ;
18811871 assert ! ( result. is_err( ) ) ;
18821872 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
18831873 assert ! ( error_msg. contains( "missing ']' to close address" ) ) ;
18841874
18851875 // Test 3: Empty contract name
1886- let result = CallExpr :: parse ( "[event.address].test()" , & mapping_abi, None , None ) ;
1876+ let result = CallExpr :: parse ( "[event.address].test()" , & mapping_abi, None , SV ) ;
18871877 assert ! ( result. is_err( ) ) ;
18881878 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
18891879 assert ! ( error_msg. contains( "missing contract name before '['" ) ) ;
18901880
18911881 // Test 4: Empty address
1892- let result = CallExpr :: parse ( "TestContract[].test()" , & mapping_abi, None , None ) ;
1882+ let result = CallExpr :: parse ( "TestContract[].test()" , & mapping_abi, None , SV ) ;
18931883 assert ! ( result. is_err( ) ) ;
18941884 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
18951885 assert ! ( error_msg. contains( "empty address" ) ) ;
18961886
18971887 // Test 5: Missing function name
1898- let result = CallExpr :: parse ( "TestContract[event.address].()" , & mapping_abi, None , None ) ;
1888+ let result = CallExpr :: parse ( "TestContract[event.address].()" , & mapping_abi, None , SV ) ;
18991889 assert ! ( result. is_err( ) ) ;
19001890 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
19011891 assert ! ( error_msg. contains( "missing function name" ) ) ;
19021892
19031893 // Test 6: Missing opening parenthesis
1904- let result = CallExpr :: parse ( "TestContract[event.address].test" , & mapping_abi, None , None ) ;
1894+ let result = CallExpr :: parse ( "TestContract[event.address].test" , & mapping_abi, None , SV ) ;
19051895 assert ! ( result. is_err( ) ) ;
19061896 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
19071897 assert ! ( error_msg. contains( "missing '(' to start function arguments" ) ) ;
19081898
19091899 // Test 7: Missing closing parenthesis
1910- let result = CallExpr :: parse (
1911- "TestContract[event.address].test(" ,
1912- & mapping_abi,
1913- None ,
1914- None ,
1915- ) ;
1900+ let result = CallExpr :: parse ( "TestContract[event.address].test(" , & mapping_abi, None , SV ) ;
19161901 assert ! ( result. is_err( ) ) ;
19171902 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
19181903 assert ! ( error_msg. contains( "missing ')' to close function arguments" ) ) ;
@@ -1922,7 +1907,7 @@ mod tests {
19221907 "TestContract[event.address].test(invalid.arg)" ,
19231908 & mapping_abi,
19241909 None ,
1925- None ,
1910+ SV ,
19261911 ) ;
19271912 assert ! ( result. is_err( ) ) ;
19281913 let error_msg = result. unwrap_err ( ) . to_string ( ) ;
0 commit comments