Skip to content
LogoLogo

SDKs

Two SDKs, one design. Both follow the shared contract in SDK & docs contract (docs/SDK_DESIGN.md): the same clients, actions and names (camelCase in TypeScript, snake_case in Python), the same errors, and the same byte-exact results.

TypeScriptPython
Packagearrekta-sdk (npm)arrekta-sdk (pip), import arrekta_sdk
RuntimeNode ≥ 20 and browsers, ESM, no Node-only APIs in core pathsPython ≥ 3.13
ClientscreateClient, createGatewayClientClient, AsyncClient (httpx), gateway variants
Crypto@noble/post-quantum (ML-DSA), @noble/hashes (SHA-3), @scure/base (bech32m)the reference package arrekta (core/), so protocol code can't drift
REST typesgenerated from openapi.json with openapi-typescriptgenerated models
Amountsbigint base unitsint base units

Design

  • Clients from a transport, standalone actions (from viem): getBlock(client, { id }), so bundlers drop what you don't use. Python also exposes every action as a client method.
  • Post-quantum accounts: keys from a 32-byte seed, ML-DSA-65 by default, ML-DSA-87 optional.
  • Issued assets, policy locks and PST as first-class types.
  • Subscriptions as async iterators with AbortSignal support that resume from the last event id.
  • Conformance: each SDK reproduces every vector in core/vectors/*.json (keys, hashing, transactions, PST, base layer, security) byte for byte, and CI runs the examples against a regtest node.

Same example, both languages

/**
 * Send a payment: derive a wallet, fund it on regtest, pay 1.5 ARRK, confirm.
 *
 *   ARREKTA_URL=http://127.0.0.1:28332 ARREKTA_ADMIN_TOKEN=... npx tsx examples/send-payment.ts
 */
import { createClient, formatArrk, fromHex, generateSeed, getAddress, getChain, getCoins, keychainFromSeed, mine, sendPayment } from 'arrekta-sdk';
 
const URL = process.env.ARREKTA_URL ?? 'http://127.0.0.1:28332';
const ADMIN = process.env.ARREKTA_ADMIN_TOKEN; // regtest mining for the demo
const SEED = fromHex(process.env.ARREKTA_SEED ?? 'a1'.repeat(32));
 
// 1. Connect and read the chain.
const client = createClient({ url: URL, adminToken: ADMIN });
const chain = await getChain(client);
console.log(`connected to ${chain.network} at height ${chain.height}`);
 
// 2. Alice's wallet from her seed; Bob gets a fresh one.
const alice = keychainFromSeed(SEED, { network: chain.network });
const bob = keychainFromSeed(generateSeed(), { network: chain.network });
 
// 3. Fund Alice (regtest: mine past coinbase maturity).
if ((await getCoins(client, { wallet: alice })).length === 0) await mine(client, alice.address(0), 101);
 
// 4. Pay Bob 1.5 ARRK (fee rate from the node's estimate).
const sent = await sendPayment(client, { wallet: alice, to: bob.address(0), amount: '1.5' });
console.log(`sent ${sent.txid} (fee ${formatArrk(sent.fee)} ARRK)`);
 
// 5. Confirm and check Bob's balance.
await mine(client, alice.address(0), 1);
const balance = (await getAddress(client, { address: bob.address(0) })).balances[0]!;
console.log(`bob has ${formatArrk(balance.spendable)} ARRK`);

Source: sdk/typescript/examples/send-payment.ts (updated 2026-11-02) · sdk/python/examples/send_payment.py (updated 2026-11-02). Runnable against a regtest node; CI runs every example.

Sections

TopicTypeScriptPython
InstallInstallInstall
ClientsClientsClients
ActionsActionsActions
Accounts & keysAccountsAccounts
TransactionsTransactionsTransactions
PSTPSTPST
ErrorsErrorsErrors
UnitsUnitsUnits