Skip to content

plumenetwork/nest-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

73 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nest-cli

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.

Features

CLI

  • 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-run emits a single TxBundle JSON object

TUI Dashboard

  • 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 tabChart widget 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, Tab to switch tabs, / to filter, modal pickers via Enter, Esc to cancel

Install

Quick install

macOS / Linux (bash):

curl -fsSL https://nestagents.io/cli/install.sh | sh

Windows (PowerShell):

irm https://nestagents.io/cli/install.ps1 | iex

Installs 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).

Manual download

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).

From source

Requires Rust (edition 2024).

git clone https://github.com/plumenetwork/nest-cli.git
cd nest-cli
cargo install --path .

Self-update

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.exenest.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 install

A 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.

Configuration

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).

Usage

Global options

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

List vaults

# 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 json

Example 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

View positions

# Using private key from env
nest positions

# Specify address directly (read-only, no private key needed)
nest positions --address 0xABCD...1234

Example 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%

Deposit

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 json

Flags:

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.

Withdraw

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 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Flags:

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

Claim

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 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Flags (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

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 plume

Flags:

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.

Instant Redeem

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 100

submit 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

Update Redeem

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 25

submit 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

Auto-claim

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 json

Flags (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)

Check compliance

nest compliance --address 0xABCD...1234
nest compliance --chain ethereum --deposit-and-bridge

Exit code is 1 if the wallet is not compliant.

View history

# 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.)

Interactive dashboard

nest dashboard

Launches 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

TxBundle JSON contract

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:

  • value in 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 --address flag (or --user for user-scoped commands) substitutes for --private-key in dry-run mode — no private key is required for bundle generation.

Supported chains

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.

Build from source

cargo build --release
# Binary at target/release/nest

License

MIT

About

No description, website, or topics provided.

Resources

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors