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

ClaseFirma conSe ejecuta en
XerisClienttu keypairNode, servidores, scripts
XerisDAppla wallet del usuario (window.xeris)el navegador
XerisAgentla clave del agente, dentro de los límites RegisterAgent del dueñoun 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étodoInstrucciónReferencia
transferXrs(kp, to, xrs), transferLamports(kp, to, lamports)NativeTransfer11
stakeXrs(kp, xrs), unstakeXrs(kp, xrs)Stake, Unstake9, 10
wrapXrs(kp, xrs), unwrapXrs(kp, xrs)WrapXrs, UnwrapXrs13, 14
createToken, mintTokens, transferToken, burnTokensTokenCreate, TokenMint, TokenTransfer, TokenBurn3, 0, 1, 2
createRwaToken, rwaUpdateStatus, rwaTransferTokenCreateRWA, RWAUpdateStatus, RWATransfer6, 7, 8
deployContract, callContractContractDeploy, ContractCall5, 4
swap, swapByToken, addLiquidity, removeLiquidity, buyOnLaunchpad, sellOnLaunchpadContractCall4
submitAttestation(kp, slot, hash32)ValidatorAttestation12
registerAgent, updateAgentRegisterAgent, UpdateAgent15, 16
createIdentity, updateIdentityCreateIdentity, UpdateIdentity18, 19
attestReputation, sendAgentMessageAttestReputation, AgentMessage20, 21
conditionalOrder, cancelConditionalOrderConditionalOrder, CancelConditionalOrder23, 24
registerOracle, oracleSubmitRegisterOracle, OracleSubmit25, 26
hardwareAttestHardwareAttest27
registerCapability, updateCapabilityRegisterCapability, UpdateCapability28, 29
postTask, claimTask, resolveTaskPostTask, ClaimTask, ResolveTask31, 32, 33
registerModel, updateModelRegisterModel, UpdateModel34, 35
openDispute, resolveDispute, slashReportOpenDispute, ResolveDispute, SlashReport36, 37, 38
createProposal, castVote, executeProposalCreateProposal, CastVote, ExecuteProposal39, 40, 41
openChannel, closeChannel, forceCloseChannelOpenChannel, CloseChannel, ForceCloseChannel42, 43, 44
agentHeartbeatAgentHeartbeat45
zkProofSubmit, zkProofVerify, zkVkRegisterZkProofSubmit, ZkProofVerify, ZkVkRegister46, 47, 61
pqKeyRegister, pqKeyRotate, pqAttestPqKeyRegister, PqKeyRotate, PqAttest50, 51, 53
createDeal, acceptDeal, confirmDeal, cancelDeal, disputeDeal, settleDeal, reclaimDealCreateDeal … ReclaimDeal54, 55, 56, 57, 58, 59, 60
sendInstruction(kp, bytes)cualquierasobre

Lectura, puerto RPC

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, planUnwrapPOST /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

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étodoMotivoAhora
airdropel faucet está deshabilitado en el nodoFeatureDisabledError
subDelegatela variante 22 se rechaza en el ingresoFeatureDisabledError
zkPrivateTransfer, sendZkPrivateTransferel despachador omite la variante 48FeatureDisabledError
zkIdentityProofvariante 49, igualFeatureDisabledError
pqSignedTransfer, sendPqTransfervariante 52, igualFeatureDisabledError
claimStakingRewardPOST /stake/claim responde 501; las recompensas se pagan cada 900 bloquesFeatureDisabledError
governanceLock, governanceDelegateno existe instrucción de bloqueo ni delegaciónFeatureDisabledError
XerisAgent.swapTokens, buyOnLaunchpad, sellOnLaunchpad, stakeXrs, unstakeXrsno se pueden delegarFeatureDisabledError
buildPqTransferMessage, createZkPrivateTransferProofs, domainHashsin ruta en cadenaeliminado