Skip to content

Commit 8fcc8e0

Browse files
committed
Refactor: handle multiple returns earlier
1 parent 5024576 commit 8fcc8e0

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

ethers/contract.nim

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,10 @@ proc createTransaction(contract: Contract,
7878
gasLimit: overrides.gasLimit,
7979
)
8080
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
8885
8986
proc call(provider: Provider,
9087
transaction: Transaction,
@@ -110,15 +107,14 @@ proc call(contract: Contract,
110107
function: string,
111108
parameters: tuple,
112109
ReturnType: type,
113-
returnMultiple: static bool,
114110
overrides = TransactionOverrides()): Future[ReturnType] {.async.} =
115111
var transaction = createTransaction(contract, function, parameters, overrides)
116112

117113
if signer =? contract.signer and transaction.`from`.isNone:
118114
transaction.`from` = some(await signer.getAddress())
119115

120116
let response = await contract.provider.call(transaction, overrides)
121-
return decodeResponse(ReturnType, returnMultiple, response)
117+
return decodeResponse(ReturnType, response)
122118

123119
proc send(contract: Contract,
124120
function: string,
@@ -170,18 +166,25 @@ func addContractCall(procedure: var NimNode) =
170166
let function = $basename(procedure[0])
171167
let parameters = getParameterTuple(procedure)
172168
let returnType = procedure[3][0]
173-
let returnMultiple = returnType.isMultipleReturn.newLit
174169

175170
procedure.addOverrides()
176171

177172
func call: NimNode =
178173
if returnType.kind == nnkEmpty:
179174
quote:
180175
await call(`contract`, `function`, `parameters`, overrides)
181-
else:
176+
elif returnType.isMultipleReturn:
182177
quote:
183178
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]
185188

186189
func send: NimNode =
187190
if returnType.kind == nnkEmpty:

0 commit comments

Comments
 (0)