ombrachain — Python SDK
Client oficial Python pentru OmbraChain. Python ≥3.10.
Install
pip install ombrachain
Quick start
Check balance
from ombrachain import OmbraClient
client = OmbraClient("https://api.ombra-net.com")
account = client.chain.get_account("5bb5c50f185363cf913f93a18c6837c20d720a69")
print(f"balance: {account['balance']} micro-OMBRA, nonce: {account['nonce']}")
Create wallet + send OMBRA
from ombrachain import OmbraClient, Wallet
client = OmbraClient("https://api.ombra-net.com")
wallet = Wallet.generate() # BIP39 12-word nou
print("address:", wallet.address)
print("mnemonic (BACKUP!):", wallet.mnemonic)
# SAU import
wallet = Wallet.from_mnemonic("twelve word mnemonic ...")
result = client.send(wallet, to="abc...", amount=1_000_000, fee=10_000)
print("tx hash:", result["hash"])
Submit AI task
import time
result = client.submit_task(
wallet,
prompt="Explain Proof of AI Tokens Used in 100 words",
task_type="chat",
fee=500_000,
)
print("task ID:", result["task_id"])
while True:
task = client.tasks.get_detailed(result["task_id"])
if task["status"] in ("completed", "failed", "timeout"):
break
time.sleep(5)
print("result:", task.get("result"))
Subscribe la blocuri noi (async SSE)
import asyncio
from ombrachain import OmbraClient
async def main():
client = OmbraClient("https://api.ombra-net.com")
async with client.subscribe_chain() as sub:
async for evt in sub:
if evt["type"] == "block":
print("new block:", evt["block"]["index"])
asyncio.run(main())
WebSocket subscribe
import asyncio
from ombrachain import OmbraClient
async def main():
client = OmbraClient("https://api.ombra-net.com")
ws = client.websocket()
await ws.connect()
await ws.subscribe({"channel": "mempool"})
async for msg in ws.messages():
print(msg)
asyncio.run(main())
Encrypted wallet storage
from ombrachain import Wallet, EncryptedStorage
storage = EncryptedStorage("wallet.enc")
wallet = Wallet.generate()
storage.save(wallet, "user-password-123")
# Mai târziu
loaded = storage.load("user-password-123")
print(loaded.address)
API publică
OmbraClient
| Attribute | Use |
|---|---|
chain | get_height(), get_account(), get_block(), submit_tx(), ... |
wallet | get_balance(addr) |
tasks | submit(), get(), get_detailed(), active(), list() |
miners | list(), get(nft_id), get_by_address(addr) |
mempool | get() |
tokenomics | get_supply(), get_holders(limit), get_distribution() |
analytics | overview(range), heatmap() |
send(wallet, ...) | high-level send OMBRA |
submit_task(wallet, ...) | high-level submit AI task |
subscribe_chain() | async SSE context manager |
websocket() | async WS client |
Wallet
| Method | Use |
|---|---|
Wallet.generate(words=12) | BIP39 nou (12 sau 24 cuvinte) |
Wallet.from_mnemonic(m, hd_index=0) | Import din mnemonic |
Wallet.from_private_key(hex) | Import raw (fără recovery) |
wallet.sign(message) | Ed25519 sign → hex |
Wallet.verify(msg, sig, pubkey) | Verify |
wallet.address, wallet.public_key, wallet.private_key, wallet.mnemonic | Attribute |
Tx builders low-level
from ombrachain import build_transfer_tx, build_burn_tx, verify_tx
tx = build_transfer_tx(from_addr, to, amount, fee, nonce, private_key)
client.chain.submit_tx(tx)
assert verify_tx(tx) == {"ok": True}
Toate 11 builders: build_transfer_tx, build_task_submit_tx, build_task_response_tx, build_task_progress_tx, build_task_validate_tx, build_task_reward_tx, build_miner_register_tx, build_nft_setname_tx, build_nft_transfer_tx, build_burn_tx, build_attestation_reward_tx.
Constants
from ombrachain import MIN_TASK_FEE, MICRO_OMBRA, TOKENS_PER_OMBRA, FEE_SPLIT_V2
MIN_TASK_FEE # 10_000 (0.01 OMBRA)
MICRO_OMBRA # 1_000_000
TOKENS_PER_OMBRA # 1_000_000 (1M tokens AI = 1 OMBRA reward)
FEE_SPLIT_V2 # {"miner": 70, "burn": 25, "validator": 5}
Error handling
from ombrachain import OmbraApiError, OmbraNetworkError
try:
client.chain.get_height()
except OmbraApiError as e:
print(f"HTTP {e.status}: {e.body}")
except OmbraNetworkError as e:
print(f"Network down: {e}")
Cross-language compatibilitate
Tx-uri semnate cu acest SDK sunt bit-exact identice cu cele semnate cu SDK TypeScript. Vector tests sdk-python/tests/test_cross_language.py validează roundtrip.
Exemplu cross-test:
# Standard BIP39 mnemonic produce ACEEAȘI adresa în TS + Python:
from ombrachain import Wallet
w = Wallet.from_mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about")
assert w.address == "94bfbb5fbd2fea4c67be283d36528a3cfd1cfda3"