← ClaudeAtlas

use-user-controlled-walletslisted

Build non-custodial wallets where end users retain control of their private keys via Circle's user-controlled wallets SDK. Supports Google, Apple, Facebook social login, email OTP, and PIN authentication with MPC-based key management. Covers wallet creation, token transfers, message signing, smart contract execution, and wallet management. Triggers on: user-controlled wallets, social login wallet, email OTP wallet, PIN wallet, w3s-pw-web-sdk, executeChallenge, MPC wallet, userToken, deviceToken, contract execution.
Ekinoxis-evm/claude-skills · ★ 0 · AI & Automation · score 60
Install: claude install-skill Ekinoxis-evm/claude-skills
## Overview User-controlled wallets are non-custodial wallets where end users maintain control over their private keys and assets. Users authorize all sensitive operations (transactions, signing, wallet creation) through a challenge-response model that ensures user consent before execution. Multi-chain support includes EVM chains, Solana, and Aptos. ## Prerequisites / Setup ### Installation ```bash npm install @circle-fin/user-controlled-wallets@latest @circle-fin/w3s-pw-web-sdk@latest vite-plugin-node-polyfills ``` ### Vite Configuration The SDKs depends on Node.js built-ins (`buffer`, `crypto`, etc.) that are not available in the browser. Add `vite-plugin-node-polyfills` to your Vite config: ```typescript import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { nodePolyfills } from "vite-plugin-node-polyfills"; export default defineConfig({ plugins: [react(), nodePolyfills()], }); ``` ### Environment Variables ```bash # Backend CIRCLE_API_KEY= # Circle API key # Frontend CIRCLE_APP_ID= # App ID from Wallets > User Controlled > Configurator ``` ### Backend SDK Initialization Uses `@circle-fin/user-controlled-wallets` for all server-side operations (user creation, challenge creation, transaction queries). ```typescript import { initiateUserControlledWalletsClient } from "@circle-fin/user-controlled-wallets"; const circleClient = initiateUserControlledWalletsClient({ apiKey: process.env.CIRCLE_API_KEY!, }); `