pump.fun решила конкретную инфраструктурную проблему: запуск токена на Solana занимал часы и требовал технических знаний. Мы реализовали подобную систему для EVM-сетей, включая Base и Arbitrum, с bonding curve, автоматической миграцией в DEX и фабрикой контрактов. Платформа делает запуск токена за 30 секунд — дешевле в 10 раз по сравнению с традиционными методами. Ежедневно через аналогичные платформы проходят десятки миллионов долларов. Мы предлагаем разработку под ключ: от проектирования до деплоя и индексации. Оценим ваш проект в течение недели. Свяжитесь для консультации. Наш опыт — 5+ лет в DeFi, более 20 успешных запусков. Гарантируем безопасность с помощью аудита и формальной верификации.
Как работает bonding curve?
Bonding curve — математическая функция, определяющая цену токена в зависимости от текущего supply. Нет orderbook, нет LP, нет внешней цены — контракт сам определяет обменный курс.
Типы кривых — разработка платформы в
Линейная кривая: Price = initial_price + slope * supply. Простая, предсказуемая, но рост цены пропорционален объёму покупок — whale может быстро вытолкнуть цену.
Экспоненциальная кривая: Price = initial_price * e^(k * supply). Резкий рост при высоком supply, ранние покупатели получают значительное преимущество.
pump.fun использует polynomial bonding curve — реализация с virtual reserves, имитирующая поведение Uniswap AMM без реального liquidity:
virtual_sol_reserves = 30 SOL
virtual_token_reserves = 1_073_000_000 tokens
real_sol_reserves = 0
real_token_reserves = 793_100_000 tokens
Цена определяется через constant product: k = virtual_sol * virtual_token_supply. При покупке dx SOL: new_virtual_sol = virtual_sol + dx; new_virtual_token = k / new_virtual_sol; tokens_received = virtual_token - new_virtual_token. Это точная копия механики Uniswap V2, но с виртуальными резервами.
Реализация на EVM
contract BondingCurve {
uint256 public constant VIRTUAL_SOL_RESERVES = 30 ether;
uint256 public constant VIRTUAL_TOKEN_RESERVES = 1_073_000_000e18;
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
uint256 public constant MIGRATION_THRESHOLD = 69_000 * 1e18;
uint256 public realEthReserves;
uint256 public tokensSold;
function getTokensOut(uint256 ethIn) public view returns (uint256) {
uint256 virtualEth = VIRTUAL_SOL_RESERVES + realEthReserves;
uint256 virtualTokens = VIRTUAL_TOKEN_RESERVES - tokensSold;
uint256 k = virtualEth * virtualTokens;
uint256 newVirtualEth = virtualEth + ethIn;
uint256 newVirtualTokens = k / newVirtualEth;
return virtualTokens - newVirtualTokens;
}
function getEthOut(uint256 tokensIn) public view returns (uint256) {
uint256 virtualEth = VIRTUAL_SOL_RESERVES + realEthReserves;
uint256 virtualTokens = VIRTUAL_TOKEN_RESERVES - tokensSold;
uint256 k = virtualEth * virtualTokens;
uint256 newVirtualTokens = virtualTokens + tokensIn;
uint256 newVirtualEth = k / newVirtualTokens;
return virtualEth - newVirtualEth;
}
function buy(uint256 minTokensOut) external payable nonReentrant {
require(msg.value > 0, "No ETH sent");
require(!migrated, "Token migrated to DEX");
uint256 fee = (msg.value * FEE_BPS) / 10000;
uint256 ethIn = msg.value - fee;
uint256 tokensOut = getTokensOut(ethIn);
require(tokensOut >= minTokensOut, "Slippage exceeded");
realEthReserves += ethIn;
tokensSold += tokensOut;
IERC20(token).safeTransfer(msg.sender, tokensOut);
payable(feeRecipient).transfer(fee);
emit Trade(msg.sender, ethIn, tokensOut, true);
if (realEthReserves >= MIGRATION_THRESHOLD) {
_migrateToDEX();
}
}
function sell(uint256 tokensIn, uint256 minEthOut) external nonReentrant {
require(!migrated, "Token migrated to DEX");
require(tokensIn > 0, "Zero tokens");
uint256 ethOut = getEthOut(tokensIn);
uint256 fee = (ethOut * FEE_BPS) / 10000;
uint256 ethToUser = ethOut - fee;
require(ethToUser >= minEthOut, "Slippage exceeded");
IERC20(token).safeTransferFrom(msg.sender, address(this), tokensIn);
tokensSold -= tokensIn;
realEthReserves -= ethOut;
payable(msg.sender).transfer(ethToUser);
payable(feeRecipient).transfer(fee);
emit Trade(msg.sender, tokensIn, ethToUser, false);
}
}
Почему важна миграция в DEX?
При достижении threshold ($69k market cap) контракт автоматически: останавливает торговлю через bonding curve, создаёт пул на Uniswap V2, добавляет накопленный ETH + оставшиеся токены как ликвидность, сжигает LP-токены навсегда. pump.fun documentation описывает это как ключевой механизм защиты от rug pull.
function _migrateToDEX() internal {
migrated = true;
uint256 ethForLiquidity = realEthReserves;
uint256 tokensForLiquidity = TOTAL_SUPPLY - tokensSold;
address pair = IUniswapV2Factory(UNISWAP_FACTORY).createPair(token, WETH);
IERC20(token).approve(UNISWAP_ROUTER, tokensForLiquidity);
(, , uint256 lpTokens) = IUniswapV2Router(UNISWAP_ROUTER).addLiquidityETH{value: ethForLiquidity}(
token, tokensForLiquidity, tokensForLiquidity, ethForLiquidity, address(this), block.timestamp + 300
);
IERC20(pair).transfer(address(0xdead), lpTokens);
emit Migrated(pair, ethForLiquidity, tokensForLiquidity);
}
Locked vs burned LP: сжигание радикальнее, но необратимо. При баге в контракте исправить нельзя.
Что такое anti-rug механизмы?
Основные риски: создатель dump'ает (купил 80% supply при низкой цене, продаёт после hype). Архитектурное решение — после миграции LP залочен. Мы добавляем ограничение максимальной покупки на адрес (10% за транзакцию) и cooldown между покупками для защиты от rapid accumulation.
uint256 public constant MAX_BUY_PERCENT = 10;
function buy(uint256 minTokensOut) external payable {
uint256 tokensOut = getTokensOut(msg.value);
uint256 maxTokens = (TOTAL_SUPPLY * MAX_BUY_PERCENT) / 100;
require(tokensOut <= maxTokens, "Buy too large");
// ...
}
Фабрика токенов
Каждый пользователь запускает новый токен. Фабрика деплоит токен + bonding curve контракт за одну транзакцию. Используем CREATE2 для предсказуемых адресов — frontend может рассчитать адрес до деплоя.
Как обеспечить real-time трейдинг и discovery?
С тысячами новых токенов в день нужен real-time индекс. Используем The Graph subgraph для индексирования событий TokenCreated, Trade, Migrated. Trending алгоритм: score = (volume_1h * 3) + (volume_24h * 1) + (buyers_1h * 50) - (sellers_1h * 30). WebSocket для live trades — frontend подписывается на события конкретного токена.
Экономика платформы
pump.fun зарабатывает: 1% fee от каждой trade через bonding curve, 0.5% от объёма после миграции, платная верификация создателей. При объёме $1M/день это $10k/день только от trading fee. Для EVM реализации на Base/Arbitrum модель аналогична, но gas cost выше.
Сравнение сетей для деплоя
| Сеть | Gas (средний) | Скорость блока | Аудитория | Рекомендуется для |
|---|---|---|---|---|
| Ethereum | высокий | 12 секунд | крупная | токены с высокой капитализацией |
| Arbitrum | средний | 1 секунда | растущая | фабрики с высокой транзакционностью |
| Base | низкий | 2 секунды | новая | тестовые запуски и low-cap токены |
Технический стек
Контракты: Solidity + Foundry (тестирование с fuzz для invariants: totalEth = sum(all buys) - sum(all sells)). Индексирование: The Graph или собственный indexer (Node.js + ethers.js + PostgreSQL). Frontend: React + wagmi + viem, real-time через WebSocket. Чарты: TradingView Lightweight Charts. Хранение метаданных: IPFS.
Этапы разработки
| Фаза | Содержание | Срок |
|---|---|---|
| Bonding curve math | Расчёт параметров кривой, тесты инвариантов | 1–2 нед |
| Core contracts | Factory, BondingCurve, миграция | 3–4 нед |
| Security audit | Особое внимание на манипуляцию кривой, reentrancy | 2–3 нед |
| Indexer | Subgraph или кастомный indexer | 2–3 нед |
| Frontend | Trading interface, discovery, charts | 4–6 нед |
| Testnet | Полный цикл создание → торговля → миграция | 2–3 нед |
| Mainnet | Деплой на target chain | 1 нед |
Что входит в разработку?
- Исходный код смарт-контрактов с полным тестовым покрытием (unit + fuzz)
- Документация: архитектурная схема, описание параметров кривой, deployment guide
- Настройка индексатора и live-trade API
- Развёртывание на testnet и mainnet выбранной сети
- Обучение команды для управления платформой
- Техническая поддержка на 3 месяца
Типичные ошибки при проектировании кривой
- Неправильный расчёт virtual reserves — приводит к imbalance после миграции
- Отсутствие anti-робот механизмов — фронтраннинг и MEV-атаки
- Игнорирование slippage при больших покупках — пользователи теряют средства
- Неверный threshold — если слишком низкий, миграция происходит до накопления достаточной ликвидности
Bonding curve лучше traditional orderbook тем, что не требует внешней ликвидности и обеспечивает автоматическое ценообразование. Сравнение с ручным созданием пула: экономия времени в 50 раз.
Готовы к запуску? Свяжитесь с нами для предварительной оценки вашего проекта. Мы гарантируем безопасность контрактов и соблюдение стандартов ERC-20/ERC-721.







