diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 35da9bc..b76c725 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Create github release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/README.md b/README.md
index f6e6436..123f213 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,73 @@
-# Inventory Extension - [LNbits](https://github.com/lnbits/lnbits) extension
+
+
+
+
+
+
-For more about LNbits extensions see the [LNbits Extensions guide](https://github.com/lnbits/lnbits/wiki/LNbits-Extensions).
+[](./LICENSE)
+[](https://github.com/lnbits/lnbits)
-The Inventory extension provides a simple inventory manager with item metadata and stock quantities. It is designed to be used standalone or as a shared inventory source for other LNbits extensions that need to reference items and availability.
+# Inventory Extension – [LNbits](https://github.com/lnbits/lnbits) extension
+
+The **Inventory extension** provides a simple and flexible inventory manager for
+tracking items, metadata, and stock quantities.
+
+It is designed to work **standalone** or as a **shared inventory source** for other
+LNbits extensions that need to reference products, prices, or availability
+(for example PoS-style extensions).
+
+## Overview
+
+Inventory offers a centralized way to manage products inside LNbits while keeping
+the data reusable across multiple extensions.
+
+Instead of each extension maintaining its own product list, Inventory can act as
+a single source of truth for item data and stock levels.
## Highlights
-- Create, edit, and manage inventory items.
-- Track stock quantities with quick inline updates.
-- Tag items for easier filtering and organization.
-- Share inventory data across extensions.
+- Create, edit, and manage inventory items
+- Track stock quantities with quick inline updates
+- Store item metadata such as names, descriptions, and tags
+- Tag items for easier filtering and organization
+- Share inventory data across multiple LNbits extensions
+
+## Typical Use Cases
+
+- Managing products for point-of-sale or checkout extensions
+- Reusing item data across multiple LNbits extensions
+- Tracking availability and stock changes over time
+- Keeping product information centralized and consistent
+
+## Standalone and Integrations
+
+The Inventory extension can be used on its own as a lightweight inventory manager.
+
+When used alongside other LNbits extensions, it can provide:
+
+- Shared access to item definitions
+- Centralized stock tracking
+- Consistent product metadata across different workflows
+
+This makes it especially useful for PoS-style setups and other extensions that
+depend on structured product data.
## Screenshots



+
+## Notes
+
+- Inventory focuses on item management and availability, not payments.
+- Extensions that integrate with Inventory remain responsible for their own
+ payment logic and workflows.
+
+## Powered by LNbits
+
+[LNbits](https://lnbits.com) is a free and open-source lightning accounts system.
+
+[](https://shop.lnbits.com/)
+[](https://my.lnbits.com/login)
diff --git a/config.json b/config.json
index 73a1f24..5722743 100644
--- a/config.json
+++ b/config.json
@@ -1,19 +1,17 @@
{
+ "id": "inventory",
+ "version": "0.1.0",
"name": "Inventory",
+ "repo": "https://github.com/lnbits/inventory",
"short_description": "Shared Inventory extension",
+ "description": "",
"tile": "/inventory/static/inventory.png",
- "min_lnbits_version": "1.4.0",
- "donate": "donate@legend.lnbits.com",
+ "min_lnbits_version": "1.3.0",
"contributors": [
{
"name": "Tiago Vasconcelos",
"uri": "https://github.com/talvasconcelos",
"role": "Developer"
- },
- {
- "name": "Ben Arc",
- "uri": "https://github.com/arcbtc",
- "role": "Dev"
}
],
"images": [
@@ -29,5 +27,9 @@
],
"description_md": "https://raw.githubusercontent.com/lnbits/inventory/main/description.md",
"terms_and_conditions_md": "https://raw.githubusercontent.com/lnbits/inventory/main/toc.md",
- "license": "MIT"
+ "license": "MIT",
+ "paid_features": "",
+ "tags": ["Merchant", "Commerce"],
+ "donate": "",
+ "hidden": false
}
diff --git a/description.md b/description.md
index fec4196..4db649f 100644
--- a/description.md
+++ b/description.md
@@ -1,9 +1,12 @@
-An easily clonable extension that can be used a base for building a new extension.
+Manage product inventories with stock tracking, pricing, and tax configuration.
-THe usual development enviroment is:
+Its functions include:
-- Clone the myextension repo to your own repo
-- Edit the cloned repos manifest to your details
-- Install into LNbits
-- Delete the cloned extensions folder in your LNbits install
-- Create a symbolic link to the extensions folder, from the where you have pulled your extension `ln -s /where/you/cloned/myextension /your/lnbits/installl/lnbits/lnbits/extensions/`
+- Creating inventories with items, prices, and descriptions
+- Tracking stock quantities and reorder thresholds
+- Configuring discounts and tax rates per item
+- Assigning managers to help manage inventory
+- Importing and exporting item data
+- Logging all inventory updates for auditing
+
+A comprehensive inventory management system for merchants and retailers who need to track products, pricing, and stock levels across their operations.
diff --git a/models.py b/models.py
index ec16f6e..d55d44d 100644
--- a/models.py
+++ b/models.py
@@ -1,8 +1,7 @@
from datetime import datetime, timezone
-from pydantic import BaseModel, Field
-
from lnbits.db import FilterModel
+from pydantic import BaseModel, Field
class CreateInventory(BaseModel):
diff --git a/pyproject.toml b/pyproject.toml
index 7ef5965..9a39843 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,5 @@
[project]
-name = "lnbits-inventory"
+name = "inventory"
version = "0.0.0"
requires-python = ">=3.10,<3.13"
description = "Shared Inventory extension"
@@ -8,8 +8,8 @@ urls = { Homepage = "https://lnbits.com", Repository = "https://github.com/lnbit
dependencies = [ "lnbits>1" ]
-[tool.uv]
-dev-dependencies = [
+[dependency-groups]
+dev = [
"black",
"pytest-asyncio",
"pytest",
@@ -18,6 +18,9 @@ dev-dependencies = [
"ruff",
]
+[tool.poetry]
+package-mode = false
+
[tool.mypy]
exclude = "(nostr/*)"
plugins = ["pydantic.mypy"]
@@ -28,18 +31,6 @@ init_typed = true
warn_required_dynamic_aliases = true
warn_untyped_fields = true
-[[tool.mypy.overrides]]
-module = [
- "lnbits.*",
- "lnurl.*",
- "loguru.*",
- "fastapi.*",
- "pydantic.*",
- "pyqrcode.*",
- "shortuuid.*",
- "httpx.*",
-]
-ignore_missing_imports = "True"
[tool.pytest.ini_options]
log_cli = false
diff --git a/static/js/index.js b/static/js/index.js
index fff9bfa..b0efb55 100644
--- a/static/js/index.js
+++ b/static/js/index.js
@@ -555,26 +555,38 @@ window.app = Vue.createApp({
}
},
async updateItem(data) {
- const newPhotos = this.itemDialog.gallery.filter(p => p.isNew && p.file)
- let newAssetIds = []
+ const filesToUpload = this.itemDialog.gallery
+ .filter(
+ p =>
+ (p.isNew && p.file) ||
+ (!p.isNew && p.assetId && isBase64String(p.assetId))
+ )
+ .map(p => {
+ if (p.isNew && p.file) return p.file
+ if (!p.isNew && p.assetId && isBase64String(p.assetId))
+ return base64ToFile(p.assetId)
+ return null
+ })
+ .filter(Boolean)
- if (newPhotos.length > 0) {
+ let uploadedAssetIds = []
+ if (filesToUpload.length > 0) {
try {
- newAssetIds = await Promise.all(
- newPhotos.map(p => this.uploadPhoto(p.file))
+ uploadedAssetIds = await Promise.all(
+ filesToUpload.map(file => this.uploadPhoto(file))
)
} catch (error) {
- LNbits.utils.notifyError('Failed to upload new photos')
+ LNbits.utils.notifyError('Failed to upload photos')
return
}
}
- const finalIds = [
- ...this.itemDialog.gallery
- .filter(p => !p.isNew && p.assetId)
- .map(p => p.assetId),
- ...newAssetIds
- ]
+ // Asset IDs from gallery that are not new and not base64
+ const existingAssetIds = this.itemDialog.gallery
+ .filter(p => !p.isNew && p.assetId && !isBase64String(p.assetId))
+ .map(p => p.assetId)
+
+ const finalIds = [...existingAssetIds, ...uploadedAssetIds]
data.images = toCsv(finalIds)
diff --git a/static/js/utils.js b/static/js/utils.js
index 2605ade..fc1c1b1 100644
--- a/static/js/utils.js
+++ b/static/js/utils.js
@@ -35,6 +35,18 @@ function fileToBase64(file) {
})
}
+function base64ToFile(base64String, filename) {
+ const arr = base64String.split(',')
+ const mime = arr[0].match(/:(.*?);/)[1]
+ const bstr = atob(arr[1])
+ let n = bstr.length
+ const u8arr = new Uint8Array(n)
+ while (n--) {
+ u8arr[n] = bstr.charCodeAt(n)
+ }
+ return new File([u8arr], filename, {type: mime})
+}
+
function isBase64String(str) {
if (typeof str !== 'string') return false
return str.includes('data:') && str.includes('base64')
diff --git a/uv.lock b/uv.lock
index 0a4b8a8..56b54b3 100644
--- a/uv.lock
+++ b/uv.lock
@@ -773,6 +773,8 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7f/91/ae2eb6b7979e2f9b035a9f612cf70f1bf54aad4e1d125129bef1eae96f19/greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", size = 584358, upload-time = "2025-08-07T13:18:23.708Z" },
{ url = "https://files.pythonhosted.org/packages/f7/85/433de0c9c0252b22b16d413c9407e6cb3b41df7389afc366ca204dbc1393/greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", size = 1113550, upload-time = "2025-08-07T13:42:37.467Z" },
{ url = "https://files.pythonhosted.org/packages/a1/8d/88f3ebd2bc96bf7747093696f4335a0a8a4c5acfcf1b757717c0d2474ba3/greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f", size = 1137126, upload-time = "2025-08-07T13:18:20.239Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/29/74242b7d72385e29bcc5563fba67dad94943d7cd03552bac320d597f29b2/greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7", size = 1544904, upload-time = "2025-11-04T12:42:04.763Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/e2/1572b8eeab0f77df5f6729d6ab6b141e4a84ee8eb9bc8c1e7918f94eda6d/greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8", size = 1611228, upload-time = "2025-11-04T12:42:08.423Z" },
{ url = "https://files.pythonhosted.org/packages/d6/6f/b60b0291d9623c496638c582297ead61f43c4b72eef5e9c926ef4565ec13/greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c", size = 298654, upload-time = "2025-08-07T13:50:00.469Z" },
{ url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" },
{ url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" },
@@ -782,6 +784,8 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" },
{ url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" },
{ url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" },
+ { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload-time = "2025-11-04T12:42:11.067Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload-time = "2025-11-04T12:42:12.928Z" },
{ url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" },
{ url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" },
{ url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" },
@@ -791,6 +795,8 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" },
{ url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" },
{ url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" },
+ { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" },
+ { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" },
{ url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" },
]
@@ -903,6 +909,37 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
]
+[[package]]
+name = "inventory"
+version = "0.0.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "lnbits" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "black" },
+ { name = "mypy" },
+ { name = "pre-commit" },
+ { name = "pytest" },
+ { name = "pytest-asyncio" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "lnbits", specifier = ">1" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "black" },
+ { name = "mypy" },
+ { name = "pre-commit" },
+ { name = "pytest" },
+ { name = "pytest-asyncio" },
+ { name = "ruff" },
+]
+
[[package]]
name = "itsdangerous"
version = "2.2.0"
@@ -1002,37 +1039,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/be/24966f6bb3a9c62cfda0a22521d458c5b0fe85e17f39e40389bafedae3ca/lnbits-1.2.1-py3-none-any.whl", hash = "sha256:64d5b8dc0fe5b72f811e13ada1677b09f55f1070d3da901dc26102f47a07563b", size = 3213306, upload-time = "2025-07-11T10:41:20.773Z" },
]
-[[package]]
-name = "lnbits-inventory"
-version = "0.0.0"
-source = { virtual = "." }
-dependencies = [
- { name = "lnbits" },
-]
-
-[package.dev-dependencies]
-dev = [
- { name = "black" },
- { name = "mypy" },
- { name = "pre-commit" },
- { name = "pytest" },
- { name = "pytest-asyncio" },
- { name = "ruff" },
-]
-
-[package.metadata]
-requires-dist = [{ name = "lnbits", specifier = ">1" }]
-
-[package.metadata.requires-dev]
-dev = [
- { name = "black" },
- { name = "mypy" },
- { name = "pre-commit" },
- { name = "pytest" },
- { name = "pytest-asyncio" },
- { name = "ruff" },
-]
-
[[package]]
name = "lnurl"
version = "0.5.3"
@@ -1781,10 +1787,19 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/9b/41/bb668a6e4192303542d2d90c3b38d564af3c17c61bd7d4039af4f29405fe/secp256k1-0.14.0.tar.gz", hash = "sha256:82c06712d69ef945220c8b53c1a0d424c2ff6a1f64aee609030df79ad8383397", size = 2420607, upload-time = "2021-11-06T01:36:10.707Z" }
wheels = [
+ { url = "https://files.pythonhosted.org/packages/68/6f/be058f4c36f488c3528e5800559a4857e64b1b6e852612533dec4bac63cf/secp256k1-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2cf51c4f6892000a781d09cecd80466f4b9bea74b31b0470704ebcf26ae003ce", size = 1298106, upload-time = "2026-01-29T16:26:23.572Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/c0/edfd6d53e2a7b19aace28dccd6b3359c52ddd1d905d5a060b7961a1bda3e/secp256k1-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f54320f5dac8b740765e1ff5e47fd3cd2604ec334104c8f9113d29666b8ce6", size = 1498901, upload-time = "2026-01-29T16:26:25.89Z" },
{ url = "https://files.pythonhosted.org/packages/09/46/5d3ca364058d39160e3623f0babafe78c2236d359e86924aa07524377c98/secp256k1-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f666c67dcf1dc69e1448b2ede5e12aaf382b600204a61dbc65e4f82cea444405", size = 1376587, upload-time = "2022-01-24T12:36:39.127Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/c6/25b43bd42e24c8ac5babe262b40af0d6cf76ab035ad5e6b894eb9038ab4c/secp256k1-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c779fd35328598522eb2b6cdb6d104e80440cb301ccc312b52bf62e5ea78ee", size = 1494595, upload-time = "2026-01-29T16:26:27.391Z" },
{ url = "https://files.pythonhosted.org/packages/ce/e2/5b1616593ed1fa0e07e87b9f5118dc098bd1ddb2a6a7698d82b0ff85ad3f/secp256k1-0.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fcabb3c3497a902fb61eec72d1b69bf72747d7bcc2a732d56d9319a1e8322262", size = 1362187, upload-time = "2022-01-24T12:36:41.677Z" },
{ url = "https://files.pythonhosted.org/packages/c9/9c/8148f74dd1fc65d0b97c8cbb101b468e27a2e93a3f291807d0d8ebe4bbf3/secp256k1-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a27c479ab60571502516a1506a562d0a9df062de8ad645313fabfcc97252816", size = 1376363, upload-time = "2022-01-24T12:36:44.314Z" },
{ url = "https://files.pythonhosted.org/packages/64/11/ff6d18314bc05a8f66619959a61be2fb6f37793d73e1dd106954b0978d92/secp256k1-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4b9306bff6dde020444dfee9ca9b9f5b20ca53a2c0b04898361a3f43d5daf2e", size = 1369109, upload-time = "2022-01-24T12:36:46.782Z" },
+ { url = "https://files.pythonhosted.org/packages/77/12/4c9815a819816587df70aa38fe7d09b54724a0b1b9b8e8ea2af1c205f2a5/secp256k1-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:539d1d9750299ec4e8df6211978ba78779f5095c7ef19985313f03d1d1b816bd", size = 1298105, upload-time = "2026-01-29T16:26:28.697Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/86/f01ee0f4c44e12933c460f2b868a3888b93a7c7f4e9fc9be173401b55e8d/secp256k1-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d597a59e3918b0e41181a1c872851ac2e6137882de7f0487b8c42b25333ada", size = 1498906, upload-time = "2026-01-29T16:26:30.138Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c8/79f2990b72556c3f416ecfde2116a08afb41e324f51b8bf61268d7b72715/secp256k1-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:393d189b4ada9ab3de0b053f484a3b7e86024f4b8cd36616c05f07dbae3ca180", size = 1494612, upload-time = "2026-01-29T16:26:32.252Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/e8/8dd140270b4e12a7f5876f1641f996854d700866352875f161f770b69ebb/secp256k1-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4ec14534c1e8b8991376915ef059b7a3e62366aeda60df50b3932ad6529d26a", size = 1298100, upload-time = "2026-01-29T16:26:33.481Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/6c/e63892de8d7582ab30602ccc1cf0ecd88a30b1a09424eb847c863fd46d9f/secp256k1-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1041694e429eb465123cb742911d2aad5cbd9e0cf2891aaaf794a887938647d1", size = 1499269, upload-time = "2026-01-29T16:26:35.717Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/5c/2faa8c523c0204af249890eb51b697e9a19d59d101625149d7b4f482e894/secp256k1-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf03e6d45892172046d4e085d5cc91d13a73a465c0f4c8b5633d823b0ca667e2", size = 1494878, upload-time = "2026-01-29T16:26:37.857Z" },
]
[[package]]