ekx-coinbase-cdplisted
Install: claude install-skill Ekinoxis-evm/claude-skills
# Coinbase CDP + OnchainKit
Two distinct things from the same vendor:
- **CDP Server Wallets** — keys held by our backend, so an *agent* can transact.
- **OnchainKit** — React components for Base dApps.
Portal: https://portal.cdp.coinbase.com · Docs: https://docs.cdp.coinbase.com
---
## When CDP instead of Privy
| Need | Use |
|---|---|
| A *person* logs in and gets a wallet | **Privy** ([skill](../ekx-privy/SKILL.md)) |
| An *agent/backend* signs autonomously | **CDP server wallet** |
| Base-native UI components | **OnchainKit** (works alongside either) |
An agent app needs CDP when its LangGraph agent books and moves USDC without
a human clicking. That is the only justification for a server-held key — if a human is
in the loop, use Privy.
---
## Environment
```bash
CDP_API_KEY_ID= # SECRET
CDP_API_KEY_SECRET= # SECRET
NEXT_PUBLIC_CDP_PROJECT_ID= # public
AGENT_WALLET_ID= # SECRET — the persisted wallet id
```
---
## Server wallets
```ts
import { CdpClient } from "@coinbase/cdp-sdk";
const cdp = new CdpClient({
apiKeyId: process.env.CDP_API_KEY_ID!,
apiKeySecret: process.env.CDP_API_KEY_SECRET!,
});
const account = await cdp.evm.getOrCreateAccount({ name: "rental-agent" });
const { transactionHash } = await cdp.evm.sendTransaction({
address: account.address,
network: "base-sepolia",
transaction: { to: USDC, data: encodedTransfer, value: 0n },
});
```
**Persist the wallet id.** A server wallet that is r