Fix ABI encoding of tuples

Offset of dynamic elements is relative to the start of the tuple,
not relative to the start of the element.
This commit is contained in:
Mark Spanbroek 2021-02-23 11:32:41 +01:00
parent 763a758b0a
commit 38a6e6ab95
2 changed files with 9 additions and 8 deletions

View File

@ -8,6 +8,7 @@ type
bytes: seq[byte]
tuples: seq[Tuple]
Tuple = object
start: int
postponed: seq[Split]
Split = object
head: Slice[int]
@ -66,12 +67,12 @@ proc write*(writer: var AbiWriter, address: EthAddress) =
writer.padleft(address.toArray)
proc startTuple*(writer: var AbiWriter) =
writer.tuples.add(Tuple())
writer.tuples.add(Tuple(start: writer.bytes.len))
proc finishTuple*(writer: var AbiWriter) =
let tupl = writer.tuples.pop()
for split in tupl.postponed:
let offset = writer.bytes.len - split.head.a
let offset = writer.bytes.len - tupl.start
writer.bytes[split.head] = Abi.encode(offset.uint64)
writer.bytes.add(split.tail)

View File

@ -80,9 +80,9 @@ suite "ABI encoding":
writer.finishTuple()
check writer.finish() ==
Abi.encode(a) &
Abi.encode(3 * 32'u8) & # offset in tuple
Abi.encode(4 * 32'u8) & # offset from start of tuple
Abi.encode(c) &
Abi.encode(3 * 32'u8) & # offset in tuple
Abi.encode(6 * 32'u8) & # offset from start of tuple
Abi.encode(b) &
Abi.encode(d)
@ -102,9 +102,9 @@ suite "ABI encoding":
writer.finishTuple()
check writer.finish() ==
Abi.encode(a) &
Abi.encode(5 * 32'u8) & # offset in tuple
Abi.encode(6 * 32'u8) & # offset from start of tuple
Abi.encode(c) &
Abi.encode(1 * 32'u8) & # offset in tuple
Abi.encode(2 * 32'u8) & # offset from start of tuple
Abi.encode(d) &
Abi.encode(b)
@ -136,7 +136,7 @@ suite "ABI encoding":
writer.write(s)
writer.finishTuple()
check writer.finish() ==
Abi.encode(32'u8) & # offset in tuple
Abi.encode(32'u8) & # offset from start of tuple
Abi.encode(s)
test "encodes array of static elements as static element":
@ -154,7 +154,7 @@ suite "ABI encoding":
writer.write(a)
writer.finishTuple()
check writer.finish() ==
Abi.encode(32'u8) & # offset in tuple
Abi.encode(32'u8) & # offset from start of tuple
Abi.encode(a)
# https://medium.com/b2expand/abi-encoding-explanation-4f470927092d