Skip to main content

eth-pydantic-types

The types in this package are pydantic types for Ethereum inspired from eth-typing.

HexStr

When your model involves a string serializes to a hex-str, HexStr is the type to use. Examples of HexStr might be a hash.

Use HexStr in your models:

from pydantic import BaseModel
from eth_pydantic_types import HexStr, HexStr32


class TransactionData(BaseModel):
    hash_any_size: HexStr
    sized_hash: HexStr32


data = TransactionData(hash_any_size="0x123", sized_hash="0x000123")
assert isinstance(data.nonce, str)
assert isinstance(data.gas, str)

HexBytes

When your model involves bytes that serialize to a hex-str, HexBytes is the type to use. Examples of HexBytes might be a hash.

Use HexBytes in your models:

from pydantic import BaseModel
from eth_pydantic_types import HexBytes, HexBytes32


class TransactionData(BaseModel):
    hash_any_size: HexBytes
    sized_hash: HexBytes32


data = TransactionData(hash_any_size="0x123", sized_hash="0x000123")
assert isinstance(data.nonce, str)
assert isinstance(data.gas, str)

HexInt

When your model involves an integer that serializes to a hex-str, HexInt is the type to use. Examples of HexInt are transaction-type, nonce, and gas values.

Use HexInt in your models:

from pydantic import BaseModel
from eth_pydantic_types import HexInt


class TransactionData(BaseModel):
    nonce: HexInt
    gas: HexInt


data = TransactionData(nonce="0x123", gas="0x000123")
assert isinstance(data.nonce, int)
assert isinstance(data.gas, int)

Address

Use the Address class for working with checksummed-addresses. Addresses get validated and checksummed in model construction. Addresses serialize to str in the Pydantic core schema and string in the JSON schema with a binary format.

from pydantic import BaseModel
from eth_pydantic_types import Address


class Account(BaseModel):
    address: Address


# NOTE: The address ends up checksummed
#   ("0x0837207e343277CBd6c114a45EC0e9Ec56a1AD84")
account = Account(address="0x837207e343277cbd6c114a45ec0e9ec56a1ad84")

HexStr

Use hex str when you only care about un-sized hex strings. The HexStr type serializes to str in the Pydantic core schema and a string in the JSON schema with a binary format.

from eth_pydantic_types import HexStr
from pydantic import BaseModel


class Tx(BaseModel):
    data: HexStr


tx = Tx(data="0x0123")

Bip122Uri

Use BIP-122 URIs in your models by annotating with the Bip122Uri type. This type serializes to a str in the Pydantic core schema as well as a string in the JSON schema, however the individual hashes are validated.

from eth_pydantic_types import Bip122Uri
from pydantic import BaseModel


class Message(BaseModel):
    path: Bip122Uri


message = Message(
    path=(
        "blockchain://d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"
        "/block/752820c0ad7abc1200f9ad42c4adc6fbb4bd44b5bed4667990e64565102c1ba6"
    )
)

Custom Types

You can build your own hex types by subclassing and passing kwargs to the validators. For example, here is a 32-byte hash type without the 0x prefix:

from pydantic import BaseModel
from pydantic_core.core_schema import with_info_before_validator_function, str_schema

from eth_pydantic_types import HexStr32


class MyAddress(HexStr32):
    @classmethod
    def __get_pydantic_core_schema__(cls, value, handler=None):
        str_size = cls.size * 2
        return with_info_before_validator_function(
            cls.__eth_pydantic_validate__,
            str_schema(max_length=str_size, min_length=str_size),
        )

    @classmethod
    def __eth_pydantic_validate__(cls, value, info=None, **kwargs):
        return super().__eth_pydantic_validate__(value, info=info, prefixed=False, **kwargs)


class MyModel(BaseModel):
    address: MyAddress


model = MyModel(address="0x" + "ab" * 32)

Padding

For types like HexStr or HexBytes, you can control the padding by using @field_validator().

from pydantic import BaseModel, field_validator
from eth_pydantic_types import HexStr20, HexBytes20
from eth_pydantic_types.utils import Pad


class MyModel(BaseModel):
    my_str: HexStr20
    my_bytes: HexBytes20

    @field_validator("my_str", "my_bytes", mode="before")
    @classmethod
    def validate_value(cls, value, info):
        field_type = cls.model_fields[info.field_name].annotation
        return field_type.__eth_pydantic_validate__(value, pad=Pad.RIGHT)

Else, by default, if you validate integer values, it will pad left. Other inputs pad right. This mirrors Solidity types, like bytes32, that automatically pad-right when given smaller values. Integer and address types automatically pad-left.

Metadata

Release files for eth-pydantic-types 0.2.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for eth-pydantic-types 0.2.7
File Size Uploaded
eth_pydantic_types-0.2.7.tar.gz 71.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for eth-pydantic-types 0.2.7
File Interpreter ABI Platform
eth_pydantic_types-0.2.7-py3-none-any.whl Python 3 none any Details

Total release size: 90.5 kB

Release files / eth_pydantic_types-0.2.7.tar.gz

Download URL eth_pydantic_types-0.2.7.tar.gz
Size 71.1 kB
Tags Source
SHA-256 checksum
How to use checksums
09cd101649ffbded73f27a981473ba49ce18c5d5d5317d6d2eccca3c025e1b7c
BLAKE2b-256 checksum
How to use checksums
6d1847c3c624c00f30ebaec61bed66cb0252186054fa1613e5a7dd010d4067d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / eth_pydantic_types-0.2.7-py3-none-any.whl

Download URL eth_pydantic_types-0.2.7-py3-none-any.whl
Size 19.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c432878d3404901d3812d789f1a4969448cbfe3feef11c049749f3ae2a094d57
BLAKE2b-256 checksum
How to use checksums
2916d89325e20a51682081e2e7b5c842990bede7e45d7e8a56bc921a034b1dad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.7 This release

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.4

1 release file

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page