AURA

Examples

End-to-end TypeScript SDK usage patterns for common AURA workflows.

Pre-alpha — not production ready

@aura-protocol/sdk-ts targets Solana devnet only. APIs may change without notice. Do not use for real funds until a stable release and audit are published.

Complete, runnable examples using @aura-protocol/sdk-ts. Each example shows both the high-level Aura API and the low-level AuraClient equivalent where relevant.

Setup

import BN from 'bn.js';
import { Connection, Keypair, PublicKey, SystemProgram } from '@solana/web3.js';
import {
  Aura,
  AuraClient,
  AURA_PROGRAM_ID,
  ENCRYPT_DEVNET_PROGRAM_ID,
  DWALLET_DEVNET_PROGRAM_ID,
} from '@aura-protocol/sdk-ts';

const rpcUrl = 'https://devnet.helius-rpc.com/?api-key=YOUR_KEY';
const owner = Keypair.generate();

// High-level
const aura = new Aura({ rpcUrl, keypair: owner });

// Low-level
const client = new AuraClient({
  connection: new Connection(rpcUrl, 'confirmed'),
  programId: AURA_PROGRAM_ID,
});

Create a Treasury

// High-level — plain numbers, timestamps auto-injected, limits default sensibly
const { treasury, signature } = await aura.treasury.create({
  agentId: 'agent-prod-1',
  dailyLimitUsd: 10_000,
  perTxLimitUsd: 1_000,
});

console.log('Treasury PDA:', treasury.toBase58());
// Low-level — full control over every field
const { treasury, signature } = await client.createTreasury(owner, {
  agentId: 'agent-prod-1',
  aiAuthority: owner.publicKey,
  createdAt: new BN(Math.floor(Date.now() / 1000)),
  pendingTransactionTtlSecs: new BN(900),
  policyConfig: {
    dailyLimitUsd: new BN(10_000),
    perTxLimitUsd: new BN(1_000),
    daytimeHourlyLimitUsd: new BN(2_500),
    nighttimeHourlyLimitUsd: new BN(500),
    velocityLimitUsd: new BN(5_000),
    allowedProtocolBitmap: new BN(31),
    maxSlippageBps: new BN(100),
    maxQuoteAgeSecs: new BN(300),
    maxCounterpartyRiskScore: 70,
    bitcoinManualReviewThresholdUsd: new BN(5_000),
    sharedPoolLimitUsd: null,
    weeklyLimitUsd: null,
    monthlyLimitUsd: null,
    recipientLimits: [],
    cooldownConfig: null,
    anomalyConfig: null,
    reputationPolicy: {
      highScoreThreshold: new BN(80),
      mediumScoreThreshold: new BN(50),
      highMultiplierBps: new BN(15_000),
      lowMultiplierBps: new BN(7_000),
    },
    budgetEnvelopes: [],
    approvalLadder: null,
    scopedPauseEntries: [],
    livenessConfig: {
      requireEncryptFreshness: false,
      requireDwalletFreshness: false,
      requireBalanceOracleFreshness: false,
      requireComplianceOracleFreshness: false,
      maxStalenessSecs: new BN(300),
    },
  },
  protocolFees: {
    treasuryCreationFeeUsd: new BN(100),
    transactionFeeBps: new BN(10),
    fheSubsidyBps: new BN(5_000),
  },
});

Fetch and Inspect a Treasury

const account = await client.getTreasuryAccount(treasury);

console.log('Agent ID:       ', account.agentId);
console.log('Owner:          ', account.owner.toBase58());
console.log('Daily limit USD:', account.policyConfig.dailyLimitUsd.toString());
console.log('Is paused:      ', account.executionPaused);
console.log('Total executed: ', account.totalTransactions.toString());
console.log('Daily spent:    ', account.policyState.spentTodayUsd.toString());

const pending = account.pendingQueue[account.pendingQueue.length - 1];
if (pending) {
  console.log('Pending proposal:', pending.proposalId.toString());
  console.log('Amount USD:      ', pending.amountUsd.toString());
  console.log('Expires:         ', new Date(pending.expiresAt.toNumber() * 1000));
}

Propose a Public Transaction

// High-level
const signature = await aura.treasury.propose({
  treasury,
  amountUsd: 250,
  chain: 2,                    // Ethereum
  recipient: '0xdeadbeef...',
  counterpartyRiskScore: 15,
});
// Low-level
const now = new BN(Math.floor(Date.now() / 1000));

await client.proposeTransaction(
  aiAuthority,
  { aiAuthority: aiAuthority.publicKey, treasury },
  {
    amountUsd: new BN(250),
    targetChain: 2,
    txType: 0,
    protocolId: null,
    currentTimestamp: now,
    expectedOutputUsd: null,
    actualOutputUsd: null,
    quoteAgeSecs: null,
    counterpartyRiskScore: 15,
    recipientOrContract: '0xdeadbeef...',
    sanctionsProof: [],
  },
);

