@@ -30,13 +30,14 @@ extension ABI {
30
30
case fallback
31
31
case event
32
32
case receive
33
+ case error
33
34
}
34
35
35
36
}
36
37
37
38
extension ABI . Record {
38
39
public func parse( ) throws -> ABI . Element {
39
- let typeString = self . type != nil ? self . type! : " function "
40
+ let typeString = self . type ?? " function "
40
41
guard let type = ABI . ElementType ( rawValue: typeString) else {
41
42
throw ABI . ParsingError. elementTypeInvalid
42
43
}
@@ -61,6 +62,9 @@ fileprivate func parseToElement(from abiRecord: ABI.Record, type: ABI.ElementTyp
61
62
case . receive:
62
63
let receive = try parseReceive ( abiRecord: abiRecord)
63
64
return ABI . Element. receive ( receive)
65
+ case . error:
66
+ let error = try parseError ( abiRecord: abiRecord)
67
+ return ABI . Element. error ( error)
64
68
}
65
69
66
70
}
@@ -70,26 +74,22 @@ fileprivate func parseFunction(abiRecord: ABI.Record) throws -> ABI.Element.Func
70
74
let nativeInput = try input. parse ( )
71
75
return nativeInput
72
76
} )
73
- let abiInputs = inputs != nil ? inputs! : [ ABI . Element. InOut] ( )
74
- let outputs = try abiRecord. outputs? . map ( { ( output: ABI . Output ) throws -> ABI . Element . InOut in
77
+ let abiInputs = inputs ?? [ ABI . Element. InOut] ( )
78
+ let outputs = try abiRecord. outputs? . map ( { ( output: ABI . Output ) throws -> ABI . Element . InOut in
75
79
let nativeOutput = try output. parse ( )
76
80
return nativeOutput
77
81
} )
78
- let abiOutputs = outputs != nil ? outputs! : [ ABI . Element. InOut] ( )
79
- let name = abiRecord. name != nil ? abiRecord. name! : " "
80
- let payable = abiRecord. stateMutability != nil ?
81
- ( abiRecord. stateMutability == " payable " || abiRecord. payable ?? false ) : false
82
- let constant = ( abiRecord. constant == true || abiRecord. stateMutability == " view " || abiRecord. stateMutability == " pure " )
82
+ let abiOutputs = outputs ?? [ ABI . Element. InOut] ( )
83
+ let name = abiRecord. name ?? " "
84
+ let payable = abiRecord. stateMutability == " payable " || abiRecord. payable == true
85
+ let constant = abiRecord. constant == true || abiRecord. stateMutability == " view " || abiRecord. stateMutability == " pure "
83
86
let functionElement = ABI . Element. Function ( name: name, inputs: abiInputs, outputs: abiOutputs, constant: constant, payable: payable)
84
87
return functionElement
85
88
}
86
89
87
90
fileprivate func parseFallback( abiRecord: ABI . Record ) throws -> ABI . Element . Fallback {
88
91
let payable = ( abiRecord. stateMutability == " payable " || abiRecord. payable == true )
89
- var constant = abiRecord. constant == true
90
- if ( abiRecord. stateMutability == " view " || abiRecord. stateMutability == " pure " ) {
91
- constant = true
92
- }
92
+ let constant = abiRecord. constant == true || abiRecord. stateMutability == " view " || abiRecord. stateMutability == " pure "
93
93
let functionElement = ABI . Element. Fallback ( constant: constant, payable: payable)
94
94
return functionElement
95
95
}
@@ -99,16 +99,9 @@ fileprivate func parseConstructor(abiRecord: ABI.Record) throws -> ABI.Element.C
99
99
let nativeInput = try input. parse ( )
100
100
return nativeInput
101
101
} )
102
- let abiInputs = inputs != nil ? inputs! : [ ABI . Element. InOut] ( )
103
- var payable = false
104
- if ( abiRecord. payable != nil ) {
105
- payable = abiRecord. payable!
106
- }
107
- if ( abiRecord. stateMutability == " payable " ) {
108
- payable = true
109
- }
110
- let constant = false
111
- let functionElement = ABI . Element. Constructor ( inputs: abiInputs, constant: constant, payable: payable)
102
+ let abiInputs = inputs ?? [ ABI . Element. InOut] ( )
103
+ let payable = abiRecord. stateMutability == " payable " || abiRecord. payable == true
104
+ let functionElement = ABI . Element. Constructor ( inputs: abiInputs, constant: false , payable: payable)
112
105
return functionElement
113
106
}
114
107
@@ -117,9 +110,9 @@ fileprivate func parseEvent(abiRecord: ABI.Record) throws -> ABI.Element.Event {
117
110
let nativeInput = try input. parseForEvent ( )
118
111
return nativeInput
119
112
} )
120
- let abiInputs = inputs != nil ? inputs! : [ ABI . Element. Event. Input] ( )
121
- let name = abiRecord. name != nil ? abiRecord . name! : " "
122
- let anonymous = abiRecord. anonymous != nil ? abiRecord . anonymous! : false
113
+ let abiInputs = inputs ?? [ ABI . Element. Event. Input] ( )
114
+ let name = abiRecord. name ?? " "
115
+ let anonymous = abiRecord. anonymous ?? false
123
116
let functionElement = ABI . Element. Event ( name: name, inputs: abiInputs, anonymous: anonymous)
124
117
return functionElement
125
118
}
@@ -129,21 +122,25 @@ fileprivate func parseReceive(abiRecord: ABI.Record) throws -> ABI.Element.Recei
129
122
let nativeInput = try input. parse ( )
130
123
return nativeInput
131
124
} )
132
- let abiInputs = inputs != nil ? inputs! : [ ABI . Element. InOut] ( )
133
- var payable = false
134
- if ( abiRecord. payable != nil ) {
135
- payable = abiRecord. payable!
136
- }
137
- if ( abiRecord. stateMutability == " payable " ) {
138
- payable = true
139
- }
125
+ let abiInputs = inputs ?? [ ABI . Element. InOut] ( )
126
+ let payable = abiRecord. stateMutability == " payable " || abiRecord. payable == true
140
127
let functionElement = ABI . Element. Receive ( inputs: abiInputs, payable: payable)
141
128
return functionElement
142
129
}
143
130
131
+ fileprivate func parseError( abiRecord: ABI . Record ) throws -> ABI . Element . EthError {
132
+ let inputs = try abiRecord. inputs? . map ( { ( input: ABI . Input ) throws -> ABI . Element . EthError . Input in
133
+ let nativeInput = try input. parseForError ( )
134
+ return nativeInput
135
+ } )
136
+ let abiInputs = inputs ?? [ ]
137
+ let name = abiRecord. name ?? " "
138
+ return ABI . Element. EthError ( name: name, inputs: abiInputs)
139
+ }
140
+
144
141
extension ABI . Input {
145
142
func parse( ) throws -> ABI . Element . InOut {
146
- let name = self . name != nil ? self . name! : " "
143
+ let name = self . name ?? " "
147
144
let parameterType = try ABITypeParser . parseTypeString ( self . type)
148
145
if case . tuple( types: _) = parameterType {
149
146
let components = try self . components? . compactMap ( { ( inp: ABI . Input ) throws -> ABI . Element . ParameterType in
@@ -171,12 +168,18 @@ extension ABI.Input {
171
168
}
172
169
}
173
170
174
- func parseForEvent( ) throws -> ABI . Element . Event . Input {
175
- let name = self . name != nil ? self . name! : " "
171
+ func parseForEvent( ) throws -> ABI . Element . Event . Input {
172
+ let name = self . name ?? " "
176
173
let parameterType = try ABITypeParser . parseTypeString ( self . type)
177
174
let indexed = self . indexed == true
178
175
return ABI . Element. Event. Input ( name: name, type: parameterType, indexed: indexed)
179
176
}
177
+
178
+ func parseForError( ) throws -> ABI . Element . EthError . Input {
179
+ let name = self . name ?? " "
180
+ let parameterType = try ABITypeParser . parseTypeString ( self . type)
181
+ return ABI . Element. EthError. Input ( name: name, type: parameterType)
182
+ }
180
183
}
181
184
182
185
extension ABI . Output {
0 commit comments