SDK Reference
Complete reference for the Tenzro Rust SDK and TypeScript SDK. Both SDKs provide full access to Tenzro Network functionality including blockchain queries, identity management, AI inference, agent operations, payments, and provider management.
Installation:
# Rust — add to Cargo.toml
tenzro-sdk = "0.2"
# TypeScript — npm or yarn
npm install @tenzro/sdkQuick Start
Rust
use tenzro_sdk::{TenzroClient, config::SdkConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = SdkConfig::testnet();
let client = TenzroClient::connect(config).await?;
let block = client.block_number().await?;
println!("Current block: {}", block);
Ok(())
}TypeScript
import { TenzroClient } from "@tenzro/sdk";
const client = TenzroClient.testnet();
const block = await client.getBlockNumber();
console.log("Current block:", block);TenzroClient (Main)
The primary entry point for interacting with Tenzro Network. Provides blockchain queries, transaction submission, and access to all sub-clients.
| Rust | TypeScript |
|---|---|
| block_number() | getBlockNumber() |
| get_block(height) | getBlock(height) |
| get_latest_block() | getLatestBlock() |
| get_balance(address) | getBalance(address) |
| get_nonce(address) | getNonce(address) |
| get_chain_id() | getChainId() |
| send_transaction(from, to, value, ...) | sendTransaction(params) |
| node_info() | nodeInfo() |
| peer_count() | peerCount() |
| total_supply() | totalSupply() |
| request_faucet(address) | requestFaucet(address) |
| is_connected() | isConnected() |
| get_transaction(hash) v0.2 | getTransaction(hash) v0.2 |
| syncing() v0.2 | isSyncing() v0.2 |
| get_finalized_block() v0.2 | getFinalizedBlock() v0.2 |
| export_config() v0.2 | exportConfig() v0.2 |
| get_transaction_history(addr, limit?) v0.2 | getTransactionHistory(addr, limit?) v0.2 |
| list_accounts() v0.2 | listAccounts() v0.2 |
Core Examples
// Rust
let balance = client.get_balance(address).await?;
let block = client.get_block(1000).await?;
let info = client.node_info().await?;
println!("Block: {}, Peers: {}", info.block_height, info.peer_count);// TypeScript
const balance = await client.getBalance("0xabc...");
const block = await client.getBlock(1000);
const info = await client.nodeInfo();
console.log("Block:", info.block_height, "Peers:", info.peer_count);New in v0.2: Transaction Queries and Node Status
// Rust
let tx = client.get_transaction("0xabc123...").await?;
println!("Transaction: {:?}", tx);
let is_syncing = client.syncing().await?;
let finalized = client.get_finalized_block().await?;
println!("Syncing: {}, Finalized block: {}", is_syncing, finalized);
let config = client.export_config().await?;
let history = client.get_transaction_history("0xabc...", Some(50)).await?;
let accounts = client.list_accounts().await?;// TypeScript
const tx = await client.getTransaction("0xabc123...");
console.log("Transaction:", tx);
const syncing = await client.isSyncing();
const finalized = await client.getFinalizedBlock();
console.log("Syncing:", syncing, "Finalized block:", finalized);
const config = await client.exportConfig();
const history = await client.getTransactionHistory("0xabc...", 50);
const accounts = await client.listAccounts();IdentityClient
Manages TDIP (Tenzro Decentralized Identity Protocol) identities for both humans and machines. Accessed via client.identity() (Rust) or client.identity (TypeScript).
| Rust | TypeScript |
|---|---|
| register_human(name) | registerHuman(name) |
| register_machine(params) | registerMachine(controllerDid?, caps) |
| resolve(did) | resolve(did) |
| resolve_did_document(did) | resolveDidDocument(did) |
| import_identity(params) | joinAsMicroNode(params?) |
| list_identities() v0.2 | listIdentities(type?) v0.2 |
| add_credential(did, type, issuer?, claims?) v0.2 | addCredential(did, type, issuerDid) v0.2 |
| add_service(did, type, endpoint) v0.2 | addService(did, type, endpoint) v0.2 |
Identity Examples
// Rust
let identity = client.identity();
let result = identity.register_human("Alice").await?;
println!("DID: {}", result.did);
let info = identity.resolve("did:tenzro:human:abc123").await?;
println!("Status: {}, Keys: {}", info.status, info.key_count);// TypeScript
const identity = client.identity;
const result = await identity.registerHuman("Alice");
console.log("DID:", result.did);
const info = await identity.resolve("did:tenzro:human:abc123");
console.log("Status:", info.status, "Keys:", info.key_count);New in v0.2: Credentials and Services
// Rust
let identity = client.identity();
// List all identities
let all = identity.list_identities().await?;
println!("Found {} identities", all);
// Add a verifiable credential
identity.add_credential(
"did:tenzro:human:abc123",
"KycAttestation",
Some("did:tenzro:human:issuer456"),
Some(serde_json::json!({"tier": 2})),
).await?;
// Add a service endpoint
identity.add_service(
"did:tenzro:human:abc123",
"MessagingService",
"https://msg.example.com/agent",
).await?;// TypeScript
const identity = client.identity;
// List all identities (optionally filter by type)
const all = await identity.listIdentities("Human");
console.log("Found", all.length, "human identities");
// Add a verifiable credential
await identity.addCredential(
"did:tenzro:human:abc123",
"KycAttestation",
"did:tenzro:human:issuer456"
);
// Add a service endpoint
await identity.addService(
"did:tenzro:human:abc123",
"MessagingService",
"https://msg.example.com/agent"
);AgentClient
AI agent lifecycle management, messaging, swarms, and template-based agents. Accessed via client.agent() (Rust) or client.agent (TypeScript).
| Rust | TypeScript |
|---|---|
| register(id, name, caps) | register(id, name, caps) |
| send_message(id, msg) | sendMessage(id, msg) |
| list_agents() | listAgents() |
| spawn_agent(parent, name, caps) | spawnAgent(parent, name, caps) |
| delegate_task(id, desc) | delegateTask(id, desc) |
| run_agent_task(id, task, url?) | runAgentTask(id, task, url?) |
| create_swarm(orch, members, ...) | createSwarm(orch, members, opts?) |
| get_swarm_status(id) | getSwarmStatus(id) |
| terminate_swarm(id) | terminateSwarm(id) |
| spawn_agent_template(id, name?, ctx?) | spawnAgentTemplate(id, name?, ctx?) |
| run_agent_template(id, iters?, dry?) | runAgentTemplate(id, iters?, dry?) |
| download_agent_template(id) | downloadAgentTemplate(id) |
| update_agent_template(id, params) | updateAgentTemplate(id, params) |
| discover_models(mod?, serving?, q?) v0.2 | discoverModels(opts?) v0.2 |
| discover_agents(capability?) v0.2 | discoverAgents(capability?) v0.2 |
| spawn_agent_with_skill(parent, name, skill, caps?) v0.2 | spawnAgentWithSkill(parent, name, skill, caps?) v0.2 |
| fund_agent(id, from, amount) v0.2 | fundAgent(id, from, amount) v0.2 |
| swap_token(id, from, to, amt, chain?) v0.2 | swapToken(id, from, to, amt, chain?) v0.2 |
| agent_pay_for_inference(id, model, prompt, max?) v0.2 | agentPayForInference(id, model, prompt, max?) v0.2 |
Agent Examples
// Rust
let agent = client.agent();
let resp = agent.register("bot-1", "TradingBot", &["inference", "trading"]).await?;
println!("Agent: {}", resp.agent_id);
let msg = agent.send_message("bot-1", "Analyze market conditions").await?;
println!("Response: {}", msg.payload);// TypeScript
const agent = client.agent;
const resp = await agent.register("bot-1", "TradingBot", ["inference", "trading"]);
console.log("Agent:", resp.agent_id);
const msg = await agent.sendMessage("bot-1", "Analyze market conditions");
console.log("Response:", msg.payload);New in v0.2: Discovery, Skills, and Autonomous Payments
// Rust
let agent = client.agent();
// Discover models by modality
let models = agent.discover_models(Some("text"), Some(true), None).await?;
// Discover agents with a specific capability
let agents = agent.discover_agents(Some("inference")).await?;
// Spawn an agent with a skill from the skills registry
let skilled = agent.spawn_agent_with_skill(
"parent-agent-id",
"SolanaTrader",
"solana-defi",
Some(vec!["swap".to_string(), "stake".to_string()]),
).await?;
// Fund an agent's wallet
agent.fund_agent("bot-1", "0xmywallet...", 10.0).await?;
// Token swap via agent
agent.swap_token("bot-1", "TNZO", "USDC", "100", Some("ethereum")).await?;
// End-to-end: agent pays for inference automatically
let result = agent.agent_pay_for_inference(
"bot-1",
"gemma4-9b",
"Summarize today's market trends",
Some(500),
).await?;// TypeScript
const agent = client.agent;
// Discover models (filter by modality, serving status, or search query)
const models = await agent.discoverModels({
modality: "text",
servingOnly: true,
});
// Discover agents with a specific capability
const agents = await agent.discoverAgents("inference");
// Spawn an agent with a skill attached
const skilled = await agent.spawnAgentWithSkill(
"parent-agent-id",
"SolanaTrader",
"solana-defi",
["swap", "stake"]
);
// Fund an agent's wallet
await agent.fundAgent("bot-1", "0xmywallet...", 10.0);
// Token swap via agent
await agent.swapToken("bot-1", "TNZO", "USDC", "100", "ethereum");
// End-to-end: agent pays for inference automatically
const result = await agent.agentPayForInference(
"bot-1",
"gemma4-9b",
"Summarize today's market trends",
500
);SettlementClient
Payment settlement, escrow, and micropayment channels. Accessed via client.settlement() (Rust) or client.settlement (TypeScript).
| Rust | TypeScript |
|---|---|
| settle(request) | settle(request) |
| get_settlement(receipt_id) | getSettlement(receiptId) |
| create_escrow(payee, amt, asset, cond) | createEscrow(payee, amt, asset, cond) |
| release_escrow(id, proof) | releaseEscrow(id, proof?) |
| open_payment_channel(payee, deposit) | openPaymentChannel(payee, deposit) |
| close_payment_channel(id) v0.2 | closePaymentChannel(id) v0.2 |
New in v0.2: Close Payment Channel
// Rust
let settlement = client.settlement();
let channel_id = settlement.open_payment_channel("0xpayee...", 10000000).await?;
// ... after streaming payments ...
let result = settlement.close_payment_channel(&channel_id).await?;
println!("Channel closed: {:?}", result);// TypeScript
const settlement = client.settlement;
const channelId = await settlement.openPaymentChannel("0xpayee...", 10000000n);
// ... after streaming payments ...
const result = await settlement.closePaymentChannel(channelId);
console.log("Channel closed:", result);PaymentClient
HTTP 402-based payment protocols (MPP and x402), card payments, and session management. Accessed via client.payment() (Rust) or client.payment (TypeScript).
| Rust | TypeScript |
|---|---|
| create_challenge(resource, amt, asset, proto) | createChallenge(resource, amt, asset?, proto?) |
| pay_mpp(url, payer_did?) | payMpp(url, payerDid?) |
| pay_x402(url, payer_did?) | payX402(url, payerDid?) |
| list_sessions() | listSessions(includeInactive?) |
| get_receipt(receipt_id) | getReceipt(receiptId) |
| gateway_info() | gatewayInfo() |
| pay_visa_tap(credential) v0.2 | payVisaTap(credential) v0.2 |
| pay_mastercard(credential) v0.2 | payMastercard(credential) v0.2 |
New in v0.2: Card Payment Protocols
// Rust
let payment = client.payment();
// Visa TAP payment
let visa_result = payment.pay_visa_tap(serde_json::json!({
"tap_token": "vtap_abc123...",
"amount": 1000,
"currency": "USD",
})).await?;
// Mastercard Agent Pay
let mc_result = payment.pay_mastercard(serde_json::json!({
"agent_token": "mc_agent_xyz...",
"amount": 500,
"currency": "USD",
})).await?;// TypeScript
const payment = client.payment;
// Visa TAP payment
const visaResult = await payment.payVisaTap({
tap_token: "vtap_abc123...",
amount: 1000,
currency: "USD",
});
// Mastercard Agent Pay
const mcResult = await payment.payMastercard({
agent_token: "mc_agent_xyz...",
amount: 500,
currency: "USD",
});ProviderClient
Network participation, model serving, hardware management, and endpoint registration. Accessed via client.provider() (Rust) or client.provider (TypeScript).
| Rust | TypeScript |
|---|---|
| participate(password) | participate(password) |
| register(models, stake) | register(models, stake?) |
| serve_model(id) | serveModel(id) |
| stop_model(id) | stopModel(id) |
| download_model(id) | downloadModel(id) |
| delete_model(id) | deleteModel(id) |
| chat(model_id, messages) | chat(modelId, messages) |
| stats() | stats() |
| get_hardware_profile() | getHardwareProfile() |
| list_model_endpoints() | listModelEndpoints() |
| list_providers() | listProviders(type?) |
| join_as_micro_node(name?, type?) v0.2 | joinAsMicroNode(name?, type?) v0.2 |
| set_provider_schedule(schedule) v0.2 | setProviderSchedule(schedule) v0.2 |
| get_provider_schedule() v0.2 | getProviderSchedule() v0.2 |
| set_provider_pricing(pricing) v0.2 | setProviderPricing(pricing) v0.2 |
| get_provider_pricing() v0.2 | getProviderPricing() v0.2 |
| get_model_endpoint(instance_id) v0.2 | getModelEndpoint(instanceId) v0.2 |
| register_model_endpoint(model, api, ...) v0.2 | registerModelEndpoint(model, api, ...) v0.2 |
| unregister_model_endpoint(id) v0.2 | unregisterModelEndpoint(id) v0.2 |
| add_resource(id, type?) v0.2 | addResource(id, type?) v0.2 |
| send_signed_transaction(from, to, amt, asset?) v0.2 | sendTransaction(from, to, amt, asset?) v0.2 |
| submit_block(block) v0.2 | submitBlock(block) v0.2 |
New in v0.2: Micro Nodes, Scheduling, and Endpoint Management
// Rust
let provider = client.provider();
// Join as a lightweight micro node (no full P2P binary required)
let result = provider.join_as_micro_node(
Some("MyMicroNode"),
Some("inference"),
).await?;
// Set availability schedule
provider.set_provider_schedule(serde_json::json!({
"timezone": "UTC",
"windows": [
{"day": "weekday", "start": "09:00", "end": "17:00"},
],
})).await?;
// Set pricing
provider.set_provider_pricing(serde_json::json!({
"input_per_token": 0.00001,
"output_per_token": 0.00003,
"currency": "TNZO",
})).await?;
// Register a remote model endpoint
provider.register_model_endpoint(
"gemma4-9b",
"https://my-gpu.example.com/v1",
Some("https://my-gpu.example.com/mcp"),
Some("Gemma 4 9B"),
Some("MyProvider"),
).await?;
// Get a specific endpoint
let ep = provider.get_model_endpoint("instance-123").await?;
// Unregister an endpoint
provider.unregister_model_endpoint("instance-123").await?;
// Send a signed transaction
let tx = provider.send_signed_transaction(
"0xsender...", "0xrecipient...", "1000000000", Some("TNZO"),
).await?;// TypeScript
const provider = client.provider;
// Join as a lightweight micro node
const result = await provider.joinAsMicroNode("MyMicroNode", "inference");
// Set availability schedule
await provider.setProviderSchedule({
timezone: "UTC",
windows: [
{ day: "weekday", start: "09:00", end: "17:00" },
],
});
// Set pricing
await provider.setProviderPricing({
input_per_token: 0.00001,
output_per_token: 0.00003,
currency: "TNZO",
});
// Register a remote model endpoint
await provider.registerModelEndpoint(
"gemma4-9b",
"https://my-gpu.example.com/v1",
"https://my-gpu.example.com/mcp",
"Gemma 4 9B",
"MyProvider"
);
// Get a specific endpoint
const ep = await provider.getModelEndpoint("instance-123");
// Unregister an endpoint
await provider.unregisterModelEndpoint("instance-123");
// Send a signed transaction
const tx = await provider.sendTransaction(
"0xsender...", "0xrecipient...", "1000000000", "TNZO"
);TaskClient
Task marketplace operations including posting, listing, quoting, assigning, and completing tasks. Accessed via client.task() (both Rust and TypeScript).
| Rust | TypeScript |
|---|---|
| post_task(title, desc, type, price, input) | postTask(params) |
| list_tasks(status?, type?, ...) | listTasks(filter?) |
| get_task(id) | getTask(id) |
| cancel_task(id) | cancelTask(id) |
| submit_quote(id, price, model, est, conf, notes?) | submitQuote(id, price, model, est) |
| assign_task(task_id, agent_id) | assignTask(taskId, agentId) |
| complete_task(id, result) | completeTask(id, result) |
| update_task(id, title?, desc?, status?, output?) v0.2 | updateTask(id, opts?) v0.2 |
New in v0.2: Update Task
// Rust
let task = client.task();
// Update task title and status
let updated = task.update_task(
"task-123",
Some("Updated Title"),
None,
Some("in_progress"),
None,
).await?;
// Update task output
let updated = task.update_task(
"task-123",
None,
None,
None,
Some("Partial result: analysis complete"),
).await?;// TypeScript
const task = client.task();
// Update task title and status
const updated = await task.updateTask("task-123", {
title: "Updated Title",
status: "in_progress",
});
// Update task output
const updated2 = await task.updateTask("task-123", {
output: "Partial result: analysis complete",
});TokenClient
Token creation, querying, cross-VM transfers, and balance lookups across all VMs. Accessed via client.token() (Rust) or client.token (TypeScript).
| Rust | TypeScript |
|---|---|
| create_token(name, symbol, decimals, supply, creator) | createToken(params) |
| get_token_info(query) | getTokenInfo(query) |
| list_tokens(vm_type?) | listTokens(vmType?) |
| get_token_balance(address) | getTokenBalance(address) |
| cross_vm_transfer(from_vm, to_vm, token, amt, sender, recipient) | crossVmTransfer(params) |
| wrap_tnzo(address, amount, vm_type) | wrapTnzo(address, amount, vmType) |
Token Examples
// Rust
let token = client.token();
// Create a new ERC-20 token
let result = token.create_token(
"My Token", "MTK", 18,
"1000000000000000000000000",
"0xcreator...",
).await?;
println!("Token created: {} at {}", result.symbol, result.evm_address);
// Get token info by symbol
let info = token.get_token_info("MTK").await?;
println!("Token: {} decimals={}", info.name, info.decimals);
// List all EVM tokens
let tokens = token.list_tokens(Some("EVM")).await?;
println!("Found {} EVM tokens", tokens.len());
// Get TNZO balance across all VMs
let balance = token.get_token_balance("0xaddress...").await?;
println!("EVM: {}, SVM: {}, DAML: {}", balance.evm, balance.svm, balance.daml);
// Cross-VM transfer: move TNZO from EVM to SVM
let transfer = token.cross_vm_transfer(
"EVM", "SVM", "TNZO",
"5000000000000000000",
"0xevm-sender...",
"solana-recipient-pubkey...",
).await?;
println!("Transfer {}: {}", transfer.transfer_id, transfer.status);// TypeScript
const token = client.token;
// Create a new ERC-20 token
const result = await token.createToken({
name: "My Token",
symbol: "MTK",
decimals: 18,
initial_supply: "1000000000000000000000000",
creator: "0xcreator...",
});
console.log("Token created:", result.symbol, "at", result.evm_address);
// Get token info by symbol
const info = await token.getTokenInfo("MTK");
console.log("Token:", info.name, "decimals:", info.decimals);
// List all EVM tokens
const tokens = await token.listTokens("EVM");
console.log("Found", tokens.length, "EVM tokens");
// Get TNZO balance across all VMs
const balance = await token.getTokenBalance("0xaddress...");
console.log("EVM:", balance.evm, "SVM:", balance.svm, "DAML:", balance.daml);
// Cross-VM transfer: move TNZO from EVM to SVM
const transfer = await token.crossVmTransfer({
from_vm: "EVM",
to_vm: "SVM",
token: "TNZO",
amount: "5000000000000000000",
sender: "0xevm-sender...",
recipient: "solana-recipient-pubkey...",
});
console.log("Transfer:", transfer.transfer_id, transfer.status);ContractClient
Smart contract deployment across EVM, SVM, and DAML runtimes via the MultiVmRuntime. Accessed via client.contract() (Rust) or client.contract (TypeScript).
| Rust | TypeScript |
|---|---|
| deploy(bytecode, vm_type, sender, args?) | deploy(params) |
Contract Examples
// Rust
let contract = client.contract();
// Deploy EVM bytecode
let result = contract.deploy(
"0x608060405234801561001057600080fd5b50...",
"EVM",
"0xdeployer...",
None,
).await?;
println!("Contract deployed at: {}", result.contract_address);
// Deploy SVM program
let svm_result = contract.deploy(
"0x7f454c46...",
"SVM",
"deployer-pubkey...",
None,
).await?;
println!("Program deployed: {}", svm_result.contract_address);// TypeScript
const contract = client.contract;
// Deploy EVM bytecode
const result = await contract.deploy({
bytecode: "0x608060405234801561001057600080fd5b50...",
vm_type: "EVM",
sender: "0xdeployer...",
});
console.log("Contract deployed at:", result.contract_address);
// Deploy SVM program
const svmResult = await contract.deploy({
bytecode: "0x7f454c46...",
vm_type: "SVM",
sender: "deployer-pubkey...",
});
console.log("Program deployed:", svmResult.contract_address);AP2Client
Agent Payment Protocol v2 (AP2) session management for autonomous agent payments. Accessed via client.ap2() (Rust) or client.ap2 (TypeScript).
| Rust | TypeScript |
|---|---|
| create_session(agent_id, policy) | createSession(agentId, policy) |
| authorize_payment(session_id, amount) | authorizePayment(sessionId, amount) |
| execute_payment(auth_id) | executePayment(authId) |
| cancel_session(session_id) | cancelSession(sessionId) |
| get_session(session_id) | getSession(sessionId) |
| list_agent_sessions(agent_id) | listAgentSessions(agentId) |
AgentPaymentsClient
Agent spending policies and autonomous payment execution within configurable bounds. Accessed via client.agent_payments() (Rust) or client.agentPayments (TypeScript).
| Rust | TypeScript |
|---|---|
| set_spending_policy(agent_id, policy) | setSpendingPolicy(agentId, policy) |
| get_spending_policy(agent_id) | getSpendingPolicy(agentId) |
| pay_for_service(agent_id, service, amt) | payForService(agentId, service, amt) |
| get_daily_spend(agent_id) | getDailySpend(agentId) |
| list_agent_transactions(agent_id, limit?) | listAgentTransactions(agentId, limit?) |
NanopaymentClient
Off-chain nanopayment channels for per-token billing with batched on-chain settlement. Accessed via client.nanopayment() (Rust) or client.nanopayment (TypeScript).
| Rust | TypeScript |
|---|---|
| open_channel(payee, deposit) | openChannel(payee, deposit) |
| send_nanopayment(channel_id, amount) | sendNanopayment(channelId, amount) |
| flush_batch(channel_id) | flushBatch(channelId) |
| close_channel(channel_id) | closeChannel(channelId) |
| get_channel(channel_id) | getChannel(channelId) |
| list_channels(filter?) | listChannels(filter?) |
BridgeClient
Cross-chain token bridging via LayerZero, Chainlink CCIP, deBridge, and Canton adapters. Accessed via client.bridge() (Rust) or client.bridge (TypeScript).
| Rust | TypeScript |
|---|---|
| bridge_tokens(from, to, amount, adapter?) | bridgeTokens(from, to, amount, adapter?) |
| get_routes(source_chain, dest_chain) | getRoutes(sourceChain, destChain) |
| list_adapters() | listAdapters() |
| get_transfer_status(transfer_id) | getTransferStatus(transferId) |
| estimate_fee(source, dest, amount) | estimateFee(source, dest, amount) |
ERC7802Client
ERC-7802 crosschain mint/burn interface for native cross-chain token transfers. Accessed via client.erc7802() (Rust) or client.erc7802 (TypeScript).
| Rust | TypeScript |
|---|---|
| crosschain_mint(to, amount, source_chain) | crosschainMint(to, amount, sourceChain) |
| crosschain_burn(from, amount, dest_chain) | crosschainBurn(from, amount, destChain) |
| get_cross_chain_supply() | getCrossChainSupply() |
CircuitBreakerClient
Provider health monitoring and circuit breaker management for inference routing. Accessed via client.circuit_breaker() (Rust) or client.circuitBreaker (TypeScript).
| Rust | TypeScript |
|---|---|
| get_provider_health(provider_id) | getProviderHealth(providerId) |
| list_circuit_breakers() | listCircuitBreakers() |
| configure_breaker(provider_id, config) | configureBreaker(providerId, config) |
| reset_breaker(provider_id) | resetBreaker(providerId) |
JSON-RPC Direct Access
You can also interact with Tenzro Network directly via JSON-RPC without the SDK. This is useful for languages without a dedicated SDK.
Endpoint URL
Testnet RPC: https://rpc.tenzro.network
Testnet API: https://api.tenzro.networkBasic Request (curl)
curl -X POST https://rpc.tenzro.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}'Basic Request (JavaScript/fetch)
async function callRpc(method, params = []) {
const response = await fetch('https://rpc.tenzro.network', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method,
params,
id: 1,
}),
});
const data = await response.json();
return data.result;
}
// Get block number
const blockNumber = await callRpc('eth_blockNumber');
console.log('Block number:', blockNumber);
// Get balance
const balance = await callRpc('eth_getBalance', [
'0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb5',
'latest'
]);
console.log('Balance:', balance);Available RPC Methods
| Method |
|---|
| eth_blockNumber |
| eth_getBalance(address, block) |
| eth_sendRawTransaction(data) |
| eth_getTransactionReceipt(hash) |
| tenzro_nodeInfo |
| tenzro_peerCount |
| tenzro_registerIdentity(params) |
| tenzro_resolveIdentity(did) |
| tenzro_listModels(filters) |
| tenzro_requestInference(params) |
| tenzro_chat(model, messages) |
| tenzro_stake(amount, type) |
| tenzro_unstake(amount) |
| tenzro_getVotingPower(address) |
| tenzro_registerAgent(name, caps) |
| tenzro_sendAgentMessage(agentId, msg) |
| tenzro_settle(request) |
| tenzro_createEscrow(payer, payee, amount) |
| tenzro_openPaymentChannel(party, deposit) |
| tenzro_createPaymentChallenge(resource, ...) |
| tenzro_payMpp(url, payer_did) |
| tenzro_payX402(url, payer_did) |
| tenzro_participate(password) |
| tenzro_registerProvider(models, stake) |
| tenzro_postTask(params) |
| tenzro_listCantonDomains() |
| tenzro_submitDamlCommand(cmd) |
| tenzro_getHardwareProfile() |
Complete Workflow Example
End-to-End: Register, Discover, Infer, and Settle (TypeScript)
import { TenzroClient } from "@tenzro/sdk";
async function workflow() {
const client = TenzroClient.testnet();
// 1. Register identity
const identity = await client.identity.registerHuman("Alice");
console.log("Registered DID:", identity.did);
// 2. Discover models
const models = await client.agent.discoverModels({ modality: "text", servingOnly: true });
console.log("Available models:", models);
// 3. Request inference via agent
const agent = await client.agent.register("alice-bot", "AliceBot", ["inference"]);
const result = await client.agent.agentPayForInference(
agent.agent_id,
"gemma4-9b",
"Explain quantum computing",
200
);
console.log("Inference result:", result);
// 4. Check transaction history
const history = await client.getTransactionHistory(identity.did, 10);
console.log("Recent transactions:", history);
}
workflow().catch(console.error);Error Handling
// Rust — errors are typed via SdkError enum
use tenzro_sdk::error::SdkError;
match client.get_balance(address).await {
Ok(balance) => println!("Balance: {} wei", balance),
Err(SdkError::RpcError(msg)) => eprintln!("RPC error: {}", msg),
Err(SdkError::ConnectionError(msg)) => eprintln!("Connection failed: {}", msg),
Err(e) => eprintln!("Unexpected error: {}", e),
}// TypeScript — standard try/catch
try {
const balance = await client.getBalance("0xabc...");
console.log("Balance:", balance);
} catch (error) {
console.error("Failed:", error.message);
}