@ombrachain/sdk — TypeScript SDK
Client oficial TypeScript pentru OmbraChain. Funcționează în Node ≥18, browser, Deno, Bun.
Install
npm install @ombrachain/sdk
# or pnpm add @ombrachain/sdk
Optional peer deps pentru Node ≤19 fără --experimental-fetch/WebSocket:
pnpm add eventsource ws
Quick start
Check balance
import { OmbraClient } from "@ombrachain/sdk";
const client = new OmbraClient({ endpoint: "https://api.ombra-net.com" });
const { balance, nonce } = await client.chain.getAccount("5bb5c50f185363cf913f93a18c6837c20d720a69");
console.log("balance (micro-OMBRA):", balance, "nonce:", nonce);
Create wallet + send OMBRA
import { OmbraClient, Wallet } from "@ombrachain/sdk";
const client = new OmbraClient({ endpoint: "https://api.ombra-net.com" });
const wallet = Wallet.generate(); // BIP39 12-word nou
console.log("address:", wallet.address);
console.log("mnemonic (BACKUP!):", wallet.mnemonic);
// SAU import
const wallet = Wallet.fromMnemonic("twelve word mnemonic ...");
// High-level (auto-nonce + sign + broadcast)
const { ok, hash } = await client.send({
wallet,
to: "abc...",
amount: 1_000_000n, // 1 OMBRA în micro (BigInt)
fee: 10_000n, // 0.01 OMBRA min
});
console.log("tx hash:", hash);
Submit AI task
const { taskId, txHash } = await client.submitTask({
wallet,
prompt: "Explain Proof of AI Tokens Used in 100 words",
taskType: "chat",
fee: 500_000n, // 0.5 OMBRA min pentru tasks
});
// Poll pentru rezultat
let task;
do {
await new Promise((r) => setTimeout(r, 5000));
task = await client.tasks.getDetailed(taskId);
} while (task.status === "pending" || task.status === "in_progress");
console.log("result:", task.result);
Subscribe la blocuri noi (SSE)
const sub = await client.events.subscribeChain();
sub.on("block", (evt) => {
if (evt.type === "block") {
console.log("new block:", evt.block.index, "txs:", evt.block.txs.length);
}
});
// Later
sub.close();
WebSocket subscribe la mempool
const ws = client.ws();
await ws.connect();
const sub = ws.subscribe({ channel: "mempool" }, (msg) => {
console.log("mempool:", msg);
});
// sub.unsubscribe();
// ws.close();
Encrypted wallet storage
import { Wallet, EncryptedStorage } from "@ombrachain/sdk";
// Browser
const storage = new EncryptedStorage({ kind: "localStorage", key: "ombra:wallet" });
// Node
const storage = new EncryptedStorage({ kind: "fs", path: "./wallet.enc" });
const wallet = Wallet.generate();
await storage.save(wallet, "user-password-123");
// Mai târziu
const loaded = await storage.load("user-password-123");
console.log(loaded.address);
API publică
OmbraClient
| Property | Use |
|---|---|
chain | height, stats, blocks, tx, account, search, fee-estimate, submitTx |
wallet | balance lookup |
tasks | submit, get, active, list |
miners | list, get, getByAddress |
mempool | pending |
tokenomics | supply, holders, distribution |
analytics | overview, heatmap |
events | SSE subscribe chain/mempool |
ws() | WebSocket subscribe channels |
send(opts) | auto-nonce + sign + broadcast TRANSFER |
submitTask(opts) | auto-nonce + UUID + sign + broadcast TASK_SUBMIT |
Wallet
| Method | Description |
|---|---|
Wallet.generate(words?) | Generate BIP39 12/24-word |
Wallet.fromMnemonic(m, idx?) | Import din mnemonic |
Wallet.fromPrivateKey(hex) | Import raw (fără recovery) |
wallet.sign(bytes) | Ed25519 sign → hex |
Wallet.verify(msg, sig, pubkey) | Verify |
Tx builders low-level
import { buildTransferTx, buildBurnTx, verifyTx } from "@ombrachain/sdk";
const tx = buildTransferTx(from, to, amount, fee, nonce, privateKey);
await client.chain.submitTx(tx);
const result = verifyTx(tx); // { ok: true } sau { ok: false, reason }
Toate 11 tipuri de tx exposed: buildTransferTx, buildTaskSubmitTx, buildTaskResponseTx, buildTaskProgressTx, buildTaskValidateTx, buildTaskRewardTx, buildMinerRegisterTx, buildNftSetNameTx, buildNftTransferTx, buildBurnTx, buildAttestationRewardTx.
Constants
import { MIN_TASK_FEE, MICRO_OMBRA, TOKENS_PER_OMBRA, FEE_SPLIT_V2 } from "@ombrachain/sdk";
MIN_TASK_FEE // 10_000n (0.01 OMBRA)
MICRO_OMBRA // 1_000_000n
TOKENS_PER_OMBRA // 1_000_000n (1M tokens AI = 1 OMBRA reward)
FEE_SPLIT_V2 // { miner: 70n, burn: 25n, validator: 5n }
Error handling
import { OmbraNetworkError, OmbraApiError } from "@ombrachain/sdk";
try {
await client.chain.getHeight();
} catch (err) {
if (err instanceof OmbraApiError) {
console.error("HTTP", err.status, err.body);
} else if (err instanceof OmbraNetworkError) {
console.error("Network down:", err.message);
}
}
Cross-language compatibilitate
Tx-uri semnate cu acest SDK sunt bit-exact identice cu cele semnate cu SDK Python. Cross-vector tests packages/sdk/tests/ + sdk-python/tests/test_cross_language.py validează roundtrip TS ↔ Python.