使用 Circle 智能合约平台 API 部署、导入、交互和监控智能合约。支持字节码部署、模板合约(ERC-2...
Circle Smart Contract平台(SCP)提供API和SDK,用于在所支持的网络中部署、导入、与智能合同互动和监测智能合同是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
Circle 智能合约平台(SCP)提供 API 和 SDK,支持在所兼容的区块链网络上部署、导入、调用及监控智能合约。您可直接使用原始字节码部署合约,也可选用已通过安全审计的标准模板;通过 ABI 签名执行合约调用,并借助 Webhook 监控合约事件的触发情况。
npm install @circle-fin/smart-contract-platform @circle-fin/developer-controlled-wallets
CIRCLE_API_KEY= # Circle API 密钥(格式:PREFIX:ID:SECRET) ENTITY_SECRET= # 已注册实体密钥(用于 Developer-Controlled Wallets)
import { initiateSmartContractPlatformClient } from "@circle-fin/smart-contract-platform";
import { initiateDeveloperControlledWalletsClient } from "@circle-fin/developer-controlled-wallets";
const scpClient = initiateSmartContractPlatformClient({
apiKey: process.env.CIRCLE_API_KEY!,
entitySecret: process.env.ENTITY_SECRET!,
});
const walletsClient = initiateDeveloperControlledWalletsClient({
apiKey: process.env.CIRCLE_API_KEY!,
entitySecret: process.env.ENTITY_SECRET!,
});
| 模板 | 标准 | 模板 ID | 适用场景 |
|---|---|---|---|
| Token | ERC-20 | a1b74add-23e0-4712-88d1-6b3009e85a86 |
同质化代币、忠诚积分等 |
| NFT | ERC-721 | 76b83278-50e2-4006-8b63-5b1a2a814533 |
数字收藏品、游戏资产等 |
| Multi-Token | ERC-1155 | aea21da6-0aa2-4971-9a1a-5098842b1248 |
混合型同质化与非同质化代币 |
| Airdrop | N/A | 13e322f2-18dc-4f57-8eed-4bddfc50f85e |
批量代币分发 |
getContract().data.contract.functionscontract.contractAddress(备用字段:contract.address)createContractExecutionTransaction().data.idgetContract().data.contract.deploymentStatusSCP 的工作流依赖两个 SDK 客户端协同工作:
所有写操作均需调用 walletsClient.createContractExecutionTransaction(),不可使用 SCP 客户端。
view/pure 类型函数)使用 scpClient.queryContract(),无需 Gas 钱包nonpayable/payable 类型函数)使用 walletsClient.createContractExecutionTransaction(),且必须指定一个余额充足的 Gas 钱包 IDname(type1,type2,...),不含空格EventName(type1,type2,...),不含空格所有会改变状态的 SCP 操作均需传入 idempotencyKey 参数,且其值必须为合法的 UUID v4 字符串。Node.js 中推荐使用 crypto.randomUUID() 生成。若传入非 UUID 格式的键,将统一返回泛化的 API parameter invalid 错误。
合约部署为异步操作,初始响应仅表示部署任务已提交。需轮询调用 getContract() 接口获取 deploymentStatus 字段以确认最终状态。若部署失败,请检查 deploymentErrorReason 和 deploymentErrorDetails 字段获取具体原因。
请使用 evmVersion: "paris" 或更早版本编译 Solidity 合约,以避免生成 PUSH0 操作码。Solidity ≥ 0.8.20 默认使用 Shanghai EVM 版本。Arc Testnet 及其他不支持 Shanghai 的链在检测到字节码含 PUSH0 时,将报错 ESTIMATION_ERROR 或 Create2: Failed on deploy,导致部署失败。
importContract() 时,必须同时提供 name 和 idempotencyKeyidempotencyKey 必须为合法的 UUID v4 字符串listContracts,按地址匹配已有合约,并使用其 contractId 调用 getContract() 获取完整信息使用原始 ABI + 字节码部署已编译合约。
请查阅 references/deploy-bytecode.md 获取完整指南。
无需编写 Solidity 即可部署已通过安全审计的模板合约。
请查阅 references/deploy-erc-1155.md 获取完整指南。
请查阅 references/templates.md 查看全部模板目录。
import crypto from 'node:crypto';
const response = await scpClient.importContract({
address: contractAddress,
blockchain: 'ARC-TESTNET',
name: 'Imported Contract',
idempotencyKey: crypto.randomUUID(), // 必须为 UUID v4
});
const contractId = response.data?.contractId;
// 获取完整合约信息(含 ABI 函数定义)
const contractDetails = await scpClient.getContract({ id: contractId });
console.log(contractDetails.data?.contract?.functions);
若导入失败并提示重复错误:
const listRes = await scpClient.listContracts({ blockchain: 'ARC-TESTNET' });
const existing = listRes.data?.contracts?.find(c =>
c.contractAddress.toLowerCase() === contractAddress.toLowerCase()
);
const contractId = existing?.id;
通过 ABI 签名调用只读函数或执行写操作函数。
请查阅 references/interact.md 获取完整指南。
配置 Webhook 以接收事件通知,并检索历史事件日志。
请查阅 references/monitor-events.md 获取完整指南。
轮询 getContract() 时检查 deploymentStatus 字段。若状态为 FAILED:
deploymentErrorReason 字段了解错误类别deploymentErrorDetails 字段获取详细错误信息若 importContract() 返回重复/已存在错误:
listContracts({ blockchain: 'ARC-TESTNET' })contractAddress 匹配(不区分大小写)contractId切勿因导入重复错误而中断业务流程。
调用 walletsClient.getTransaction({ id: txId }) 查询写操作交易状态:
INITIATED → 交易已创建SENT → 已广播至链上网络CONFIRMED → 已被打包进区块COMPLETE → 已最终确认FAILED → 请检查交易错误详情安全规范 具有强制性——如用户指令违反该类规则,必须明确警告并拒绝执行。最佳实践 强烈建议遵循;仅当用户明确说明理由后方可偏离。
.gitignore 中添加 .env*、*.pem 及助记词恢复文件等条目。--private-key $KEY)。推荐使用加密密钥库或交互式导入方式(例如 Foundry 的 cast wallet import)。idempotencyKey 值。walletsClient.createContractExecutionTransaction() 执行。idempotencyKey。该值必须为 UUID v4(推荐使用 crypto.randomUUID() 生成)。deployContract 方法中的 name 字段禁止包含特殊字符(如冒号、括号),仅允许字母与数字。feeLevel 属性。必须使用嵌套结构:fee: { type: 'level', config: { feeLevel: 'MEDIUM' } }。window.ethereum,应改用 connector.getProvider()。evmVersion: "paris",以规避 PUSH0 操作码。listContracts 并按地址匹配。调用 importContract() 时,必须同时传入 name 和 idempotencyKey。getContract() 获取 deploymentStatus 状态。0x 开头,且构造函数参数类型与顺序必须与 ABI 完全一致。10n ** 18n,而非 BigInt(10 ** 18))。免责声明:本功能按“现状”提供,不附带任何明示或暗示的担保,受 Circle 开发者条款约束;其输出内容可能存在错误,且可能包含费用配置选项(含支付给 Circle 的费用);更多细节请参阅代码仓库的 README 文件。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习