External API Proxy
Purpose
The External API Proxy addresses the need to securely and efficiently access market data and trading-related information from third-party services such as CoinGecko, Zerion, and 0x. Instead of clients calling these external APIs directly, which may involve rate limits, authentication complexities, and cross-origin restrictions, this proxy centralizes and simplifies access. It also enables consistent caching and response handling within the project’s ecosystem, improving performance and reliability.
Functionality
The proxy exposes internal REST endpoints that mirror the external APIs’ structures. When a client requests data through these endpoints, the proxy:
Receives the internal API request matching a specific external service (CoinGecko, Zerion, or 0x).
Checks an in-memory cache keyed by the request URL to determine if a recent response is available, reducing redundant external calls.
For cache misses, forwards the request to the corresponding external API, attaching required authentication headers (API keys).
Caches the successful response for a configurable time-to-live (TTL), typically one minute, to serve subsequent identical requests quickly.
Returns the response data and headers to the client, transparently relaying status codes and error messages.
Handles errors gracefully, mapping external API errors or internal failures to appropriate HTTP responses.
Each external API proxy implementation encapsulates these behaviors in a dedicated handler class, managing its own axios HTTP client and cache.
Integration with Parent Topic and Other Subtopics
As a subtopic under the parent Proxy API Service, the External API Proxy complements the **Address Validation** subtopic by extending proxy functionality beyond address checks to general market and trading data. Together, these subtopics provide a unified proxy interface that abstracts away multiple external dependencies.
This proxy service integrates seamlessly with the broader API layer by exposing standardized internal endpoints. It supports the Unified API Layer’s goal to provide consistent and developer-friendly blockchain-related data access. Additionally, caching mechanisms here reduce load on both external services and internal infrastructure, contributing to overall system scalability and responsiveness.
Unlike the Address Validation subtopic, which focuses on security and risk screening, the External API Proxy centers on data aggregation and performance optimization. Its distinct responsibility enhances the modularity and maintainability of the proxy service.
Key Code Snippets Illustrating Core Behavior
Caching and Request Forwarding Pattern
const cachedResponse = this.requestCache[req.url]
if (cachedResponse) {
// Serve cached data with original headers
Object.entries(cachedResponse.headers).forEach(([k, v]) => res.set(k, v))
res.set('X-Cache', 'HIT').status(cachedResponse.status).send(cachedResponse.data)
return
}
res.set('X-Cache', 'MISS')
try {
const response = await this.axiosInstance.get(`${BASE_URL}${url}`)
this.requestCache[req.url] = response
Object.entries(response.headers).forEach(([k, v]) => res.set(k, v))
res.status(response.status).send(response.data)
} catch (err) {
// Error handling omitted for brevity
}
This pattern is employed in both the CoinGecko and Zerion proxy classes to reduce redundant external API calls by caching responses keyed by request URLs.
Dynamic Endpoint Resolution for 0x API Proxy
const url = (() => {
if (path.includes('v1')) {
// Determine base URL by chain parameter
switch (chain) {
case 'ethereum':
return 'https://api.0x.org/' + parts.join('/') + parsedUrl.search
// Other chains omitted for brevity
}
} else {
return 'https://api.0x.org/' + path + parsedUrl.search
}
})()
This logic enables routing requests to the appropriate 0x subdomain based on blockchain network, supporting multi-chain API access through a single proxy.
Process Flow Diagram
flowchart TD
Client[Client Request to Proxy] -->|Request URL| ProxyServer[External API Proxy Handler]
ProxyServer -->|Check Cache| Cache{Cache Hit?}
Cache -->|Yes| ServeCached[Serve Cached Response]
Cache -->|No| FetchExternal[Fetch from External API]
FetchExternal -->|Success| CacheStore[Store Response in Cache]
CacheStore --> ServeResponse[Send Response to Client]
FetchExternal -->|Error| HandleError[Send Error Response]
ServeCached --> ServeResponse
This flowchart illustrates the proxy's core behavior of checking cache before forwarding requests to external APIs and handling responses accordingly.
By abstracting and caching external market data APIs, the External API Proxy enhances client experience with faster, reliable data delivery and centralized management of third-party integrations. Its modular implementation aligns with the project’s goals of scalable, maintainable multi-blockchain infrastructure.