Skip to content

Commit 2e37d03

Browse files
authored
Merge pull request #95 from BANKEX/develop
Implement decoding of input data for ABIv2 bound contracts
2 parents c4910a9 + 5dac4ab commit 2e37d03

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

web3swift/ABIv2/Classes/ABIv2Elements.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,65 @@ extension ABIv2.Element {
141141
return returnArray
142142
}
143143
}
144+
145+
func decodeInputData(_ data: Data) -> [String: Any]? {
146+
switch self {
147+
case .constructor(let function):
148+
if (data.count == 0 && function.inputs.count == 1) {
149+
let name = "0"
150+
let value = function.inputs[0].type.emptyValue
151+
var returnArray = [String:Any]()
152+
returnArray[name] = value
153+
if function.inputs[0].name != "" {
154+
returnArray[function.inputs[0].name] = value
155+
}
156+
return returnArray
157+
}
158+
159+
guard function.inputs.count*32 <= data.count else {return nil}
160+
var returnArray = [String:Any]()
161+
var i = 0;
162+
guard let values = ABIv2Decoder.decode(types: function.inputs, data: data) else {return nil}
163+
for input in function.inputs {
164+
let name = "\(i)"
165+
returnArray[name] = values[i]
166+
if input.name != "" {
167+
returnArray[input.name] = values[i]
168+
}
169+
i = i + 1
170+
}
171+
return returnArray
172+
case .event(_):
173+
return nil
174+
case .fallback(_):
175+
return nil
176+
case .function(let function):
177+
if (data.count == 0 && function.inputs.count == 1) {
178+
let name = "0"
179+
let value = function.inputs[0].type.emptyValue
180+
var returnArray = [String:Any]()
181+
returnArray[name] = value
182+
if function.inputs[0].name != "" {
183+
returnArray[function.inputs[0].name] = value
184+
}
185+
return returnArray
186+
}
187+
188+
guard function.inputs.count*32 <= data.count else {return nil}
189+
var returnArray = [String:Any]()
190+
var i = 0;
191+
guard let values = ABIv2Decoder.decode(types: function.inputs, data: data) else {return nil}
192+
for input in function.inputs {
193+
let name = "\(i)"
194+
returnArray[name] = values[i]
195+
if input.name != "" {
196+
returnArray[input.name] = values[i]
197+
}
198+
i = i + 1
199+
}
200+
return returnArray
201+
}
202+
}
144203
}
145204

146205
extension ABIv2.Element.Event {

web3swift/Contract/Classes/Contract.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,8 @@ public struct Contract:ContractProtocol {
206206
public func testBloomForEventPrecence(eventName: String, bloom: EthereumBloomFilter) -> Bool? {
207207
return false
208208
}
209+
210+
public func decodeInputData(_ method: String, data: Data) -> [String : Any]? {
211+
return nil
212+
}
209213
}

web3swift/Contract/Classes/ContractABIv2.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,4 +228,19 @@ public struct ContractV2:ContractProtocol {
228228
guard case .function(_) = function else {return nil}
229229
return function.decodeReturnData(data)
230230
}
231+
232+
public func decodeInputData(_ method: String, data: Data) -> [String : Any]? {
233+
if method == "fallback" {
234+
return [String:Any]()
235+
}
236+
guard let function = methods[method] else {return nil}
237+
switch function {
238+
case .function(_):
239+
return function.decodeInputData(data)
240+
case .constructor(_):
241+
return function.decodeInputData(data)
242+
default:
243+
return [String:Any]()
244+
}
245+
}
231246
}

web3swift/Contract/Classes/ContractProtocol.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public protocol ContractProtocol {
1717
func method(_ method:String, parameters: [AnyObject], extraData: Data, options: Web3Options?) -> EthereumTransaction?
1818
init?(_ abiString: String, at: EthereumAddress?)
1919
func decodeReturnData(_ method:String, data: Data) -> [String:Any]?
20+
func decodeInputData(_ method:String, data: Data) -> [String:Any]?
2021
func parseEvent(_ eventLog: EventLog) -> (eventName:String?, eventData:[String:Any]?)
2122
func testBloomForEventPrecence(eventName: String, bloom: EthereumBloomFilter) -> Bool?
2223
// func createEventFilter(eventName:String, filter: EventFilter?)

0 commit comments

Comments
 (0)