SDK
xeris-sdk 5.0.0npmMITNode 18+TypeScript
xeris-sdk construye, firma y envía transacciones de Xeris desde Node o el navegador.
Inicio rápido
npm install xeris-sdk
# https://github.com/ZZachWWins/xeris-sdk
import { XerisClient, XerisKeypair } from 'xeris-sdk';
const client = XerisClient.testnet();
// de keypair_gen, wallet keygen o saveToFile
const wallet = XerisKeypair.fromJsonFile('./keypair.json');
const { signature } = await client.transferXrs(wallet, '<recipient>', 1);
const tx = await client.waitForConfirmation(signature);
console.log(tx.status); // "confirmed"
No hay faucet. Fondea la dirección primero; cada transacción cuesta 0.001 XRS.
Clases
| Clase | Firma con | Se ejecuta en |
|---|---|---|
XerisClient | tu keypair | Node, servidores, scripts |
XerisDApp | la wallet del usuario (window.xeris) | el navegador |
XerisAgent | la clave del agente, dentro de los límites RegisterAgent del dueño | un proceso de agente |
const testnet = XerisClient.testnet(); // 138.197.116.81, puertos 56001 y 50008
// lanza sin host ni XERIS_MAINNET_HOST
const mainnet = XerisClient.mainnet('http://<host>');
const custom = new XerisClient('http://<host>',
{ rpcPort: 56001, explorerPort: 50008 });
Claves
const kp = XerisKeypair.generate();
kp.saveToFile('keypair.json'); // array JSON de 64 bytes, modo 0600
console.log(kp.publicKey); // base58
kp.sign(message); // Ed25519, 64 bytes
// el archivo que leen xrs-node --validator y la CLI wallet
const same = XerisKeypair.fromJsonFile('keypair.json');
Enviar y confirmar
// status "ok" = admitido en la mempool; cualquier cuerpo {"error"} lanza RpcError
const { status, signature } = await client.transferXrs(wallet, to, 1.5);
// por defecto 600,000 ms
const tx = await client.waitForConfirmation(signature, { timeoutMs: 30_000 });
tx.status; // "confirmed" | "partial" | "failed" | "included"
tx.confirmations; // current_slot - block_slot
waitForConfirmation consulta GET /v2/tx hasta que la transacción está indexada. Vocabulario de estados.Leer
await client.getBalance(address); // lamports; 1 XRS = 1,000,000,000
await client.getAccountInfo(address); // data: balance, stake, is_validator, …
await client.getStats(); // data: block_height, current_slot, …
await client.getBlocks(1, 5); // data: [block], pagination
// [{ signature, slot, err, … }]
await client.getSignaturesForAddress(address, 20);
// puerto RPC: recompensa, comisiones, stake
await client.getNetworkEconomics();
Índice de métodos
Los métodos terminados en Xrs reciben XRS como número o cadena decimal; cualquier otro importe va en unidades base.
Escritura
| Método | Instrucción | Referencia |
|---|---|---|
transferXrs(kp, to, xrs), transferLamports(kp, to, lamports) | NativeTransfer | 11 |
stakeXrs(kp, xrs), unstakeXrs(kp, xrs) | Stake, Unstake | 9, 10 |
wrapXrs(kp, xrs), unwrapXrs(kp, xrs) | WrapXrs, UnwrapXrs | 13, 14 |
createToken, mintTokens, transferToken, burnTokens | TokenCreate, TokenMint, TokenTransfer, TokenBurn | 3, 0, 1, 2 |
createRwaToken, rwaUpdateStatus, rwaTransfer | TokenCreateRWA, RWAUpdateStatus, RWATransfer | 6, 7, 8 |
deployContract, callContract | ContractDeploy, ContractCall | 5, 4 |
swap, swapByToken, addLiquidity, removeLiquidity, buyOnLaunchpad, sellOnLaunchpad | ContractCall | 4 |
submitAttestation(kp, slot, hash32) | ValidatorAttestation | 12 |
registerAgent, updateAgent | RegisterAgent, UpdateAgent | 15, 16 |
createIdentity, updateIdentity | CreateIdentity, UpdateIdentity | 18, 19 |
attestReputation, sendAgentMessage | AttestReputation, AgentMessage | 20, 21 |
conditionalOrder, cancelConditionalOrder | ConditionalOrder, CancelConditionalOrder | 23, 24 |
registerOracle, oracleSubmit | RegisterOracle, OracleSubmit | 25, 26 |
hardwareAttest | HardwareAttest | 27 |
registerCapability, updateCapability | RegisterCapability, UpdateCapability | 28, 29 |
postTask, claimTask, resolveTask | PostTask, ClaimTask, ResolveTask | 31, 32, 33 |
registerModel, updateModel | RegisterModel, UpdateModel | 34, 35 |
openDispute, resolveDispute, slashReport | OpenDispute, ResolveDispute, SlashReport | 36, 37, 38 |
createProposal, castVote, executeProposal | CreateProposal, CastVote, ExecuteProposal | 39, 40, 41 |
openChannel, closeChannel, forceCloseChannel | OpenChannel, CloseChannel, ForceCloseChannel | 42, 43, 44 |
agentHeartbeat | AgentHeartbeat | 45 |
zkProofSubmit, zkProofVerify, zkVkRegister | ZkProofSubmit, ZkProofVerify, ZkVkRegister | 46, 47, 61 |
pqKeyRegister, pqKeyRotate, pqAttest | PqKeyRegister, PqKeyRotate, PqAttest | 50, 51, 53 |
createDeal, acceptDeal, confirmDeal, cancelDeal, disputeDeal, settleDeal, reclaimDeal | CreateDeal … ReclaimDeal | 54, 55, 56, 57, 58, 59, 60 |
sendInstruction(kp, bytes) | cualquiera | sobre |
Lectura, puerto RPC
| Método | Ruta |
|---|---|
getHealth() | GET /health |
getRecentBlocks() | GET /blocks |
getStakeInfo(addr) | GET /stake/{address} |
getUnstaking(addr) | GET /account/{address}/unstaking |
getNetworkEconomics() | GET /network/economics |
getTokenList() | GET /tokens |
getTokenBalance(addr, id) | GET /token/balance/{address}/{token_id} |
getTokenAccounts(addr) | GET /token/accounts/{address} |
getContracts() | GET /contracts |
getContract(id) | GET /contract/{id} |
getContractQuote(id, inputToken, amount) | GET /contract/{id}/quote |
getVestingStatus(id, wallet) | GET /contract/{id}/vesting/{wallet} |
getLaunchpads() | GET /launchpads |
getLaunchpadQuote(id, lamports) | GET /launchpad/{id}/quote |
getAgentRegistry(owner) | GET /agent/registry/{owner} |
validateAgent(agent, owner) | GET /agent/validate/{agent}/{owner} |
agentPlan(body), planTransfer, planSwap, planBuyLaunchpad, planStake, planWrap, planUnwrap | POST /agent/plan |
getCapabilities() | GET /capabilities |
searchCapabilities(params) | GET /capabilities/search |
getTasks() | GET /tasks |
getTask(id) | GET /tasks/{id} |
getZkProofs(identity) | GET /zk/proofs/{identity} |
getZkProofStatus(id) | GET /zk/verify/{proof_id} |
getZkStats() | GET /zk/stats |
getPqKey(addr) | GET /pq/keys/{address} |
getPqStatus() | GET /pq/status |
getGovernanceProposals() | GET /governance/proposals |
getGovernanceLock(addr) | GET /governance/lock/{address} |
getPriceHistory(pool, limit) | GET /price-history |
getAllPoolPriceHistory() | GET /pools/price-history |
Lectura, puerto del explorador
| Método | Ruta |
|---|---|
| JSON-RPC | |
getBalance(addr) | getBalance |
getAccountInfoRpc(addr) | getAccountInfo |
getSlot() | getSlot |
getBlockHeight() | getBlockHeight |
getLatestBlockhash(), getLatestBlockhashInfo() | getLatestBlockhash |
getBlockRpc(slot) | getBlock |
getTransactionRpc(sig) | getTransaction |
getSignaturesForAddress(addr, limit) | getSignaturesForAddress |
getHealthRpc() | getHealth |
getVersion() | getVersion |
| REST v2 | |
getStats() | GET /v2/stats |
getBlocks(page, size) | GET /v2/blocks |
getBlockBySlot(slot) | GET /v2/block/slot/{slot} |
getBlockByHash(hash) | GET /v2/block/hash/{hash} |
getTransactions(page, size) | GET /v2/transactions |
getTransaction(sig), waitForConfirmation(sig) | GET /v2/tx/{signature} |
getAccountInfo(addr) | GET /v2/account/{address} |
getAccountTransactions(addr, { page, pageSize, before }) | GET /v2/account/{address}/transactions |
getValidators() | GET /v2/validators |
search(q) | GET /v2/search |
getTokens({ after, limit }) | GET /v2/tokens |
getTokenHolders(id) | GET /v2/token/{id}/holders |
getRwaTokens() | GET /v2/rwa |
getRwa(id) | GET /v2/rwa/{id} |
getContractsV2() | GET /v2/contracts |
getContractV2(id) | GET /v2/contract/{id} |
getPools() | GET /v2/pools |
Tokens
import { toBaseUnits } from 'xeris-sdk';
// el firmante es la autoridad de emisión; maxSupply en unidades base
await client.createToken(wallet, 'mytoken', 'My Token', 'MTK', 9,
toBaseUnits('1000000', 9));
// 1,000 MTK
await client.mintTokens(wallet, 'mytoken', to, toBaseUnits('1000', 9));
await client.transferToken(wallet, 'mytoken', to, toBaseUnits('50', 9));
// { native_xrs, token_accounts: [{ token_id, balance, … }] }
await client.getTokenAccounts(to);
DEX y launchpad
// el DEX y el launchpad gastan XRS envuelto
await client.wrapXrs(wallet, 10);
// POST /agent/plan: amount_in en lamports, slippage 1 %
const swap = await client.planSwap(poolId, 'xrs_native', 1_000_000_000, 1);
// args: 16 bytes crudos, amount_in ‖ min_output, u64 LE (encodeSwapCall)
await client.swap(wallet, poolId, swap.params.method,
1_000_000_000, swap.quote.min_amount_out);
const buy = await client.planBuyLaunchpad(launchpadId, 1_000_000_000, 1);
// args: JSON { xrs_amount, min_tokens_out }
await client.buyOnLaunchpad(wallet, launchpadId,
1_000_000_000, buy.quote.min_tokens_out);
// cualquier plan: await client.sendInstruction(wallet, fromPlan(plan))
Navegador
import { XerisDApp } from 'xeris-sdk';
// { host } para otro nodo; mainnet lo exige
const dapp = new XerisDApp();
await dapp.connect(); // window.xeris firma; el SDK no guarda ninguna clave
await dapp.getBalance(); // la dirección conectada
const { signature } = await dapp.transferXrs(to, 5);
await dapp.waitForConfirmation(signature);
Agentes
await client.registerAgent(
owner, 'ari-trader', agentKp.publicKey,
5_000_000_000, // max_per_tx, lamports
10_000_000_000, // max_daily, lamports, por 21,600 slots
[], // allowed_contracts, vacío = cualquiera
// allowed_operations, cadenas exactas de AGENT_OPERATIONS
['NativeTransfer', 'WrapXrs', 'UnwrapXrs'],
0, // expires_at_slot, 0 = nunca
);
import { XerisAgent } from 'xeris-sdk';
const agent = XerisAgent.testnet(agentKp, owner.publicKey);
await agent.getPermissions(); // { authorized, revoked, expired, agent }
// una vez, antes del primer heartbeat
await agent.createIdentity('Ari Trader', '{}');
// hash del modelo, tareas activas, capacidad, estado
await agent.heartbeat('', 1, 9, 'online');
const [task] = await agent.findTasks({ category: 'trading' });
await agent.claimTask(task.task_id);
// AgentExecute: se ejecuta como el dueño, dentro de los límites
await agent.transferXrs(to, 2);
// swaps, compras en launchpad y Stake no se delegan
await agent.completeTask(task.task_id, proof);
Reglas de AgentExecute. Diseño: whitepaper.
Claves poscuánticas
import { buildPqRotationMessage, CHAIN_ID_TESTNET } from 'xeris-sdk';
// clave pública ML-DSA-65, 1,952 bytes; POST /pq-register
await client.pqKeyRegister(wallet, pqPublicKey, 'dilithium3', 3);
// { has_pq_key, algorithm, security_level, rotation_count, … }
const key = await client.getPqKey(wallet.publicKey);
await client.getPqStatus();
const msg = buildPqRotationMessage(
CHAIN_ID_TESTNET, pqPublicKey, newPqPublicKey, key.rotation_count);
// proof: la clave actual firma msg, ML-DSA-65, 3,309 bytes
await client.pqKeyRotate(wallet, newPqPublicKey, 'dilithium3', proof);
Instrucciones en bruto
import { Instructions, encodeU32, encodeU64, encodeString } from 'xeris-sdk';
// 36 bytes; los builders reciben unidades base, posicionales, aridad estricta
const ix = Instructions.nativeTransfer(wallet.publicKey, to, 1_000_000_000);
// blockhash, firma, POST /submit; hasta 16 instrucciones por transacción
await client.sendInstruction(wallet, ix);
// los mismos bytes a mano: variante u32 y luego los campos en orden de declaración
Buffer.concat([encodeU32(11), encodeString(wallet.publicKey),
encodeString(to), encodeU64(1_000_000_000)]);
Vectores de prueba
npm test
npm run test:vectors
Bytes esperados: Instrucciones.
Eliminado en 5.0
| Método | Motivo | Ahora |
|---|---|---|
airdrop | el faucet está deshabilitado en el nodo | FeatureDisabledError |
subDelegate | la variante 22 se rechaza en el ingreso | FeatureDisabledError |
zkPrivateTransfer, sendZkPrivateTransfer | el despachador omite la variante 48 | FeatureDisabledError |
zkIdentityProof | variante 49, igual | FeatureDisabledError |
pqSignedTransfer, sendPqTransfer | variante 52, igual | FeatureDisabledError |
claimStakingReward | POST /stake/claim responde 501; las recompensas se pagan cada 900 bloques | FeatureDisabledError |
governanceLock, governanceDelegate | no existe instrucción de bloqueo ni delegación | FeatureDisabledError |
XerisAgent.swapTokens, buyOnLaunchpad, sellOnLaunchpad, stakeXrs, unstakeXrs | no se pueden delegar | FeatureDisabledError |
buildPqTransferMessage, createZkPrivateTransferProofs, domainHash | sin ruta en cadena | eliminado |