From 04176b00610b6f4a32e823a929507ea8b8948a6b Mon Sep 17 00:00:00 2001 From: Ferdinando Ametrano Date: Thu, 13 Aug 2026 21:09:58 +0200 Subject: [PATCH] Require both siblings from the releases that now carry what this tree calls `btclib_secp256k1>=0.8.0.1` and `bitcoin-core-rpc>=2026.8.13`, where each was a `git+...@main` direct reference: `keys.PubkeyTweakChain` (issue #685) is published now, and so are `assert_chain` and the two magic lookups `network.py` stopped carrying. Neither floor is an upgrade -- the bindings' tag is the commit uv.lock pinned plus its release-notes commit, and bitcoin-core-rpc's is the pinned commit plus a Windows CI fix, a README line and the version bump -- so what moves is the shape of the pin, not the code resolved. The prose and the comments that described the reference follow it back: CONTRIBUTING.md's dependency paragraph names the two floors again, test.yml's matrix selects a published wheel per cell rather than compiling one, and latest.yml's suite-bindings-latest upgrades to a release rather than to the tip of a branch. RELEASING.md keeps the warning that made the reference worth documenting, stated as a condition rather than as the arrangement: PyPI refuses a direct reference in metadata and nothing before publish-pypi catches one, so a floor is the only pin a release may carry. The dist job's constraints are whole again. #767 dropped the two siblings from the export with --no-emit-package because uv refuses a branch url against the commit the lock resolved, once the branch has moved past it -- which cost that job its determinism, deliberately and for want of an alternative. A floor resolves to a release and a release does not move, so the exception goes and every package is pinned to the lock again; #767's other half, the regex that lets tests/build_system_test.py collect on 3.10, is untouched, and its CHANGELOG entry keeps that half alone. Two names those comments had wrong are corrected while they are being rewritten: the jobs are suite-latest and suite-bindings-latest, which published.yml also misnamed, and test.yml cited a floor three releases old. The gates: 26455 passed at 100.00% coverage, pre-commit clean, sphinx -W clean. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/latest.yml | 35 ++++++------- .github/workflows/published.yml | 2 +- .github/workflows/release.yml | 15 ++---- .github/workflows/test.yml | 54 ++++++++------------ CHANGELOG.md | 59 +++++----------------- CONTRIBUTING.md | 37 ++++---------- HISTORY.md | 2 +- RELEASING.md | 25 +++++---- pyproject.toml | 21 +------- uv.lock | 89 +++++++++++++++++++++++++++++++-- 10 files changed, 164 insertions(+), 175 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index a0c0d5404..88576e752 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -12,13 +12,11 @@ name: latest # uv.lock moves on a weekly dependabot pull request. A break upstream # therefore surfaces a week or more later, inside a pull request that has # to be reviewed anyway, and its cause is one entry in a diff of many. -# btclib_secp256k1 is the entry that matters most here, and it is not a -# release but a branch: pyproject.toml asks for that repository's main -# through a direct reference, so any commit there -- not only a release of -# it -- is a change in another repository that nothing in this one has to -# make for the pair to stop working. suite-bindings-latest below asks -# about that one entry alone, precisely, rather than folding it into -# suite-latest's broader upgrade -- see that job for why. +# btclib_secp256k1 is the entry that matters most here: a release of +# the bindings is a release in another repository, which nothing in this +# one has to change for the pair to stop working. suite-bindings-latest +# below asks about that one entry alone, precisely, rather than folding +# it into suite-latest's broader upgrade -- see that job for why. # # The obvious alternative, dropping --locked from test.yml and resolving # afresh on every run, is what this workflow exists instead of: a pull @@ -115,9 +113,8 @@ jobs: enable-cache: true python-version: ${{ matrix.python }} # --upgrade re-resolves every entry, btclib_secp256k1 included: - # this is what carries the bindings to the tip of their main, and - # every other dependency to its newest release, which nothing else - # off a pull request does. + # this is what carries the bindings to their newest release, which + # nothing else off a pull request does. # It prints one "Update vA -> vB" line per package it moves, # so the log names the suspects without a diff of uv.lock; a run # that moved nothing says so, and its green means nothing new. @@ -133,13 +130,13 @@ jobs: run: uv run --locked --no-default-groups --group test pytest # narrower than suite-latest above, and for a different reason: that - # job upgrades every dependency, so a red run there buries a commit + # job upgrades every dependency, so a red run there buries a release # of btclib_secp256k1 behind a dozen other candidates. This # upgrades only that one, so a red run here names it without a # bisect -- worth a job of its own because it is a sibling project - # under the same org, written by the same people for this library, - # which makes "did my own other commit just break this one" a distinct - # and likely enough question to ask separately from "did some + # under the same org, released by the same maintainer, which makes + # "did my own other release just break this one" a distinct and + # likely enough question to ask separately from "did some # third-party wheel". Moved here from published.yml (issue #397): it # is a question about drift against a tree not yet published, which # belongs before publication rather than after @@ -164,14 +161,12 @@ jobs: enable-cache: true python-version: ${{ matrix.python }} # upgrades one entry rather than every one of them, which is the - # whole difference from suite-latest above: it prints "Updated - # btclib_secp256k1 vA (sha) -> vB (sha)" when main moved and + # whole difference from suite-latest above: it prints "Update + # btclib_secp256k1 vA -> vB" when a release moved it and # nothing when it did not, so the log names the suspect without a - # diff of uv.lock -- and with a direct reference the version can be - # the same on both sides, the commit in parentheses being what - # moved. Harmless on an ephemeral checkout; worth + # diff of uv.lock. Harmless on an ephemeral checkout; worth # knowing before running the same command in a working tree - - name: Upgrade the bindings to the tip of their main + - name: Upgrade the bindings to their latest release run: uv lock --upgrade-package btclib_secp256k1 - name: Run pytest run: uv run --locked --no-default-groups --group test pytest diff --git a/.github/workflows/published.yml b/.github/workflows/published.yml index c75be902a..4bb6a6286 100644 --- a/.github/workflows/published.yml +++ b/.github/workflows/published.yml @@ -28,7 +28,7 @@ name: published # # What this is not: a sentinel for whether the newest btclib_secp256k1 # breaks this tree. That question -- issue #397 -- belongs to latest.yml's -# test-bindings-latest job instead: it is about drift against a tree not +# suite-bindings-latest job instead: it is about drift against a tree not # yet published, asked before publication rather than after, and asking # it here would be asking it one step too late to matter to what gets # published next diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5f6ffa8b6..c72e72640 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -393,20 +393,15 @@ jobs: # wheel and not to the btclib/ source tree. # Unconstrained, where dist-py pins the runtime dependencies to # uv.lock: no pull request waits on this job, so it can afford the - # question a required check cannot -- whether what the wheel's own - # requirements resolve to, unpinned, satisfies the wheel about to be - # published, which is what a user installing it resolves. A release - # stopping on that answer is the outcome wanted. Unpinned is the - # newest published release of each once pyproject.toml carries - # floors, and the tip of a branch while it carries a direct - # reference -- which no release may carry: PyPI refuses one, so an - # upload would fail in publish-pypi below, past everything this job - # guards. RELEASING.md's step 1 is where that is caught. + # question a required check cannot -- whether the newest published + # btclib_secp256k1 satisfies the wheel about to be published, + # which is what a user installing it resolves. A release stopping + # on that answer is the outcome wanted. # The three assertions are dist-py's, and there for the same # reasons: metadata can be missing (issue #150), `import btclib` # runs only __init__.py and touches no binding, and a bindings # release can install and still answer wrongly - - name: Smoke-test the wheel, with its dependencies unpinned + - name: Smoke-test the wheel, with its dependencies from PyPI run: | cd "$RUNNER_TEMP" uv run --isolated --no-project --with "$GITHUB_WORKSPACE"/dist/*.whl \ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f228124fd..07cad45bb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -61,19 +61,14 @@ concurrency: jobs: # what the matrix buys: every (os, architecture, interpreter) triple - # builds btclib_secp256k1 from the commit uv.lock pins -- pyproject.toml - # asks for that repository's main through a direct reference -- so each - # cell compiles its own libsecp256k1 with the toolchain of its runner, - # and the pure Python code meets a distinct hashlib and OpenSSL. What - # the same triples used to buy was a different *published* wheel per - # cell; that question is published.yml's now, which installs btclib from - # the index and resolves the wheels a user gets, and it is the one this - # matrix stopped asking when the direct reference went in. + # selects a different published wheel of btclib_secp256k1, each with + # its own compiled libsecp256k1 inside, and the pure Python code meets a + # distinct hashlib and OpenSSL. # windows-11-arm needs no special handling, and that is worth a word: # which architecture the interpreter targets there is up to the runner # image, native arm64 for the versions it caches and emulated x86-64 - # for the ones uv has to download, and cffi builds for the interpreter - # rather than for the host, so either one links + # for the ones uv has to download, and the wheel is selected for the + # interpreter rather than for the host, so either one links suite: name: Run the suite on ${{ matrix.python }}, ${{ matrix.os }} # a draft pull request is work in progress: every push to one spends @@ -275,30 +270,23 @@ jobs: # what none of the three above does: install the wheel, and install # it alone, from an empty directory. The wheel is the only thing # asked for, so what pulls btclib_secp256k1 in is the - # `Requires-Dist` the wheel itself carries -- which is the question, - # metadata being what the three checks above only read. That - # requirement is a direct reference while pyproject.toml says so, so - # what answers it is the bindings' repository rather than the index, - # and the bindings are built from source here; the metadata is doing - # the same work either way, and does it against the index again once - # a release replaces the reference with a floor. + # `Requires-Dist` the wheel itself carries, resolved from the index + # -- which is the question, metadata being what the three checks + # above only read. # The lock arrives as constraints and not as requirements: a # requirements file installs the bindings whether or not the wheel # asks for them, so a wheel declaring nothing would pass. A - # constraint pins and requests no package, which leaves the wheel's - # metadata doing the work while pinning the outcome to what uv.lock - # resolved. - # Every package but the two direct references, which is what - # --no-emit-package is for here: the lock exports those as the - # commit it resolved, the wheel asks for `main`, and uv unifies a - # branch with a commit only while the branch is still at it -- - # after which it refuses the two urls as conflicting and the job - # fails on nothing this repository did. Those branches are where - # this tree's own dependencies are developed, so they move on their - # own schedule, and a pin that has to be refreshed within the hour - # is not determinism. Unpinned, this step resolves what a user - # installing the wheel today resolves, which is the question it - # asks; the rest of the workflow runs --locked and is unaffected. + # constraint binds a version and requests no package, which leaves + # the wheel's metadata doing the work while pinning the outcome to + # what uv.lock resolved -- and pinning it is what keeps a required + # check deterministic, since with the floor alone uv takes the + # newest release and a btclib_secp256k1 published this morning + # would redden every open pull request, none of which caused it. + # Every package, then, including the two siblings: what made them + # an exception was the direct reference, the lock exporting the + # commit it resolved against a wheel asking for `main`, which uv + # refuses as conflicting once the branch has moved past it. A floor + # resolves to a release, and a release does not move. # Whether the newest bindings still work is asked on a schedule by # latest.yml, and again by the release workflow before it publishes. # The assertions are three, because each catches what the others @@ -310,11 +298,9 @@ jobs: # binding, so the bindings could be missing entirely; and a # signature is verified because an installable release of them with # an incompatible API imports fine and answers wrongly - - name: Smoke-test the wheel, with the dependencies its metadata asks for + - name: Smoke-test the wheel, with its dependencies from PyPI run: | uv export --locked --no-dev --no-emit-project --no-hashes \ - --no-emit-package btclib-secp256k1 \ - --no-emit-package bitcoin-core-rpc \ -o "$RUNNER_TEMP"/constraints.txt cd "$RUNNER_TEMP" uv venv diff --git a/CHANGELOG.md b/CHANGELOG.md index 11cf8adac..3c9e112ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -244,35 +244,16 @@ documented at release-notes length in the first place, and are still in ### Packaging, linting and CI -- **`main` is green again, after two failures of one run that have - nothing to do with each other.** `tests/build_system_test.py` read - pyproject.toml with `tomllib`, which is standard library from 3.11 up - and the floor here is 3.10: the module failed to collect on the four - 3.10 cells of the matrix and passed everywhere else, so the pull - request that added it (#754) merged with every other cell green. It - reads the `[build-system]` table by regex now, anchored on the header - and stopping at the next one, which is what `tests/copyright_test.py` +- **`tests/build_system_test.py` collects on 3.10** (#767), where it read + pyproject.toml with `tomllib` -- standard library from 3.11 up, and the + floor here is 3.10: the module failed to collect on the four 3.10 cells + of the matrix and passed everywhere else, so the pull request that + added it (#754) merged with every other cell green. It reads the + `[build-system]` table by regex now, anchored on the header and + stopping at the next one, which is what `tests/copyright_test.py` already does with the same file and for the same reason; both tests assert what they asserted before. - The `dist` job's smoke test is the other one, and what it failed on was - a design that could only hold for as long as nothing moved. It installs - the wheel with `uv.lock` exported as constraints, and the wheel asks - for `btclib_secp256k1` and `bitcoin-core-rpc` from their repositories' - `main` while the export pins the commit the lock resolved: uv unifies a - branch with a commit while the branch is still at it, and refuses the - two urls as conflicting once it is not. Both repositories had moved, so - the job failed here and in every open pull request, none of which - caused it -- and a lock refresh would only have bought the time until - the next push, which for `bitcoin-core-rpc` was fifteen minutes. - The export now passes `--no-emit-package` for those two, which is the - whole of the fix: everything else stays pinned to the lock, and the two - direct references resolve the way a user installing this wheel resolves - them. Nothing here is left unasked -- `uv run --locked` is what the - rest of the workflow runs, and whether the newest bindings still work - is `latest.yml`'s weekly question and the release workflow's before it - publishes. - - **The package-content policy is stated where an unpacked sdist carries it** (#735, #734). `docs/source/package-content-policy.md` says what may be in the wheel and the sdist, what may never be, and what has to @@ -453,26 +434,6 @@ documented at release-notes length in the first place, and are still in rather than by commit SHA, which every third-party action here is: it is read from the same commit as the workflow calling it, so there is no owner who could move it. -- **The bindings are required from their `main` rather than from a - release**, which is what `bitcoin-core-rpc` already was: a direct - reference to `btclib-org/btclib-secp256k1@main` in place of - `btclib_secp256k1>=0.8.0`, with `uv.lock` pinning the commit and moving - when that branch does. They exist for this library, so what a branch - here needs of them lands there first and then waits for a release of - another repository to be callable at all — `keys.PubkeyTweakChain`, - written for issue #685, is in `main` and in no release. - - Three things it costs. Every environment builds libsecp256k1 from source - where a published wheel used to be resolved: cmake and cffi come from - the bindings' own `[build-system] requires`, a C toolchain is the - machine's, and a cold `uv pip install --no-cache` of the reference takes - about ten seconds on an arm64 laptop, the submodule fetch included. The - test matrix stops selecting a different published wheel per cell and - compiles one instead, so whether the published wheels install and answer - correctly is `published.yml`'s question and now only its. And PyPI - refuses a direct reference in metadata, so a release has to write a - floor back over each of the two — nothing before the upload catches it, - which RELEASING.md's step 1 now says. - **Their repository is renamed with them**, to `btclib-org/btclib-secp256k1`, so the urls naming it here move: the issue templates, `README.md`, `SECURITY.md`'s advisory link, and the @@ -526,6 +487,12 @@ documented at release-notes length in the first place, and are still in both: they are btclib-org projects developed by the same people, which is what a version ceiling substitutes for when it cannot be. Its `<0.8` example moves to `<0.9`, the floor having passed it. +- **Both bounds move to the sibling releases of 13 August**, + `btclib_secp256k1>=0.8.0.1` and `bitcoin-core-rpc>=2026.8.13`, each + naming the release that carries what this tree calls of it: + `keys.PubkeyTweakChain` (issue #685) in the first, `assert_chain` and + the two magic lookups `network.py` stopped carrying in the second. + `uv.lock` follows both. - **`--cov` is in pytest's addopts, so the ratchet is a local gate.** The 100% threshold was reached only by the `coverage` job, which means a change met it after being pushed: the pull request that added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a408e0fbc..ec064ed20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,19 +49,8 @@ tools, including those needed to build the documentation, is then created with: uv sync ``` -**Both declared dependencies are direct references to their own `main`**, -`btclib_secp256k1` and `bitcoin-core-rpc`: what a branch here needs of -them lands there first, and waiting for a release of another repository to -call it is a wait two projects developed together do not have to take. -`uv.lock` pins the commit, so what CI installs is still one resolution -someone locked, and it moves when that branch does. The price is paid -twice: the bindings are built from source wherever a published wheel used -to be resolved — cmake and cffi come from their own `[build-system] -requires`, a C toolchain is the machine's — and PyPI refuses a direct -reference, so a release replaces each line with a floor before the tag -(RELEASING.md's step 1). - -**Those floors carry no upper bound**, and the absence of a +**The declared dependencies are `btclib_secp256k1>=0.8.0.1` and +`bitcoin-core-rpc>=2026.8.13`, with no upper bound**, and the absence of a ceiling is a decision. Both are btclib-org projects developed by the same people, and the bindings' whole purpose is to be the bindings this library calls, so a breaking change there is coordinated with the release here — @@ -338,10 +327,9 @@ which the suite compares against the script's own constants, so changing a rule means changing both. The last commands ask for the wheel and nothing else, so what pulls btclib_secp256k1 in is the `Requires-Dist` the wheel -carries; the lock arrives as constraints, which pin without -requesting a package — a commit, for a direct reference — so nothing -pushed or published in the bindings can turn a required check red while -the wheel's own metadata still does the work. They run +carries; the lock arrives as constraints, which bind a version without +requesting a package, so a release of the bindings cannot turn a required +check red while the wheel's own metadata still does the work. They run from an empty directory, or the import finds the source tree instead of the wheel: @@ -381,11 +369,9 @@ Its build job then repeats the smoke test above on the wheel it uploads, which is not the one `dist` built, and repeats it without the constraints. No pull request waits on that job and no branch rule names it, where `publish-testpypi` and `publish-pypi` both have it in `needs`: -so it is the place to ask whether what those requirements resolve to -unpinned satisfies the artifact — the newest published release of each, -once the direct references are floors again — and a release stopping on -that answer is the outcome wanted. It runs after the upload rather than -before, the artifact being +so it is the place to ask whether the newest published bindings satisfy +the artifact, and a release stopping on that answer is the outcome +wanted. It runs after the upload rather than before, the artifact being what the publish jobs download: installing a dependency executes its code, and a compromised one must not reach a `dist/` that has still to be handed on. @@ -418,10 +404,9 @@ uv lock --upgrade ``` That workflow has a second job, `suite-bindings-latest`, upgrading only -the bindings — to the tip of their `main`, that being what the -requirement points at — and re-running the suite: narrower than the -upgrade above, which moves every dependency, so a red run here names the -one responsible instead of burying it behind a dozen others: +the bindings and re-running the suite — narrower than the upgrade above, +which moves every dependency, so a red run here names the one responsible +instead of burying it behind a dozen others: ```shell uv lock --upgrade-package btclib_secp256k1 diff --git a/HISTORY.md b/HISTORY.md index a69be48ea..d5574cfc9 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -150,7 +150,7 @@ full year, short month, short day (YYYY-M-D) ### The bindings are now `btclib_secp256k1` - **The secp256k1 bindings were renamed, and btclib requires the new - name**: `btclib_secp256k1>=0.8.0`, where it required + name**: `btclib_secp256k1>=0.8.0.1`, where it required `btclib_libsecp256k1>=0.7.1.3`. `lib` named the C library, and a python distribution is not that library. Nothing in btclib's own API moves, and an install of btclib picks the new dependency up on its own. diff --git a/RELEASING.md b/RELEASING.md index ffa3b47be..b07554c12 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -129,12 +129,12 @@ pyroma), build, wheel smoke test — and publishes to Wednesday cron, because what it answers is cheaper to know before a version is consumed than after. It gates nothing, so it will not stop you: reading it is the point. Its `suite-bindings-latest` job is the one worth -reading closely: it asks about btclib_secp256k1 +reading closely: it asks about the newest btclib_secp256k1 release alone, precisely, rather than folding it into the broader upgrade the -rest of the workflow makes — a commit there is a change in another -repository, which nothing here has to make for the pair to +rest of the workflow makes — a release of the bindings is a release in +another repository, which nothing here has to change for the pair to stop working, and this release is the moment to find out before shipping -against a pin about to be behind. +against a pin about to be a version behind. **Read it per job, not as a verdict.** A red run means either "one dependency moved and this tree has not caught up" or "the bindings are @@ -169,15 +169,14 @@ word, and step 1 asks it of both. knows what the sibling's release was for. Both projects are pinned without a ceiling and both can publish on the morning of a release. - **A direct reference is not a pin this release may carry.** Between - releases each of the two is ` @ git+…@main`, so that a branch - here can call what just landed there; PyPI refuses a direct reference - in metadata, and nothing before `publish-pypi` does — the whole matrix - builds, the artifacts upload, and the upload fails at the end. So the - answer to the two questions above is a floor written back over each - reference, `>=` the release that carries what this tree calls: the - sibling has to be released first, and there is no shipping against a - commit. + **A direct reference is not a pin this release may carry.** Either + line can be ` @ git+…@main` while a branch here calls what has + just landed there and no release of it carries that yet; PyPI refuses + a direct reference in metadata, and nothing before `publish-pypi` + does — the whole matrix builds, the artifacts upload, and the upload + fails at the end. So a floor is written back over the reference, `>=` + the release that carries what this tree calls: the sibling has to be + released first, and there is no shipping against a commit. 1. Set the release version (calendar versioning, `YYYY.M.D`) in pyproject.toml, the only place it is declared, and re-lock (the diff --git a/pyproject.toml b/pyproject.toml index 5df017f01..0eeb51678 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,25 +25,8 @@ license-files = ["LICENSE", "COPYRIGHT", "AUTHORS.md"] authors = [{ name = "The btclib developers", email = "devs@btclib.org" }] requires-python = ">=3.10" dependencies = [ - # main, not a release, as the line below already is: the bindings - # exist for this library, so what a branch here needs of them lands - # there first and waits for a release of another repository to be - # callable -- `keys.PubkeyTweakChain`, written for issue #685, is in - # main and in no release. A direct reference is what PyPI refuses to - # publish, so the next release of that package replaces this line with - # a floor -- `btclib_secp256k1>=` -- and nothing else - # here changes. The lock pins the commit, and moves when main does. - # What it costs is a build from source wherever a published wheel used - # to be resolved: cmake and cffi come from the bindings' own - # [build-system] requires, a C toolchain is the machine's - "btclib_secp256k1 @ git+https://github.com/btclib-org/btclib-secp256k1.git@main", - # main, not a release: `assert_chain` and the two magic lookups are - # there first, and this tree stops carrying the check and the p2p - # constant it was made of. A direct reference is what PyPI refuses to - # publish, so the next release of that package replaces this line with - # a floor -- `bitcoin-core-rpc>=` -- and nothing else - # here changes. The lock pins the commit, and moves when main does - "bitcoin-core-rpc @ git+https://github.com/btclib-org/bitcoin-core-rpc.git@main", + "btclib_secp256k1>=0.8.0.1", + "bitcoin-core-rpc>=2026.8.13", ] keywords = [ # The GitHub repository topics, in the same order, and the order is by diff --git a/uv.lock b/uv.lock index e6f2e37e0..5f3850826 100644 --- a/uv.lock +++ b/uv.lock @@ -301,8 +301,12 @@ wheels = [ [[package]] name = "bitcoin-core-rpc" -version = "2026.9" -source = { git = "https://github.com/btclib-org/bitcoin-core-rpc.git?rev=main#299334b2dd4b6b5a15903dd78bfc266e13318044" } +version = "2026.8.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/f8/bc602214490d47ed66f857a119e66d8c2788691d597024536d4c702a380f/bitcoin_core_rpc-2026.8.13.tar.gz", hash = "sha256:ab7c748457756982561a07bf699eda211fcfe99acbe6ef46cf4d43b311025d03", size = 368264, upload-time = "2026-08-13T17:18:08.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/e9/ae5634c2c8ffd36c5013412e0450cff63db7138ba3c3a829a9f6a98d4e3e/bitcoin_core_rpc-2026.8.13-py3-none-any.whl", hash = "sha256:606285cc836780d55ac426d573dfe051c5fa9f0300b73e9cf4da695ea0215456", size = 44484, upload-time = "2026-08-13T17:18:07.39Z" }, +] [[package]] name = "btclib" @@ -369,8 +373,8 @@ test = [ [package.metadata] requires-dist = [ - { name = "bitcoin-core-rpc", git = "https://github.com/btclib-org/bitcoin-core-rpc.git?rev=main" }, - { name = "btclib-secp256k1", git = "https://github.com/btclib-org/btclib-secp256k1.git?rev=main" }, + { name = "bitcoin-core-rpc", specifier = ">=2026.8.13" }, + { name = "btclib-secp256k1", specifier = ">=0.8.0.1" }, ] [package.metadata.requires-dev] @@ -422,10 +426,85 @@ test = [ [[package]] name = "btclib-secp256k1" version = "0.8.0.1" -source = { git = "https://github.com/btclib-org/btclib-secp256k1.git?rev=main#c49b6c7ce1b50c2748430da48fab90bfe379d6c3" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/9a/88/1fe7e600dbbc7a83edacad23907bedee07c847beed61f703c3aa1b554b2a/btclib_secp256k1-0.8.0.1.tar.gz", hash = "sha256:bdbab4163f2ebd38511214ac882d525bacb648c47699f42f9ae95f46d8206659", size = 3116900, upload-time = "2026-08-13T19:06:35.842Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/1a/44429ff7882c7a141d1ecb949b0faa03eb8595f6d75693ad44b94f9b189b/btclib_secp256k1-0.8.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc394d7bdbb26eee48713c02d652a5952c28c6933b0d2f0ecb317b35354b62e4", size = 1363830, upload-time = "2026-08-13T19:04:27.14Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e6/eefd0de736f7eb24990e7f4d19d3847daf8f3f4ffd59bb5ed323cd0011dc/btclib_secp256k1-0.8.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db7f085d25e3ce54607c8fb97f45a7b19f3b0779b6990b4d34d1e6378249b6bd", size = 1357938, upload-time = "2026-08-13T19:04:28.929Z" }, + { url = "https://files.pythonhosted.org/packages/13/f1/98d59b20664d3cef4df65a771eef8b0de88881d83c58ec2b3bed5c02a4ae/btclib_secp256k1-0.8.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78b2b2c83ec512cc8dd2efbbc8ab76abbf96abc07a66777b8867231dce3bd15c", size = 1457378, upload-time = "2026-08-13T19:04:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/33/b5/10d07115919a82483c41a007c1f3deaa756ccb4bca4c47fd73e8eed1cb3b/btclib_secp256k1-0.8.0.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06951bb174db5776df76f53016a55ea9041965f0fe2d064a371779d25b6bfbca", size = 1440332, upload-time = "2026-08-13T19:04:32.553Z" }, + { url = "https://files.pythonhosted.org/packages/30/dc/617ecafaa4c2cf5197024b1d48da98c5138c5ac5dffaa8f5cd10896740b6/btclib_secp256k1-0.8.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:79e73c9c0773a67e44d6cf72b11cc6a5a9c3ed2e5765b006e93ee7c8edf76902", size = 1458473, upload-time = "2026-08-13T19:04:34.309Z" }, + { url = "https://files.pythonhosted.org/packages/46/d4/244180fd568da687cf650d6d1b12972bd46a9b2e084da07450e299e95e8e/btclib_secp256k1-0.8.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:deccbbad1162f5a6c8d4ca9a338a86a1e2f266310f1c271270f605619294d7db", size = 1439227, upload-time = "2026-08-13T19:04:35.891Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0f/26bbe81bbdf570a449dd00ec22b9b04b8d38084f3857ab673aab67847171/btclib_secp256k1-0.8.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:69436adcc83261a8e6a5ede30dda8d9dc97d0c8fa850927e7128f5b718dfe310", size = 1348703, upload-time = "2026-08-13T19:04:37.44Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0b/926ab02c603bb74f5006785c6864d1ade4b5a14ca04fe8d220d94fcaf76d/btclib_secp256k1-0.8.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:066b4cc87a6f444b879fb0e92d82e30f0ad2f405d464f60cb0d4cea0ba264678", size = 1363831, upload-time = "2026-08-13T19:04:39.13Z" }, + { url = "https://files.pythonhosted.org/packages/10/ff/858f52d01aa854689b4299cfd699baf470da21601c87c47486e758ea5342/btclib_secp256k1-0.8.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b59259d56a1b02a6e4b75d5a35622f49b0338bd8006a83050e7fb2d113cc2626", size = 1357940, upload-time = "2026-08-13T19:04:40.691Z" }, + { url = "https://files.pythonhosted.org/packages/86/3c/454bbd0318ccc7bdea671df0084e617b7593d1c8011b6592aac5e756942b/btclib_secp256k1-0.8.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a17df4e9004898ef3ddd3a29fd170a022cd36125c8d84c818ad2e82be2c3f8b", size = 1457372, upload-time = "2026-08-13T19:04:42.814Z" }, + { url = "https://files.pythonhosted.org/packages/47/2d/7a4c17a1f761afa3f5bb7f47969e89a1e7e77ee35c632bf2907e5cf9bef9/btclib_secp256k1-0.8.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ddd7adcf7ed4b18251b1af4f6588f1bd27ae93e2a67fa317c04866cb9b6edc", size = 1440333, upload-time = "2026-08-13T19:04:44.539Z" }, + { url = "https://files.pythonhosted.org/packages/c8/93/a2daf903eebaeb6dddcb360c4c077aa81d5cf7e66af97fe0d1710afc9183/btclib_secp256k1-0.8.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc0ef911e20b20e6a6fe6c0936b2d9832ed9100e443fc03e5058d9ceb30fe5c1", size = 1458471, upload-time = "2026-08-13T19:04:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/6c/dc/ff584811dc19872e86938de210fdbcf71b1ed6d8f1f635bf7afccd8a59f9/btclib_secp256k1-0.8.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:227a3e05dba30b567fa8f296e9a5da7e6ae589aff4ed4624fccdb6fb19da64fe", size = 1439272, upload-time = "2026-08-13T19:04:48.272Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f3/59a0fa95aeaed2d8f37b947c06f21cefe6ea0572daff666549cfaef01367/btclib_secp256k1-0.8.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ed944a99409636c5779e1cce752c8bb423218122999449f1ec1d905dd697952", size = 1348702, upload-time = "2026-08-13T19:04:49.976Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2f/ecc61bed2234fc199e19ff2b740c5b1e7a8f8a4af2358f98a1c12e95f10c/btclib_secp256k1-0.8.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:574420e77a321a8e89631fd30108710496cb594ae1f5eb9586a7492ea7ed6cda", size = 1369490, upload-time = "2026-08-13T19:04:51.934Z" }, + { url = "https://files.pythonhosted.org/packages/c7/1f/68a30d6bdf0bbae0bc9199aadb3946095bfb245ad60f78cbbb3fb5731b54/btclib_secp256k1-0.8.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:598cf6882ac2baf2dc36217353bffc877b104b69712818a562c83aac61dd4ec4", size = 1363812, upload-time = "2026-08-13T19:04:54.003Z" }, + { url = "https://files.pythonhosted.org/packages/49/1f/939c687b7f4d5de04c1e5c9a10a63e6245ac6d07ae13c9dc549d69e176e7/btclib_secp256k1-0.8.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50aee54099accafa680ed56c1809d6005d221b2c0da6eb649ea3b4f151ff42ea", size = 1357970, upload-time = "2026-08-13T19:04:55.577Z" }, + { url = "https://files.pythonhosted.org/packages/42/09/1a0150466268f340a1c066b0b61fc394f89eeaab3753ae35136886772787/btclib_secp256k1-0.8.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81ef9f22bcb5a47a7a0251d1d6819afa99c6707458969ca6b843375c83298db7", size = 1457692, upload-time = "2026-08-13T19:04:58.076Z" }, + { url = "https://files.pythonhosted.org/packages/38/d1/44033415f2531df5f2c45c4c49d95475fa33f0af5355875ffe01b6cfdb81/btclib_secp256k1-0.8.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52d9290bda9dec0a67e649b6a5b706cae4c0ab10d881c1916a9bd8c906608191", size = 1440864, upload-time = "2026-08-13T19:05:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/50/30/5cbf4c3376ec45076e03de5c1dbce57cd53884ba0f9b85f1a44ef1011905/btclib_secp256k1-0.8.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:592d6781a408759c1047b4ff584265e3bd0673979f2cdda0d9238c48d3f409d3", size = 1458682, upload-time = "2026-08-13T19:05:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2e/17a6126a7811975db1f9de0a4e2c86fc86d7b064463ab4f6244838652464/btclib_secp256k1-0.8.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:51d247b621f5c4c5c726e09a8dee3e6d90c061458b5be9730085533a3847bc04", size = 1439708, upload-time = "2026-08-13T19:05:04.087Z" }, + { url = "https://files.pythonhosted.org/packages/13/53/57c4a9289b8f64fb4e3ac6d476bebdca070b5706182cedfc3d631d3b13bf/btclib_secp256k1-0.8.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:896fc8d0bdd7deb7522dda8bdf14e3d370c7a626b3905078f53a45ab3035eab9", size = 1347666, upload-time = "2026-08-13T19:05:05.738Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b7/bc2c4ad07f48a85547b58a340fce155175c34556e243a27adabc5dca19cc/btclib_secp256k1-0.8.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0b1ada160c40d572b815da849ab4f75b211aa7a43c2de19b785bae82d12a11a7", size = 1368566, upload-time = "2026-08-13T19:05:07.253Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cd/64546afe897415efa45c0a838e49b8c4a5d0973f84d5f7ddc89b26cdf8f4/btclib_secp256k1-0.8.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76562068dd878bdd35118757d940daec66b879eca2b86cccd2acd3c697020e8e", size = 1363811, upload-time = "2026-08-13T19:05:09.058Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a5/a956193b653c00a45052c9b0119436449f7bb9d68e62e759e79761adb17c/btclib_secp256k1-0.8.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8c56ee7d01d99e8734a8c8d06cd421742c7c0bc168e09e4d7f5f3e32706a8fc", size = 1388319, upload-time = "2026-08-13T19:05:10.684Z" }, + { url = "https://files.pythonhosted.org/packages/55/cc/ef70c65fd2288c5f5464ec7ce3550594c5e811cc48e8497ec449cefe232f/btclib_secp256k1-0.8.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:634bb2a9dc9efbb796776d3abb76bc0c564b591f98c055646f7308c647d0c227", size = 1457683, upload-time = "2026-08-13T19:05:12.29Z" }, + { url = "https://files.pythonhosted.org/packages/3c/7d/a53d7dc8df76e9405a837f9d68bb4936059ff6eeeebfeba00f3516acbcb1/btclib_secp256k1-0.8.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b12e3a24daf6a1fb78ae8b2c59a6bc5557562e451eff79da6744329f73fec7b2", size = 1440853, upload-time = "2026-08-13T19:05:14.167Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9d/46b20110ac8a5947cbe9aacea00460d38a41397c787b3da9a96fdcccba03/btclib_secp256k1-0.8.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c0247b047fe0e28f09256426a5f8df19c1ca6ba451f8dcb81544a9fae883f43", size = 1458683, upload-time = "2026-08-13T19:05:15.738Z" }, + { url = "https://files.pythonhosted.org/packages/64/bf/6d599c4b1797251ead87f6309d7496a0b893059dab3e58e743f8610cd432/btclib_secp256k1-0.8.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f5170250ee87311afba46e95ed1e97cbee74b2fb817070fdd8095d205d0e3700", size = 1439673, upload-time = "2026-08-13T19:05:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5d/871d5c0f007cb8667659b61c34b5ab7f22b2263bbf8ce7137551e3727f7e/btclib_secp256k1-0.8.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:3fd079bf41cdacd7e5023eb7a47def69e27bb5a1fe225840ff96bfaadbb053d2", size = 1347664, upload-time = "2026-08-13T19:05:18.948Z" }, + { url = "https://files.pythonhosted.org/packages/72/ad/18862dea779ff53e2cbaa854bf0267ce194a7221315dc7eecef70368b713/btclib_secp256k1-0.8.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:08c44d112a8b11a49cee9595551c2ed326334e2d0ac5715c0a56af6ee69b0624", size = 1368565, upload-time = "2026-08-13T19:05:21.208Z" }, + { url = "https://files.pythonhosted.org/packages/32/7e/426242156accedf0a4ac0fabb994189675b0867430c3075be2bc85995ef4/btclib_secp256k1-0.8.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba7f53c5793e13ef58790969ea0182d8874d93795731614ac068b25679526cca", size = 1365501, upload-time = "2026-08-13T19:05:22.765Z" }, + { url = "https://files.pythonhosted.org/packages/ff/59/491dd870d4b2ac9e4837c438b4eeaadd99b7e80a41897df1c42a2b615af7/btclib_secp256k1-0.8.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8950b4b8d149765e34d132332ea286efa1858a9e4606128e08fead9985b40e19", size = 1388302, upload-time = "2026-08-13T19:05:24.401Z" }, + { url = "https://files.pythonhosted.org/packages/9b/21/074b18aef96c5b13db5ea3311b3033a7c2f1d4be8483cb9d45fe1ebb8946/btclib_secp256k1-0.8.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6299e51a49076b784580847d90be7693e84b7e465a28ea30efed5c7a81f01b2b", size = 1457568, upload-time = "2026-08-13T19:05:26.023Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/0abadbb5a1162547e0a0b21a4496307e6085ccf476fff81e3c2544609c3f/btclib_secp256k1-0.8.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97074443fde6656ad78ed25c86900d63649b9788f5e5d3bada974da686a884e3", size = 1440770, upload-time = "2026-08-13T19:05:27.889Z" }, + { url = "https://files.pythonhosted.org/packages/26/3d/53aea98885372bc0493f1222b0bda004fc3b9b81277761958733ce8e3f46/btclib_secp256k1-0.8.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bce896d52bc07d390fcbd8bcd3761193c27a2140451cb9ee3fa1e7be96d74324", size = 1458682, upload-time = "2026-08-13T19:05:29.633Z" }, + { url = "https://files.pythonhosted.org/packages/8c/79/1e51106e273a60c15b79afe16262e733c842bdb712e0e2e20dc207c444e2/btclib_secp256k1-0.8.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:539440a366512bc3e25a83bfda049d70a7da505f378ad9bfb994a288f529c298", size = 1439711, upload-time = "2026-08-13T19:05:31.804Z" }, + { url = "https://files.pythonhosted.org/packages/04/fe/626119dcff91bed9ec73f64fda4eafded6a85ed8ffc7062dacbcdec790d2/btclib_secp256k1-0.8.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:e731a98d634951a2a1f2befbe2c73821998963335720791680dcf484ad372172", size = 1351000, upload-time = "2026-08-13T19:05:33.691Z" }, + { url = "https://files.pythonhosted.org/packages/c7/70/3a2d2fd07642ada242c0e89efa481bf723efbbe9b0eb10841222279bc4f6/btclib_secp256k1-0.8.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:9f63bdc20709b6bb354c2df55d0d548191874b066ec0eae19460078a54821b29", size = 1377059, upload-time = "2026-08-13T19:05:35.429Z" }, + { url = "https://files.pythonhosted.org/packages/63/59/e20561cecc1b798196bfbcc1eff00db6463beddb9fc4c574748cca948511/btclib_secp256k1-0.8.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:63133cdcdbc968e08dfa1c46f1222d115069f205cb712ddf4999a21f42e52693", size = 1365813, upload-time = "2026-08-13T19:05:37.085Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/d67ce089f13b7b15d770729d4e4e303dd9c479970596fab988eaf47c4b53/btclib_secp256k1-0.8.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:029f85452170bfd6609be9949197096091ccd5b2fe6b30dffd9f5e1cba1d4a2b", size = 1388686, upload-time = "2026-08-13T19:05:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/4d/7b/75ab8e60e27fc428044f5699ec69b1b82f3964aec660cbd484e7bf25dc8f/btclib_secp256k1-0.8.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df988da26ef9e7467d081ea34db0b096e4f3175d30c588f5dbfd2667faac71d2", size = 1464606, upload-time = "2026-08-13T19:05:40.789Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0b/a531ebd82230d9f8c652bf73efe38025bb3d80bdf7b3069d400afc9aa28a/btclib_secp256k1-0.8.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bae727b3cd2f46295b7b96bb1c87e06ea4b288bb23928810ba27d1d594f7e86", size = 1447472, upload-time = "2026-08-13T19:05:43.045Z" }, + { url = "https://files.pythonhosted.org/packages/fb/03/b0f3e5b6d1728c9ef3b26e5838025323973293f4a606de5a0e60b6ef800e/btclib_secp256k1-0.8.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f0d348982d4d0b1215e6fc4fa593dd2d27cb1219a0df237a58d41e01cadc39d", size = 1465365, upload-time = "2026-08-13T19:05:44.64Z" }, + { url = "https://files.pythonhosted.org/packages/75/41/90898087e3c843519ce08d3bd579c594ca8cd327c77196821f37cc6cce0c/btclib_secp256k1-0.8.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:055ecab95c4e3b367d71e49682d2aa047e74b5b838e69a17316043cdee52b738", size = 1446259, upload-time = "2026-08-13T19:05:46.303Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d1/81f046b0f156bdb213cf8d81c1e9b8961adcee3b1be05552bb6a101e9b6f/btclib_secp256k1-0.8.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:99eeaae36f3ef7c0be767a3959ed2b424ca192833c9872870a65ff92f22bb533", size = 1351175, upload-time = "2026-08-13T19:05:48.099Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6a/e08a245e8a3288caa57c1b3f32fa4a83084e3644e2db4a8b6c31c2e14d59/btclib_secp256k1-0.8.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bce20741b9d304eb43777eceee061f198e13c567e7b4b25bef0dcee9a9bdf570", size = 1377386, upload-time = "2026-08-13T19:05:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/ab/94/d90ddd981777175984d2b6e5d7d3c516359fce2684158ea6397d67c91fb6/btclib_secp256k1-0.8.0.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:17c0e2b31a620a651fe6cd7bf6b32e588e65685c89aef4aafe81619f016e5811", size = 1365501, upload-time = "2026-08-13T19:05:51.807Z" }, + { url = "https://files.pythonhosted.org/packages/6a/e7/4475c80cc868fc4fdf2e0879186795cce31e2ae415e366272bba9f647f30/btclib_secp256k1-0.8.0.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:06276a3868faf906ff6d0489f627d72a17a22e3b135d7b77108ee2e6dc49b1ad", size = 1388423, upload-time = "2026-08-13T19:05:53.58Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/fd287125eb26b9d297255720300722e15a446632676330ea468ea100e4b9/btclib_secp256k1-0.8.0.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a17825cbadd290795f685255e537131793aaa50f43882a6f38283ed41bb733f4", size = 1457857, upload-time = "2026-08-13T19:05:55.617Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/7275e021e4d68b07367edb41a5df1fd1963d62803d2233ef3be1cbe2910c/btclib_secp256k1-0.8.0.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f12222c658deebd938f3cce71a6e882e4dad59933b136fed9cf4097656da99e1", size = 1440882, upload-time = "2026-08-13T19:05:57.377Z" }, + { url = "https://files.pythonhosted.org/packages/95/42/9f041ddbd0745a0e35693e9ea8bcdc956cd4f66632dbd0a9250743bb4155/btclib_secp256k1-0.8.0.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1a909910448894c30609a2743541b5ef93108c64f5931cd4de08b57cb8b2ad95", size = 1458764, upload-time = "2026-08-13T19:05:58.85Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/1a125c66f3050a2657404e3e98bd635f59248502de6f12884a216ca452c9/btclib_secp256k1-0.8.0.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:aba167920f204ff509a4f390392b06f4a0edbce52f49bdba1a9b4b859928bf7a", size = 1439753, upload-time = "2026-08-13T19:06:00.611Z" }, + { url = "https://files.pythonhosted.org/packages/2b/34/de25b89667350e6782661d9f05a634910d22fe9d56c3881eada79f990b80/btclib_secp256k1-0.8.0.1-cp315-cp315-win_amd64.whl", hash = "sha256:1050bf5582c5dc4fb4fca87aae0458497e1a7cbe5601e2999b5bb8bbdb506607", size = 1350995, upload-time = "2026-08-13T19:06:02.68Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c6/ad5a0d789be9c640cbf6ef783ba87ba1e76a17c4091a737f4607f9859946/btclib_secp256k1-0.8.0.1-cp315-cp315-win_arm64.whl", hash = "sha256:1e8d97d90e7136f70bf8054c045b87d0d7fdecfa84eabc599c8b218621c5ea7d", size = 1377054, upload-time = "2026-08-13T19:06:04.29Z" }, + { url = "https://files.pythonhosted.org/packages/4f/7d/5fd267dfeac4bf761a99fcc152ed72b38ce1784469f4a876135c4dfa1466/btclib_secp256k1-0.8.0.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:b12b84eaa5e40a678dc9c8d6edaf2aa686eb7b9b92f9618bd04c4a68c547055c", size = 1365520, upload-time = "2026-08-13T19:06:05.978Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/1765f75515155706aa0dc879da34d147692eb92c63429a747e736281ec05/btclib_secp256k1-0.8.0.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:ef6bfc54d3f2c2964bbf8d33bd68845cebd60733efb4d30035e22dda87ffaf3e", size = 1388435, upload-time = "2026-08-13T19:06:07.757Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/5bc07fd568c813a395c4daba9d5b2ecc5b144ff909e566a35729ca1e7fc4/btclib_secp256k1-0.8.0.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6505a2cf325333e6481082a469ecf5c8e2c09c630ef0ebaf87268e2e548918ef", size = 1457521, upload-time = "2026-08-13T19:06:09.315Z" }, + { url = "https://files.pythonhosted.org/packages/3b/75/e8d54e5aa870f49eccf243319650293c0047a7b66387bf5a12c193f87e97/btclib_secp256k1-0.8.0.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:279f1afecab52f29facefac1577fb28cbc3558759cb134090783c6cbc3c0170e", size = 1440565, upload-time = "2026-08-13T19:06:10.812Z" }, + { url = "https://files.pythonhosted.org/packages/fa/00/7b0c261d6817abc8c9ee7c8e6414b44fb43a3fb6dfc99392665dbd72c0ad/btclib_secp256k1-0.8.0.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b859b0ab8bbba318f0966e96407dddcfd0693b371b180d9fe2c7241d53c30bdf", size = 1458506, upload-time = "2026-08-13T19:06:12.616Z" }, + { url = "https://files.pythonhosted.org/packages/70/0d/a4fc1a1fc496fd332638d07788a750c0a315843ddf2be2fcbde358e12c71/btclib_secp256k1-0.8.0.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:8c72baf41154563a49418ca15afdf8c73b9b9ebdd647febdb844bdb776934899", size = 1439336, upload-time = "2026-08-13T19:06:14.374Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/b8d3b7c9161c4d327facc20d61c84611a43840e1f795a391d54f09fc9037/btclib_secp256k1-0.8.0.1-cp315-cp315t-win_amd64.whl", hash = "sha256:4bc1b82223f4acd76e8e3d428808009cf2de11ebfe992065b51a7fb23aa6671e", size = 1351021, upload-time = "2026-08-13T19:06:16.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8d/4f1739613fc70a0aaf793c8e5a7874badf8249323da56f7d86f54dca1375/btclib_secp256k1-0.8.0.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fe54a0678899d35196fb6304038f283759c5029efeb51d043d8bc04e7a7c4d09", size = 1377034, upload-time = "2026-08-13T19:06:18.181Z" }, + { url = "https://files.pythonhosted.org/packages/31/40/8f66a4352097c3b8802f1ed0fbec8a85caa62dfac5405467e30b00da909d/btclib_secp256k1-0.8.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5e3cf5696e0201851e1847d94e7f27f4ee4fe8cb2c97b2f1fca108ba79a7447", size = 1342796, upload-time = "2026-08-13T19:06:19.9Z" }, + { url = "https://files.pythonhosted.org/packages/11/db/745380005c616470542f99a4693180b24a1d081a0fe82e247981d21103a0/btclib_secp256k1-0.8.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6b35e26efc40675a019a9a04b5a2593c80e683001c2ce4781594c580025958d", size = 1338643, upload-time = "2026-08-13T19:06:21.85Z" }, + { url = "https://files.pythonhosted.org/packages/f2/59/ce0f93a20b9a9342e3e8edddcb8643909df16b5f20da4381b692be0b6fb3/btclib_secp256k1-0.8.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c54580827883e99d09977079c287db8f9f985f9c5ddbe27a04f5c4f6f18ec222", size = 1335232, upload-time = "2026-08-13T19:06:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/8e/06/3b913e8739a3f1212f30572551c4ee5d8500e556e4f8505d9c874f9c99ba/btclib_secp256k1-0.8.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a666327a6306b1b52b9abb39834bd079d26313b1b029b99c11b3a1e7b4f8994f", size = 1314198, upload-time = "2026-08-13T19:06:24.997Z" }, + { url = "https://files.pythonhosted.org/packages/3f/84/c13eac827ae67a62dc3cc2d433d3a816d10c9b0b005ac36b4bdd2b857a00/btclib_secp256k1-0.8.0.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:21547c9af3b2f97b0ae4916b4da02ed0b40b848630523e27660160328601b9b0", size = 2626216, upload-time = "2026-08-13T19:06:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/55/df/4df934dc7315d02fb477740ac7512b6798a01341aa0d8609c6188a45eb06/btclib_secp256k1-0.8.0.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:ca46419bbb593bb027b34728a1bc58f4a612200e3d0d3f0d45b918a870f85eed", size = 2626243, upload-time = "2026-08-13T19:06:29.01Z" }, + { url = "https://files.pythonhosted.org/packages/f3/95/0e3172435a018a618f31830bfcd39505fb5ce46a35699b8e7b3b3b792a32/btclib_secp256k1-0.8.0.1-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f7aa577a0bc9a05a5dca2ed1032896ec3ad9a2b7a23c648d835f0fc048b31cad", size = 1329981, upload-time = "2026-08-13T19:06:30.832Z" }, + { url = "https://files.pythonhosted.org/packages/50/1a/1938af166ab4e4c84c506388cd304d221c60d733b558f5dd7c1cd144b9e7/btclib_secp256k1-0.8.0.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0d12c9c54c320faf465492ecce4a64e4e6fc8d9ff913f95c6ca43dbee5d80e23", size = 1310767, upload-time = "2026-08-13T19:06:32.484Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/48a6a98cc735defbc58d260f71b132d428b9722053c350cb9c28168b4a06/btclib_secp256k1-0.8.0.1-py3-none-win_amd64.whl", hash = "sha256:9f077199d42f46bd4375783708eb81c7c396a47755d88750291af330ffd17a64", size = 1332872, upload-time = "2026-08-13T19:06:34.065Z" }, +] [[package]] name = "build"