A Rust CLI + TUI for interacting with Nest Vaults on Plume Network and supported EVM chains.
Transactions are signed and broadcast locally — your private key never leaves your machine.
nest is also the canonical Plume CLI for agentic workflows: use --dry-run -o json with --address (no private key needed) to receive a TxBundle JSON object ready for programmatic signing and submission.
- List vaults — browse all Nest vaults with APY, TVL, price, and chain info
- View positions — check your on-chain balances across all vaults via Multicall3
- Deposit — same-chain deposits via evm-actions-api; boring cross-chain deposit-and-bridge via
--bridge(built locally with LayerZero) - Withdraw — queue a redemption request via evm-actions-api
- Bridge — bridge vault shares across chains (LayerZero OFT)
- Claim — check and claim matured nest redemptions
- Instant Redeem — instantly redeem nest shares (quote, liquidity check, submit)
- Update Redeem — reduce a pending redemption to a smaller share amount
- Auto-claim — enable/disable/check an automated claim operator
- Compliance check — verify wallet eligibility before transacting
- Performance history — view historical APY, TVL, and price data
- Self-update — atomic in-place upgrade on macOS, Linux, and Windows (x86_64)
- Update notifier — a one-line stderr notice on every invocation when a newer version is published (24 h cached, background-refreshed; disable with
NEST_NO_UPDATE_CHECK=1) - JSON output — all commands support
-o json; with--dry-runemits a singleTxBundleJSON object
- Vaults tab — sortable, searchable vault table with detail view
- Portfolio tab — live on-chain positions with totals and weighted APY
- Deposit tab — modal pickers for vault / chain / asset, live wallet + native-balance display with loading throbbers, server-side share preview (debounced 300 ms) via the actions API, inline validation
- Withdraw tab — same picker UX as Deposit plus a mode picker (Request / Instant / Claim); Instant and Claim auto-disable when liquidity / claimable shares are zero
- History tab —
Chartwidget with real X/Y axes (dates and value ticks) for APY, TVL, and Price; always-visible header bar with the latest snapshot; vault picker (v); date-window navigation ([/]) - Keyboard-driven — arrow keys,
Tabto switch tabs,/to filter, modal pickers viaEnter,Escto cancel
macOS / Linux (bash):
curl -fsSL https://nestagents.io/cli/install.sh | shWindows (PowerShell):
irm https://nestagents.io/cli/install.ps1 | iexInstalls to /usr/local/bin/nest (macOS/Linux — sudo prompt if needed) or %LOCALAPPDATA%\nest-cli\bin\nest.exe (Windows — no admin required, adds itself to your user PATH; restart your terminal once after first install).
Platform tarballs and a version.json manifest with SHA256 sums are published at nestagents.io/downloads/:
# macOS (Apple Silicon)
curl -fL https://nestagents.io/downloads/nest-cli-aarch64-apple-darwin.tar.gz | tar xz
sudo mv nest /usr/local/bin/
# macOS (Intel)
curl -fL https://nestagents.io/downloads/nest-cli-x86_64-apple-darwin.tar.gz | tar xz
sudo mv nest /usr/local/bin/
# Linux (x86_64)
curl -fL https://nestagents.io/downloads/nest-cli-x86_64-unknown-linux-gnu.tar.gz | tar xz
sudo mv nest /usr/local/bin/
# Windows (x86_64) — download nest-cli-x86_64-pc-windows-msvc.zip,
# extract nest.exe, and add its directory to your PATH.To verify a download, fetch https://nestagents.io/downloads/version.json and compare its sha256 for your platform against shasum -a 256 <archive> (or Get-FileHash -Algorithm SHA256 <archive> on Windows).
Requires Rust (edition 2024).
git clone https://github.com/plumenetwork/nest-cli.git
cd nest-cli
cargo install --path .Once installed, the CLI can self-replace its binary in place. Works on macOS, Linux, and Windows (x86_64) — Windows uses the rename trick (nest.exe → nest.exe.old, then writes the new binary; the .old file is swept on next launch).
nest update # check and install the latest release
nest update --check # check only, don't installA passive update notice is printed to stderr on every nest <cmd> invocation when a newer version is available. The check is fully backgrounded (24 h cache, 3 s timeout); the running command never waits on the network. Skipped automatically for nest update and nest dashboard. Disable entirely with NEST_NO_UPDATE_CHECK=1.
Set environment variables directly or via a .env file in the working directory.
| Variable | Default | Description |
|---|---|---|
PRIVATE_KEY |
— | Hex-encoded private key (with or without 0x prefix) |
PLUME_RPC_URL |
https://rpc.plume.org |
Plume RPC endpoint |
NEST_API_URL |
https://api.nest.credit |
API base host — the Nest API (/v1) and evm-actions-api (/v1/actions) are derived from it |
ETHEREUM_RPC_URL |
https://eth.llamarpc.com |
Ethereum RPC (for cross-chain / bridge) |
BSC_RPC_URL |
https://bsc-dataseed.binance.org |
BSC RPC |
ARBITRUM_RPC_URL |
https://arb1.arbitrum.io/rpc |
Arbitrum RPC |
All options can also be passed as flags (--private-key, --rpc-url, --api-url).
nest [OPTIONS] <COMMAND>
Options:
--private-key <KEY> Private key for signing transactions
--rpc-url <URL> Plume RPC endpoint
--api-url <URL> API base host (/v1 and /v1/actions derived from it)
-o, --output <FORMAT> Output format: table (default) or json
--dry-run Build transactions but don't broadcast
--no-color Disable colored output
# Table output (default)
nest vaults
# Sort by APY, ascending
nest vaults --sort apy --reverse
# Single vault detail
nest vaults --slug nalpha
# JSON output
nest vaults -o jsonExample output:
Name Symbol Type APY TVL Price Holders Chains
Nest Alpha nALPHA boring 8.42% $12.5M $1.0800 342 plume, ethereum, bsc
Nest Stable nSTABLE nest 5.21% $8.2M $1.0200 156 plume
# Using private key from env
nest positions
# Specify address directly (read-only, no private key needed)
nest positions --address 0xABCD...1234Example output:
Vault Shares Price Value
Nest Alpha 1,250.00 $1.0800 $1,350.00
Nest Stable 5,000.00 $1.0200 $5,100.00
────────────────────────────────────────
Total $6,450.00
Weighted APY (API) 6.8%
Same-chain deposits are built by evm-actions-api. Boring cross-chain deposits
use the --bridge flag and are built locally (LayerZero deposit-and-bridge).
# Same-chain deposit — dry-run, JSON output (no private key needed)
nest deposit --vault nest-treasury-vault --asset 0x55d398326f99059fF775485246999027B3197955 --amount 1 --chain bsc --address 0xYOUR_ADDR --dry-run -o json
# Same-chain deposit — broadcast (private key required)
nest deposit --vault nest-treasury-vault --asset 0x55d398326f99059fF775485246999027B3197955 --amount 1 --chain bsc
# Boring cross-chain deposit-and-bridge to Plume (built locally)
nest deposit --vault nest-alpha-vault --asset 0xUSDT --amount 100 --chain ethereum --address 0xYOUR_ADDR --bridge --dry-run -o jsonFlags:
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--asset |
yes | Deposit asset address |
--amount |
yes | Amount in human-readable units (e.g. 1, 100.5) |
--chain |
no | Chain name or ID (default: plume) |
--address |
no | Wallet address — required for --dry-run without a private key |
--bridge |
no | Use boring deposit-and-bridge flow (cross-chain to Plume) |
--skip-simulation |
no | Skip the API simulateCalls preflight |
The deposit flow automatically handles token approval (if needed) and compliance.
The resulting bundle contains an approve tx (if required) followed by a deposit tx.
Queues a redemption request via evm-actions-api. After the cooldown period has
elapsed, claim the shares with nest claim submit.
# Queue a withdrawal request — dry-run
nest withdraw --vault nest-treasury-vault --shares 50 --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --address 0xYOUR_ADDR --dry-run -o json
# Queue a withdrawal request — broadcast
nest withdraw --vault nest-treasury-vault --shares 50 --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48Flags:
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--shares |
yes | Shares to withdraw in human-readable units |
--redemption-asset |
yes | Token address you want to receive |
--chain |
no | Chain name or ID (default: plume) |
--address |
no | Wallet address — required for --dry-run without a private key |
--skip-simulation |
no | Skip the API simulateCalls preflight |
Check for claimable shares or claim a matured nest redemption.
# Show claimable shares across ALL vaults in one multicall (no --vault)
nest claim pending --user 0xYOUR_ADDR
# Show claimable shares for a single vault (via the API)
nest claim pending --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --user 0xYOUR_ADDR
# Claim (dry-run)
nest claim submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --user 0xYOUR_ADDR --dry-run -o json
# Claim (broadcast)
nest claim submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48Flags (shared by both pending and submit):
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--redemption-asset |
yes | Redemption asset address |
--chain |
no | Chain name or ID (default: plume) |
--user |
no | Wallet address — required for --dry-run without a private key |
--skip-simulation |
no | Skip the API simulateCalls preflight (submit only) |
Bridge vault shares across chains using LayerZero OFT. Built locally (no API call for the bridge tx itself).
# Dry-run — see the bundle without broadcasting
nest bridge --vault nest-treasury-vault --shares 0.5 --from-chain ethereum --to-chain plume --address 0xYOUR_ADDR --dry-run -o json
# Broadcast
nest bridge --vault nest-treasury-vault --shares 0.5 --from-chain ethereum --to-chain plumeFlags:
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--shares |
yes | Shares to bridge in human-readable units |
--from-chain |
yes | Source chain (name or ID) |
--to-chain |
yes | Destination chain (name or ID) |
--address |
no | Wallet address — required for --dry-run without a private key |
Note: dry-run for bridge still requires an RPC connection to the source chain to quote the LayerZero fee.
Instantly redeem nest shares without a cooldown period (subject to available liquidity).
# Check available liquidity
nest instant-redeem liquidity --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
# Get a quote for a given share amount
nest instant-redeem quote --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --shares 100
# Submit (dry-run)
nest instant-redeem submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --shares 100 --user 0xYOUR_ADDR --dry-run -o json
# Submit (broadcast)
nest instant-redeem submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --shares 100submit flags:
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--redemption-asset |
yes | Redemption asset address |
--shares |
yes | Shares to redeem in human-readable units |
--chain |
no | Chain name or ID (default: plume) |
--user |
no | Wallet address — required for --dry-run without a private key |
--receiver |
no | Override the recipient address |
--skip-simulation |
no | Skip the API simulateCalls preflight |
Reduce an existing pending redemption to a smaller share total (reduce-only).
# Check current pending redemption
nest update-redeem pending --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --user 0xYOUR_ADDR
# Submit a reduced pending total (dry-run)
nest update-redeem submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --new-shares 25 --user 0xYOUR_ADDR --dry-run -o json
# Submit (broadcast)
nest update-redeem submit --vault nest-treasury-vault --redemption-asset 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 --new-shares 25submit flags:
| Flag | Required | Description |
|---|---|---|
--vault |
yes | Vault slug |
--redemption-asset |
yes | Redemption asset address |
--new-shares |
yes | Final reduced pending-share total (reduce-only — must be less than current) |
--chain |
no | Chain name or ID (default: plume) |
--user |
no | Wallet address — required for --dry-run without a private key |
--skip-simulation |
no | Skip the API simulateCalls preflight |
Manage an automated claim operator that claims matured redemptions on your behalf.
# Check operator status
nest auto-claim status --user 0xYOUR_ADDR
# Enable auto-claim (dry-run)
nest auto-claim enable --user 0xYOUR_ADDR --dry-run -o json
# Enable auto-claim (broadcast)
nest auto-claim enable
# Disable auto-claim
nest auto-claim disable --user 0xYOUR_ADDR --dry-run -o jsonFlags (shared by status, enable, disable):
| Flag | Required | Description |
|---|---|---|
--chain |
no | Chain name or ID (default: plume) |
--user |
no | Wallet address — required for --dry-run without a private key |
--skip-simulation |
no | Skip the API simulateCalls preflight (enable/disable only) |
nest compliance --address 0xABCD...1234
nest compliance --chain ethereum --deposit-and-bridgeExit code is 1 if the wallet is not compliant.
# Last 30 days (default)
nest history --vault nalpha
# Last 90 days, APY only
nest history --vault nalpha --days 90 --metric apy
# JSON output
nest history --vault nalpha -o json(--vault-slug is still accepted as a visible alias for --vault.)
nest dashboardLaunches a full-screen terminal UI with five tabs:
| Tab | Description |
|---|---|
| Vaults | Sortable vault table with search (/), detail view (Enter) |
| Portfolio | On-chain positions via Multicall3, totals and weighted APY |
| Deposit | Modal pickers for vault / chain / asset; live wallet + native balance with throbbers; server-side share preview |
| Withdraw | Pickers for vault / chain / redemption asset and a mode picker (Request / Instant / Claim) |
| History | Chart widget with X/Y axes for APY, TVL, Price; header bar with latest snapshot; date-window navigation |
Keyboard shortcuts:
| Key | Action |
|---|---|
q / Ctrl+C |
Quit |
Tab / Shift+Tab |
Next / previous tab |
1-5 |
Jump to tab |
↑ / ↓ (or j / k) |
Navigate lists, form fields, and modal entries |
Enter |
Open a picker on a form field; commit selection in a modal |
Esc |
Cancel modal / clear filter / go back |
/ |
Filter (Vaults tab and inside any modal) |
Ctrl+M |
Fill the active Amount/Shares field with the MAX balance |
r |
Refresh data on the current tab |
v |
Open the vault picker (History tab) |
[ / ] |
Shift the History date window backward / forward by half the current range |
7 / 3 / 9 / y |
Set history range to 7 d / 30 d / 90 d / 1 y |
d |
Jump to Deposit with the selected vault prefilled |
w |
Jump to Withdraw with the selected position prefilled |
When you run any transaction-building command with --dry-run -o json, the output is a single TxBundle JSON object — not an array. The shape is stable and designed for agentic signing:
{
"slug": "nest-treasury-vault",
"chainId": 56,
"transactions": [
{
"label": "approve",
"to": "0x55d398326f99059fF775485246999027B3197955",
"data": "0x095ea7b3...",
"value": "0",
"description": "Approve USDT for deposit"
},
{
"label": "deposit",
"to": "0xfC0c4222B3A0c9B060C0B959DEc62442036b9035",
"data": "0x...",
"value": "0",
"description": "Deposit 1 USDT"
}
],
"shareTokenAddress": "0x...",
"shareAmount": "957831",
"shareDecimals": 18,
"depositAsset": "0x55d398326f99059fF775485246999027B3197955",
"depositAmount": "1000000000000000000",
"depositDecimals": 18
}Key properties:
valuein each transaction is a decimal wei string (not hex, not a number).- Optional fields (
shareTokenAddress,shareAmount,shareDecimals,redemptionType,redemptionAmount, etc.) are omitted when not applicable. - Extra fields returned by the API (e.g.
claimableShares,pendingShares,newShareAmount,minPrice,deadline) pass through transparently. - An
--addressflag (or--userfor user-scoped commands) substitutes for--private-keyin dry-run mode — no private key is required for bundle generation.
| Chain | ID | API-driven deposit/withdraw | Bridge (OFT) |
|---|---|---|---|
| Plume | 98866 | Yes | Yes |
| Ethereum | 1 | Yes | Yes |
| BSC | 56 | Yes | Yes |
| Arbitrum | 42161 | Yes | Yes |
| Plasma | 9745 | Yes | Yes |
| Worldchain | 480 | No | Yes |
evm-actions-api does not currently support Worldchain deposits/withdrawals; bridging via OFT works on all chains.
cargo build --release
# Binary at target/release/nestMIT