Mark Spanbroek 46b1933aff Decoder: tuples do not have an offset, their elements do
No longer read offset when starting dynamic tuple,
read it when reading a dynamic element in a tuple.

Remove Tuple.dynamic, because it's no longer needed.
2021-12-02 11:13:50 +01:00
2021-11-25 09:33:40 +01:00
2021-11-30 15:14:57 +01:00
2021-12-01 11:55:16 +01:00

Contract ABI

Implements encoding of parameters according to the Ethereum Contract ABI Specification.

Installation

Use the Nimble package manager to add contractabi to an existing project. Add the following to its .nimble file:

requires "https://github.com/status-im/nim-contract-abi >= 0.1.0 & < 0.2.0"

Usage

import contractabi

# encode unsigned integers, booleans, enums
AbiEncoder.encode(42'u8)

# encode uint256
import stint
AbiEncoder.encode(42.u256)

# encode byte arrays and sequences
AbiEncoder.encode([1'u8, 2'u8, 3'u8])
AbiEncoder.encode(@[1'u8, 2'u8, 3'u8])

# encode tuples
AbiEncoder.encode( (42'u8, @[1'u8, 2'u8, 3'u8], true) )

# decode values of different types
AbiDecoder.decode(bytes, uint8)
AbiDecoder.decode(bytes, UInt256)
AbiDecoder.decode(bytes, array[3, uint8])
AbiDecoder.decode(bytes, seq[uint8])

# decode tuples
AbiDecoder.decode(bytes, (uint32, bool, seq[byte]) )

# add support for encoding of custom types
import questionable/results

type CustomType = object
  a: uint16
  b: string

func encode(encoder: var AbiEncoder, custom: CustomType) =
  encoder.write( (custom.a, custom.b) )

func decode(decoder: var AbiDecoder, T: type CustomType): ?!T =
  let (a, b) = ?decoder.read( (uint16, string) )
  success CustomType(a: a, b: b)

Description
Contract ABI Encoding
Readme
Languages
Nim 100%