Cartouche.Transaction.TypedDecode (Cartouche v0.5.0)

Copy Markdown View Source

Shared EIP-2718 typed-transaction envelope dispatch.

Every typed transaction (EIP-2930 V_2930, EIP-7702 V4, …) decodes the same way: match the leading type byte, RLP-decode the remaining payload, then hand the decoded field list to a type-specific decode_fields callback. This module owns that envelope contract so each decoder only declares its type byte, its error message, and how to turn the RLP list into its struct.

Summary

Types

EIP-2930 access list: {address, [storage_key]} pairs.

Functions

Dispatches a typed-transaction binary.

Decodes an RLP-decoded access list into {address, [storage_key]} tuples.

Left-pads a signature/word binary to a full 32-byte word.

Decodes an RLP y_parity field (0/1) into a boolean.

Types

access_list()

@type access_list() :: [{<<_::160>>, [<<_::256>>]}]

EIP-2930 access list: {address, [storage_key]} pairs.

Functions

decode(arg1, tx_type, invalid, decode_fields)

@spec decode(binary(), byte(), String.t(), (list() ->
                                        {:ok, term()} | {:error, String.t()})) ::
  {:ok, term()} | {:error, String.t()}

Dispatches a typed-transaction binary.

Matches the leading tx_type byte, RLP-decodes the rest (returning invalid on malformed RLP), and applies decode_fields to the decoded field list. Any other leading byte (or non-binary) yields {:error, invalid}.

decode_access_list(access_list, invalid)

@spec decode_access_list(term(), String.t()) ::
  {:ok, access_list()} | {:error, String.t()}

Decodes an RLP-decoded access list into {address, [storage_key]} tuples.

Each entry must be a [20-byte address, [32-byte storage_key, ...]] list; anything else yields {:error, invalid}. Shared by every typed transaction that carries an EIP-2930 access list (V_2930, V3, …).

decode_word(word, invalid)

@spec decode_word(binary(), String.t()) :: {:ok, <<_::256>>} | {:error, String.t()}

Left-pads a signature/word binary to a full 32-byte word.

Words longer than 32 bytes are rejected with {:error, invalid}.

decode_y_parity(y_parity, invalid)

@spec decode_y_parity(binary(), String.t()) :: {:ok, boolean()} | {:error, String.t()}

Decodes an RLP y_parity field (0/1) into a boolean.

Any other value — or a non-binary that :binary.decode_unsigned/1 rejects — yields {:error, invalid}.