Skip to content

Getting Started

SATI is the ERC-8004 agent identity standard on Solana. This guide walks you through installing the SDK, registering an agent on devnet, giving feedback, and querying reputation.

Prerequisites

Before you begin, ensure you have:

  • Node.js 18+ and a package manager (pnpm recommended)
  • A Solana wallet with devnet SOL - you'll need ~0.01 SOL for transactions

Getting Devnet SOL

Generate a keypair and airdrop SOL using @solana/kit:

typescript
import { generateKeyPairSigner, createSolanaRpc, address } from "@solana/kit";

const signer = await generateKeyPairSigner();
const rpc = createSolanaRpc("https://api.devnet.solana.com");
await rpc.requestAirdrop(signer.address, 1_000_000_000n).send(); // 1 SOL

Or use the Solana Faucet with your wallet address.

Install

bash
pnpm add @cascade-fyi/sati-sdk
bash
npm install @cascade-fyi/sati-sdk

Peer dependencies:

bash
pnpm add @solana/kit @solana-program/token-2022

Which SDK?

PackageUse When
@cascade-fyi/sati-sdkSolana-native development - agent registration, feedback, search, reputation, and low-level access. Start here.
@cascade-fyi/sati-agent0-sdkYour codebase already uses agent0-sdk types (AgentId, Feedback, AgentSummary). Thin wrapper over sati-sdk.

Quick Start

The full loop: initialize, register an agent, give feedback, query reputation.

typescript
import { Sati, createSatiUploader } from "@cascade-fyi/sati-sdk";
import { generateKeyPairSigner, createSolanaRpc } from "@solana/kit";

// 1. Create a funded devnet wallet
const signer = await generateKeyPairSigner();
const rpc = createSolanaRpc("https://api.devnet.solana.com");
await rpc.requestAirdrop(signer.address, 1_000_000_000n).send(); // 1 SOL

// 2. Initialize the client
const sati = new Sati({ network: "devnet" });

// 3. Register an agent (metadata uploaded to IPFS automatically)
const builder = sati
  .createAgentBuilder("MyAgent", "An AI trading assistant", "https://example.com/avatar.png")
  .setMCP("https://mcp.example.com", "2025-06-18")
  .setActive(true);

const reg = await builder.register({
  payer: signer,
  uploader: createSatiUploader(), // hosted IPFS - no API keys needed
});
console.log(reg.mint);         // agent mint address
console.log(reg.signature);    // transaction signature

// 4. Give feedback (ERC-8004 value/tag fields)
const fb = await sati.giveFeedback({
  payer: signer,
  agentMint: reg.mint,
  value: 85,
  tag1: "quality",
  tag2: "speed",
});

// 5. Query reputation
const summary = await sati.getReputationSummary(reg.mint);
console.log(`${summary.count} reviews, avg ${summary.averageValue}`);
typescript
import { SatiAgent0 } from "@cascade-fyi/sati-agent0-sdk";
import { generateKeyPairSigner, createSolanaRpc } from "@solana/kit";

// 1. Create a funded devnet wallet
const signer = await generateKeyPairSigner();
const rpc = createSolanaRpc("https://api.devnet.solana.com");
await rpc.requestAirdrop(signer.address, 1_000_000_000n).send(); // 1 SOL

// 2. Initialize the SDK
const sdk = new SatiAgent0({
  network: "devnet",
  signer,
});

// 3. Register an agent (metadata is uploaded to IPFS automatically)
const agent = sdk.createAgent("MyAgent", "An AI trading assistant");
agent.setActive(true);

const regHandle = await agent.registerIPFS();
console.log(agent.agentId);   // solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1:MintAddr...
console.log(regHandle.hash);  // transaction signature

// 4. Give feedback (ERC-8004 value/tag fields)
const fbHandle = await sdk.giveFeedback(agent.agentId!, 85, "quality", "speed");
const { result: feedback } = await fbHandle.waitMined();

// 5. Query reputation
const summary = await sdk.getReputationSummary(agent.agentId!);
console.log(`${summary.count} reviews, avg ${summary.averageValue}`);

Bring Your Own IPFS

createSatiUploader() uses a hosted service - no API keys needed. To use your own Pinata account instead:

typescript
import { createPinataUploader } from "@cascade-fyi/sati-sdk";
const uploader = createPinataUploader(process.env.PINATA_JWT!);

SDK Modes

typescript
import { Sati } from "@cascade-fyi/sati-sdk";

// Read-only - search agents, read feedback (no signer needed)
const sati = new Sati({ network: "devnet" });

// With convenience writes - pass a payer to each write method
const result = await sati.giveFeedback({ payer: signer, agentMint, value: 85 });

Next Steps

Released under the Apache 2.0 License.