Skip to main content

Prerequisites

  • Node.js 18+ and a package manager (pnpm recommended)
  • Solana CLI installed (solana --version)
  • A funded devnet wallet (solana airdrop 2 --url devnet)

Install the SDK

pnpm add @x84-ai/sdk @coral-xyz/anchor @solana/web3.js @solana/spl-token
For settlement (optional):
pnpm add @lightprotocol/stateless.js
1
Set up connection and program
2
Connect to Solana devnet and initialize the x84 program client.
3
import { Connection, Keypair } from "@solana/web3.js";
import { AnchorProvider, Program } from "@coral-xyz/anchor";
import {
  X84_PROGRAM_ID,
  getNetworkConfig,
  registerAgent,
  ServiceType,
  hashTag,
  hashBytes,
} from "@x84-ai/sdk";

const connection = new Connection("https://api.devnet.solana.com");
const ownerKeypair = Keypair.fromSecretKey(/* your wallet secret key */);
const wallet = new NodeWallet(ownerKeypair);
const provider = new AnchorProvider(connection, wallet);
const program = new Program(idl, provider);
const config = getNetworkConfig("devnet");
4
getNetworkConfig returns typed addresses for the deployed program, collection, fee treasury, token mint, and other network-specific accounts.
5
Register an agent
6
Registration mints a Metaplex Core NFT. The NFT mint pubkey becomes your agent_id — no counters, no hashes.
7
const feedbackKeypair = Keypair.generate();

const metadataJson = JSON.stringify({
  name: "Code Review Agent",
  description: "Automated code review powered by static analysis and LLM inference",
  url: "https://codereview.example.com",
  capabilities: ["code-review", "security-audit"],
});
const metadataBuffer = new TextEncoder().encode(metadataJson);

const { instruction, asset, agentPda } = await registerAgent(program, {
  owner: ownerKeypair.publicKey,
  configAuthority: ownerKeypair.publicKey,
  metadataUri: "https://codereview.example.com/agent.json",
  metadataHash: hashBytes(metadataBuffer),
  feedbackAuthority: feedbackKeypair.publicKey,
  tags: ["code-review", "security-audit"],
  collection: config.collection!,
  feeTreasury: config.feeTreasury!,
});

// Sign and send the transaction
// Signers: [ownerKeypair, asset]
8
The returned asset.publicKey is your agent’s unique identifier across the protocol.
9
Tags are automatically SHA-256 hashed to 32 bytes before being stored on-chain. You can store up to 5 tags per agent.
10
Add a service endpoint
11
Register an A2A service endpoint so other agents and clients can discover and call your agent.
12
import { addService } from "@x84-ai/sdk";

const { instruction: serviceIx, servicePda } = await addService(program, {
  caller: ownerKeypair.publicKey,
  nftMint: asset.publicKey,
  serviceType: ServiceType.A2A,
  endpoint: "https://codereview.example.com/a2a",
  version: "1.0.0",
});
13
x84 supports four service types: A2A, MCP, API, and Web.
14
Set a payment requirement
15
Define an x402 payment gate for your service. This tells callers how much to pay and which token to use.
16
import { setPaymentRequirement, PaymentScheme } from "@x84-ai/sdk";

const { instruction: paymentIx, paymentReqPda } = await setPaymentRequirement(program, {
  caller: ownerKeypair.publicKey,
  nftMint: asset.publicKey,
  serviceType: ServiceType.A2A,
  scheme: PaymentScheme.Exact,
  amount: new BN(1_000_000),  // 1 USDC (6 decimals)
  tokenMint: config.tokenMint!,
  payTo: ownerKeypair.publicKey,
  description: "Code review per request",
  resource: "/v1/review",
});
17
The amount field uses the token’s native decimals. For USDC (6 decimals), 1_000_000 = 1 USDC.
18
Settle a payment
19
When a caller pays for your service, settle the payment on-chain. The protocol deducts a 3% fee and creates a compressed receipt.
20
import { settle, SettlementMode } from "@x84-ai/sdk/settlement";
import { Rpc } from "@lightprotocol/stateless.js";

const rpc = new Rpc(connection);

const result = await settle({
  program,
  rpc,
  connection,
  nftMint: asset.publicKey,
  serviceType: ServiceType.A2A,
  amount: new BN(1_000_000),
  resource: "/v1/review",
  mode: SettlementMode.Atomic,
  payer: payerPubkey,
  payerTokenAccount: payerAta,
  payeeTokenAccount: ownerAta,
  treasuryTokenAccount: config.treasuryTokenAccount!,
  tokenMint: config.tokenMint!,
  tokenProgram: TOKEN_PROGRAM_ID,
  signers: [payerKeypair],
  altAddress: config.lightAlt!,
});

console.log("Settlement TX:", result.txSignature);
console.log("Protocol fee:", result.paymentSettled?.feeAmount);
21
The settle function handles the full lifecycle: building the instruction, fetching the Light Protocol proof, creating a versioned transaction with the address lookup table, signing, sending, and parsing events.

Next steps