|
| 1 | +import { ApiClient } from './client'; |
| 2 | +import { Trade } from './models'; |
| 3 | + |
| 4 | +export interface BridgeProvider { |
| 5 | + name: string; |
| 6 | + oracle_address: string; |
| 7 | + is_active: boolean; |
| 8 | + fee_bps: number; |
| 9 | + supported_chains: string[]; |
| 10 | + max_trade_amount: string; |
| 11 | + min_trade_amount: string; |
| 12 | +} |
| 13 | + |
| 14 | +export interface CrossChainTrade { |
| 15 | + trade_id: number; |
| 16 | + source_chain: string; |
| 17 | + dest_chain: string; |
| 18 | + source_tx_hash: string; |
| 19 | + bridge_provider: string; |
| 20 | + attestation_id: string; |
| 21 | + attestation_status: 'pending' | 'confirmed' | 'failed' | 'expired'; |
| 22 | + attestation_timestamp: number; |
| 23 | + retry_count: number; |
| 24 | + current_confirmations: number; |
| 25 | + bridge_fee: string; |
| 26 | +} |
| 27 | + |
| 28 | +export interface BridgeAttestation { |
| 29 | + attestation_id: string; |
| 30 | + trade_id: number; |
| 31 | + source_chain: string; |
| 32 | + source_tx_hash: string; |
| 33 | + amount: string; |
| 34 | + recipient: string; |
| 35 | + timestamp: number; |
| 36 | + signature: string; |
| 37 | + provider: string; |
| 38 | +} |
| 39 | + |
| 40 | +export interface BridgeValidation { |
| 41 | + valid: boolean; |
| 42 | + error_code?: number; |
| 43 | + error_message?: string; |
| 44 | + confirmations: number; |
| 45 | +} |
| 46 | + |
| 47 | +export interface ProviderStatus { |
| 48 | + provider: string; |
| 49 | + healthy: boolean; |
| 50 | + latency_ms: number; |
| 51 | + last_check: number; |
| 52 | + error?: string; |
| 53 | +} |
| 54 | + |
| 55 | +/** |
| 56 | + * Bridge API for cross-chain trade operations |
| 57 | + */ |
| 58 | +export class BridgeApi { |
| 59 | + constructor(private client: ApiClient) {} |
| 60 | + |
| 61 | + /** |
| 62 | + * Register a new bridge provider |
| 63 | + */ |
| 64 | + async registerProvider(provider: Partial<BridgeProvider>): Promise<BridgeProvider> { |
| 65 | + return this.client.post('/bridge/providers', provider); |
| 66 | + } |
| 67 | + |
| 68 | + /** |
| 69 | + * Get all registered bridge providers |
| 70 | + */ |
| 71 | + async getProviders(): Promise<BridgeProvider[]> { |
| 72 | + return this.client.get('/bridge/providers'); |
| 73 | + } |
| 74 | + |
| 75 | + /** |
| 76 | + * Get a specific bridge provider |
| 77 | + */ |
| 78 | + async getProvider(name: string): Promise<BridgeProvider> { |
| 79 | + return this.client.get(`/bridge/providers/${name}`); |
| 80 | + } |
| 81 | + |
| 82 | + /** |
| 83 | + * Deactivate a bridge provider |
| 84 | + */ |
| 85 | + async deactivateProvider(name: string): Promise<void> { |
| 86 | + return this.client.delete(`/bridge/providers/${name}`); |
| 87 | + } |
| 88 | + |
| 89 | + /** |
| 90 | + * Create a cross-chain trade |
| 91 | + */ |
| 92 | + async createCrossChainTrade( |
| 93 | + tradeId: number, |
| 94 | + sourceChain: string, |
| 95 | + sourceTxHash: string, |
| 96 | + bridgeProvider: string, |
| 97 | + attestationId: string, |
| 98 | + bridgeFee: string |
| 99 | + ): Promise<CrossChainTrade> { |
| 100 | + return this.client.post('/bridge/trades', { |
| 101 | + trade_id: tradeId, |
| 102 | + source_chain: sourceChain, |
| 103 | + source_tx_hash: sourceTxHash, |
| 104 | + bridge_provider: bridgeProvider, |
| 105 | + attestation_id: attestationId, |
| 106 | + bridge_fee: bridgeFee, |
| 107 | + }); |
| 108 | + } |
| 109 | + |
| 110 | + /** |
| 111 | + * Get cross-chain trade info |
| 112 | + */ |
| 113 | + async getCrossChainTrade(tradeId: number): Promise<CrossChainTrade> { |
| 114 | + return this.client.get(`/bridge/trades/${tradeId}`); |
| 115 | + } |
| 116 | + |
| 117 | + /** |
| 118 | + * Submit bridge attestation |
| 119 | + */ |
| 120 | + async submitAttestation(attestation: BridgeAttestation): Promise<BridgeValidation> { |
| 121 | + return this.client.post('/bridge/attestations', attestation); |
| 122 | + } |
| 123 | + |
| 124 | + /** |
| 125 | + * Get attestation status |
| 126 | + */ |
| 127 | + async getAttestationStatus(attestationId: string): Promise<BridgeValidation> { |
| 128 | + return this.client.get(`/bridge/attestations/${attestationId}`); |
| 129 | + } |
| 130 | + |
| 131 | + /** |
| 132 | + * Retry failed attestation |
| 133 | + */ |
| 134 | + async retryAttestation(tradeId: number): Promise<void> { |
| 135 | + return this.client.post(`/bridge/trades/${tradeId}/retry`, {}); |
| 136 | + } |
| 137 | + |
| 138 | + /** |
| 139 | + * Rollback failed cross-chain trade |
| 140 | + */ |
| 141 | + async rollbackTrade(tradeId: number, reason: string): Promise<CrossChainTrade> { |
| 142 | + return this.client.post(`/bridge/trades/${tradeId}/rollback`, { reason }); |
| 143 | + } |
| 144 | + |
| 145 | + /** |
| 146 | + * Get bridge provider health status |
| 147 | + */ |
| 148 | + async getProviderStatus(provider: string): Promise<ProviderStatus> { |
| 149 | + return this.client.get(`/bridge/providers/${provider}/status`); |
| 150 | + } |
| 151 | + |
| 152 | + /** |
| 153 | + * Get all provider statuses |
| 154 | + */ |
| 155 | + async getAllProviderStatuses(): Promise<ProviderStatus[]> { |
| 156 | + return this.client.get('/bridge/providers/status/all'); |
| 157 | + } |
| 158 | + |
| 159 | + /** |
| 160 | + * Pause bridge operations |
| 161 | + */ |
| 162 | + async pauseBridge(): Promise<void> { |
| 163 | + return this.client.post('/bridge/pause', {}); |
| 164 | + } |
| 165 | + |
| 166 | + /** |
| 167 | + * Resume bridge operations |
| 168 | + */ |
| 169 | + async resumeBridge(): Promise<void> { |
| 170 | + return this.client.post('/bridge/resume', {}); |
| 171 | + } |
| 172 | + |
| 173 | + /** |
| 174 | + * Get bridge operational status |
| 175 | + */ |
| 176 | + async getBridgeStatus(): Promise<{ paused: boolean; providers_active: number }> { |
| 177 | + return this.client.get('/bridge/status'); |
| 178 | + } |
| 179 | + |
| 180 | + /** |
| 181 | + * Query cross-chain trades with filters |
| 182 | + */ |
| 183 | + async queryCrossChainTrades(filters: { |
| 184 | + source_chain?: string; |
| 185 | + bridge_provider?: string; |
| 186 | + attestation_status?: string; |
| 187 | + limit?: number; |
| 188 | + offset?: number; |
| 189 | + }): Promise<{ items: CrossChainTrade[]; total: number; has_more: boolean }> { |
| 190 | + const params = new URLSearchParams(); |
| 191 | + if (filters.source_chain) params.append('source_chain', filters.source_chain); |
| 192 | + if (filters.bridge_provider) params.append('bridge_provider', filters.bridge_provider); |
| 193 | + if (filters.attestation_status) params.append('attestation_status', filters.attestation_status); |
| 194 | + if (filters.limit) params.append('limit', filters.limit.toString()); |
| 195 | + if (filters.offset) params.append('offset', filters.offset.toString()); |
| 196 | + |
| 197 | + return this.client.get(`/bridge/trades?${params}`); |
| 198 | + } |
| 199 | + |
| 200 | + /** |
| 201 | + * Get bridge statistics |
| 202 | + */ |
| 203 | + async getBridgeStats(): Promise<{ |
| 204 | + total_cross_chain_trades: number; |
| 205 | + successful_attestations: number; |
| 206 | + failed_attestations: number; |
| 207 | + total_bridge_volume: string; |
| 208 | + average_confirmation_time_secs: number; |
| 209 | + }> { |
| 210 | + return this.client.get('/bridge/stats'); |
| 211 | + } |
| 212 | +} |
0 commit comments