Aqueduct for treasuries.

Idle USDC in a DAO or company treasury can earn the dull, dependable kind of yield without leaving the multisig's control. Deposit from Squads, keep the shares in the vault, and hand your accountants a statement of every deposit, withdrawal and dollar earned.

Accounting statement

Read straight from the chain for any address: no sign-in, no indexer. Export it as CSV for a spreadsheet, your accounting system or a crypto tax tool. Each row links to its transaction on the explorer.

No wallet handy?

Deposit from a multisig

The vault is the depositor

A Squads vault address works anywhere a wallet does: pass it as account to the Actions endpoint (or as the owner in @aqueduct/react) and you get back the deposit instructions with the vault as signer. Wrap them in a vault transaction, collect approvals, execute. Shares land in the vault's own token account.

The vault pays rent for its share account the first time (about 0.002 SOL), so keep a little SOL in it. Withdrawals work the same way through /api/actions/{tier}/withdraw.

Reporting

Statements use average cost per vault: a withdrawal realizes the difference between what it returned and the average cost of the shares it redeemed. What is still deposited is valued at the live share price, and its gain is reported as unrealized. Shares received without paying USDC (transfers, fee shares) enter at zero cost.

propose-deposit.ts (outline)
// 1. Ask Aqueduct for the deposit, with the Squads vault as the account
const res = await fetch("https://aqueduct.justus.sh/api/actions/bedrock/deposit?amount=250000", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ account: squadsVault.toBase58() }),
}).then((r) => r.json());

// 2. Keep its instructions; the vault signs them when the proposal executes
const tx = Transaction.from(Buffer.from(res.transaction, "base64"));
const message = new TransactionMessage({
  payerKey: squadsVault,
  recentBlockhash: (await connection.getLatestBlockhash()).blockhash,
  instructions: tx.instructions,
});

// 3. Propose it as a vault transaction (@sqds/multisig), approve, execute
date_utcBlock time of the transaction (ISO 8601)
tier / typebedrock or rapids; deposit, withdraw, shares_in, shares_out or holding
usdc / sharesUSDC paid or received and shares minted or burned
share_priceUSDC per share implied by the transaction
shares_after / cost_basis_afterRunning position and remaining cost basis
realized_gain / unrealized_gainYield realized by a withdrawal; open yield on holding rows
signature / explorer_urlThe on-chain proof for every row

What a treasury committee will ask

Exit is never blocked

Withdrawals work even while deposits are paused. The keeper can rebalance between vetted venues but can never withdraw.

Fees only on yield

5% (Bedrock) or 10% (Rapids) of yield above the vault's high-water mark. No management, deposit or withdrawal fees.

Every move is explained

Each rebalance is logged with the rates it saw, the sentinel's verdict and why it moved or held, next to its devnet signature.

Plain token accounting

Your position is an SPL share token in the treasury's own account. Its value is shares times a share price anyone can recompute on-chain.