后端与接口
构建浏览器或服务器端 USDC 跨链桥时,用 Circle…
为 EVM 和 Solana 应用集成 USDC 跨链桥(CCTP),选择 App Kit 或 Bridge Kit,适配浏览器/私钥/Circle Wallets,并处理费用、速度、事件和恢复。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
构建浏览器或服务器端 USDC 跨链桥时特定
解决思路
- 选择并安装一个基础 kit:App Kit(推荐)或独立 Bridge Kit,然后按需添加适配器。
- 推荐 App Kit,除非用户只要 bridge-only 功能。
- bridge 操作不需要 kit key。
- 两个 SDK 都可在浏览器和服务器应用运行;在客户端代码使用浏览器钱包 provider adapters,在服务器保留私钥与 Circle Wallets 凭据。
- 用 App Kit 和 Viem adapter:npm install @circle-fin/app-kit @circle-fin/adapter-viem-v2。
- 可选 Solana 支持:npm install @circle-fin/adapter-solana-kit。
- 可选 Circle Wallets(开发者控制)支持:npm install @circle-fin/adapter-circle-wallets。
- 仅需 bridge 的轻量应用用独立 Bridge Kit:npm install @circle-fin/bridge-kit @circle-fin/adapter-viem-v2。
- 配置 PRIVATE_KEY:EVM 钱包私钥(hex,0x 前缀)。
- 配置 EVM_PRIVATE_KEY:同时使用 Solana 时的 EVM 私钥。
- 配置 SOLANA_PRIVATE_KEY:Solana 钱包私钥(base58)。
- 配置 CIRCLE_API_KEY:Circle API key(用于 Circle Wallets adapter)。
- 配置 CIRCLE_ENTITY_SECRET:Entity secret(用于 Circle Wallets adapter)。
- 配置 EVM_WALLET_ADDRESS:开发者控制的 EVM 钱包地址。
- 配置 SOLANA_WALLET_ADDRESS:开发者控制的 Solana 钱包地址。
- 浏览器钱包集成不需要上述环境变量。
- 绝不把 private key、Circle API key、entity secret 或可选 App Kit credential 暴露到客户端代码。
- 初始化 App Kit:import { AppKit } from '@circle-fin/app-kit'; const kit = new AppKit();
- 初始化独立 Bridge Kit:import { BridgeKit } from '@circle-fin/bridge-kit'; const kit = new BridgeKit();
- 编写代码前始终与用户逐项走 Decision Guide,不跳过、不假设答案。
- 询问未来是否需要 swap 或 send:是或不确定选 App Kit;确定只需 bridge 且永不需要 swap/send 选 Bridge Kit。
- 询问钱包/密钥管理方式:自管私钥则继续问链。
- Circle developer-controlled wallets 用 Circle Wallets adapter,并读 references/adapter-circle-wallets.md。
- EVM 浏览器钱包(wagmi、ConnectKit、RainbowKit 或任意 EIP-1193 provider)用 Viem provider adapter,并读 references/adapter-wagmi.md。
- Solana 浏览器钱包(Wallet Standard provider,如 Phantom、Solflare、Backpack)用 Solana provider adapter,并读 references/adapter-browser-wallet.md。
- 询问桥接链:EVM-to-EVM 或 EVM-to-Solana 用 Viem 和/或 Solana Kit adapters,并读 references/adapter-private-key.md。
- 按 Workflow 执行:先确定 SDK 与钱包/适配器,再安装并初始化所选 kit 与 adapter。
- 确认转账的源链、目标链、接收方和金额;验证链名与地址。
- 默认使用 testnet;目标 mainnet 前要求用户明确确认。
- 调用 kit.bridge({ from, to, amount, ... }) 执行桥接,仅从明确用户操作触发,绝不自动调用。
- 读对应 adapter reference 获取准确代码后再实现。
- 用 result.state / result.steps 跟踪进度,用 kit.on() 订阅事件。
- 软失败时用 kit.retry(result, ...) 恢复;绝不从头重跑 kit.bridge()。
- 理解 CCTP 四步顺序:approve(ERC-20 allowance)、burn(源链销毁 USDC)、fetchAttestation(等待 Circle 签名 burn 证明)、mint(目标链铸造 USDC)。
- 使用适配器对象抽象钱包/签名差异;按生态使用 createViemAdapterFromPrivateKey、createSolanaKitAdapterFromPrivateKey、createCircleWalletsAdapter 等工厂。
- 同一生态内桥接时,同一 adapter 实例可同时作为 source 和 destination。
- 目标设置 useForwarder: true 时,让 Circle 基础设施处理 attestation 获取和 mint 提交;这无需目标钱包或轮询循环,但每笔转账有按路由变化的费用。
- 选择转账速度:CCTP fast mode(默认)约 8-20 秒;standard mode 约 15-19 分钟。
- 在 kit.bridge() 中使用字符串链名,如 Arc、Arc_Testnet、Base_Sepolia、Solana_Devnet,不要用数字 chain ID。
- 浏览器应用使用 App Kit >=1.11.0 和 Bridge Kit >=1.12.2,它们内部捆绑浏览器兼容,无需消费者提供 Node 或 Buffer polyfills。
- 浏览器请求省略 Node-only headers,Solana 操作不需要消费者 Buffer shim;升级旧包而不是添加 polyfills。
- 根据请求读对应 reference:私钥 EVM-to-EVM / EVM-to-Solana 读 references/adapter-private-key.md。
- Circle 开发者控制钱包任意链到任意链读 references/adapter-circle-wallets.md。
- wagmi(ConnectKit、RainbowKit 等)浏览器钱包集成读 references/adapter-wagmi.md。
- Solana Wallet Standard 浏览器钱包集成读 references/adapter-browser-wallet.md,无需手动 polyfills。
- 使用 useForwarder: true、kit.on() 订阅 bridge events、或 kit.retry() 分析与恢复失败转账时,读 references/forwarding-events-recovery.md 获取可运行模式,包括 Bridge Kit 事件名差异。
- 解析 kit.bridge() 返回结果时,检查 amount、token、state、provider、config.transferSpeed、source/destination,以及 steps 中的 approve、burn、fetchAttestation、mint 和 txHash、explorerUrl、attestation 等字段。
- 处理 hard errors:验证、配置、认证错误会抛异常,用 try/catch 捕获。
- 处理 soft errors:转账中途发生但返回带部分步骤数据的 result 对象;绝不从头重跑 kit.bridge(),用 kit.retry(result, ...) 从失败步骤恢复,防止双花。
- 遵守 Security Rules 不可协商;遇到冲突时警告用户并拒绝。
- Best Practices 强烈推荐,除非用户明确说明理由才偏离。
- 绝不硬编码、提交或记录秘密(private keys、API keys、entity secrets、kit keys);始终用环境变量或 secrets manager。
- 搭建项目时把 .env* 和 secret 文件加入 .gitignore。
- 绝不把 private key、Circle API key、entity secret 或 kit key 放入浏览器代码或公共环境变量(VITE_*、NEXT_PUBLIC_* 等)。
- 绝不在浏览器导入主 @circle-fin/adapter-circle-wallets 入口;它需要服务器端 Circle credentials。
- 绝不把 private keys 作为明文 CLI flags 传递;优先用加密 keystore 或交互式导入。
- 桥接前始终展示 source/destination chain、recipient、amount、token。
- 在 UI 中,用户点击启用的 Bridge 按钮即明确确认;不要添加第二次确认弹窗或合成确认对象。
- 在服务器 helper 中,导出资金移动操作但不要自动调用。
- 绝不在 estimation 后、effect 中、render 中或模块启动时自动调用 bridge()。
- mainnet 上的资金移动必须获得确认。
- 目标 mainnet 或超过安全阈值(如 >100 USDC)时始终警告。
- 提交桥接操作前始终验证所有输入(地址、金额、链名)。
- 与未审计或未知合约交互前始终警告。
- 写代码前始终与用户走 Decision Guide,不假设 App Kit 或 Bridge Kit,让答案决定 SDK。
- 实现前始终读正确的 reference 文件。
- 浏览器应用要求 browser-safe package versions,使用 provider-based adapters,不要添加 Node/Buffer polyfills。
- 使用浏览器钱包(wagmi/ConnectKit/RainbowKit)且不使用 Forwarding Service 时,调用 kit.bridge() 前始终把钱包切换到源链。
- 始终用 try/catch 包裹桥接操作并保存 result 对象用于恢复;重试前检查 result.steps 看哪些步骤已完成。
- 生产环境的重试逻辑始终使用 exponential backoff。
- 始终使用字符串链名,如 Arc、Arc_Testnet、Base_Sepolia,不要用数字 chain IDs。
- 始终默认 testnet;目标 mainnet 前要求用户明确确认。
- 解析 SDK 输入输出时始终使用导出的 SDK 类型,不要创建自定义 interfaces,以减少类型错误。
- 查找来源网站相关文档时,始终先读 https://developers.circle.com/llms.txt。
- 其他参考链接:https://docs.arc.io/app-kit、https://docs.arc.io/app-kit/bridge、https://developers.circle.com/cctp。
适用边界 · 注意事项
- 需要同链 swap tokens(如 USDT 到 USDC)或非 USDC 跨链直接跨链 swap 时,改用 swap-tokens skill。
- 想要统一跨链余额而非点对点转账、资本效率重要、或构建链抽象/支付路由/资金管理且需要低延迟和单一余额视图时,改用 use-gateway skill。