mirror of
https://github.com/status-im/nim-ethers.git
synced 2025-02-17 09:36:34 +00:00
Refactor: handle multiple returns earlier
This commit is contained in:
parent
942fe034fc
commit
b78463a299
@ -78,13 +78,10 @@ proc createTransaction(contract: Contract,
|
|||||||
gasLimit: overrides.gasLimit,
|
gasLimit: overrides.gasLimit,
|
||||||
)
|
)
|
||||||
|
|
||||||
proc decodeResponse(T: type, multiple: static bool, bytes: seq[byte]): T =
|
proc decodeResponse(T: type, bytes: seq[byte]): T =
|
||||||
when multiple:
|
without decoded =? AbiDecoder.decode(bytes, T):
|
||||||
without decoded =? AbiDecoder.decode(bytes, T):
|
raiseContractError "unable to decode return value as " & $T
|
||||||
raiseContractError "unable to decode return value as " & $T
|
return decoded
|
||||||
return decoded
|
|
||||||
else:
|
|
||||||
return decodeResponse((T,), true, bytes)[0]
|
|
||||||
|
|
||||||
proc call(provider: Provider,
|
proc call(provider: Provider,
|
||||||
transaction: Transaction,
|
transaction: Transaction,
|
||||||
@ -110,7 +107,6 @@ proc call(contract: Contract,
|
|||||||
function: string,
|
function: string,
|
||||||
parameters: tuple,
|
parameters: tuple,
|
||||||
ReturnType: type,
|
ReturnType: type,
|
||||||
returnMultiple: static bool,
|
|
||||||
overrides = TransactionOverrides()): Future[ReturnType] {.async.} =
|
overrides = TransactionOverrides()): Future[ReturnType] {.async.} =
|
||||||
var transaction = createTransaction(contract, function, parameters, overrides)
|
var transaction = createTransaction(contract, function, parameters, overrides)
|
||||||
|
|
||||||
@ -118,7 +114,7 @@ proc call(contract: Contract,
|
|||||||
transaction.sender = some(await signer.getAddress())
|
transaction.sender = some(await signer.getAddress())
|
||||||
|
|
||||||
let response = await contract.provider.call(transaction, overrides)
|
let response = await contract.provider.call(transaction, overrides)
|
||||||
return decodeResponse(ReturnType, returnMultiple, response)
|
return decodeResponse(ReturnType, response)
|
||||||
|
|
||||||
proc send(contract: Contract,
|
proc send(contract: Contract,
|
||||||
function: string,
|
function: string,
|
||||||
@ -170,7 +166,6 @@ func addContractCall(procedure: var NimNode) =
|
|||||||
let function = $basename(procedure[0])
|
let function = $basename(procedure[0])
|
||||||
let parameters = getParameterTuple(procedure)
|
let parameters = getParameterTuple(procedure)
|
||||||
let returnType = procedure[3][0]
|
let returnType = procedure[3][0]
|
||||||
let returnMultiple = returnType.isMultipleReturn.newLit
|
|
||||||
|
|
||||||
procedure.addOverrides()
|
procedure.addOverrides()
|
||||||
|
|
||||||
@ -178,10 +173,18 @@ func addContractCall(procedure: var NimNode) =
|
|||||||
if returnType.kind == nnkEmpty:
|
if returnType.kind == nnkEmpty:
|
||||||
quote:
|
quote:
|
||||||
await call(`contract`, `function`, `parameters`, overrides)
|
await call(`contract`, `function`, `parameters`, overrides)
|
||||||
else:
|
elif returnType.isMultipleReturn:
|
||||||
quote:
|
quote:
|
||||||
return await call(
|
return await call(
|
||||||
`contract`, `function`, `parameters`, `returnType`, `returnMultiple`, overrides)
|
`contract`, `function`, `parameters`, `returnType`, overrides
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
quote:
|
||||||
|
# solidity functions return a tuple, so wrap return type in a tuple
|
||||||
|
let tupl = await call(
|
||||||
|
`contract`, `function`, `parameters`, (`returnType`,), overrides
|
||||||
|
)
|
||||||
|
return tupl[0]
|
||||||
|
|
||||||
func send: NimNode =
|
func send: NimNode =
|
||||||
if returnType.kind == nnkEmpty:
|
if returnType.kind == nnkEmpty:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user