AURA

Treasury

Create and configure treasuries, analytics, and recipient limits.

The treasury domain creates the root account every other instruction hangs off of. Access it via instructions.treasury.*. All examples assume:

import BN from "bn.js";
import { SystemProgram } from "@solana/web3.js";
import { accounts, instructions, pda } from "@aura-protocol/sdk-ts";

const now = () => new BN(Math.floor(Date.now() / 1000));
// `treasury` is the PDA from createTreasuryInput / deriveTreasuryAddress.

createTreasury

Initializes a treasury PDA with a full policy configuration. Accounts: owner (s, w), treasury (w), systemProgram.

const { treasury, input } = accounts.createTreasuryInput({
  owner: owner.publicKey,
  args: {
    agentId: "agent-prod-1",
    aiAuthority: owner.publicKey,
    createdAt: now(),
    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),
      },
      failureModes: {
        quoteFreshness: 0,
        counterpartyRisk: 0,
        slippage: 0,
        anomaly: 0,
        balanceOracleStale: 0,
        complianceOracle: 0,
        encryptLiveness: 0,
        dwalletLiveness: 0,
        maxFailOpenUsd: new BN(0),
        failOpenWindowSecs: new BN(0),
        failOpenBudgetUsd: new BN(0),
        failOpenMaxPerWindow: 0,
        staleFallbackLimitUsd: new BN(0),
      },
    },
    protocolFees: {
      treasuryCreationFeeUsd: new BN(100),
      transactionFeeBps: new BN(10),
      fheSubsidyBps: new BN(5_000),
    },
  },
});

await instructions.treasury.sendCreateTreasury(client, owner, input);

The whole args object is typed as CreateTreasuryArgs (policyConfig: PolicyConfigRecord, protocolFees: ProtocolFeesRecord) — your editor flags any missing field. The example above reuses this policyConfig shape on the Policy and Governance pages.

initTreasuryAnalytics

Creates the analytics + audit-commitment sidecar at deriveTreasuryAnalyticsAddress(treasury). Accounts: owner (s, w), treasury, analytics (w), systemProgram.

const [analytics] = pda.deriveTreasuryAnalyticsAddress(treasury);

await instructions.treasury.sendInitTreasuryAnalytics(client, owner, {
  accounts: { owner: owner.publicKey, treasury, analytics, systemProgram: SystemProgram.programId },
  args: { now: now() },
});

closeTreasuryAnalytics

Closes the analytics sidecar and reclaims rent. Accounts: owner (s, w), treasury, analytics (w). No arguments.

const [analytics] = pda.deriveTreasuryAnalyticsAddress(treasury);

await instructions.treasury.sendCloseTreasuryAnalytics(client, owner, {
  accounts: { owner: owner.publicKey, treasury, analytics },
});

updateTreasuryMetadata

Patches operational settings — all fields optional. Accounts: owner (s), treasury (w).

await instructions.treasury.sendUpdateTreasuryMetadata(client, owner, {
  accounts: { owner: owner.publicKey, treasury },
  args: {
    pendingTransactionTtlSecs: new BN(1_200),
    highRiskThreshold: 80,
    highRiskRequireGuardian: true,
    sanctionsCheckEnabled: true,
    now: now(),
  },
});

setRecipientLimit

Sets a per-recipient daily/per-tx cap. Accounts: owner (s), treasury (w).

await instructions.treasury.sendSetRecipientLimit(client, owner, {
  accounts: { owner: owner.publicKey, treasury },
  args: {
    chain: 1, // Ethereum
    address: "0x000000000000000000000000000000000000dead",
    dailyLimitUsd: new BN(2_000),
    perTxLimitUsd: new BN(500),
    now: now(),
  },
});

removeRecipientLimit

Removes a per-recipient limit. Accounts: owner (s), treasury (w).

await instructions.treasury.sendRemoveRecipientLimit(client, owner, {
  accounts: { owner: owner.publicKey, treasury },
  args: {
    chain: 2,
    address: "0x000000000000000000000000000000000000dead",
    now: now(),
  },
});

On this page