diff --git a/nitro/abi.nim b/nitro/abi.nim index 2242b10..32eef1f 100644 --- a/nitro/abi.nim +++ b/nitro/abi.nim @@ -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) diff --git a/tests/nitro/testAbi.nim b/tests/nitro/testAbi.nim index 2da686c..0c02d95 100644 --- a/tests/nitro/testAbi.nim +++ b/tests/nitro/testAbi.nim @@ -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