Skip to main content

A library for deterministic concurrency testing that helps you reliably reproduce and test race conditions

Project description

Frontrun

A library for deterministic concurrency testing.

pip install frontrun

Overview

Frontrun is named after the insider trading crime where someone uses insider information to make a timed trade for maximum profit. The principle is the same here, except you use insider information about event ordering for maximum concurrency bugs.

The core problem: race conditions are hard to test because they depend on timing. A test that passes 95% of the time is worse than a test that always fails, because it breeds false confidence. Frontrun replaces timing-dependent thread interleaving with deterministic scheduling, so race conditions either always happen or never happen.

Three approaches, in order of decreasing interpretability:

  1. Trace markers — Comment-based synchronization points (# frontrun: marker_name) that let you force a specific execution order. Useful when you already know the race window and want to reproduce it deterministically in a test.

  2. DPOR — Systematically explores every meaningfully different interleaving. When it finds a race, it tells you exactly which shared-memory accesses conflicted and in what order. Powered by a Rust engine using vector clocks to prune redundant orderings.

  3. Bytecode exploration — Generates random opcode-level schedules and checks an invariant under each one. Often finds races very efficiently (sometimes on the first attempt), and can catch races that are invisible to DPOR (e.g. shared state inside C extensions). The trade-off: error traces show what happened but not why — you get the interleaving that broke the invariant, not a causal explanation.

All three have async variants. A C-level LD_PRELOAD library intercepts libc I/O for database drivers and other opaque extensions.

Quick Start: Bank Account Race Condition

A pytest test that uses trace markers to trigger a lost-update race:

from frontrun.common import Schedule, Step
from frontrun.trace_markers import TraceExecutor

class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance

    def transfer(self, amount):
        current = self.balance  # frontrun: read_balance
        new_balance = current + amount
        self.balance = new_balance  # frontrun: write_balance

def test_transfer_lost_update():
    account = BankAccount(balance=100)

    # Both threads read before either writes
    schedule = Schedule([
        Step("thread1", "read_balance"),    # T1 reads 100
        Step("thread2", "read_balance"),    # T2 reads 100 (both see same value!)
        Step("thread1", "write_balance"),   # T1 writes 150
        Step("thread2", "write_balance"),   # T2 writes 150 (overwrites T1's update!)
    ])

    executor = TraceExecutor(schedule)
    executor.run("thread1", lambda: account.transfer(50))
    executor.run("thread2", lambda: account.transfer(50))
    executor.wait(timeout=5.0)

    # One update was lost: balance is 150, not 200
    assert account.balance == 150

Case Studies

46 concurrency bugs found across 12 libraries by running bytecode exploration directly against unmodified library code: TPool, threadpoolctl, cachetools, PyDispatcher, pydis, pybreaker, urllib3, SQLAlchemy, amqtt, pykka, and tenacity. See detailed case studies.

Usage Approaches

1. Trace Markers

Trace markers are special comments (# frontrun: <marker-name>) that mark synchronization points in multithreaded or async code. A sys.settrace callback pauses each thread at its markers and waits for a schedule to grant the next execution turn. This gives deterministic control over execution order without modifying code semantics — markers are just comments.

A marker gates the code that follows it: the thread pauses at the marker and only executes the gated code after the scheduler says so. Name markers after the operation they gate (e.g. read_value, write_balance) rather than with temporal prefixes like before_ or after_.

from frontrun.common import Schedule, Step
from frontrun.trace_markers import TraceExecutor

class Counter:
    def __init__(self):
        self.value = 0

    def increment(self):
        temp = self.value  # frontrun: read_value
        temp += 1
        self.value = temp  # frontrun: write_value

def test_counter_lost_update():
    counter = Counter()

    schedule = Schedule([
        Step("thread1", "read_value"),
        Step("thread2", "read_value"),
        Step("thread1", "write_value"),
        Step("thread2", "write_value"),
    ])

    executor = TraceExecutor(schedule)
    executor.run("thread1", counter.increment)
    executor.run("thread2", counter.increment)
    executor.wait(timeout=5.0)

    assert counter.value == 1  # One increment lost

2. DPOR (Systematic Exploration)

DPOR (Dynamic Partial Order Reduction) systematically explores every meaningfully different thread interleaving. It automatically detects shared-memory accesses at the bytecode level — attribute reads/writes, subscript accesses, lock operations — and uses vector clocks to determine which orderings are equivalent. Two interleavings that differ only in the order of independent operations (two reads of different objects, say) produce the same outcome, so DPOR runs only one representative from each equivalence class.

When a race is found, the error trace shows the exact sequence of conflicting accesses and which threads were involved:

from frontrun.dpor import explore_dpor

class Counter:
    def __init__(self):
        self.value = 0

    def increment(self):
        temp = self.value
        self.value = temp + 1

def test_counter_is_atomic():
    result = explore_dpor(
        setup=Counter,
        threads=[lambda c: c.increment(), lambda c: c.increment()],
        invariant=lambda c: c.value == 2,
    )

    assert result.property_holds, result.explanation

This test fails because Counter.increment is not atomic. The result.explanation shows the conflict:

Race condition found after 2 interleavings.

  Write-write conflict: threads 0 and 1 both wrote to value.

  Thread 0 | counter.py:7             temp = self.value
           | [read Counter.value]
  Thread 0 | counter.py:8             self.value = temp + 1
           | [write Counter.value]
  Thread 1 | counter.py:7             temp = self.value
           | [read Counter.value]
  Thread 1 | counter.py:8             self.value = temp + 1
           | [write Counter.value]

  Reproduced 10/10 times (100%)

DPOR explored exactly 2 interleavings out of the 6 possible (the other 4 are equivalent to one of the first two). For a detailed walkthrough of how this works, see the DPOR algorithm documentation.

Scope and limitations: DPOR tracks Python bytecode-level conflicts (attribute and subscript reads/writes, lock operations) plus I/O. Redis key-level conflicts are detected by intercepting redis-py's execute_command() (sync; active with detect_io=True) or via detect_redis=True (async). SQL conflicts are detected by intercepting DBAPI cursor.execute(). These key/table-level detectors are important: raw socket detection uses host:port as the resource ID, so every send and recv to the same server appears to conflict — without key-level or SQL-level refinement this causes a combinatorial explosion of spurious interleavings. C-extension shared state (NumPy arrays, etc.) is not tracked at all. The frontrun CLI adds C-level socket interception via LD_PRELOAD for opaque drivers, also at the coarse host:port level.

3. Bytecode Exploration

Bytecode exploration generates random opcode-level schedules and checks an invariant under each one, in the style of Hypothesis. Each thread fires a sys.settrace callback at every bytecode instruction, pausing to wait for its scheduler turn. No markers or annotations needed.

explore_interleavings() often finds races very quickly — sometimes on the first attempt. It can also find races that are invisible to DPOR, because it doesn't need to understand why a schedule is bad; it just checks whether the invariant holds after the threads finish. If a C extension mutates shared state in a way that breaks your invariant, bytecode exploration will stumble into it. DPOR won't, because it can't see the C-level mutation.

The trade-off: error traces are less interpretable. You get the specific opcode schedule that broke the invariant and a best-effort interleaved source trace, but not the causal conflict analysis that DPOR provides.

from frontrun.bytecode import explore_interleavings

class Counter:
    def __init__(self, value=0):
        self.value = value

    def increment(self):
        temp = self.value
        self.value = temp + 1

def test_counter_is_atomic():
    result = explore_interleavings(
        setup=lambda: Counter(value=0),
        threads=[
            lambda c: c.increment(),
            lambda c: c.increment(),
        ],
        invariant=lambda c: c.value == 2,
        max_attempts=200,
        max_ops=200,
        seed=42,
    )

    assert result.property_holds, result.explanation

This fails with output like:

Race condition found after 1 interleavings.

  Lost update: threads 0 and 1 both read value before either wrote it back.

  Thread 1 | counter.py:7             temp = self.value
           | [read value]
  Thread 0 | counter.py:7             temp = self.value
           | [read value]
  Thread 1 | counter.py:8             self.value = temp + 1
           | [write value]
  Thread 0 | counter.py:8             self.value = temp + 1
           | [write value]

  Reproduced 10/10 times (100%)

The reproduce_on_failure parameter (default 10) controls how many times the counterexample schedule is replayed to measure reproducibility. Set to 0 to skip.

Note: Opcode-level schedules are not stable across Python versions. CPython does not guarantee bytecode compatibility between releases, so a counterexample from Python 3.12 may not reproduce on 3.13. Treat counterexample schedules as ephemeral debugging artifacts.

Automatic I/O Detection

Both the bytecode explorer and DPOR automatically detect socket and file I/O operations (enabled by default via detect_io=True). When two threads access the same network endpoint or file path, the operation is reported as a conflict so the scheduler explores their reorderings.

Python-level detection (monkey-patching):

  • Sockets: connect, send, sendall, sendto, recv, recv_into, recvfrom
  • Files: open() (read vs write determined by mode)

Resource identity is derived from the socket's peer address (host:port) or the file's resolved path — two threads hitting the same endpoint or file conflict; different endpoints are independent.

Redis Key-Level Conflict Detection

DPOR goes beyond coarse socket-level detection for Redis: it intercepts execute_command() on redis-py clients, classifies each command as a read or write on specific keys, and reports per-key resource IDs to the engine. Two threads operating on different Redis keys are independent; only operations on the same key (with at least one write) trigger interleaving exploration.

Sync DPOR — Redis patching is active automatically when detect_io=True (the default):

from frontrun.dpor import explore_dpor
import redis

def test_redis_counter_race(redis_port):
    class State:
        def __init__(self):
            r = redis.Redis(port=redis_port, decode_responses=True)
            r.set("counter", "0")
            r.close()

    def increment(state):
        r = redis.Redis(port=redis_port, decode_responses=True)
        val = int(r.get("counter"))
        r.set("counter", str(val + 1))
        r.close()

    result = explore_dpor(
        setup=State,
        threads=[increment, increment],
        invariant=lambda s: int(redis.Redis(port=redis_port).get("counter")) == 2,
        detect_io=True,   # default — activates Redis key-level patching
    )
    assert not result.property_holds  # DPOR finds the lost-update race

Async DPOR — pass detect_redis=True:

from frontrun.async_dpor import explore_async_dpor
import redis.asyncio as aioredis

async def test_async_redis_race(redis_port):
    async def increment(state):
        r = aioredis.Redis(port=redis_port, decode_responses=True)
        val = int(await r.get("counter"))
        await r.set("counter", str(val + 1))
        await r.aclose()

    result = await explore_async_dpor(
        setup=lambda: None,
        tasks=[increment, increment],
        invariant=lambda s: True,  # check Redis directly in a real test
        detect_redis=True,
    )

The same key-level precision applies to hashes (HGET/HSET), lists, sets, sorted sets, and all other Redis data structures — 160+ commands are classified. See the Redis technical details for a full walkthrough.

C-Level I/O Interception

When run under the frontrun CLI, a native LD_PRELOAD library (libfrontrun_io.so) intercepts libc I/O functions directly. This covers opaque C extensions — database drivers (libpq, mysqlclient), Redis clients, HTTP libraries, and anything else that calls libc's send(), recv(), read(), write(), etc.

Intercepted functions: connect, send, sendto, sendmsg, write, writev, recv, recvfrom, recvmsg, read, readv, close

The library maintains a process-global file-descriptor → resource map:

connect(fd, sockaddr{127.0.0.1:5432}, ...)  →  record fd=7 → "socket:127.0.0.1:5432"
send(fd=7, ...)                              →  report write to "socket:127.0.0.1:5432"
recv(fd=7, ...)                              →  report read from "socket:127.0.0.1:5432"
close(fd=7)                                  →  remove fd=7 from map

Events are transmitted to the Python side via one of two channels:

  • Pipe (preferred): IOEventDispatcher creates an os.pipe() and sets FRONTRUN_IO_FD to the write-end fd. The Rust library writes directly to the pipe (no open/close overhead per event), and a Python reader thread dispatches events to registered listener callbacks in arrival order. The pipe's FIFO ordering provides a natural total order without timestamps.
  • Log file (legacy): FRONTRUN_IO_LOG points to a temp file. Events are appended per-call (open + write + close each time) and read back in batch after execution.
from frontrun._preload_io import IOEventDispatcher

with IOEventDispatcher() as dispatcher:
    dispatcher.add_listener(lambda ev: print(f"{ev.kind} {ev.resource_id}"))
    # ... run code under LD_PRELOAD / DYLD_INSERT_LIBRARIES ...
# all events are also available as dispatcher.events

Trace Filtering (trace_packages)

By default, frontrun only traces user code — files outside the stdlib, site-packages, and frontrun's own internals. When the code under test lives inside an installed package (Django apps, plugin architectures, etc.), pass trace_packages to widen the filter:

from frontrun.dpor import explore_dpor

result = explore_dpor(
    setup=make_state,
    threads=[thread_a, thread_b],
    invariant=check_invariant,
    trace_packages=["mylib.*", "django_filters.*"],
)

Patterns use fnmatch syntax and are matched against dotted module names (e.g. django_filters.views). All exploration entry points (explore_dpor, explore_interleavings, and their async variants) accept this parameter. See trace filtering docs for details.

Async Support

Trace markers, random interleaving exploration, and DPOR all have async support.

Async Trace Markers

from frontrun import TraceExecutor
from frontrun.common import Schedule, Step

class AsyncCounter:
    def __init__(self):
        self.value = 0

    async def get_value(self):
        return self.value

    async def set_value(self, new_value):
        self.value = new_value

    async def increment(self):
        # frontrun: read_value
        temp = await self.get_value()
        # frontrun: write_value
        await self.set_value(temp + 1)

def test_async_counter_lost_update():
    counter = AsyncCounter()

    schedule = Schedule([
        Step("task1", "read_value"),
        Step("task2", "read_value"),
        Step("task1", "write_value"),
        Step("task2", "write_value"),
    ])

    executor = TraceExecutor(schedule)
    executor.run({
        "task1": counter.increment,
        "task2": counter.increment,
    })

    assert counter.value == 1  # One increment lost

Async Bytecode Exploration

Async shuffler exploration works at natural await boundaries instead of opcodes, making schedules stable across Python versions:

import asyncio
from frontrun import explore_interleavings

class Counter:
    def __init__(self):
        self.value = 0

    async def increment(self):
        temp = self.value
        await asyncio.sleep(0)  # any natural await is a scheduling point
        self.value = temp + 1

async def test_async_counter_race():
    result = await explore_interleavings(
        setup=lambda: Counter(),
        tasks=[lambda c: c.increment(), lambda c: c.increment()],
        invariant=lambda c: c.value == 2,
        max_attempts=200,
    )

    assert result.property_holds, result.explanation

CLI

The frontrun CLI wraps any command with the I/O interception environment:

# Run pytest with frontrun I/O interception
frontrun pytest -vv tests/

# Run any Python program
frontrun python examples/orm_race.py

# Run a web server
frontrun uvicorn myapp:app

The CLI:

  1. Sets FRONTRUN_ACTIVE=1 so frontrun knows it's running under the CLI
  2. Sets LD_PRELOAD (Linux) or DYLD_INSERT_LIBRARIES (macOS) to load libfrontrun_io.so/.dylib
  3. Runs the command as a subprocess

Pytest Plugin

Frontrun ships a pytest plugin (registered via the pytest11 entry point) that patches threading.Lock, threading.RLock, queue.Queue, and related primitives with cooperative versions before test collection.

Patching is on by default when running under the frontrun CLI. When running plain pytest without the CLI, patching is off unless explicitly requested:

frontrun pytest                    # cooperative lock patching is active (auto)
pytest --frontrun-patch-locks      # explicitly enable without CLI
pytest --no-frontrun-patch-locks   # explicitly disable even under CLI

Tests that use explore_interleavings() or explore_dpor() will be automatically skipped when run without the frontrun CLI, preventing confusing failures when the environment isn't properly set up.

Platform Compatibility

Feature Linux macOS Windows
Trace markers (sync + async) Yes Yes Yes
Bytecode exploration (sync + async) Yes Yes Yes
DPOR (Rust engine) Yes Yes Yes
frontrun CLI + C-level I/O interception Yes Yes No

Linux is the primary development platform and has full support for all features including the LD_PRELOAD I/O interception library.

macOS supports all features. The frontrun CLI uses DYLD_INSERT_LIBRARIES to load libfrontrun_io.dylib. Note that macOS System Integrity Protection (SIP) strips DYLD_INSERT_LIBRARIES from Apple-signed system binaries (/usr/bin/python3, etc.). Use a Homebrew, pyenv, or venv Python to avoid this limitation.

Windows support is limited to trace markers, bytecode exploration, and DPOR — the pure-Python and Rust PyO3 components that don't rely on LD_PRELOAD. The frontrun CLI and C-level I/O interception library are not available on Windows because they depend on the Unix dynamic linker's symbol interposition mechanism, which has no direct Windows equivalent.

Development

Running Tests

# Build everything and run tests
make test-3.10

# Or via the frontrun CLI
make build-dpor-3.10 build-io
frontrun .venv-3.10/bin/pytest -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

frontrun-0.3.0.tar.gz (212.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

frontrun-0.3.0-cp314-cp314t-manylinux_2_39_x86_64.whl (709.1 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.39+ x86-64

frontrun-0.3.0-cp314-cp314t-manylinux_2_39_aarch64.whl (699.0 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.39+ ARM64

frontrun-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl (634.5 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

frontrun-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

frontrun-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (701.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

frontrun-0.3.0-cp314-cp314-macosx_11_0_arm64.whl (634.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

frontrun-0.3.0-cp313-cp313t-manylinux_2_39_x86_64.whl (709.5 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.39+ x86-64

frontrun-0.3.0-cp313-cp313t-manylinux_2_39_aarch64.whl (699.4 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.39+ ARM64

frontrun-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl (634.7 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

frontrun-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

frontrun-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (701.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

frontrun-0.3.0-cp313-cp313-macosx_11_0_arm64.whl (635.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

frontrun-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

frontrun-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (701.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

frontrun-0.3.0-cp312-cp312-macosx_11_0_arm64.whl (635.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

frontrun-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

frontrun-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (701.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

frontrun-0.3.0-cp311-cp311-macosx_11_0_arm64.whl (636.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

frontrun-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

frontrun-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (701.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

frontrun-0.3.0-cp310-cp310-macosx_11_0_arm64.whl (637.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file frontrun-0.3.0.tar.gz.

File metadata

  • Download URL: frontrun-0.3.0.tar.gz
  • Upload date:
  • Size: 212.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for frontrun-0.3.0.tar.gz
Algorithm Hash digest
SHA256 706b92a3b321d2a48b4dbccf04094da695094cb8a7112b4ac59ef7a00bf969b5
MD5 1c4a71a40bd04a0ec1ecb20e6b3cf474
BLAKE2b-256 a0a2d6bc3d1226c984eacbf126e59d3dcaf284956047d04d05f83d3445b7e050

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0.tar.gz:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314t-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314t-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 07094718d20e44ecda7cbf1286449534aaf80e360f97366d72294442a0f3c3a3
MD5 5f64755513c49e073c5466148e73a462
BLAKE2b-256 690846ea0fa7a3a02dacf226a1caaf2f0832640d94b3bb19fa22280111c47231

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314t-manylinux_2_39_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314t-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314t-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 c44eb2d36c45f0295ccd2d64065623e8fba549670ddb72777904fef102058bc4
MD5 015c11886b3d5b743a63fee7b3af92d9
BLAKE2b-256 a5fcbe48d7babebd1b8f8863d373b713444fe4c5b86e0fb389a6770d0bedf8cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314t-manylinux_2_39_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da42fa3850d3ff661f759bddd42f6750a8ab5b0f41edd99b1bb8d8ca2c47a939
MD5 41478032db9e0c72791e15526f6b9e31
BLAKE2b-256 4648d1efd007da387818dc6ecb62e52ba448d83124f02f4b2817b0d30fb6cf67

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3872d2140242b5d6b7e175498ad41ed0a1946644b7772f3af542a32a854f5ba6
MD5 66ee6277b40f8b6febf1da0452364fb3
BLAKE2b-256 cd0eccf3b5ab541cb2b03bac811c5926e136ef97a225f6a1af2147a92369984a

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a566a2190db886dd62d082f21b04f2191e632ca2f834b87b9fac3322b81fe827
MD5 0ef481835fdd7242ec84a41fed17dd51
BLAKE2b-256 0bc4c5d2a9f21d047b6493e0e11375d534583536fed768a10cea76f961d740e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a94d427fee854cf07a969a1429d5bd5d73869a1c3597069665d733f513ce660
MD5 ce3698979782c9afb6511625f2093381
BLAKE2b-256 1a4b49f0c9c6525a9f6c31239b41c0399d75b4446237e57abf3a977ff99752ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313t-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313t-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 9fbae7423d936d78c268d39e0322a96d4ac2192d73d0c83c87ce69edd808cc00
MD5 76762feeb3d0b4c83c11c20919fa7cf5
BLAKE2b-256 3ab214556fe6112a30fab5742a592c5d5f182ad0938a8aa1e631004df0846ec5

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313t-manylinux_2_39_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313t-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313t-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 8d8080d9c575a20d8cc7cc530f955e871f7047b85b18ea013d2787c1f6c56e67
MD5 e49600fe7db10e68972ae01145923fae
BLAKE2b-256 edc561e867f325fb31bd6a40badd5d6b1f7984cf411dd03a0da73a225091fac9

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313t-manylinux_2_39_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cbce21445e829e0f78abb909f0365e56280417d6e21d0cd4ca230f6351a35664
MD5 862cf76bb729367d54b1a28caaf6b0e1
BLAKE2b-256 9afdf9a86bdb6c1ffb2529dbbd3b8222f3bcb05ec332c2e3624cb68e2f86f013

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4299a512ab51a5cfeecc3be65f99d9f2f445939226bcdb21e063f5d54e67d5f0
MD5 04de314e9feb4a535c7d7dfe758828ba
BLAKE2b-256 c9d61b1a47bc0da9a8513d073b9f8590fc6148e6b3db4535f18c42fe46f653b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2fe9c4b03179d50613ca8d4299a42ccaad7b3d719d2112c351217e953388b2d0
MD5 acb5c8dffbb2a50509800fe7db2f9b95
BLAKE2b-256 ac939c697e4d742ed73a5b1f1acdced45f4a6ac64a89a086a1f5bf095d9d74ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 181933a4cb0088ac9e909b6ac16cf7a247609ef862ca3a6e678f8cbf52a5b289
MD5 5c77f45a313301dc1f5317ba98b47837
BLAKE2b-256 10cc557bb6337dbb933ad7e7e29ad524979b7a9885eed2253e049eb2c37857e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ff5fdda1b69a8341e047424e088a731fb4e7a2798f3e32f357f49b914c1dd70e
MD5 28c51fb2aa1e7ecece62169856ec2d34
BLAKE2b-256 1ca48fcbca93525d3f28ddfa19d6eaef1d897896979ae1d4da97ff11ab284fe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 40b352acb99196ae97776b95447ddd067318cb6231bcb20ec76a71e49f8b07b7
MD5 dfd4f806bd6ae028311b77216d5839b6
BLAKE2b-256 230c9dfc3bec16aec531092f1dce6e6a801e9a9434cab263d476996cc177b105

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 17df7fbca15a4840e7f96c5f346f324ff3c04e0cb23fdda753358aeb85d8b125
MD5 12f8c3cc380925f5bf2347132d8d0780
BLAKE2b-256 896a41cf594524e634dc4874d96ded4e3a72a3e30e4f51af09f7d592218b4985

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4dc29c85d828cb95b820ffa0b3fdab5a35f1463aff067fd1ada857251a39345c
MD5 f5e72f7e9ec733149eb5b3578df62fb0
BLAKE2b-256 75c3226f426f34e9d13b41a7d04e1feb95af41fa23c5b163a53c278a942130f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cdccc91354a1e111f64e3c4a510e897931ceae5da0cfd187f2302b133a39cb1c
MD5 9aa165acde6bb53ac9836d8fd23ff13f
BLAKE2b-256 89650263e44ff1d7c08fa5fd0c0a71e46d2c3fe8d90f781a3c9a51821ef6c590

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f014693cac72d665fcf8bd6fa989be14b6b9bc4ad1a488795cb8703bb700da78
MD5 d988e9767e4260a973c6ac57f010ebfe
BLAKE2b-256 1db83bbe3da2b61ea0dcf78b7480eeebab3e1d0fc5d3045575a9b1e722a6889b

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ec00e94064f582ea31832113eff1275da7a1e0f04a0c5b5a42a093bdbb939332
MD5 208b3d75276903ae38fc0362b1ff8c2b
BLAKE2b-256 dc0e4e107515bdb4ea8fb0754a1fc222c59c4d5a7ae846f48af21a8d70abc0b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 00a145671771fa0258be561b1dafa1facd97753b33c913ec0c8db44f0f7a2003
MD5 645591d4a6f0d25c88c9026b9502a349
BLAKE2b-256 81f0e8334d830bd4281fb43fe2b00b1abcedc96037c2845f91ae5bbdef6d8b1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file frontrun-0.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa6baad66277f7c775ad16a36d829245dcc8071f648a21ec5da8c3fba40186ec
MD5 13dda057fe185f13a302a881e466c1c5
BLAKE2b-256 599493dfc5f9523c3fa7eeb03b8cba05efb88118ad79fdaae5be58f9ac4b52b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.3.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on lucaswiman/frontrun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page