Files
assetx/webapp/lib/api/lending.ts
default 2ee4553b71 init: 初始化 AssetX 项目仓库
包含 webapp(Next.js 用户端)、webapp-back(Go 后端)、
antdesign(管理后台)、landingpage(营销落地页)、
数据库 SQL 和配置文件。
2026-03-27 11:26:43 +00:00

202 lines
5.7 KiB
TypeScript

// Lending API Client
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8080/api';
export interface CollateralInfo {
tokenSymbol: string;
balance: string;
balanceUsd: number;
collateralValue: number;
}
export interface LendingPosition {
userAddress: string;
walletAddress: string;
suppliedBalance: string;
suppliedBalanceUsd: number;
borrowedBalance: string;
borrowedBalanceUsd: number;
collateralBalances: Record<string, CollateralInfo>;
healthFactor: number;
ltv: number;
supplyAPY: number;
borrowAPY: number;
}
export interface LendingStats {
totalSuppliedUsd: number;
totalBorrowedUsd: number;
totalCollateralUsd: number;
utilizationRate: number;
avgSupplyAPY: number;
avgBorrowAPY: number;
totalUsers: number;
activeBorrowers: number;
totalTVL: number;
}
export interface LendingMarket {
id: number;
market_name: string;
contract_address: string;
chain_id: number;
collateral_asset: string;
borrow_collateral_factor: number;
liquidate_collateral_factor: number;
liquidation_penalty: number;
supply_cap: number;
base_supply_apy: number;
base_borrow_apy: number;
is_active: boolean;
}
export interface LendingAPYPoint {
time: string;
supply_apy: number;
borrow_apy: number;
}
export interface LendingAPYHistory {
history: LendingAPYPoint[];
current_supply_apy: number;
current_borrow_apy: number;
apy_change: number;
period: string;
}
export async function fetchLendingAPYHistory(
period: '1W' | '1M' | '1Y' = '1W',
chainId?: number
): Promise<LendingAPYHistory | null> {
try {
const params = new URLSearchParams({ period });
if (chainId) params.append('chain_id', chainId.toString());
const response = await fetch(`${API_BASE_URL}/lending/apy-history?${params}`, {
cache: 'no-store',
});
if (!response.ok) return null;
const data = await response.json();
if (!data.success) return null;
return data.data;
} catch (error: unknown) {
console.error('Error fetching lending APY history:', error);
return null;
}
}
export async function fetchLendingPosition(address: string): Promise<LendingPosition | null> {
try {
const response = await fetch(`${API_BASE_URL}/lending/position/${address}`, {
cache: 'no-store',
});
if (!response.ok) return null;
const data = await response.json();
if (!data.success) return null;
return data.data;
} catch (error: unknown) {
console.error('Error fetching lending position:', error);
return null;
}
}
export async function fetchLendingStats(): Promise<LendingStats | null> {
try {
const response = await fetch(`${API_BASE_URL}/lending/stats`, {
cache: 'no-store',
});
if (!response.ok) return null;
const data = await response.json();
if (!data.success) return null;
return data.data;
} catch (error: unknown) {
console.error('Error fetching lending stats:', error);
return null;
}
}
export async function fetchLendingMarkets(): Promise<LendingMarket[]> {
try {
const response = await fetch(`${API_BASE_URL}/lending/markets`, {
cache: 'no-store',
});
if (!response.ok) return [];
const data = await response.json();
if (!data.success) return [];
return data.data;
} catch (error: unknown) {
console.error('Error fetching lending markets:', error);
return [];
}
}
export async function notifySupplyCollateral(asset: string, amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/supply-collateral`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ asset, amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying supply collateral:', error);
}
}
export async function notifyWithdrawCollateral(asset: string, amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/withdraw-collateral`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ asset, amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying withdraw collateral:', error);
}
}
export async function notifyLendingBorrow(amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/borrow`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying lending borrow:', error);
}
}
export async function notifyLendingRepay(amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/repay`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying lending repay:', error);
}
}
export async function notifyLendingSupply(amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/supply`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying lending supply:', error);
}
}
export async function notifyLendingWithdraw(amount: string, txHash?: string): Promise<void> {
try {
await fetch(`${API_BASE_URL}/lending/withdraw`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ amount, tx_hash: txHash }),
});
} catch (error: unknown) {
console.error('Error notifying lending withdraw:', error);
}
}