@keccak256-evg/passport-sdk
Version:
T-REX Passport SDK for interacting with Passport and Registry contracts
251 lines (191 loc) • 6.07 kB
Markdown
# 🚀 统一 Passport SDK 使用指南
基于 **EIP-1193** 标准的统一 SDK,支持所有主流 Web3 钱包和库!
## ✨ 主要优势
- **🔄 通用兼容**: 支持 MetaMask、WalletConnect、Coinbase Wallet 等所有 EIP-1193 兼容钱包
- **📦 统一API**: 一套 API 适配所有钱包,无需针对不同库编写不同代码
- **⚡ 简单配置**: 只需传入 provider,自动处理底层差异
- **🎯 类型安全**: 完整的 TypeScript 支持
## 🔧 基础使用
### 安装
```bash
npm install @keccak256-evg/passport-sdk
```
### 快速开始
```typescript
import { UnifiedPassportSDK } from '@keccak256-evg/passport-sdk';
// 使用 MetaMask
const sdk = new UnifiedPassportSDK({
provider: window.ethereum, // EIP-1193 provider
chain: {
id: 1962,
name: 'T-Rex Testnet',
rpcUrls: { default: { http: ['https://testnetrpc.trex.xyz'] } }
},
env: 'dev'
});
// 连接钱包并检查 Passport
const accounts = await sdk.connectWallet();
const result = await sdk.checkWalletHasPassport(accounts[0]);
```
## 📱 支持的钱包
| 钱包 | Provider 获取方式 | 状态 |
|------|------------------|------|
| MetaMask | `window.ethereum` | ✅ 完全支持 |
| Coinbase Wallet | `window.coinbaseWalletExtension?.ethereum` | ✅ 完全支持 |
| WalletConnect | `provider` from WC SDK | ✅ 完全支持 |
| Trust Wallet | `window.trustWallet` | ✅ 完全支持 |
| 其他 EIP-1193 钱包 | 按钱包文档获取 | ✅ 理论支持 |
## 🎯 核心功能
### 1. 钱包管理
```typescript
// 连接钱包
const accounts = await sdk.connectWallet();
// 获取账户信息
const accounts = await sdk.getAccounts();
// 切换网络
await sdk.switchChain();
// 获取 provider 信息
const info = sdk.getProviderInfo();
console.log(info.isMetaMask, info.isCoinbaseWallet);
```
### 2. Passport 操作
```typescript
// 创建 Passport
const txHash = await sdk.createPassport();
// 检查钱包是否有 Passport
const result = await sdk.checkWalletHasPassport(userAddress);
// 获取 Passport 详细信息
const info = await sdk.getPassportInfo(passportAddress);
// 绑定钱包
await sdk.requestBindWallet(passportAddress, targetWallet);
await sdk.acceptBindRequest(passportAddress);
// 解绑钱包
await sdk.unbindWallet(passportAddress);
```
### 3. 事件监听
```typescript
// 监听账户变化
sdk.onAccountsChanged((accounts) => {
console.log('账户已更改:', accounts);
});
// 监听网络变化
sdk.onChainChanged((chainId) => {
console.log('网络已更改:', chainId);
});
```
## 🔄 与不同库的兼容性对比
### 传统方式(需要针对每个库单独配置)
```typescript
// Viem 方式
const viemSDK = new ViemPassportSDK({
publicClient: createPublicClient({...}),
walletClient: createWalletClient({...}),
// ...复杂配置
});
// Thirdweb 方式
const thirdwebSDK = new PassportSDK({
client: createThirdwebClient({...}),
chain: defineChain({...}),
// ...不同的配置
});
```
### 统一方式(一套代码适配所有)
```typescript
// 统一方式 - 任何钱包都用同样的代码
const sdk = new UnifiedPassportSDK({
provider: anyEIP1193Provider, // 可以是任何兼容钱包
chain: chainConfig,
env: 'dev'
});
```
## 🛠️ 高级用法
### 错误处理和重试
```typescript
async function robustOperation() {
const maxRetries = 3;
for (let i = 0; i < maxRetries; i++) {
try {
return await sdk.createPassport();
} catch (error) {
if (i === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
}
```
### 类型安全配置
```typescript
import { UnifiedPassportSDKConfig } from '@keccak256-evg/passport-sdk';
function createSDK(config: UnifiedPassportSDKConfig) {
// 配置验证
if (!config.provider.request) {
throw new Error('Provider 必须实现 EIP-1193 标准');
}
return new UnifiedPassportSDK(config);
}
```
### 多钱包支持
```typescript
// 检测并使用可用的钱包
async function detectAndUseWallet() {
let provider;
if (window.ethereum?.isMetaMask) {
provider = window.ethereum;
console.log('使用 MetaMask');
} else if (window.coinbaseWalletExtension) {
provider = window.coinbaseWalletExtension.ethereum;
console.log('使用 Coinbase Wallet');
} else {
throw new Error('未检测到支持的钱包');
}
return new UnifiedPassportSDK({
provider,
chain: chainConfig
});
}
```
## 🔄 迁移指南
### 从 ViemPassportSDK 迁移
```typescript
// 旧方式
const oldSDK = new ViemPassportSDK({
publicClient: createPublicClient({
transport: custom(window.ethereum)
}),
// ...其他配置
});
// 新方式
const newSDK = new UnifiedPassportSDK({
provider: window.ethereum, // 直接使用 provider
chain: chainConfig
});
```
### 从 PassportSDK 迁移
```typescript
// 旧方式
const oldSDK = new PassportSDK({
client: thirdwebClient,
chain: thirdwebChain,
// ...
});
// 新方式
const newSDK = new UnifiedPassportSDK({
provider: window.ethereum, // 使用钱包 provider 而不是库 client
chain: standardChainConfig
});
```
## ❓ 常见问题
### Q: 为什么选择 EIP-1193?
A: EIP-1193 是以太坊钱包的标准接口,所有主流钱包都支持,使用它可以实现最大的兼容性。
### Q: 是否支持服务器端?
A: 统一SDK主要面向浏览器环境。服务器端请继续使用 ViemPassportSDK 配合私钥。
### Q: 如何处理不同钱包的特殊功能?
A: 通过 `getProviderInfo()` 检测钱包类型,然后使用钱包特定的功能。
### Q: 性能如何?
A: 统一SDK底层使用 Viem,性能与直接使用 Viem 基本一致。
## 🔗 相关链接
- [EIP-1193 标准](https://eips.ethereum.org/EIPS/eip-1193)
- [示例代码](./examples/unified-provider-example.ts)
- [完整 API 文档](./README.md)
---
**建议**: 新项目直接使用 `UnifiedPassportSDK`,现有项目可以逐步迁移。这样可以让您的 dApp 支持更多钱包,提供更好的用户体验!