{"_id":"@blinks-labs/spm","_rev":"2-fed1d6fe1810f332446ae57fb82aae46","name":"@blinks-labs/spm","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@blinks-labs/spm","version":"0.1.0","keywords":["solana","cli","jupiter","swap","defi"],"license":"MIT","_id":"@blinks-labs/spm@0.1.0","maintainers":[{"name":"nabaruns","email":"nabsarkar@gmail.com"}],"homepage":"https://github.com/blinks-labs/solana-portfolio-manager#readme","bugs":{"url":"https://github.com/blinks-labs/solana-portfolio-manager/issues"},"bin":{"spm":"dist/index.js"},"dist":{"shasum":"ecdf5ff1868b3db236245138975e659c596e42f5","tarball":"https://registry.npmjs.org/@blinks-labs/spm/-/spm-0.1.0.tgz","fileCount":4,"integrity":"sha512-CccNY8qfLXGtSs0qI4j8Z4PpXu8j3XhAYOCpvB/DIDIF0RTOSwj8bLDMcpgGvkLzmzdlntcFXwG0YJ8VD5yX9w==","signatures":[{"sig":"MEUCIEw+9nq5bYve6uPUlDYgMS5P7Drs3VuUCQwwdA2XSDNJAiEA/KRO1Sm5Kawk+q8nX53FKqW6yDeM4USSxn6wapza6vQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33713},"type":"module","engines":{"node":">=20"},"gitHead":"cebb68984cb48596ce8a20de43a6b33ff65f14b9","scripts":{"dev":"bun --watch src/index.ts","lint":"echo 'lint not configured yet'","test":"echo 'tests not configured yet'","build":"bun build src/index.ts --target=node --outfile=dist/index.js --external @solana/web3.js --external bs58 --banner=\"#!/usr/bin/env node\"","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"nabaruns","email":"nabsarkar@gmail.com"},"repository":{"url":"git+https://github.com/blinks-labs/solana-portfolio-manager.git","type":"git","directory":"apps/cli"},"_npmVersion":"11.6.1","description":"Solana Portfolio Manager CLI — swap, invest, trade, and predict from the terminal with a local keypair.","directories":{},"_nodeVersion":"24.10.0","dependencies":{"bs58":"^6.0.0","@solana/web3.js":"^1.98.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@spm/shared":"*","@types/node":"^22.0.0","@spm/solana-core":"*","@spm/strategy-engine":"*"},"_npmOperationalInternal":{"tmp":"tmp/spm_0.1.0_1785746081586_0.7721245193140274","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@blinks-labs/spm","version":"0.1.1","description":"Solana Portfolio Manager CLI — swap, invest, trade, and predict from the terminal with a local keypair.","type":"module","license":"MIT","bin":{"spm":"dist/index.js"},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/blinks-labs/solana-portfolio-manager.git","directory":"apps/cli"},"keywords":["solana","cli","jupiter","swap","defi"],"dependencies":{"@ellipsis-labs/rise":"^0.4.67","@kamino-finance/klend-sdk":"^8","@solana/kit":"^2.3.0","@solana/web3.js":"^1.98.4","bs58":"^6.0.0","decimal.js":"^10.6.0"},"devDependencies":{"@spm/kamino-client":"*","@spm/shared":"*","@spm/solana-core":"*","@spm/strategy-engine":"*","@types/node":"^22.0.0"},"scripts":{"build":"bun build src/index.ts --target=node --outfile=dist/index.js --external @solana/web3.js --external bs58 --external @ellipsis-labs/rise --external @kamino-finance/klend-sdk --external @solana/kit --external decimal.js --banner=\"#!/usr/bin/env node\"","prepublishOnly":"bun run build","dev":"bun --watch src/index.ts","lint":"echo 'lint not configured yet'","test":"echo 'tests not configured yet'","type-check":"tsc -p tsconfig.json --noEmit"},"gitHead":"f6c3dcb19663adee739613a9f7bd08508addd384","_id":"@blinks-labs/spm@0.1.1","bugs":{"url":"https://github.com/blinks-labs/solana-portfolio-manager/issues"},"homepage":"https://github.com/blinks-labs/solana-portfolio-manager#readme","_nodeVersion":"24.10.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-mvx3RXjUXSC9BmOAARgMYgoRffRkrKoxxKO6WUNahJXiXviTSrSySgGIfzLCERZ1M99LKrLZWsXuwSlj78LzFQ==","shasum":"61a34ca98f3f61cd81002b0fe0f92e672f0f2004","tarball":"https://registry.npmjs.org/@blinks-labs/spm/-/spm-0.1.1.tgz","fileCount":4,"unpackedSize":94580,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCQkigAsj8GKIIy2ZlduDXm4CAjXEaVLX0WEZFTP9Wk9AIhAMC1QrTeQe1lyoYtnyDAGJPqq9Uz0mxsaIog3Ci4QmM0"}]},"_npmUser":{"name":"nabaruns","email":"nabsarkar@gmail.com"},"directories":{},"maintainers":[{"name":"nabaruns","email":"nabsarkar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spm_0.1.1_1786790590581_0.21818035882779196"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-03T08:34:41.399Z","modified":"2026-08-15T10:43:10.902Z","0.1.0":"2026-08-03T08:34:41.728Z","0.1.1":"2026-08-15T10:43:10.729Z"},"bugs":{"url":"https://github.com/blinks-labs/solana-portfolio-manager/issues"},"license":"MIT","homepage":"https://github.com/blinks-labs/solana-portfolio-manager#readme","keywords":["solana","cli","jupiter","swap","defi"],"repository":{"type":"git","url":"git+https://github.com/blinks-labs/solana-portfolio-manager.git","directory":"apps/cli"},"description":"Solana Portfolio Manager CLI — swap, invest, trade, and predict from the terminal with a local keypair.","maintainers":[{"name":"nabaruns","email":"nabsarkar@gmail.com"}],"readme":"# @blinks-labs/spm\n\nSolana Portfolio Manager CLI — swap, invest, trade, and predict from the terminal,\nsigning with a local Solana keypair.\n\n```bash\nnpm install -g @blinks-labs/spm\n# or run without installing\nnpx @blinks-labs/spm swap --in SOL --out USDC --amount 0.01 --simulate\n```\n\nRequires Node.js 20+.\n\n## Commands\n\n| Command | What it does |\n| --- | --- |\n| `swap` | Swap tokens via Jupiter |\n| `trade` | Phoenix Eternal perps — markets, positions, orders, collateral |\n| `invest` | Kamino Earn vaults — list, position, deposit, withdraw |\n| `predict` | Jupiter prediction markets — events, positions, bet, close, claim |\n\n## Swap\n\n```bash\nspm swap --in SOL --out USDC --amount 0.01 [--slippage-bps 50] [--simulate] [--yes] [--json]\n```\n\n`--in` / `--out` accept a known symbol (`SOL`, `USDC`, `USDT`, `JUP`, `BONK`, …) or any\nbase58 mint address — decimals for unknown mints are read on-chain.\n\nThe CLI prints a preview (expected output, minimum received, price impact, route,\npriority fee) and asks for confirmation before signing. Use `--simulate` for a dry run\nthat never broadcasts, or `--yes` to skip the prompt in scripts.\n\n```console\n$ spm swap --in SOL --out USDC --amount 0.01 --simulate\n\nSwap on mainnet-beta\n  Wallet           CgKa8mrAHCJ1jPPMbyoUMG9i6wn79Ea6xHrmMkSWXBfU\n  RPC              https://api.mainnet-beta.solana.com\n  Pay              0.01 SOL (10000000 atomic)\n  Receive ~        0.721099 USDC\n  Min received     0.717494 USDC (slippage 50 bps)\n  Price impact     0.0011%\n  Route            GoonFi V2\n  Priority fee     0.000065718 SOL\n```\n\n## Trade\n\nPerpetual futures on [Phoenix Eternal](https://phoenix.trade). 60+ markets — crypto,\nequities and commodities.\n\n```bash\nspm trade markets [--filter SOL] [--limit 25]     # no wallet needed\nspm trade positions [--address <pubkey>]\nspm trade deposit  --amount 25                    # USDC wallet → collateral\nspm trade open  --market SOL --side long --size 0.5 [--limit-price 70]\nspm trade close --market SOL [--size 0.2]\nspm trade cancel --market SOL\nspm trade withdraw --amount 10\n```\n\n`markets` needs no keypair at all, and `positions --address <pubkey>` reads any\nwallet — handy for checking an account before you fund one.\n\n```console\n$ spm trade markets --filter SOL\n\n  SYMBOL    STATUS     MAX LEV   TAKER FEE\n  SOL       active         25x      0.035%\n\n$ spm trade open --market SOL --side long --size 0.1 --simulate\n\nMarket order — long 0.1 SOL\n  Wallet           5sd6f47RF9EtacmZcsBbPx2DcDDePWN8JVWfycHj3rqd\n  Market           SOL (max 25x)\n  Size             0.1 SOL\n  Mark price       73.9100\n  Notional         ~7.39 USDC\n  Taker fee        ~0.0026 USDC\n  Margin           cross (subaccount 0)\n```\n\nCollateral is USDC, and you must `deposit` before your first order — that call\nalso creates your Phoenix trader account. Orders use **cross margin** against\nthat balance; isolated margin and TP/SL are only in the web app for now.\n\nPhoenix perps are mainnet-only, so `--cluster devnet` is rejected rather than\nsilently trading somewhere unexpected.\n\n## Invest\n\nKamino Earn vaults. Deposits earn yield as the vault's share price rises;\nwithdrawing redeems shares back to the underlying token.\n\n```bash\nspm invest vaults [--token USDC] [--limit 8]       # no wallet needed\nspm invest position --vault <address> [--address <pubkey>]\nspm invest deposit  --vault <address> --amount 10\nspm invest withdraw --vault <address> [--percent 50]\n```\n\n```console\n$ spm invest vaults --limit 3\n\n  VAULT                            APY           TVL  HOLDERS  ADDRESS\n  Ethena PYUSD Prime             2.63%      $250.69M       14  4TwKA9JX…\n  Sentora PYUSD                  6.37%      $119.21M     3604  A2wsxhA7…\n  Steakhouse High Yield USDG     7.21%       $35.17M      674  BoZDRc1R…\n```\n\n`--percent` defaults to 100, and withdrawals redeem shares directly rather than\nconverting through a token amount, which avoids share/token rounding.\n\n## Predict\n\nJupiter prediction markets. Contracts settle at $1.00, so a YES bought at $0.62\npays $1.00 if the market resolves yes — the price is the implied probability.\n\n```bash\nspm predict events [--category crypto] [--filter bitcoin] [--limit 15]\nspm predict market --market <id>            # or --event <id> for every market\nspm predict positions [--address <pubkey>]\nspm predict bet   --market <id> --side yes --amount 5 [--limit-price 0.62]\nspm predict close --position <pubkey>       # sell back early\nspm predict claim --position <pubkey>       # collect a settled win\n```\n\nBets deposit USDC by default (`--token SOL|JUPUSD` for the others); the minimum\norder is $5. `spm predict positions` prints a ready-to-run `claim` line for any\nposition that has settled in your favour.\n\nUnlike the other commands, predict never talks to RPC: Jupiter returns an\nunsigned transaction, the CLI signs it locally, and Jupiter's keeper network\nsubmits it. There is nothing to simulate, so `--simulate` is rejected rather\nthan silently ignored.\n\n## Signing\n\nTransactions are signed locally. The keypair is resolved in this order:\n\n1. `--keypair <path>`\n2. `$SPM_KEYPAIR` — path to a keypair JSON file\n3. `$SPM_SECRET_KEY` — base58-encoded secret key\n4. `~/.config/solana/id.json`\n\nYour secret key is read from disk, used to sign in-process, and never sent\nanywhere — quotes go to Jupiter and only the signed transaction goes to the RPC\nendpoint you choose. There is no backend and no account: the CLI is\nnon-custodial, and nothing happens on-chain without a signature from your key.\n\nPrefer `--simulate` first on anything unfamiliar, and treat a keypair file used\nwith `--yes` in a script the same way you would treat any other hot wallet.\n\n## Network\n\nBy default the CLI talks directly to Jupiter, Phoenix, Kamino and a Solana RPC node. Choose an endpoint\nwith `--rpc <url>` or `--cluster <mainnet-beta|devnet|testnet|localnet>`. Without either,\nit uses `RPCFAST_URL`, then `ALCHEMY_API_KEY`, then `HELIUS_API_KEY`, then the public\nmainnet endpoint. Set `JUPITER_API_KEY` to use Jupiter's keyed host for higher rate limits.\n\n## Output\n\nHuman-readable output goes to stderr; `--json` emits a single JSON object on stdout, so\n`spm swap … --json | jq` works cleanly.\n\nExit codes: `0` success · `2` usage/arguments · `3` keypair · `4` quote/build · `5` on-chain.\n\n## License\n\nMIT © Blinks Labs\n","readmeFilename":"README.md"}