钱包概览
ONE SDK 的钱包模块提供了一个统一接口,用于在多条 EVM 链上创建和管理钱包。根据你的应用需求,可以使用智能钱包(账户抽象)或传统的 EOA 钱包。
智能钱包 vs EOA 钱包
| 功能 | 智能钱包 | EOA 钱包 |
|---|---|---|
| 账户抽象 | 是 (ERC-4337) | 否 |
| Gas 赞助 | 是 | 否 |
| 批量交易 | 是 | 否 |
| 社交恢复 | 是 | 否 |
| 密钥类型 | 基于合约 | 私钥 |
| 部署方式 | 首次交易时部署 | 即时 |
创建钱包
使用 engine client 的 createWallet 方法来创建新钱包。
import { useOneClient } from '@one_deploy/sdk';
function CreateWalletExample() {
const { engineClient } = useOneClient();
const handleCreateSmartWallet = async () => {
const wallet = await engineClient.createWallet(
CHAIN_IDS.BASE, // chainId
'smart' // type: 'smart' | 'eoa'
);
console.log('Wallet address:', wallet.address);
console.log('Wallet type:', wallet.type); // 'smart'
console.log('Chain ID:', wallet.chainId); // 8453
};
const handleCreateEOAWallet = async () => {
const wallet = await engineClient.createWallet(
CHAIN_IDS.ETHEREUM,
'eoa'
);
console.log('EOA address:', wallet.address);
};
return (
<div>
<button onClick={handleCreateSmartWallet}>Create Smart Wallet</button>
<button onClick={handleCreateEOAWallet}>Create EOA Wallet</button>
</div>
);
}
方法签名
createWallet(chainId: number, type: 'smart' | 'eoa'): Promise<Wallet>
参 数:
| 参数 | 类型 | 描述 |
|---|---|---|
chainId | number | 创建钱包的链 ID。使用 CHAIN_IDS 常量。 |
type | 'smart' | 'eoa' | 钱包类型。'smart' 启用账户抽象功能。 |
返回值: Promise<Wallet>
interface Wallet {
address: string;
type: 'smart' | 'eoa';
chainId: number;
createdAt: string;
status: 'active' | 'pending_deployment';
}
多链支持
ONE SDK 开箱即用地支持以下链:
import { CHAIN_IDS } from '@one_deploy/sdk';
// 主网
CHAIN_IDS.BASE; // 8453
CHAIN_IDS.ETHEREUM; // 1
CHAIN_IDS.POLYGON; // 137
CHAIN_IDS.ARBITRUM; // 42161
CHAIN_IDS.OPTIMISM; // 10
// 测试网
CHAIN_IDS.BASE_SEPOLIA; // 84532
CHAIN_IDS.ETHEREUM_SEPOLIA; // 11155111
CHAIN_IDS.POLYGON_AMOY; // 80002
CHAIN_IDS.ARBITRUM_SEPOLIA; // 421614
CHAIN_IDS.OPTIMISM_SEPOLIA; // 11155420
单个钱包地址可在所有支持的链上使用。智能钱包在首次使用时按链部署。
智能钱包与 Gas 赞助
通过 ONE SDK 创建的智能钱包支持通过 paymaster 进行 Gas 赞助。当你的项目启用了 Gas 赞助(在控制面板中配置),用户无需持有原生代币即可发送交易。
import { useOneClient, CHAIN_IDS } from '@one_deploy/sdk';
function GasSponsoredTransaction() {
const { engineClient } = useOneClient();
const handleSend = async () => {
// 当项目设置中启用后,智能钱包的 Gas 会自动赞助
const tx = await engineClient.sendTransaction({
fromAddress: '0xYourSmartWallet...',
toAddress: '0xRecipient...',
chainId: CHAIN_IDS.BASE,
value: '0.01',
currency: 'ETH',
});
console.log('Transaction hash:', tx.transactionHash);
};
return <button onClick={handleSend}>Send (Gasless)</button>;
}
获取用户钱包
检索与已认证用户关联的所有钱包。
import { useOneClient } from '@one_deploy/sdk';
function UserWallets() {
const { engineClient } = useOneClient();
const loadWallets = async () => {
const wallets = await engineClient.getUserWallets();
wallets.forEach((wallet) => {
console.log(`${wallet.type} wallet on chain ${wallet.chainId}: ${wallet.address}`);
});
};
return <button onClick={loadWallets}>Load My Wallets</button>;
}
方法签名
getUserWallets(): Promise<Wallet[]>
返回当前已认证用户在所有链上的 Wallet 对象数组。
CHAIN_IDS 常量
CHAIN_IDS 常量提供了一种类型安全的方式来引用支持的链:
import { CHAIN_IDS } from '@one_deploy/sdk';
type ChainId = typeof CHAIN_IDS[keyof typeof CHAIN_IDS];
// 在类型化函数中使用
function getChainName(chainId: ChainId): string {
switch (chainId) {
case CHAIN_IDS.BASE: return 'Base';
case CHAIN_IDS.ETHEREUM: return 'Ethereum';
case CHAIN_IDS.POLYGON: return 'Polygon';
case CHAIN_IDS.ARBITRUM: return 'Arbitrum';
case CHAIN_IDS.OPTIMISM: return 'Optimism';
default: return 'Unknown';
}
}