Inside GMX v2: Building a Decentralized Perpetual Futures Exchange
Developing a decentralized perpetual futures exchange (Perpetual swap) by the GMX model is a task we encounter regularly. With over a decade in blockchain, 20+ successful DeFi projects, and half a decade on the market, we've seen it all. In one project, traders exploited oracle delay for risk-free profit — we had to redesign the execution mechanism. GMX v2 is a protocol with a peak daily volume of over $1B and TVL exceeding $400M. Key metrics: orders execute 5x faster compared to v1, slashing arbitrage opportunities by 80%. The architecture: traders trade with leverage against a liquidity pool (GM-pools), liquidity providers earn fees and bear directional risk. Oracle: Chainlink Low Latency Feeds updating every few seconds, and keeper bots for order execution. If you are considering perpetual DEX development, this article explains the architecture. Below is what happens under the hood.
How is the GM model liquidity pool structured?
GM tokens and pool composition
In GMX v2, each market has its own GM-pool: for example, the ETH/USDC market contains ETH (long collateral) and USDC (short collateral). The GM token represents a share in that pool. The GM token price = (total assets in pool - total pending PnL of traders) / total GM supply. When traders are collectively profitable, the GM token price drops (the pool must pay out). When traders lose, GM rises. LPs and traders are in a zero-sum game.
function getGMTokenPrice(address market) external view returns (uint256) {
MarketProps memory marketData = getMarketData(market);
int256 poolValue = getPoolValue(market); // assets at current prices
int256 pendingPnL = getTotalPendingPnL(market); // unrealized PnL of traders
uint256 netValue = uint256(poolValue - pendingPnL);
return netValue * 1e18 / IERC20(market).totalSupply();
}
Impact fees and depth factor
One of the smart mechanics in GMX v2 is the price impact for opening positions. If a trader opens a large long that creates an imbalance (longs > shorts), they pay an additional impact fee, which can be up to 5% for extreme positions. A trader who balances the imbalance (opens a short in a long-heavy pool) receives a rebate. This emulates order book depth without a real order book. The depth factor is a pool parameter governed by governance that determines how aggressively impact grows with position size.
Smart contract architecture
Modular contract system of GMX v2
GMX v2 is split into several layers: Router — entry point for users; OrderVault — temporary collateral storage; ExchangeRouter — order execution via keeper bots; DataStore — unified data storage via bytes32 keys; EventEmitter — a separate contract only for events. This architecture ensures upgradeability: Handler contracts can be replaced without changing the DataStore. This is critical for a protocol that will evolve after deployment.
How does the keeper infrastructure work?
Orders in GMX v2 are not executed synchronously. A user creates an order (market/limit/stop-loss) → it is stored in the contract → keeper bots monitor orders → when conditions are met, the keeper calls executeOrder(). Why this is necessary: to prevent the user from choosing the execution timestamp (frontrunning by picking the execution moment). The keeper receives the current Chainlink Low Latency price at execution time — this is fairer for both sides. The keeper receives an execution fee (prepaid by the user) for each successful execution, typically $0.50–$2.00 per order. If unsuccessful, the fee is returned to the user.
// Keeper logic (simplified)
async function processOrders() {
const pendingOrders = await exchangeRouter.getPendingOrders()
for (const order of pendingOrders) {
const priceUpdate = await getPythPriceUpdate(order.indexToken)
try {
await exchangeRouter.executeOrder(order.key, {
priceFeedTokens: [order.indexToken],
priceFeedData: [priceUpdate],
})
} catch (err) {
if (err.message.includes('PRICE_NOT_MET')) continue // limit not reached
logError(order.key, err)
}
}
}
Funding fees and borrowing fees
GMX v2 has two types of continuous fees for position holders: Borrowing fee — a fee for using pool liquidity. Calculated as (openInterest / poolLiquidity) * borrowingFactor * time. At high utilization, it can reach 0.1% per hour. Funding fee — a balancing mechanism between long and short. The side with the larger open interest pays the other side. It accumulates through a cumulative index similar to Aave's interest index. When a position is partially closed, accumulated fees must be calculated correctly. An error here leads to direct loss or profit for traders at the expense of the pool.
Example of funding rate calculation
Formula: fundingRate = (openInterest * fundingFactor) / poolLiquidity. In practice, values can vary: funding factor 0.0001 per second at 100% utilization, max open interest depends on pool.
Why use Chainlink Low Latency and Pyth?
GMX v1 used standard Chainlink feeds (update every few minutes or at >0.5% deviation). This created arbitrage: the price on CEX moved, Chainlink hadn't updated yet — open a position at the old price, close it at the new one. GMX v2 migrated to Chainlink Low Latency Feeds — updates every few seconds via off-chain signed price attestation. The keeper includes the signed price directly in the execution transaction. Pyth Network is an alternative push-oracle system with similar speed. Integrating both as primary/fallback is the standard for production protocols.
Pool parameters and governance
Each market is managed through DAO parameters:
| Parameter | Typical values | Description |
|---|---|---|
| Max open interest | depends on pool | Limit on total positions per side |
| Max PnL factor | 0.5 (50% of pool) | Maximum unrealized profit of traders |
| Borrowing factor | 0.0001 per second at 100% utilization | Borrowing fee accrual rate |
| Funding factor | Varies | Flow rate from long to short |
| Position impact factor | Varies | Aggressiveness of price impact |
Incorrect parameter calibration is a direct attack vector. Oracle manipulation + high max PnL factor = possibility of draining the pool through artificially profitable positions.
Version comparison: GMX v2 vs v1 — oracle speed
| Feature | GMX v1 | GMX v2 |
|---|---|---|
| Oracles | Chainlink standard | Chainlink Low Latency + Pyth |
| Update frequency | ~ minutes | ~ seconds |
| Execution latency | High | Low — arbitrage eliminated |
GMX v2 processes orders 5x faster thanks to Low Latency Feeds.
Deliverables: What is included in perpetual DEX development?
Our turnkey perpetual DEX development includes:
- Math specification (1–2 weeks). All formulas: borrowing rate, funding rate, price impact, GM token pricing, liquidation price — formally verified before a single line of code.
- Core contracts (6–10 weeks). DataStore, EventEmitter, OrderVault, ExchangeRouter, position accounting. Foundry tests with 90%+ coverage, Echidna invariant testing.
- Keeper infrastructure (2–3 weeks). TypeScript bots, monitoring, fallback on RPC downtime.
- Frontend integration (2–4 weeks). wagmi/viem hooks for pool data, order building, The Graph subgraph for history.
- Audit (4–6 weeks). Perpetual DEX is a complex protocol. The audit must cover both smart contracts and economic mechanics (economic exploit simulation).
- Documentation and team training (1–2 weeks). Detailed technical docs, API guides, access to source code, and training sessions for your developers.
- Post-deployment support (3 months). Monitoring, alerts, and hotfixes.
Development process
- Analytics and specification: formalize math, choose stack, design architecture.
- Smart contract development: write code using Foundry, write invariant tests.
- Oracle and keeper infrastructure integration: set up Chainlink Low Latency, Pyth, develop bots.
- Frontend integration: connect via wagmi, create interface for trading and pool management.
- Testing and audit: internal QA, external audit of smart contracts and economic models.
- Deployment and monitoring: deploy on mainnet, set up monitoring and alerts.
Timeline and cost estimates
An MVP perpetual DEX with one market (ETH) and keeper infrastructure — 2–3 months, typically $50,000–$100,000. A full platform with multiple markets, governance, GM tokenomics, and frontend — from 5–6 months, typically $150,000–$300,000. Savings of up to 30% compared to building from scratch due to reusable components. The cost is calculated after a technical specification. Contact us for a preliminary estimate. Order a turnkey perpetual DEX development — get a consultation. We guarantee transparent pricing and fixed deadlines. 10+ years in blockchain, 20+ successful DeFi projects, 5+ years on the market — your project is in safe hands.







