@@ -78,13 +78,10 @@ proc createTransaction(contract: Contract,
78
78
gasLimit: overrides.gasLimit,
79
79
)
80
80
81
- proc decodeResponse(T: type , multiple: static bool , bytes: seq [byte ]): T =
82
- when multiple:
83
- without decoded =? AbiDecoder.decode(bytes, T):
84
- raiseContractError "unable to decode return value as " & $T
85
- return decoded
86
- else:
87
- return decodeResponse((T,), true, bytes)[ 0]
81
+ proc decodeResponse(T: type , bytes: seq [byte ]): T =
82
+ without decoded =? AbiDecoder.decode(bytes, T):
83
+ raiseContractError "unable to decode return value as " & $T
84
+ return decoded
88
85
89
86
proc call(provider: Provider,
90
87
transaction: Transaction,
@@ -110,15 +107,14 @@ proc call(contract: Contract,
110
107
function: string ,
111
108
parameters: tuple ,
112
109
ReturnType: type ,
113
- returnMultiple: static bool ,
114
110
overrides = TransactionOverrides()): Future[ReturnType] {.async.} =
115
111
var transaction = createTransaction(contract, function, parameters, overrides)
116
112
117
113
if signer =? contract.signer and transaction.`from`.isNone:
118
114
transaction.`from` = some(await signer.getAddress())
119
115
120
116
let response = await contract.provider.call(transaction, overrides)
121
- return decodeResponse(ReturnType, returnMultiple, response)
117
+ return decodeResponse(ReturnType, response)
122
118
123
119
proc send(contract: Contract,
124
120
function: string ,
@@ -170,18 +166,25 @@ func addContractCall(procedure: var NimNode) =
170
166
let function = $ basename(procedure[0 ])
171
167
let parameters = getParameterTuple(procedure)
172
168
let returnType = procedure[3 ][0 ]
173
- let returnMultiple = returnType.isMultipleReturn.newLit
174
169
175
170
procedure.addOverrides()
176
171
177
172
func call: NimNode =
178
173
if returnType.kind == nnkEmpty:
179
174
quote:
180
175
await call(`contract`, `function`, `parameters`, overrides)
181
- else :
176
+ elif returnType.isMultipleReturn :
182
177
quote:
183
178
return await call(
184
- `contract`, `function`, `parameters`, `returnType`, `returnMultiple`, overrides)
179
+ `contract`, `function`, `parameters`, `returnType`, overrides
180
+ )
181
+ else :
182
+ quote:
183
+ # solidity functions return a tuple, so wrap return type in a tuple
184
+ let tupl = await call(
185
+ `contract`, `function`, `parameters`, (`returnType`,), overrides
186
+ )
187
+ return tupl[0 ]
185
188
186
189
func send: NimNode =
187
190
if returnType.kind == nnkEmpty:
0 commit comments