Metadata-Version: 2.4
Name: unpchain-database-sdk
Version: 1.0.0
Summary: A generic, encrypted, blockchain-backed database SDK for the UNP Chain.
Project-URL: Homepage, https://unpchain.com
Project-URL: Repository, https://github.com/UNPChain/unpchain-database-sdk-python
Author: UNPChain
License: MIT
Keywords: blockchain,database,encryption,unpchain,web3
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Database
Classifier: Topic :: Security :: Cryptography
Requires-Python: >=3.10
Requires-Dist: cryptography>=41.0
Requires-Dist: eth-account>=0.10
Requires-Dist: pymongo<5,>=4.0
Requires-Dist: web3<8,>=6.0
Provides-Extra: dev
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Description-Content-Type: text/markdown

# UNPChainDatabaseSDK — Python

A generic, encrypted, blockchain-backed database SDK for the **UNP Chain**.  
Store, retrieve, update, and delete any JSON-serializable Python object on-chain with private-key-based AES-256-GCM encryption.

## Installation

```bash
pip install unpchain-database-sdk
```

## Quick Start

```python
from unpchain_database_sdk import ChainDatabase, ChainDatabaseOptions

# With MongoDB (recommended)
options = ChainDatabaseOptions(
    mongo_connection_string="mongodb://localhost:27017",
    mongo_database_name="MyApp",
)
db = ChainDatabase("0xYOUR_PRIVATE_KEY", "Product", options)

# Insert
result = db.insert({"name": "Keyboard", "price": 149.99})
print(result.tx_hash)   # on-chain proof
print(result.payload)   # encrypted blob (store this!)

# Read
product = db.get(result.payload)

# Update
result2 = db.update(result.payload, result.tx_hash, {"name": "Keyboard", "price": 129.99})

# Delete
db.delete(result2.payload, result2.tx_hash)

# MongoDB-backed convenience methods
all_records = db.get_all()
record = db.get_by_record_id("some-record-id")
db.update_by_record_id("some-record-id", new_data)
db.delete_by_record_id("some-record-id")
```

## Without MongoDB

```python
db = ChainDatabase("0xYOUR_PRIVATE_KEY", "Product")
result = db.insert({"name": "Keyboard", "price": 149.99})
# You must store result.tx_hash and result.payload yourself!
product = db.get(result.payload)
```

## API Reference

| Method | MongoDB Required | Description |
|---|---|---|
| `insert(data)` | No | Encrypt + store on-chain |
| `update(payload, tx_hash, new_data)` | No | Chain a new version |
| `delete(payload, tx_hash)` | No | Soft-delete on-chain |
| `get(payload)` | No | Decrypt → data (None if deleted) |
| `get_record(payload)` | No | Decrypt → RecordInfo with metadata |
| `is_deleted(payload)` | No | Check soft-delete flag |
| `get_all(sort_order)` | **Yes** | All records for this wallet |
| `get_by_record_id(id)` | **Yes** | Single record by stable GUID |
| `update_by_record_id(id, data)` | **Yes** | Convenience update |
| `delete_by_record_id(id)` | **Yes** | Convenience delete |

## Testing

```bash
cd tests
python test_integration.py
```
