Skip to main content

@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

PropertyUse
chainheight, stats, blocks, tx, account, search, fee-estimate, submitTx
walletbalance lookup
taskssubmit, get, active, list
minerslist, get, getByAddress
mempoolpending
tokenomicssupply, holders, distribution
analyticsoverview, heatmap
eventsSSE subscribe chain/mempool
ws()WebSocket subscribe channels
send(opts)auto-nonce + sign + broadcast TRANSFER
submitTask(opts)auto-nonce + UUID + sign + broadcast TASK_SUBMIT

Wallet

MethodDescription
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.

Vezi și