@keccak256-evg/passport-sdk
Version:
T-REX Passport SDK for interacting with Passport and Registry contracts
191 lines (155 loc) • 5.48 kB
Markdown
# Passport 升级功能实现
## 概述
在 Passport Information 信息框的右上角添加了自动升级检测和升级功能,确保用户的 Passport 始终使用最新版本的合约实现。
## 功能特性
### 1. 自动升级检测
- 当用户连接钱包并查询 Passport 信息时,自动调用 `requireUpgrade()` 方法
- 检查当前 Passport 的实现版本是否与 Registry 中的最新版本一致
- 实时显示升级状态
### 2. 升级状态显示
- **需要升级**: 显示橙色的 "🔄 Upgrade" 按钮
- **最新版本**: 显示绿色的 "✓ Latest Version" 标签
- **升级中**: 显示 "Upgrading..." 状态
### 3. 一键升级
- 用户点击升级按钮后,调用 Registry 合约的 `upgradeMyPassport()` 方法
- 自动处理交易确认和状态更新
- 升级成功后自动刷新 Passport 信息
## 技术实现
### SDK 新增方法
#### 1. `checkPassportUpgrade(passportAddress: string): Promise<boolean>`
```typescript
// 检查 Passport 是否需要升级
const needsUpgrade = await passportSDK.checkPassportUpgrade(passportAddress);
```
**实现细节**:
- 调用 Passport 合约的 `requireUpgrade()` 方法
- 比较当前实现版本与 Registry 中的最新版本
- 返回 `true` 表示需要升级,`false` 表示已是最新版本
#### 2. `upgradeMyPassport(): Promise<any>`
```typescript
// 升级用户的 Passport
const transaction = await passportSDK.upgradeMyPassport();
const result = await sendTransaction(transaction);
```
**实现细节**:
- 调用 Registry 合约的 `upgradeMyPassport()` 方法
- 该方法会自动升级调用者的 Passport 到最新版本
- 返回准备好的交易对象,需要用户签名确认
### ABI 更新
在 `constants.ts` 中添加了新的方法定义:
#### Passport ABI 新增
```json
{
"inputs": [],
"name": "requireUpgrade",
"outputs": [{"type": "bool"}],
"stateMutability": "view",
"type": "function"
}
```
#### Registry ABI 新增
```json
{
"inputs": [],
"name": "upgradeMyPassport",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
```
### UI 实现
#### 状态管理
```typescript
const [upgrading, setUpgrading] = useState(false);
const [needsUpgrade, setNeedsUpgrade] = useState(false);
```
#### 自动检测逻辑
```typescript
// 在 checkPassportInfo 中添加升级检测
if (hasPassport.hasPassport && hasPassport.passportAddress) {
const info = await passportSDK.getPassportInfo(hasPassport.passportAddress);
setPassportInfo({
...hasPassport,
...info,
});
// 检查是否需要升级
try {
const upgradeNeeded = await passportSDK.checkPassportUpgrade(hasPassport.passportAddress);
setNeedsUpgrade(upgradeNeeded);
} catch (error) {
console.error("Error checking upgrade status:", error);
setNeedsUpgrade(false);
}
}
```
#### 升级按钮实现
```typescript
{passportInfo && (
<div className="flex items-center space-x-2">
{needsUpgrade ? (
<button
onClick={handleUpgradePassport}
disabled={upgrading || isTransactionPending}
className={`px-3 py-1 rounded-md text-sm font-medium ${
upgrading || isTransactionPending
? 'bg-zinc-700 text-zinc-400 cursor-not-allowed'
: 'bg-orange-600 hover:bg-orange-700 text-white'
}`}
>
{upgrading || isTransactionPending ? 'Upgrading...' : '🔄 Upgrade'}
</button>
) : (
<span className="px-3 py-1 rounded-md text-sm font-medium bg-green-600 text-white">
✓ Latest Version
</span>
)}
</div>
)}
```
## 用户体验
### 1. 自动检测
- 用户连接钱包后,系统自动检查 Passport 版本
- 无需手动操作,状态实时更新
### 2. 清晰的状态指示
- **橙色升级按钮**: 明确提示用户需要升级
- **绿色最新版本标签**: 确认用户已使用最新版本
- **升级中状态**: 防止重复操作
### 3. 一键升级
- 点击升级按钮即可完成升级
- 自动处理交易确认和状态更新
- 升级成功后自动刷新信息
### 4. 错误处理
- 升级失败时显示具体错误信息
- 网络问题或合约错误都有相应提示
## 合约方法说明
### Passport.requireUpgrade()
```solidity
function requireUpgrade() external view returns (bool) {
address currentImpl = implementation();
address registryImpl = PassportRegistry(registry()).getPassportImplementation();
return currentImpl != registryImpl;
}
```
**功能**: 检查当前 Passport 的实现版本是否与 Registry 中的最新版本一致
### Registry.upgradeMyPassport()
```solidity
function upgradeMyPassport() external {
// 验证调用者是否绑定到 Passport
// 获取当前实现版本
// 升级到最新版本
// 发出升级事件
}
```
**功能**: 将调用者的 Passport 升级到最新实现版本
## 安全考虑
1. **权限验证**: 只有绑定到 Passport 的钱包才能升级
2. **版本检查**: 避免重复升级到相同版本
3. **交易确认**: 用户必须签名确认升级交易
4. **错误处理**: 完善的错误处理和用户提示
## 总结
升级功能的实现确保了:
- **自动化**: 无需用户手动检查版本
- **安全性**: 严格的权限验证和交易确认
- **用户体验**: 清晰的状态指示和简单的操作流程
- **可靠性**: 完善的错误处理和状态管理
这个功能让用户能够轻松保持 Passport 合约的最新版本,享受最新的功能和安全性改进。