@keccak256-evg/passport-sdk
Version:
T-REX Passport SDK for interacting with Passport and Registry contracts
226 lines (191 loc) • 5.95 kB
text/typescript
/**
* 统一 Provider 使用示例
* 展示如何使用 EIP-1193 provider 与不同钱包交互
*/
import {
UnifiedPassportSDK,
EIP1193Provider,
UnifiedPassportSDKConfig
} from '../src';
// T-Rex 测试网配置
const tRexTestnetConfig = {
id: 1962,
name: 'T-Rex Testnet',
rpcUrls: {
default: {
http: ['https://testnetrpc.trex.xyz']
}
},
nativeCurrency: {
name: 'Ether',
symbol: 'ETH',
decimals: 18,
},
blockExplorers: {
default: {
name: 'T-Rex Explorer',
url: 'https://explorer.trex.com'
},
},
};
/**
* 示例 1: 使用 MetaMask
*/
export async function useWithMetaMask() {
// 检查 MetaMask 是否可用
if (typeof window !== 'undefined' && window.ethereum) {
console.log('🦊 检测到 MetaMask');
const sdk = new UnifiedPassportSDK({
provider: window.ethereum,
chain: tRexTestnetConfig,
env: 'dev',
});
try {
// 连接钱包
const accounts = await sdk.connectWallet();
console.log('✅ 连接成功:', accounts[0]);
// 获取 provider 信息
const providerInfo = sdk.getProviderInfo();
console.log('📋 Provider 信息:', providerInfo);
// 切换到正确的网络
await sdk.switchChain();
console.log('🌐 网络切换成功');
// 检查是否有 Passport
const result = await sdk.checkWalletHasPassport(accounts[0] as `0x${string}`);
console.log('🔍 Passport 检查结果:', result);
return sdk;
} catch (error) {
console.error('❌ MetaMask 操作失败:', error);
throw error;
}
} else {
throw new Error('❌ 未检测到 MetaMask');
}
}
/**
* 示例 2: 使用任何兼容的 provider
*/
export async function useWithAnyProvider(provider: EIP1193Provider) {
console.log('🔌 使用自定义 provider');
const sdk = new UnifiedPassportSDK({
provider,
chain: tRexTestnetConfig,
env: 'dev',
});
try {
// 获取账户
const accounts = await sdk.getAccounts();
if (accounts.length === 0) {
// 如果没有连接,请求连接
await sdk.connectWallet();
}
// 创建 Passport
console.log('🆕 正在创建 Passport...');
const createTxHash = await sdk.createPassport();
console.log('✅ Passport 创建交易:', createTxHash);
return sdk;
} catch (error) {
console.error('❌ Provider 操作失败:', error);
throw error;
}
}
/**
* 示例 3: 监听钱包事件
*/
export function setupWalletEventListeners(sdk: UnifiedPassportSDK) {
console.log('👂 设置钱包事件监听器');
// 监听账户变化
sdk.onAccountsChanged((accounts) => {
console.log('👤 账户已更改:', accounts);
if (accounts.length === 0) {
console.log('🔓 钱包已断开连接');
}
});
// 监听网络变化
sdk.onChainChanged((chainId) => {
console.log('🌐 网络已更改:', chainId);
const chainIdNumber = parseInt(chainId, 16);
if (chainIdNumber !== 1962) {
console.warn('⚠️ 当前网络不是 T-Rex 测试网');
}
});
return {
cleanup: () => {
// 移除监听器的示例(实际实现需要保存回调引用)
console.log('🧹 清理事件监听器');
}
};
}
/**
* 示例 4: 完整的 Passport 操作流程
*/
export async function completePassportWorkflow(sdk: UnifiedPassportSDK) {
try {
const accounts = await sdk.getAccounts();
const userAddress = accounts[0];
console.log('🔄 开始完整的 Passport 工作流程');
// 1. 检查是否已有 Passport
const hasPassport = await sdk.checkWalletHasPassport(userAddress as `0x${string}`);
if (!hasPassport.hasPassport) {
// 2. 创建 Passport
console.log('🆕 创建新的 Passport...');
const createTx = await sdk.createPassport();
console.log('✅ Passport 创建交易:', createTx);
// 等待交易确认后再检查
// 注意:实际应用中需要等待交易确认
console.log('⏳ 请等待交易确认后再继续...');
return;
}
// 3. 获取 Passport 详细信息
console.log('📖 获取 Passport 信息...');
const passportInfo = await sdk.getPassportInfo(hasPassport.passportAddress!);
console.log('📋 Passport 信息:', passportInfo);
// 4. 如果需要,可以进行钱包绑定操作
if (passportInfo.walletCount < 2) {
console.log('🔗 当前只有一个钱包,可以绑定更多钱包');
// 这里可以添加绑定其他钱包的逻辑
}
return passportInfo;
} catch (error) {
console.error('❌ Passport 工作流程失败:', error);
throw error;
}
}
/**
* 示例 5: 错误处理和重试机制
*/
export async function robustPassportOperation(sdk: UnifiedPassportSDK) {
const maxRetries = 3;
let retryCount = 0;
while (retryCount < maxRetries) {
try {
const accounts = await sdk.getAccounts();
if (accounts.length === 0) {
throw new Error('没有连接的账户');
}
const result = await sdk.checkWalletHasPassport(accounts[0] as `0x${string}`);
console.log('✅ 操作成功:', result);
return result;
} catch (error: any) {
retryCount++;
console.warn(`⚠️ 尝试 ${retryCount}/${maxRetries} 失败:`, error.message);
if (retryCount >= maxRetries) {
console.error('❌ 所有重试都失败了');
throw error;
}
// 等待一段时间后重试
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
}
// 类型安全的使用示例
export function createTypeSafeSDK(config: UnifiedPassportSDKConfig): UnifiedPassportSDK {
// 验证配置
if (!config.provider) {
throw new Error('Provider 是必需的');
}
if (!config.chain || !config.chain.id) {
throw new Error('链配置是必需的');
}
return new UnifiedPassportSDK(config);
}