mirror of
https://github.com/logos-storage/nim-nitro.git
synced 2026-01-11 01:53:08 +00:00
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:
parent
763a758b0a
commit
38a6e6ab95
@ -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)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user