后端与接口
用 Circle Smart Contract…
在支持的 EVM 链上通过 Circle SCP SDK 部署/导入合约、按 ABI 读写调用并订阅事件时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Circle Smart Contr特定
解决思路
- 安装依赖:npm install @circle-fin/smart-contract-platform @circle-fin/developer-controlled-wallets
- 配置环境变量 CIRCLE_API_KEY(格式 PREFIX:ID:SECRET)和 ENTITY_SECRET,并分别用 initiateSmartContractPlatformClient 与 initiateDeveloperControlledWalletsClient 初始化两个客户端
- 采用双客户端架构:SCP 客户端负责部署、导入、读查询和事件监控;Developer-Controlled Wallets 客户端负责写交易并提供部署钱包
- 区分读写:view/pure 函数用 scpClient.queryContract()(无需 gas 钱包);nonpayable/payable 函数用 walletsClient.createContractExecutionTransaction()(需要有钱包 ID 和 gas 资金)
- 函数签名写成 name(type1,type2,...) 无空格;事件签名写成 EventName(type1,type2,...) 无空格;参数顺序必须与 ABI 定义完全一致
- 所有变更类 SCP 操作都要传 idempotencyKey,且必须是合法 UUID v4(Node.js 用 crypto.randomUUID()),非 UUID 会报 API parameter invalid
- 部署是异步的:响应只表示已发起,需轮询 getContract() 查看 deploymentStatus
- 编译 Solidity 时设置 evmVersion: "paris" 或更早,避免 PUSH0 操作码;Solidity >= 0.8.20 默认 Shanghai,在 Arc 等非 Shanghai 链上会因 PUSH0 报 ESTIMATION_ERROR / Create2: Failed on deploy
- 写操作按异步状态机轮询 walletsClient.getTransaction({ id: txId }) 直到终态:正常路径 INITIATED -> CLEARED -> QUEUED -> SENT -> CONFIRMED -> COMPLETE;终态为 COMPLETE/FAILED/DENIED/CANCELLED;中间态含 INITIATED/WAITING/QUEUED/CLEARED/SENT/STUCK/CONFIRMED;STUCK 表示费用低于链上最新要求,需取消或加速
- 合约部署状态单独用 scpClient.getContract() 的 deploymentStatus 跟踪;失败时查看 deploymentErrorReason 和 deploymentErrorDetails
- 按错误码处理:175001 合约不存在(核对 ID、是否被归档);175003 构造函数参数不匹配(核对数量与类型);175004 重复合约(listContracts({ blockchain }) 按 contractAddress 大小写不敏感匹配并复用 contractId);175009 部署仍在进行(继续轮询);175201 模板不存在(核对模板 ID);175301 事件订阅不存在(核对 monitor ID,确保先导入合约);175302 重复事件订阅(查询已有订阅并复用);175303 事件签名非法(用无空格精确格式);175402 链不支持或已弃用(SCP 不支持 Solana、Aptos、NEAR);175404 API key 与网络不匹配(TEST_API_KEY 配测试网、LIVE_API_KEY 配主网);177015 缺少部署字节码(提供带 0x 前缀的字节码并用 paris 编译)
- 按场景选择实现模式:从字节码部署、从模板部署、导入已有合约、与已部署合约交互、监控合约事件,分别参考 references/deploy-bytecode.md、deploy-template.md、import-contract.md、interact.md、monitor-events.md
- 使用模板时按模板 ID 选择:ERC-20 a1b74add-23e0-4712-88d1-6b3009e85a86、ERC-721 76b83278-50e2-4006-8b63-5b1a2a814533、ERC-1155 aea21da6-0aa2-4971-9a1a-5098842b1248、Airdrop 13e322f2-18dc-4f57-8eed-4bddfc50f85e
- 读取关键响应字段:函数列表 getContract().data.contract.functions;合约地址 contract.contractAddress(回退 contract.address);交易 ID createContractExecutionTransaction().data.id;部署状态 getContract().data.contract.deploymentStatus
- 安全规则:绝不硬编码/提交/打印密钥,使用环境变量或密钥管理,脚手架时把 .env*、*.pem 和恢复文件加入 .gitignore;绝不用明文 CLI 参数传私钥,改用加密 keystore 或交互式导入;API key 和 entity secret 只放服务端;不同请求不复用 idempotencyKey;写交易前必须让用户明确确认目标地址、金额、网络和代币,主网资金移动必须确认;主网或超过安全阈值(如 >100 USDC)要警告;提交前校验合约地址、金额、链标识;有审计模板时优先用模板,用自定义字节码前警告未经审计;绝不部署用于欺骗、钓鱼或盗取资金的合约;与未审计或未知合约交互前警告
- 最佳实践:写操作绝不用 SCP 客户端,一律用 walletsClient.createContractExecutionTransaction();deployContract 的 name 字段只用字母数字,不含冒号、括号等特殊字符;费用用嵌套结构 fee: { type: 'level', config: { feeLevel: 'MEDIUM' } },不用扁平 feeLevel;不要用 window.ethereum 直接配 wagmi,改用 connector.getProvider();不要用默认 EVM 版本编译 Solidity >= 0.8.20,必须设 evmVersion: "paris";importContract() 必须同时传 name 和 idempotencyKey;不要假设部署同步完成,必须轮询 getContract();字节码加 0x 前缀并精确匹配构造函数参数类型与顺序;18 位小数金额用整数安全运算(10n ** 18n,而非 BigInt(10 ** 18));创建事件监控前先导入合约;演示默认用 Arc Testnet;默认用测试网,切主网前需用户明确确认
- 需要文档时先读 https://developers.circle.com/llms.txt
适用边界 · 注意事项
- 目标链是 Solana、Aptos 或 NEAR 时(SCP 不支持,会报 175402)
- 没有 Circle API key 和已注册的 entity secret,或无法使用 @circle-fin 相关 SDK 时
- 只想做简单只读链上查询、不需要部署/导入/事件监控等 SCP 能力时