@@ -17,7 +17,6 @@ extension ABIDecoder {
17
17
}
18
18
19
19
public static func decode( types: [ ABI . Element . ParameterType ] , data: Data ) -> [ AnyObject ] ? {
20
- // print("Full data: \n" + data.toHexString())
21
20
var toReturn = [ AnyObject] ( )
22
21
var consumed : UInt64 = 0
23
22
for i in 0 ..< types. count {
@@ -37,34 +36,26 @@ extension ABIDecoder {
37
36
}
38
37
switch type {
39
38
case . uint( let bits) :
40
- // print("Uint256 element itself: \n" + elementItself.toHexString())
41
39
guard elementItself. count >= 32 else { break }
42
40
let mod = BigUInt ( 1 ) << bits
43
41
let dataSlice = elementItself [ 0 ..< 32 ]
44
42
let v = BigUInt ( dataSlice) % mod
45
- // print("Uint256 element is: \n" + String(v))
46
43
return ( v as AnyObject , type. memoryUsage)
47
44
case . int( let bits) :
48
- // print("Int256 element itself: \n" + elementItself.toHexString())
49
45
guard elementItself. count >= 32 else { break }
50
46
let mod = BigInt ( 1 ) << bits
51
47
let dataSlice = elementItself [ 0 ..< 32 ]
52
48
let v = BigInt . fromTwosComplement ( data: dataSlice) % mod
53
- // print("Int256 element is: \n" + String(v))
54
49
return ( v as AnyObject , type. memoryUsage)
55
50
case . address:
56
- // print("Address element itself: \n" + elementItself.toHexString())
57
51
guard elementItself. count >= 32 else { break }
58
52
let dataSlice = elementItself [ 12 ..< 32 ]
59
53
let address = EthereumAddress ( dataSlice)
60
- // print("Address element is: \n" + String(address.address))
61
54
return ( address as AnyObject , type. memoryUsage)
62
55
case . bool:
63
- // print("Bool element itself: \n" + elementItself.toHexString())
64
56
guard elementItself. count >= 32 else { break }
65
57
let dataSlice = elementItself [ 0 ..< 32 ]
66
58
let v = BigUInt ( dataSlice)
67
- // print("Address element is: \n" + String(v))
68
59
if v == BigUInt ( 36 ) ||
69
60
v == BigUInt ( 32 ) ||
70
61
v == BigUInt ( 28 ) ||
@@ -77,34 +68,27 @@ extension ABIDecoder {
77
68
return ( false as AnyObject , type. memoryUsage)
78
69
}
79
70
case . bytes( let length) :
80
- // print("Bytes32 element itself: \n" + elementItself.toHexString())
81
71
guard elementItself. count >= 32 else { break }
82
72
let dataSlice = elementItself [ 0 ..< length]
83
- // print("Bytes32 element is: \n" + String(dataSlice.toHexString()))
84
73
return ( dataSlice as AnyObject , type. memoryUsage)
85
74
case . string:
86
- // print("String element itself: \n" + elementItself.toHexString())
87
75
guard elementItself. count >= 32 else { break }
88
76
var dataSlice = elementItself [ 0 ..< 32 ]
89
77
let length = UInt64 ( BigUInt ( dataSlice) )
90
78
guard elementItself. count >= 32 + length else { break }
91
79
dataSlice = elementItself [ 32 ..< 32 + length]
92
80
guard let string = String ( data: dataSlice, encoding: . utf8) else { break }
93
- // print("String element is: \n" + String(string))
94
81
return ( string as AnyObject , type. memoryUsage)
95
82
case . dynamicBytes:
96
- // print("Bytes element itself: \n" + elementItself.toHexString())
97
83
guard elementItself. count >= 32 else { break }
98
84
var dataSlice = elementItself [ 0 ..< 32 ]
99
85
let length = UInt64 ( BigUInt ( dataSlice) )
100
86
guard elementItself. count >= 32 + length else { break }
101
87
dataSlice = elementItself [ 32 ..< 32 + length]
102
- // print("Bytes element is: \n" + String(dataSlice.toHexString()))
103
88
return ( dataSlice as AnyObject , type. memoryUsage)
104
89
case . array( type: let subType, length: let length) :
105
90
switch type. arraySize {
106
91
case . dynamicSize:
107
- // print("Dynamic array element itself: \n" + elementItself.toHexString())
108
92
if subType. isStatic {
109
93
// uint[] like, expect length and elements
110
94
guard elementItself. count >= 32 else { break }
@@ -130,7 +114,6 @@ extension ABIDecoder {
130
114
dataSlice = Data ( elementItself [ 32 ..< elementItself. count] )
131
115
var subpointer : UInt64 = 0
132
116
var toReturn = [ AnyObject] ( )
133
- // print("Dynamic array sub element itself: \n" + dataSlice.toHexString())
134
117
for _ in 0 ..< length {
135
118
let ( v, c) = decodeSingleType ( type: subType, data: dataSlice, pointer: subpointer)
136
119
guard let valueUnwrapped = v, let consumedUnwrapped = c else { break }
@@ -145,7 +128,6 @@ extension ABIDecoder {
145
128
return ( toReturn as AnyObject , nextElementPointer)
146
129
}
147
130
case . staticSize( let staticLength) :
148
- // print("Static array element itself: \n" + elementItself.toHexString())
149
131
guard length == staticLength else { break }
150
132
var toReturn = [ AnyObject] ( )
151
133
var consumed : UInt64 = 0
@@ -164,16 +146,16 @@ extension ABIDecoder {
164
146
break
165
147
}
166
148
case . tuple( types: let subTypes) :
167
- // print("Tuple element itself: \n" + elementItself.toHexString())
168
149
var toReturn = [ AnyObject] ( )
169
150
var consumed : UInt64 = 0
170
151
for i in 0 ..< subTypes. count {
171
152
let ( v, c) = decodeSingleType ( type: subTypes [ i] , data: elementItself, pointer: consumed)
172
153
guard let valueUnwrapped = v, let consumedUnwrapped = c else { return ( nil , nil ) }
173
154
toReturn. append ( valueUnwrapped)
174
- /*
175
- When decoding a tuple that is not static or an array with a subtype that is not static, the second value in the tuple returned by decodeSignleType is a pointer to the next element, NOT the length of the consumed element. So when decoding such an element, consumed should be set to consumedUnwrapped, NOT incremented by consumedUnwrapped.
176
- */
155
+ // When decoding a tuple that is not static or an array with a subtype that is not static,
156
+ // the second value in the tuple returned by decodeSignleType is a pointer to the next element,
157
+ // NOT the length of the consumed element. So when decoding such an element, consumed should
158
+ // be set to consumedUnwrapped, NOT incremented by consumedUnwrapped.
177
159
switch subTypes [ i] {
178
160
case . array( type: let subType, length: _) :
179
161
if !subType. isStatic {
@@ -191,31 +173,24 @@ extension ABIDecoder {
191
173
consumed = consumed + consumedUnwrapped
192
174
}
193
175
}
194
- // print("Tuple element is: \n" + String(describing: toReturn))
195
176
if type. isStatic {
196
177
return ( toReturn as AnyObject , consumed)
197
178
} else {
198
179
return ( toReturn as AnyObject , nextElementPointer)
199
180
}
200
181
case . function:
201
- // print("Function element itself: \n" + elementItself.toHexString())
202
182
guard elementItself. count >= 32 else { break }
203
183
let dataSlice = elementItself [ 8 ..< 32 ]
204
- // print("Function element is: \n" + String(dataSlice.toHexString()))
205
184
return ( dataSlice as AnyObject , type. memoryUsage)
206
185
}
207
186
return ( nil , nil )
208
187
}
209
188
210
189
fileprivate static func followTheData( type: ABI . Element . ParameterType , data: Data , pointer: UInt64 = 0 ) -> ( elementEncoding: Data ? , nextElementPointer: UInt64 ? ) {
211
- // print("Follow the data: \n" + data.toHexString())
212
- // print("At pointer: \n" + String(pointer))
213
190
if type. isStatic {
214
191
guard data. count >= pointer + type. memoryUsage else { return ( nil , nil ) }
215
192
let elementItself = data [ pointer ..< pointer + type. memoryUsage]
216
193
let nextElement = pointer + type. memoryUsage
217
- // print("Got element itself: \n" + elementItself.toHexString())
218
- // print("Next element pointer: \n" + String(nextElement))
219
194
return ( Data ( elementItself) , nextElement)
220
195
} else {
221
196
guard data. count >= pointer + type. memoryUsage else { return ( nil , nil ) }
@@ -237,8 +212,6 @@ extension ABIDecoder {
237
212
let elementPointer = UInt64 ( bn)
238
213
let elementItself = data [ elementPointer ..< UInt64 ( data. count) ]
239
214
let nextElement = pointer + type. memoryUsage
240
- // print("Got element itself: \n" + elementItself.toHexString())
241
- // print("Next element pointer: \n" + String(nextElement))
242
215
return ( Data ( elementItself) , nextElement)
243
216
}
244
217
}
0 commit comments