合约概览
ONE SDK 通过 Engine API 层公开合约交互功能。合约模块没有专门的 React hook 或组件——你使用 useOneEngine() 获取 OneEngineClient 实例,然后直接调用其合约方法。
快速开始
import { useOneEngine } from '@one_deploy/sdk';
function ContractPage() {
const { client } = useOneEngine();
async function fetchContracts() {
const res = await client.getUserContracts();
console.log(res.data); // Contract[]
}
return <button onClick={fetchContracts}>Load My Contracts</button>;
}
在非 React 环境(Node、Edge、脚本)中,直接创建客户端:
import { OneEngineClient } from '@one_deploy/sdk';
const client = new OneEngineClient({
apiKey: process.env.ONE_API_KEY!,
projectId: process.env.ONE_PROJECT_ID!,
});
const res = await client.getUserContracts();
可用方法
| 方法 | 描述 |
|---|---|
getUserContracts(options?) | 列出当前用户部署或交互过的所有合约。 |
getContractDetails(address, chainId) | 获取单个合约的元数据、ABI 和链上状态。 |
readContract(params) | 调用任意合约上的只读(view / pure)函数。 |
writeContract(params) | 向合约发送状态更改交易。 |
deployContract(params) | 从支持的 模板或自定义字节码部署新合约。 |
createWebhook(params) | 通过 webhook 订阅合约事件。 |
getTransactionStatus(txHash, chainId) | 轮询交易确认状态。 |
核心类型
Contract
import type { Contract, ContractType } from '@one_deploy/sdk';
interface Contract {
address: string;
chainId: number;
name: string;
type: ContractType;
abi?: Record<string, unknown>[];
deployedAt?: string; // ISO-8601 时间戳
deployerAddress?: string;
metadata?: Record<string, unknown>;
}
ContractType
type ContractType =
| 'erc20'
| 'erc721'
| 'erc1155'
| 'custom'
| 'marketplace'
| 'staking'
| 'governance';
getUserContracts
检索与已认证用户关联的所有合约。
interface GetUserContractsOptions {
chainId?: number; // 按链筛选
type?: ContractType; // 按合约类型筛选
page?: number; // 分页(从 1 开始)
limit?: number; // 每页条数(默认 20,最大 100)
}
const res = await client.getUserContracts({
chainId: 137,
type: 'erc20',
limit: 50,
});
// res.data -> Contract[]
// res.meta -> { page: number; limit: number; total: number }
getContractDetails
获取特定合约的完整详情,包括可用时的 ABI。
const res = await client.getContractDetails(
'0x1234...abcd', // 合约地址
137, // chainId(Polygon)
);
const contract: Contract = res.data;
console.log(contract.name); // "MyToken"
console.log(contract.type); // "erc20"
console.log(contract.abi); // [...] 完整的 ABI 数组
仅提供 API -- 无 React 组件
与钱包和支付模块不同,合约模块不提供预构建的 React 组件。所有操作通过 OneEngineClient 方法执行。如需 React 友好的封装,请在自己的组件中使用 useOneEngine():
import { useOneEngine } from '@one_deploy/sdk';
import { useEffect, useState } from 'react';
import type { Contract } from '@one_deploy/sdk';
function ContractList() {
const { client } = useOneEngine();
const [contracts, setContracts] = useState<Contract[]>([]);
useEffect(() => {
client.getUserContracts().then((res) => setContracts(res.data));
}, [client]);
return (
<ul>
{contracts.map((c) => (
<li key={c.address}>
{c.name} ({c.type}) -- {c.address.slice(0, 10)}...
</li>
))}
</ul>
);
}
提示
如需完整的方法签名和响应结构,请参阅合约与 NFT API 参考。
下一步
- 读取合约 -- 调用 view 函数并读取链上状态。
- 写入合约 -- 发送修改状态的交易。
- 部署合约 -- 从模板部署新合约。
- 合约事件与 Webhook -- 订阅链上事件。