Any agent that can describe an intent can run on Soloraa.
The built-in agents are not a closed set. The @soloraa/sdk exposes the same primitives the catalog uses — describe an action, the enclave signs only what your policy allows, the chain verifies before funds move.
Install
npm install @soloraa/sdk # or pnpm add @soloraa/sdk
Five-line example
Submit a swap intent. The enclave reads on-chain wallet state, runs your policy, fetches and verifies the Pyth update, and signs only if every check passes. Your code never sees a private key.
import { SoloraaClient } from "@soloraa/sdk";
const client = new SoloraaClient({
rpcUrl: process.env.SOLANA_RPC_URL!,
enclaveUrl: process.env.SOLORA_ENCLAVE_URL!,
walletPda: process.env.SOLORA_WALLET_PDA!,
});
await client.execute({
action: "swap",
protocol: "jupiter",
inputMint: "EPjFW...USDC",
outputMint: "So111...SOL",
amount: 1000_000_000n, // 1000 USDC
constraints: {
maxSlippageBps: 25,
},
});What the SDK does for you
Intent shaping
Your high-level action (swap, transfer, lend, rebalance) becomes a structured intent the enclave can policy-check. Account metas, token mints, decimals — all derived.
Enclave dispatch
The SDK calls the enclave HTTP API, receives the canonical 169-byte SOLORA_INTENT_V2 message, the 64-byte Ed25519 signature, and the enclave pubkey.
Broadcast & stream
Builds a Solana transaction with the Ed25519 verify ix prepended, signs as the relayer, broadcasts, and streams the lifecycle events back to the caller.
What the SDK won't let you do
These aren't bugs — they're the point.
Hold a private key
There is no signing key in user space. The enclave holds the Ed25519 secret sealed to its image hash.
Bypass wallet.policy
The enclave fetches the on-chain policy on every call. Any intent outside it is refused before signing.
Reuse a signed intent
Every intent commits to wallet.nonce. The on-chain verifier rejects with IntentNonceMismatch.
Target arbitrary programs
CPI targets must appear in wallet.policy.allowed_programs. Authority-controlled, capped at 16 entries.
Streaming execution events
For long-running agents you'll want the same 7-stage lifecycle the UI shows. client.stream() emits typed events so you can wire them into your own observability stack.
for await (const event of client.stream({ runId })) {
switch (event.stage) {
case "oracle": metric("oracle.verified", { feed: event.feedId }); break;
case "sign": metric("intent.signed", { pubkey: event.pubkey }); break;
case "verify":
if (event.error) {
// event.error.code, event.error.name, event.error.description
alert("on-chain rejected", event.error);
} else {
metric("intent.confirmed", { sig: event.txSignature });
}
break;
}
}Integration partners
Soloraa is designed to be the cryptographic execution surface between an AI agent and a Solana DeFi protocol. If you maintain a venue or model and want to publish a curated agent, the integration cost is the policy schema and the program allowlist entry.