diff --git a/ethers/contract.nim b/ethers/contract.nim index d7b9d24..d73cb0f 100644 --- a/ethers/contract.nim +++ b/ethers/contract.nim @@ -138,6 +138,13 @@ func getParameterTuple(procedure: NimNode): NimNode = tupl.add name return tupl +func isGetter(procedure: NimNode): bool = + let pragmas = procedure[4] + for pragma in pragmas: + if pragma.eqIdent "getter": + return true + false + func isConstant(procedure: NimNode): bool = let pragmas = procedure[4] for pragma in pragmas: @@ -145,6 +152,8 @@ func isConstant(procedure: NimNode): bool = return true elif pragma.eqIdent "pure": return true + elif pragma.eqIdent "getter": + return true false func isMultipleReturn(returnType: NimNode): bool = @@ -166,6 +175,7 @@ func addContractCall(procedure: var NimNode) = let function = $basename(procedure[0]) let parameters = getParameterTuple(procedure) let returnType = procedure[3][0] + let isGetter = procedure.isGetter procedure.addOverrides() @@ -173,7 +183,7 @@ func addContractCall(procedure: var NimNode) = if returnType.kind == nnkEmpty: quote: await call(`contract`, `function`, `parameters`, overrides) - elif returnType.isMultipleReturn: + elif returnType.isMultipleReturn or isGetter: quote: return await call( `contract`, `function`, `parameters`, `returnType`, overrides @@ -193,7 +203,10 @@ func addContractCall(procedure: var NimNode) = else: quote: when typeof(result) isnot Confirmable: - {.error: "unexpected return type, missing {.view.} or {.pure.} ?".} + {.error: + "unexpected return type, " & + "missing {.view.}, {.pure.} or {.getter.} ?" + .} return await send(`contract`, `function`, `parameters`, overrides) procedure[6] = @@ -229,6 +242,7 @@ macro contract*(procedure: untyped{nkProcDef|nkMethodDef}): untyped = template view* {.pragma.} template pure* {.pragma.} +template getter* {.pragma.} proc subscribe*[E: Event](contract: Contract, _: type E, diff --git a/testmodule/testReturns.nim b/testmodule/testReturns.nim index 09d4a60..2893f33 100644 --- a/testmodule/testReturns.nim +++ b/testmodule/testReturns.nim @@ -53,3 +53,11 @@ suite "Contract return values": let values = await contract.getDynamics() check values.a == ("1", 2.u256) check values.b == ("3", 4.u256) + + test "handles static size struct as a public state variable": + proc staticVariable(contract: TestReturns): Static {.contract, getter.} + check (await contract.staticVariable()) == (1.u256, 2.u256) + + test "handles dynamic size struct as a public state variable": + proc dynamicVariable(contract: TestReturns): Dynamic {.contract, getter.} + check (await contract.dynamicVariable()) == ("3", 4.u256) diff --git a/testnode/contracts/TestReturns.sol b/testnode/contracts/TestReturns.sol index bf36853..8a17bab 100644 --- a/testnode/contracts/TestReturns.sol +++ b/testnode/contracts/TestReturns.sol @@ -11,6 +11,9 @@ contract TestReturns { uint256 b; } + StaticStruct public staticVariable = StaticStruct(1, 2); + DynamicStruct public dynamicVariable = DynamicStruct("3", 4); + function getStatic() external pure returns (StaticStruct memory) { return StaticStruct(1, 2); }