@keccak256-evg/passport-sdk
Version:
T-REX Passport SDK for interacting with Passport and Registry contracts
237 lines (203 loc) • 7.06 kB
text/typescript
import { createPublicClient, createWalletClient, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import {
ViemPassportSDK,
createViemPassportSDK,
Environment,
tRexTestnet
} from '../src';
// 方式1: 使用便利函数创建SDK(推荐)
const easySDK = createViemPassportSDK({
rpcUrl: 'https://testnetrpc.trex.xyz',
env: Environment.DEV,
// 如果有私钥,可以这样添加账户
// account: privateKeyToAccount('0xYOUR_PRIVATE_KEY'),
});
// 方式2: 手动创建客户端(更灵活)
async function createManualSDK() {
// 创建 Public Client
const publicClient = createPublicClient({
chain: tRexTestnet,
transport: http('https://testnetrpc.trex.xyz'),
});
// 创建 Wallet Client(如果需要发送交易)
const account = privateKeyToAccount('0xYOUR_PRIVATE_KEY'); // 实际使用时替换为真实私钥
const walletClient = createWalletClient({
account,
chain: tRexTestnet,
transport: http('https://testnetrpc.trex.xyz'),
});
// 创建 SDK 实例
const sdk = new ViemPassportSDK({
publicClient,
walletClient,
network: tRexTestnet,
env: Environment.DEV,
});
return sdk;
}
// 使用示例
async function viemSDKExample() {
const walletAddress = '0x...'; // 用户钱包地址
try {
// 1. 检查钱包是否有 Passport
console.log('检查钱包是否有 Passport...');
const hasPassport = await easySDK.checkWalletHasPassport(walletAddress);
if (hasPassport.hasPassport) {
console.log('找到 Passport!');
console.log('Passport ID:', hasPassport.passportId);
console.log('Passport 地址:', hasPassport.passportAddress);
// 2. 获取 Passport 详细信息
const passportInfo = await easySDK.getPassportInfo(hasPassport.passportAddress!);
console.log('绑定的钱包:', passportInfo.boundWallets);
console.log('钱包数量:', passportInfo.walletCount);
// 3. 获取待处理绑定钱包列表
const pendingWallets = await easySDK.getPendingBindWallets(
hasPassport.passportAddress!,
walletAddress
);
console.log('待处理绑定钱包:', pendingWallets);
// 4. 查询待处理绑定请求
const pendingRequest = await easySDK.getPendingBindRequest(
hasPassport.passportAddress!,
walletAddress
);
if (pendingRequest.exists) {
console.log('发现待处理请求,来自:', pendingRequest.requester);
}
} else {
console.log('该钱包没有 Passport');
// 5. 预测 Passport 地址
const predictedAddress = await easySDK.predictPassportAddress(walletAddress);
console.log('预测的 Passport 地址:', predictedAddress);
}
} catch (error) {
console.error('错误:', error);
}
}
// 交易示例(需要用户签名)
async function viemTransactionExample() {
const walletAddress = '0x...'; // 用户钱包地址
const passportAddress = '0x...'; // Passport 地址
// 需要有wallet client才能发送交易
const sdkWithWallet = await createManualSDK();
try {
// 1. 创建 Passport
console.log('创建 Passport...');
const createTxHash = await sdkWithWallet.createPassport();
console.log('创建交易哈希:', createTxHash);
// 2. 请求绑定钱包
console.log('请求绑定钱包...');
const bindTxHash = await sdkWithWallet.requestBindWallet(passportAddress, walletAddress);
console.log('绑定请求交易哈希:', bindTxHash);
// 3. 解绑钱包
console.log('解绑钱包...');
const unbindTxHash = await sdkWithWallet.unbindWallet(passportAddress);
console.log('解绑交易哈希:', unbindTxHash);
// 4. 接受绑定请求
console.log('接受绑定请求...');
const acceptTxHash = await sdkWithWallet.acceptBindRequest(passportAddress);
console.log('接受请求交易哈希:', acceptTxHash);
// 5. 拒绝绑定请求
console.log('拒绝绑定请求...');
const rejectTxHash = await sdkWithWallet.rejectBindRequest(passportAddress);
console.log('拒绝请求交易哈希:', rejectTxHash);
// 6. 取消绑定请求
console.log('取消绑定请求...');
const cancelTxHash = await sdkWithWallet.cancelBindRequest(passportAddress, walletAddress);
console.log('取消请求交易哈希:', cancelTxHash);
} catch (error) {
console.error('错误:', error);
}
}
// 连接钱包示例
async function connectWalletExample() {
try {
// 检查是否有 MetaMask 或其他钱包
if (typeof window.ethereum !== 'undefined') {
// 请求用户连接钱包
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts'
});
// 创建 wallet client
const walletClient = createWalletClient({
chain: tRexTestnet,
transport: window.ethereum,
});
// 动态设置 wallet client
easySDK.setWalletClient(walletClient);
console.log('钱包已连接:', accounts[0]);
return accounts[0];
} else {
throw new Error('请安装 MetaMask 或其他以太坊钱包');
}
} catch (error) {
console.error('连接钱包失败:', error);
throw error;
}
}
// 批量操作示例
async function batchOperationsExample(customerId: string) {
try {
// 并行获取多个信息
const walletAddress = '0x...';
const [
hasPassport,
implementation,
counter,
isAbolished
] = await Promise.all([
easySDK.checkWalletHasPassport(walletAddress),
easySDK.getPassportImplementation(),
easySDK.getPassportIdCounter(),
easySDK.isWalletAbolished(walletAddress)
]);
console.log('批量查询结果:');
console.log('- 是否有 Passport:', hasPassport.hasPassport);
console.log('- 实现地址:', implementation);
console.log('- ID 计数器:', counter);
console.log('- 是否被废除:', isAbolished);
return {
hasPassport,
implementation,
counter,
isAbolished
};
} catch (error) {
console.error('批量操作失败:', error);
throw error;
}
}
// 错误处理示例
async function errorHandlingExample() {
try {
const result = await easySDK.checkWalletHasPassport('invalid-address');
} catch (error) {
if (error instanceof Error) {
switch (error.message) {
case 'Invalid address format':
console.log('地址格式无效');
break;
case 'Network not supported':
console.log('不支持的网络');
break;
case 'RPC error':
console.log('RPC 连接错误');
break;
default:
console.error('未知错误:', error.message);
}
}
}
}
// 运行示例
// viemSDKExample();
// viemTransactionExample();
// connectWalletExample();
export {
viemSDKExample,
viemTransactionExample,
connectWalletExample,
batchOperationsExample,
errorHandlingExample
};