Every Aqueduct vault is a Solana Action, so a post, a QR code or a chat message can carry a working deposit. Drop a themable deposit card into any site with one script tag, or build your own flow with the React hooks and public API.
Paste any of these links into a Blink-aware client (Phantom, Backpack, Dialect, X with the Blinks extension) and it unfurls into a live card that builds the transaction for the reader's wallet. The faucet chains straight into a deposit once its transaction lands. The cards below are rendered from the live endpoints; withdrawals work the same way.
aqueduct.justus.sh
Earn 4.47% on USDC with Aqueduct Bedrock
Blue-chip lending only. Built to never surprise you. Routed across 5 vetted venues by a risk-aware keeper, $250,241 deposited. 5% performance fee on yield only; no deposit or withdrawal fees. Withdraw any time. Runs on Solana devnet with test USDC.
Adds credit, delta-neutral and fixed-rate yield. Higher return, higher risk. Routed across 6 vetted venues by a risk-aware keeper, $100,173 deposited. 10% performance fee on yield only; no deposit or withdrawal fees. Withdraw any time. Runs on Solana devnet with test USDC.
Get devnet test USDC to try Aqueduct, the Solana stablecoin yield router. Up to 10,000 per transaction; after it lands you can deposit straight from here. Runs on Solana devnet with test USDC.
https://aqueduct.justus.sh/actions.json maps /blink/{tier}/{deposit|withdraw} and /blink/faucet onto the action API, so the friendly share pages unfurl too. Every response carries open CORS, X-Action-Version: 2.4 and the devnet X-Blockchain-Ids.
POSTs are checked before a wallet ever sees them: amount, wallet USDC and SOL, the vault's cap and your position, then a read-only simulation, so problems come back as plain sentences such as “You have 40 USDC” instead of a failed transaction.
Withdrawal amounts are in USDC and converted to shares at the live share price; amount=all redeems the whole position without leaving dust.
Embed a deposit card
One tag gives any website a live Aqueduct deposit: current APY, wallet connect, deposit, withdraw and an inline test USDC faucet. It sizes itself, follows your theme and reports confirmed transactions to your page.
Live preview. Wallets that inject into frames (Phantom, Solflare, Backpack) connect inside the card; when none is found it offers the Blink and the full app instead.
Build your own with @aqueduct/react
Hooks and headless components over the public API: no Anchor, no IDL and no RPC keys in your bundle. Transactions are built by the Actions endpoint and signed by whichever wallet you already use.
A wallet's USDC balance and its position in each vault
GET|POST /api/actions/{tier}/{deposit|withdraw}
Solana Action metadata, or an unsigned transaction for { account }
GET|POST /api/actions/faucet
Mint up to 10,000 devnet test USDC, chained into a deposit
GET /api/actions/icon/{tier|faucet}
800 x 800 PNG with the live APY, used as the Blink image
GET /actions.json
Blink URL mapping for this domain
GET /embed/{tier}
The deposit card, for iframes
GET keeper /rates, /decisions, /targets, /fees
Live venue rates and the rebalancer's decisions and targets
Hosting the embed yourself
The site sends a strict content security policy with frame-ancestors 'none'. The card only works if /embed/** is excluded from it and served with frame-ancestors * (and no X-Frame-Options) instead. Actions and the API set their own CORS headers in their route handlers, so they work under any page policy.
next.config.ts
async headers() {
return [
// Everything except /embed/** keeps the strict policy.
{ source: "/:path((?!embed/).*)", headers: securityHeaders },
// The deposit card is meant to be framed by any site.
{ source: "/embed/:path*", headers: embedHeaders },
];
}