Execute a Pending Transaction (Public)

const now = new BN(Math.floor(Date.now() / 1000));
const [dwalletCpiAuthority] = client.deriveDwalletCpiAuthority();

await client.executePending(
  operator,
  {
    operator: operator.publicKey,
    treasury,
    callerProgram: client.programId,
    systemProgram: SystemProgram.programId,
    dwallet: dwalletAccountPDA,
    cpiAuthority: dwalletCpiAuthority,
    dwalletProgram: DWALLET_DEVNET_PROGRAM_ID,
    messageApproval: messageApprovalPDA,
  },
  now,
);

await client.finalizeExecution(
  operator,
  {
    operator: operator.publicKey,
    treasury,
    messageApproval: messageApprovalPDA,
  },
  now,
);

Pause and Resume Execution

// High-level
await aura.treasury.pause({ treasury, paused: true });
await aura.treasury.pause({ treasury, paused: false });

// Low-level
const now = new BN(Math.floor(Date.now() / 1000));
const accounts = { owner: owner.publicKey, treasury };

await client.pauseExecution(owner, accounts, true, now);
await client.pauseExecution(owner, accounts, false, now);

Register a dWallet

// High-level
await aura.dwallet.register({
  treasury,
  chain: 2,                    // Ethereum
  dwalletId: 'dwallet-abc123',
  address: '0xdeadbeef...',
  balanceUsd: 5_000,
});

// Low-level
await client.registerDwallet(
  owner,
  { owner: owner.publicKey, treasury },
  {
    chain: 2,
    dwalletId: 'dwallet-abc123',
    address: '0xdeadbeef...',
    balanceUsd: new BN(5_000),
    dwalletAccount: dwalletAccountPDA,
    authorizedUserPubkey: null,
    messageMetadataDigest: null,
    publicKeyHex: null,
    timestamp: new BN(Math.floor(Date.now() / 1000)),
  },
);

Configure Guardian Multisig

// High-level
await aura.governance.configureMultisig({
  treasury,
  requiredSignatures: 2,
  guardians: [guardian1.publicKey, guardian2.publicKey],
});

// Low-level
await client.configureMultisig(
  owner,
  { owner: owner.publicKey, treasury },
  {
    requiredSignatures: 2,
    guardians: [guardian1.publicKey, guardian2.publicKey],
    timestamp: new BN(Math.floor(Date.now() / 1000)),
  },
);

Issue a Session Key

import { SystemProgram } from '@solana/web3.js';

const sessionKeypair = Keypair.generate();
const now = new BN(Math.floor(Date.now() / 1000));

// Derive the session key PDA: seeds = [b"session_key", treasury, sessionKey]
const [sessionKeyAccount] = PublicKey.findProgramAddressSync(
  [
    Buffer.from('session_key'),
    treasury.toBuffer(),
    sessionKeypair.publicKey.toBuffer(),
  ],
  client.programId,
);

await client.issueSessionKey(
  owner,
  {
    authority: owner.publicKey,
    treasury,
    sessionKeyAccount,
    systemProgram: SystemProgram.programId,
  },
  {
    sessionKey: sessionKeypair.publicKey,
    durationSecs: new BN(3600),          // 1-hour session
    maxAmountUsdPerTx: new BN(500),      // max per transaction
    maxDailySpendUsd: null,              // no daily cap on session
    allowedChains: Buffer.from([0]),     // Solana only
    allowedTxTypes: Buffer.from([0]),    // Transfer only
    maxProposalCount: null,              // unlimited proposals
    now,
  },
);

Emergency Shutdown

const recoveryAuthority = Keypair.generate().publicKey;

await client.emergencyShutdown(
  owner,
  { owner: owner.publicKey, treasury },
  recoveryAuthority,
  Math.floor(Date.now() / 1000),
);
console.log('Shutdown triggered, recovery authority:', recoveryAuthority.toBase58());

Enumerate the Program Surface

import { AURA_FEATURE_DOMAINS } from '@aura-protocol/sdk-ts';

for (const domain of AURA_FEATURE_DOMAINS) {
  console.log(`\n${domain.label}`);
  for (const ix of domain.instructions) {
    console.log(`  ${ix.name.padEnd(40)} ${ix.maturity}`);
  }
}

Batch Multiple Instructions

const now = new BN(Math.floor(Date.now() / 1000));
const accounts = { owner: owner.publicKey, treasury };

const pauseIx = await client.pauseExecutionInstruction(accounts, true, now);
const cancelIx = await client.cancelPendingInstruction(accounts, now);

const signature = await client.sendInstructions(owner, [pauseIx, cancelIx]);
console.log('Batched tx:', signature);

On this page