UNPKG

@keccak256-evg/passport-sdk

Version:

T-REX Passport SDK for interacting with Passport and Registry contracts

226 lines (191 loc) 5.95 kB
/** * 统一 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); }