Skip to content

Commit 38e24e1

Browse files
committed
Handle getter functions for public state variables
Getter functions that are generated by the solidity compiler do not wrap their return value in a tuple like other functions do.
1 parent 8fcc8e0 commit 38e24e1

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

ethers/contract.nim

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,22 @@ func getParameterTuple(procedure: NimNode): NimNode =
138138
tupl.add name
139139
return tupl
140140

141+
func isGetter(procedure: NimNode): bool =
142+
let pragmas = procedure[4]
143+
for pragma in pragmas:
144+
if pragma.eqIdent "getter":
145+
return true
146+
false
147+
141148
func isConstant(procedure: NimNode): bool =
142149
let pragmas = procedure[4]
143150
for pragma in pragmas:
144151
if pragma.eqIdent "view":
145152
return true
146153
elif pragma.eqIdent "pure":
147154
return true
155+
elif pragma.eqIdent "getter":
156+
return true
148157
false
149158

150159
func isMultipleReturn(returnType: NimNode): bool =
@@ -166,14 +175,15 @@ func addContractCall(procedure: var NimNode) =
166175
let function = $basename(procedure[0])
167176
let parameters = getParameterTuple(procedure)
168177
let returnType = procedure[3][0]
178+
let isGetter = procedure.isGetter
169179

170180
procedure.addOverrides()
171181

172182
func call: NimNode =
173183
if returnType.kind == nnkEmpty:
174184
quote:
175185
await call(`contract`, `function`, `parameters`, overrides)
176-
elif returnType.isMultipleReturn:
186+
elif returnType.isMultipleReturn or isGetter:
177187
quote:
178188
return await call(
179189
`contract`, `function`, `parameters`, `returnType`, overrides
@@ -193,7 +203,10 @@ func addContractCall(procedure: var NimNode) =
193203
else:
194204
quote:
195205
when typeof(result) isnot Confirmable:
196-
{.error: "unexpected return type, missing {.view.} or {.pure.} ?".}
206+
{.error:
207+
"unexpected return type, " &
208+
"missing {.view.}, {.pure.} or {.getter.} ?"
209+
.}
197210
return await send(`contract`, `function`, `parameters`, overrides)
198211

199212
procedure[6] =
@@ -229,6 +242,7 @@ macro contract*(procedure: untyped{nkProcDef|nkMethodDef}): untyped =
229242

230243
template view* {.pragma.}
231244
template pure* {.pragma.}
245+
template getter* {.pragma.}
232246

233247
proc subscribe*[E: Event](contract: Contract,
234248
_: type E,

testmodule/testReturns.nim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,11 @@ suite "Contract return values":
5252
let values = await contract.getDynamics()
5353
check values.a == ("1", 2.u256)
5454
check values.b == ("3", 4.u256)
55+
56+
test "handles static size struct as a public state variable":
57+
proc staticVariable(contract: TestReturns): Static {.contract, getter.}
58+
check (await contract.staticVariable()) == (1.u256, 2.u256)
59+
60+
test "handles dynamic size struct as a public state variable":
61+
proc dynamicVariable(contract: TestReturns): Dynamic {.contract, getter.}
62+
check (await contract.dynamicVariable()) == ("3", 4.u256)

testnode/contracts/TestReturns.sol

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ contract TestReturns {
1111
uint256 b;
1212
}
1313

14+
StaticStruct public staticVariable = StaticStruct(1, 2);
15+
DynamicStruct public dynamicVariable = DynamicStruct("3", 4);
16+
1417
function getStatic() external pure returns (StaticStruct memory) {
1518
return StaticStruct(1, 2);
1619
}

0 commit comments

Comments
 (0)