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 conflicts at the Python bytecode level. It sees attribute reads/writes, subscript operations, and lock acquire/release. It does not see shared state managed entirely in C extensions (database rows, NumPy arrays, Redis keys). For those, the code runs fine but DPOR concludes — incorrectly — that the threads are independent and explores only one interleaving. Direct socket I/O is detected via monkey-patching when detect_io=True (the default), and the frontrun CLI adds C-level interception via LD_PRELOAD for opaque drivers.

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.

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

Async Support

Trace markers and bytecode exploration have async variants (DPOR does not yet have an async version).

Async Trace Markers

from frontrun.async_trace_markers import AsyncTraceExecutor
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 = AsyncTraceExecutor(schedule)
    executor.run({
        "task1": counter.increment,
        "task2": counter.increment,
    })

    assert counter.value == 1  # One increment lost

Async Bytecode Exploration

Async bytecode exploration works at await points instead of opcodes, making schedules stable across Python versions:

import asyncio
from frontrun.async_bytecode import explore_interleavings, await_point

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

    async def increment(self):
        temp = self.value
        await await_point()  # Yield control; race can happen here
        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.1.0.tar.gz (94.5 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.1.0-cp314-cp314t-manylinux_2_39_x86_64.whl (579.4 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.39+ x86-64

frontrun-0.1.0-cp314-cp314t-manylinux_2_39_aarch64.whl (568.5 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.39+ ARM64

frontrun-0.1.0-cp314-cp314t-macosx_11_0_arm64.whl (509.2 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

frontrun-0.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (580.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

frontrun-0.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (572.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

frontrun-0.1.0-cp314-cp314-macosx_11_0_arm64.whl (510.6 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

frontrun-0.1.0-cp313-cp313t-manylinux_2_39_x86_64.whl (579.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.39+ x86-64

frontrun-0.1.0-cp313-cp313t-manylinux_2_39_aarch64.whl (568.5 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.39+ ARM64

frontrun-0.1.0-cp313-cp313t-macosx_11_0_arm64.whl (509.4 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

frontrun-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (580.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

frontrun-0.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (572.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

frontrun-0.1.0-cp313-cp313-macosx_11_0_arm64.whl (511.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

frontrun-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (580.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

frontrun-0.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (572.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

frontrun-0.1.0-cp312-cp312-macosx_11_0_arm64.whl (511.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

frontrun-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (580.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

frontrun-0.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (572.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

frontrun-0.1.0-cp311-cp311-macosx_11_0_arm64.whl (512.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

frontrun-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (580.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

frontrun-0.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (572.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

frontrun-0.1.0-cp310-cp310-macosx_11_0_arm64.whl (513.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for frontrun-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2cc9bd483f0e8e37d02a562e458c84761a9a577e1836c422e5baa8e9a0fbcbf6
MD5 df721fec5d6d3998112a0d976ed18fe8
BLAKE2b-256 2fe0c384ca45dc605eb33f40e01587e47932c949a59cfa22407467e6af103c43

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314t-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314t-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f89668e2dcfa97c398c578ae902e656ca59bcdec9590308dc93d778e9f508b90
MD5 ec435aec656fbfb5df8fc91cc7056288
BLAKE2b-256 13001de0290ff861fe940cbe4c9b0c12ab00be95e881772d7cb1062d3b2916c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314t-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314t-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 e02e95817f3a3237937ec726de9fc9ec82ed5378b7618adaf086917a0607a0c8
MD5 91be150b6dc6ca61d16a0461978c12c2
BLAKE2b-256 139105de61cc17975bec9aaa777ba30f3cc09b47c32cf452190f9c03fdac6ed1

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c75cc49a6a73dec948718746e799c98f7ee8437e7b76b827f9181ba805cc4ec
MD5 f794db4729d1317b063a66c998640d18
BLAKE2b-256 26e912b7619fcc34e3392d848447b6fc2d17197c576a480cf07b1d7fb5c9944f

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 36863497b4c032b97f5b4e9e541b0e17f7755cf4af49ebb8e319d96f5504c870
MD5 0f67e676a6030adbca13696be7b026f9
BLAKE2b-256 839fae9bae3fa7724f07e838e11188f9027883f47ba1908458c343c7985df70d

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a1c5f92a0dca10d53e58fda523009708a4e93a339d922ed9f3b819e0b12751d9
MD5 e8c0deddfff1956bd69194f6eaa6573a
BLAKE2b-256 c4b3a07378a4dc5fed7159c0a7cb8d001bf13a498d5c4eec15cf25ada20d711f

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5fb6c51f1ff23124b7e72f0f02ff273f28429a94b03830b3f96aa69cfcfbaf76
MD5 c1b31d72c501024305e538729b8fdbe5
BLAKE2b-256 f76c577c690a3a5cc8f00d57ff8660cf45f1753a5e7f32936c49f7362d6257ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313t-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313t-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 1ad48cf88c29c230d165ef322bb3ba0d3ae117c6dc3f9e2477fbbbc3f5f6fc81
MD5 25a52c51b74fc8419795da7c66cccf1f
BLAKE2b-256 308f94f807d31c5f425921cbb0f06c181705732cc69e6c71d947f89a730f8bd4

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313t-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313t-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 ac0e5e5be63ea92e29273a9bacb87a2b78b66a628f419a7c370871963d5b9bcc
MD5 aa24a620b8c506f1fe03d79ef86c00ef
BLAKE2b-256 59a77c4ab844f7ed97ff0109dbdbe0d1c96dd40b3fa4cdd43bf25cd5d72f5c84

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6646474d204b321c7bbf66679f522be7d8f71c49b7b36d5fece7052ebefe63cb
MD5 876df644ef12b1ee04bcb8f5efaadfc3
BLAKE2b-256 0c3b9cc698b15ca8b59203970c96cd08fb2baba5a3baee9e64c636d06d177c11

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c240855f5e429bce55e162f79b1ad9b3a578c4e38a10033024625fd00d706235
MD5 6f199d99aef13b523228d743bbb64cf3
BLAKE2b-256 9c8e82ba468ce9231d0d2f4a28088219a0eea61b280bf1e9562335ace2a9150c

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c5e4f1a9fe43a100acb6a0ae7581396209a41494ee0ebc7f0d687deee20adc28
MD5 2f8d06db7a060d76cc2a75559662a478
BLAKE2b-256 8f60d6357c215afb920c76c77f5dfc34f8f92bcf2d1100d6bc73252748878c39

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29895db8f204f354398c56d571475e9d01d7bdf2a12cf7bb1227c1b11a331e0a
MD5 abd766d3ea7bb2389ed56a516582bbf5
BLAKE2b-256 937df8b4cae3f7bf7c087f1fafce0ebe9ccd8b8fab0f4701b252d130ec551213

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c474610d5ddbc56f29ec34be0cc8feb1844a98ec6de98d391b841a0625de2739
MD5 e896afdcbef9bb26895b79bbdd96e00e
BLAKE2b-256 143999ffbe49441d5801ce2920ccb5be4419e9e66ad55020a9b376d645d601f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b5870c3018523b1656032cde9e015dd2883a7198e6317f8c6030c91b18703a19
MD5 f50c75f646fb4f886dbf7a76e7805055
BLAKE2b-256 f4ea6bdf13ba9b8ea776a538711a55e22bbc5595b129d0a69962140ec2d9d208

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 49f23e8b6b7c1c0f6fc642d77c5c120f0ce4547967e29f309fcf43177e699f84
MD5 ec5d97977cb468d3e8e65af0b86825ab
BLAKE2b-256 bc8dfa48d3bf3b8f447a6ce2402e7a1fe1e045b33ee9e6911821fecff54e852e

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 73cc0a3239dbdf952cafd8f410ec3f3c64c39a02ab7d3b4f9252c16598096032
MD5 d38f219f57b7e7b93568fd7e953cd5fb
BLAKE2b-256 ce7cd37a1c1d10c37339df01e12aa39c01367dca3f05b4d916f3202b9de20af5

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 08a2b2e78898ee8f95948787045997ebdb847e6fa3c562e1af4a79d8ef522411
MD5 00a03118a64a6980d41bf5ea7ae34d76
BLAKE2b-256 14d73e2836fef442e7158006053a84acc70bdfc22cadb9f3f6fc32adf9d83e08

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 13b29fbf7394f1c473cbd7e675bec41fc3c57bd772c6f236117f76efdf14d489
MD5 b49df9e8dca91bceae2677dbf212c9f1
BLAKE2b-256 f89093270169af45af75d1423d9e01f5029650113514c52585510a658aa26784

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aabc6fa1cb0033b0d9de9c475edc00c63652949c5b17b65fefefd7450f5cfbb8
MD5 0039a61d806126c03a1f0275945452c5
BLAKE2b-256 6e4aba0e0f35e623248bacf07f0698942923d1e8091ebf33227feaeb9756f7d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 30ef7553c4c3926f5c6626798470ca0c8abfe17de17c9d1a852f8fa4c9d65871
MD5 f46e8bcbb651167152d79eda0dae93e5
BLAKE2b-256 962bcadb8bd140bf1344af2fdb986ccacaa3c9a9e2abb83d692d0b6f684e735e

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frontrun-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 12dc080975c09d1a68377a93fc5db545bb838b931f7b22c900166e023da95774
MD5 403f3339d5efc412f70215e86f93d00f
BLAKE2b-256 a4e335c94268b70921187a82af2cc2f0c4a31cd6cae4a9224cbde4413796fb2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for frontrun-0.1.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