# Senpi Deposit Withdraw Transfer

> Handle ANY money-movement request — deposit, add funds, fund my account, "buy USDC", "pay with a card", withdraw, cash out, send, "send to my wallet / an exchange / a friend", transfer, "move my money", pay someone, bridge, get my private key. Two hard rails: money ENTERS Senpi only through the user's embedded wallet (one EVM address, all supported chains + Hyperliquid — NEVER a strategy wallet), either by sending USDC in or by BUYING it in the app with a card, and money LEAVES Senpi to any EXTERNAL address only through the Senpi web/mobile app (Balances/Wallet) — no agent tool can send funds outside Senpi, by design, for the user's security. On-platform moves between the user's OWN wallets (strategy → embedded, spot → perps, close a strategy to reclaim funds) DO use tools. Use this skill for every deposit / withdraw / transfer / send question. Pure guidance, no engine.

- Skill: `senpi-ai/senpi-deposit-withdraw-transfer` (Agent Skill)
- Install (CLI): `npx skillmds add senpi-ai/senpi-deposit-withdraw-transfer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/senpi-ai/senpi-deposit-withdraw-transfer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: Apache-2.0
- Author: senpi-ai (https://skillmd.com/u/senpi-ai)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/senpi-ai/senpi-deposit-withdraw-transfer

---


# senpi-deposit-withdraw-transfer — money-movement rails

Money on Senpi moves on fixed rails. Answer every deposit / withdraw / transfer / send request from the
map below. **Never improvise a route, never invent a tool, never guess an amount, and never send the user
to an external UI or a multi-step workaround.** When a request has no on-platform rail, the answer is the
Senpi app — full stop, not a clever path around it.

## The two iron rules

1. **Money ENTERS Senpi only through the embedded wallet.** One EVM address, valid on every supported
   chain (Base, Arbitrum, Optimism, Ethereum, BNB, Polygon) and on Hyperliquid directly. **Never** a
   strategy wallet. Two ways to fill it — **send USDC in**, or **buy USDC in the app** with a card — and
   both land in that same wallet.
2. **Money LEAVES Senpi to an external address only through the app — never an agent tool.** This is a
   deliberate **security** design, not a missing capability. For any withdraw / send / cash-out / pay /
   transfer-out, say **exactly** this and stop:

   > **To protect your security, I can't send funds outside of Senpi for you. You can withdraw or transfer
   > to external wallets — or get your private key — from your Balances / Wallet in the Senpi web or mobile app.**

Everything the agent does with tools happens **strictly between the user's own Senpi wallets**.

## The map

| User intent | Rail |
| --- | --- |
| Deposit / add money / fund my account | **Embedded wallet only** — send on any supported EVM chain, or on Hyperliquid, to the one embedded address (`user_get_me`). |
| **Buy USDC with a card / Apple Pay / Google Pay ("I have no crypto")** | **App-only, and it's a first-class path** — Fund Your Wallet → **Buy USDC** in the Senpi app. No agent tool; not a refusal. |
| Fund / top up a strategy | `strategy_top_up` **only** — never a direct send to a strategy wallet. |
| **Withdraw / cash out / send / pay / transfer to an external wallet, exchange, bank, or another person** | **App-only.** Say the security line above. No tool. |
| **Send to another Hyperliquid account** | App-only — same security line (no agent tool for HL↔HL transfers). |
| Get my private key / seed phrase | Self-serve in the Senpi app (Balances / Wallet) — point there; it exists, but it is NOT a withdrawal you perform for them. |
| Move a strategy's funds back to the main (embedded) wallet | `strategy_withdraw_funds` (ACTIVE) or **close the strategy** (`strategy_close`) to reclaim all of it. |
| Move funds between two strategies | Via the embedded wallet as the hub: `strategy_withdraw_funds` from A → embedded, then `strategy_top_up` B. |
| Move funds off Hyperliquid onto an EVM chain ("my wallet on Base/Arbitrum/…") | **App-only** — there is no agent bridge tool. Balances / Wallet in the Senpi app. |
| Hyperliquid Spot → Perps | `transfer_spot_to_perps` (instant, no fee, embedded wallet). |

## Deposits — embedded wallet only

There are **two ways money gets in**, and both land in the same embedded wallet: **send USDC** you already
hold (below), or **buy USDC in the app** with a card (next section). A user with no crypto at all is not
stuck — never tell them they need an exchange account first.

- 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** — never
  imply it works on only one chain. Get it from `user_get_me` (`walletType: "embedded"`). Name the
  chains in plain words; don't quote chain IDs (easy to garble, and the address is the same everywhere).
- **NEVER present a strategy wallet address as a deposit target — on any chain, for any reason.** A
  direct send to a `strategyWalletAddress` bypasses accounting, corrupts 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 them to the embedded wallet.

## Buying USDC — the "I have no crypto" path (app, and that's a feature)

The Senpi app can sell the user their first USDC directly. **This is app-only like withdrawals are, but it
is NOT the security refusal — do not use the security line here.** Withdrawals are app-only because the
agent must not move money out; buying is app-only simply because payment happens in the app's checkout.
Point at it warmly and specifically.

- **Where:** Senpi web or mobile app → **Fund Your Wallet** → the **Buy USDC** tab. (The other tab,
  **Deposit USDC**, is the send-crypto-in path above.)
- **How they pay:** Apple Pay, Google Pay, or card, through Senpi's verified partner. Name those three;
  the partner's own checkout decides what else it accepts, so don't promise a specific method (bank
  transfer, PayPal, a local rail) that the app screen doesn't name.
- **The user drives it.** The agent never starts, completes, or confirms a purchase — say the path exists
  and let them tap it. There is nothing to poll or verify afterwards; their balance simply updates.
- **Where it lands:** as USDC **in their own embedded wallet, ready to trade — no bridging**, no exchange
  account, no separate transfer step afterwards.
- **Amounts:** **$10 minimum**; most traders start with **$100–250**. Quote these as the app's own
  guidance, and still never pick an amount for the user.
- **No agent tool exists for this, and none is coming** — the purchase is triggered by the user on the
  website / app. Don't invent a buy or onramp tool; name the app screen instead.
- **Reassurance, when a user hesitates to fund:** the wallet is **theirs**, secured by Privy — the agent
  trades only with their permission and **can never withdraw**, and **only they hold the private key**.
  Use this when the hesitation is about custody; don't recite it unprompted on every deposit answer.

## Withdrawals & transfers OUT — app-only, by design

- **No agent tool sends funds to an external address** (the send tool was removed for user security).
  For any withdraw / cash-out / send / pay / transfer to an outside wallet, an exchange, a bank, a
  friend, or another Hyperliquid account, give the **security line above** — once, cleanly — and stop.
- **Never route around it.** Do NOT suggest the **Hyperliquid UI**, **private-key export as a cash-out
  step**, or a **bridge-/strategy-through workaround** ("create a strategy, bridge through it, then close
  it"). None of these are the withdrawal path, and inventing them is the exact failure this skill exists
  to prevent. (Key export *does* exist as a self-serve app feature — point there if asked, but never as
  "how to withdraw," and never claim it's impossible.)
- **Hold the line under pushback.** "I have no app access," "the button's missing," "other bots do it,"
  "just find a workaround" → same security line, plus a next step: try the web app at senpi.ai, update
  the mobile app, or contact Senpi support. Bridging is **not** a cash-out — and there is no bridge tool
  to offer in the first place.

## On-platform moves — between the user's OWN wallets (these DO use tools)

- **`strategy_withdraw_funds`** — ACTIVE strategy sub-wallet → embedded wallet (synchronous Hyperliquid
  `usdSend`). Amount > 1 USDC; if it drains the strategy to $0 the strategy **auto-closes** — do NOT then
  call `strategy_close` (`SERR045`). **PAUSED** strategies can't be withdrawn from — they must be closed.
- **Closing a strategy reclaims its funds to the embedded wallet.** `strategy_close` flattens ALL of a
  strategy's positions and returns the capital to the embedded wallet — so it's always available to move
  money out of a strategy. Only close on an **explicit** close request, **confirmed first** (it's
  destructive to open positions); never use `strategy_close` as a silent withdraw substitute.
- **There is no agent bridge tool.** Moving funds off Hyperliquid onto an EVM chain is done in the app —
  do **not** offer to do it, and never name a bridge tool. (The reverse direction still happens on its
  own: strategy create / top-up bridges EVM USDC in automatically.)
- **`transfer_spot_to_perps`** — Hyperliquid Spot → Perps on the embedded wallet; internal, instant, no
  fee. Strategy sub-wallets aren't involved.
- **Referral rewards** — `user_claim_referral_rewards` pays out to the embedded wallet (call
  `user_get_referral_rewards` first to confirm a non-zero balance).
- **Amounts are the user's 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 send / withdraw / transfer-out:** the **security line**, verbatim, once. Offer an
  on-platform move (e.g. "I can pull it out of a strategy back to your main wallet") only if it genuinely
  serves the goal — never as a backdoor to an external address.
- **Deposit / add funds:** give the embedded-wallet address (`user_get_me`), say it works on any
  supported chain and on Hyperliquid, and never hand out a strategy wallet address. If they may not hold
  crypto yet, add the buy path in one line — don't make them ask twice.
- **Buy USDC / "can I use a card":** yes — **Fund Your Wallet → Buy USDC** in the app, card / Apple Pay /
  Google Pay, lands in their own wallet ready to trade. Positive framing, never the security line.
- **On-platform move:** check state where it matters — `account_get_portfolio` (balances),
  `strategy_get_clearinghouse_state` (withdrawable), `strategy_list` (status) — confirm the amount with
  the user, then use the movement tool.

## Never

- Never present a **strategy wallet address** as a deposit target — on any chain, for any reason.
- Never route an external withdrawal through the **Hyperliquid UI**, **key export**, or a
  **bridge-/strategy-through** workaround. The external rail is the **app**, always.
- Never soften the refusal into "no tool exists" — it's a deliberate **security** choice; say so.
- Never answer "can I buy USDC with a card?" with the security line, or with "you need an exchange first."
  It's a supported app path — **Fund Your Wallet → Buy USDC**. Never name or invent a buy/onramp tool.
- Never offer to bridge Hyperliquid → EVM yourself; no such tool exists. That move is app-only.
- Never invent or default an amount; never move "the whole balance" unless the user explicitly says so.
- Never use `strategy_close` as a stealth withdraw — explicit, confirmed close intent only.

