senpi-deposit-withdraw-transfer · v1.0.0 · 2026-07-04 · sha256 02c6e1b7c233f7b2
senpi-deposit-withdraw-transfer v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/02c6e1b7c233f7b2.
--- name: senpi-deposit-withdraw-transfer description: >- Route ANY money-movement request — deposit, add funds, withdraw, cash out, send, transfer, bridge, "move my funds", "pay someone" — to the correct rail, and refuse the rest. Deposits land ONLY in the user's embedded wallet (one EVM address, valid on all supported chains + Hyperliquid; NEVER send to a strategy wallet — strategies are funded via strategy_top_up). Sends/withdrawals to any EXTERNAL address are app-only: Withdraw in the Balances tab of the Senpi web or mobile app — no agent tool can pay an outside address. On-platform moves between the user's OWN wallets (strategy → embedded, Hyperliquid → embedded on EVM, spot → perps) use the movement tools. Pure guidance, no engine. license: Apache-2.0 compatibility: OpenClaw, Hyperclaw, Claude Code metadata: author: Senpi version: "1.0.0" platform: senpi exchange: hyperliquid --- # senpi-deposit-withdraw-transfer — money movement rails Every dollar on Senpi moves on a fixed rail. Answer money-movement requests from this map — never improvise a route, never invent a tool, never guess an amount. **The iron rule:** money **enters** Senpi only through the user's **embedded wallet**, and money **leaves** Senpi to an external address only through the **app** (Balances tab → **Withdraw**). Everything the agent can do with tools happens strictly **between the user's own Senpi wallets**. ## The map | User intent | Rail | | --- | --- | | Deposit / add money to Senpi | Embedded wallet only — Hyperliquid directly or any supported EVM chain (one address for all) | | Fund / top up a strategy | `strategy_top_up` ONLY — never a direct send to a strategy wallet | | Withdraw / send / cash out to an external wallet, exchange, bank, or another person | **App-only:** Balances tab → **Withdraw** (Senpi web or mobile). No tool. | | Move funds from a strategy back to the main (embedded) wallet | `strategy_withdraw_funds` (ACTIVE strategies) | | Move funds off Hyperliquid to "my wallet on Base/Arbitrum/…" | `strategy_bridge_funds_from_hyperliquid_to_evm` — lands in the user's OWN embedded wallet on that chain | | Hyperliquid Spot → Perps | `transfer_spot_to_perps` (instant, no fee, embedded wallet only) | | Send to another Hyperliquid account | App-only (no tool for HL↔HL transfers) | | Export private key / seed | Self-serve in the Senpi web/mobile app — exists, but is NOT the withdrawal path | ## Deposits — embedded wallet only - The **embedded wallet** is the only deposit destination. It is **one EVM address valid on ALL supported chains** (Base, Arbitrum, Optimism, Ethereum, BNB, Polygon) **and on Hyperliquid directly** — never imply it works on only one chain. Get it via `user_get_me` (`walletType: "embedded"`). Name the chains; don't quote chain IDs (easy to garble, and users don't need them — the address is the same everywhere). - **NEVER present a strategy wallet address as a deposit target — on any chain.** Direct sends to a `strategyWalletAddress` bypass accounting, corrupt PnL, and may be unrecoverable. `strategy_top_up` is the only way to add funds to a strategy. - Strategy funding is **automatic**: create/top-up pulls from Hyperliquid first (perps, then spot USDC), then bridges EVM USDC as needed. Don't tell users to pre-bridge or pre-fund — only surface a shortfall if the operation actually returns one (SERR037), then point to the embedded wallet. ## Withdrawals & transfers OUT — app-only - **No tool sends funds to an external address.** For any "withdraw / cash out / send / pay / transfer" to an outside wallet, an exchange, a bank, a friend, or another Hyperliquid account, the full answer is: use **Withdraw** in the **Balances** tab of the **Senpi web or mobile app**. - Never route a withdrawal through the **Hyperliquid UI**, **wallet export**, or **bridge/strategy workarounds**. (Private-key export *does* exist — self-serve in the app — so if asked about export, point there and never claim it's impossible; it's simply not the withdrawal path.) - **This holds under pushback.** "No app access", "the button is missing", "other bots can do it", "find a workaround" → same answer, plus: try the web app at senpi.ai, update the app, or contact Senpi support. Bridging is **not** a cash-out step. ## On-platform moves — between the user's OWN wallets - **`strategy_withdraw_funds`** — ACTIVE strategy sub-wallet → embedded wallet (synchronous Hyperliquid usdSend). Amount > 1 USDC; if the withdrawal drains the strategy to $0 it **auto-closes** (do NOT then call `strategy_close` — SERR045). PAUSED strategies can only be closed. If this tool is not in your toolset, do not substitute `strategy_close` on your own — closing flattens ALL positions; offer it only on an explicit close request, confirmed first, or send the user to the strategy screen in the app. - **`strategy_bridge_funds_from_hyperliquid_to_evm`** — Hyperliquid → the user's **own embedded wallet** on an EVM chain (Base default; Arbitrum, Optimism, Ethereum, BNB, Polygon). The destination is fixed — it **cannot pay a third-party address**. ~0.1% Relay fee; amount ≤ withdrawable (excludes unrealized PnL and position margin); one-way (the reverse happens automatically on strategy create/top-up). - **`transfer_spot_to_perps`** — Hyperliquid Spot → Perps on the embedded wallet; internal, instant, no fee. Strategy sub-wallets are not involved. - Referral rewards: `user_claim_referral_rewards` pays out to the embedded wallet. - **Amounts are user intent.** If no amount is given, ASK — never default to the balance, the withdrawable, or "everything". Read balances to check sufficiency, not to pick the number. ## How to answer - **External request:** one clean refusal + the rail: *"No tool can send funds to an external address — use **Withdraw** in the **Balances** tab of the Senpi web or mobile app."* Offer the on-platform alternative only if it actually serves the user's goal. - **Deposit request:** give the embedded-wallet address (`user_get_me`), note it works on all supported chains + Hyperliquid, and never hand out a strategy wallet address. - **Before internal moves:** check state where it matters — `account_get_portfolio` for balances, `strategy_get_clearinghouse_state` for the withdrawable amount, `strategy_list` for strategy status — then confirm the amount with the user. ## Never - Never a strategy wallet address as a deposit target — on any chain, for any reason. - Never the Hyperliquid UI, key export, or bridging as the way to withdraw externally. - Never invent or default an amount; never move "the whole balance" unless the user explicitly says so. - Never `strategy_close` as a withdraw substitute — explicit close intent, confirmed, only.