@@ -34,27 +34,28 @@ extension ABIDecoder {
34
34
guard let elementItself = elData, let nextElementPointer = nextPtr else {
35
35
return ( nil , nil )
36
36
}
37
+ let startIndex = UInt64 ( elementItself. startIndex)
37
38
switch type {
38
39
case . uint( let bits) :
39
40
guard elementItself. count >= 32 else { break }
40
41
let mod = BigUInt ( 1 ) << bits
41
- let dataSlice = elementItself [ 0 ..< 32 ]
42
+ let dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
42
43
let v = BigUInt ( dataSlice) % mod
43
44
return ( v, type. memoryUsage)
44
45
case . int( let bits) :
45
46
guard elementItself. count >= 32 else { break }
46
47
let mod = BigInt ( 1 ) << bits
47
- let dataSlice = elementItself [ 0 ..< 32 ]
48
+ let dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
48
49
let v = BigInt . fromTwosComplement ( data: dataSlice) % mod
49
50
return ( v, type. memoryUsage)
50
51
case . address:
51
52
guard elementItself. count >= 32 else { break }
52
- let dataSlice = elementItself [ 12 ..< 32 ]
53
+ let dataSlice = elementItself [ startIndex + 12 ..< startIndex + 32 ]
53
54
let address = EthereumAddress ( dataSlice)
54
55
return ( address, type. memoryUsage)
55
56
case . bool:
56
57
guard elementItself. count >= 32 else { break }
57
- let dataSlice = elementItself [ 0 ..< 32 ]
58
+ let dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
58
59
let v = BigUInt ( dataSlice)
59
60
if v == BigUInt ( 36 ) ||
60
61
v == BigUInt ( 32 ) ||
@@ -69,33 +70,33 @@ extension ABIDecoder {
69
70
}
70
71
case . bytes( let length) :
71
72
guard elementItself. count >= 32 else { break }
72
- let dataSlice = elementItself [ 0 ..< length]
73
- return ( dataSlice, type. memoryUsage)
73
+ let dataSlice = elementItself [ startIndex ..< startIndex + length]
74
+ return ( Data ( dataSlice) , type. memoryUsage)
74
75
case . string:
75
76
guard elementItself. count >= 32 else { break }
76
- var dataSlice = elementItself [ 0 ..< 32 ]
77
+ var dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
77
78
let length = UInt64 ( BigUInt ( dataSlice) )
78
- guard elementItself. count >= 32 + length else { break }
79
+ guard elementItself. count >= 32 + length else { break }
79
80
dataSlice = elementItself [ 32 ..< 32 + length]
80
81
guard let string = String ( data: dataSlice, encoding: . utf8) else { break }
81
82
return ( string, type. memoryUsage)
82
83
case . dynamicBytes:
83
84
guard elementItself. count >= 32 else { break }
84
- var dataSlice = elementItself [ 0 ..< 32 ]
85
+ var dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
85
86
let length = UInt64 ( BigUInt ( dataSlice) )
86
- guard elementItself. count >= 32 + length else { break }
87
- dataSlice = elementItself [ 32 ..< 32 + length]
88
- return ( dataSlice, nextElementPointer)
87
+ guard elementItself. count >= 32 + length else { break }
88
+ dataSlice = elementItself [ startIndex + 32 ..< startIndex + 32 + length]
89
+ return ( Data ( dataSlice) , nextElementPointer)
89
90
case . array( type: let subType, length: let length) :
90
91
switch type. arraySize {
91
92
case . dynamicSize:
92
93
if subType. isStatic {
93
94
// uint[] like, expect length and elements
94
95
guard elementItself. count >= 32 else { break }
95
- var dataSlice = elementItself [ 0 ..< 32 ]
96
+ var dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
96
97
let length = UInt64 ( BigUInt ( dataSlice) )
97
98
guard elementItself. count >= 32 + subType. memoryUsage*length else { break }
98
- dataSlice = elementItself [ 32 ..< 32 + subType. memoryUsage*length]
99
+ dataSlice = elementItself [ startIndex + 32 ..< startIndex + 32 + subType. memoryUsage*length]
99
100
var subpointer : UInt64 = 32
100
101
var toReturn = [ Any] ( )
101
102
for _ in 0 ..< length {
@@ -108,10 +109,10 @@ extension ABIDecoder {
108
109
} else {
109
110
// in principle is true for tuple[], so will work for string[] too
110
111
guard elementItself. count >= 32 else { break }
111
- var dataSlice = elementItself [ 0 ..< 32 ]
112
+ var dataSlice = elementItself [ startIndex ..< startIndex + 32 ]
112
113
let length = UInt64 ( BigUInt ( dataSlice) )
113
114
guard elementItself. count >= 32 else { break }
114
- dataSlice = Data ( elementItself [ 32 ..< elementItself. count] )
115
+ dataSlice = Data ( elementItself [ startIndex + 32 ..< UInt64 ( elementItself. count) ] )
115
116
var subpointer : UInt64 = 0
116
117
var toReturn = [ Any] ( )
117
118
for _ in 0 ..< length {
@@ -179,21 +180,21 @@ extension ABIDecoder {
179
180
}
180
181
case . function:
181
182
guard elementItself. count >= 32 else { break }
182
- let dataSlice = elementItself [ 8 ..< 32 ]
183
- return ( dataSlice, type. memoryUsage)
183
+ let dataSlice = elementItself [ startIndex + 8 ..< startIndex + 32 ]
184
+ return ( Data ( dataSlice) , type. memoryUsage)
184
185
}
185
186
return ( nil , nil )
186
187
}
187
188
188
189
fileprivate static func followTheData( type: ABI . Element . ParameterType , data: Data , pointer: UInt64 = 0 ) -> ( elementEncoding: Data ? , nextElementPointer: UInt64 ? ) {
189
190
if type. isStatic {
190
191
guard data. count >= pointer + type. memoryUsage else { return ( nil , nil ) }
191
- let elementItself = data [ pointer ..< pointer + type. memoryUsage]
192
+ let elementItself = data [ data . startIndex + Int ( pointer) ..< data . startIndex + Int ( pointer + type. memoryUsage) ]
192
193
let nextElement = pointer + type. memoryUsage
193
194
return ( Data ( elementItself) , nextElement)
194
195
} else {
195
196
guard data. count >= pointer + type. memoryUsage else { return ( nil , nil ) }
196
- let dataSlice = data [ pointer ..< pointer + type. memoryUsage]
197
+ let dataSlice = data [ data . startIndex + Int ( pointer) ..< data . startIndex + Int ( pointer + type. memoryUsage) ]
197
198
let bn = BigUInt ( dataSlice)
198
199
if bn > UInt64 . max || bn >= data. count {
199
200
// there are ERC20 contracts that use bytes32 instead of string. Let's be optimistic and return some data
@@ -209,7 +210,8 @@ extension ABIDecoder {
209
210
return ( nil , nil )
210
211
}
211
212
let elementPointer = UInt64 ( bn)
212
- let elementItself = data [ elementPointer ..< UInt64 ( data. count) ]
213
+ let startIndex = UInt64 ( data. startIndex)
214
+ let elementItself = data [ startIndex + elementPointer ..< startIndex + UInt64( data. count) ]
213
215
let nextElement = pointer + type. memoryUsage
214
216
return ( Data ( elementItself) , nextElement)
215
217
}
0 commit comments