Docs
Всё об XCP-69 в одном месте. Первая половина объясняет, как работают запуски, для всех. Вторая — для разработчиков, которые хотят читать те же данные из блокчейна, что и этот сайт, или строить на них.
Обзор
XCP-69 — стандарт запуска токенов с фиксированными параметрами, построенный на пулы fairmint Counterparty. Нет ни контракта-фабрики, ни ключа администратора, ни хранения средств платформой на каком-либо этапе: протокол и есть платформа. Каждое действие — создание запуска, минт, обмен — это транзакция, которую вы подписываете в своём кошельке и транслируете в Bitcoin. Этот сайт — интерфейс поверх публичных данных сети; исчезни он завтра, каждый запуск, возврат и пул продолжили бы работать ровно как прежде.
Каждый запуск XCP-69 одинаков: предложение 100M, публичная продажа 69M по 0,01 XCP за лот в 1 000 токенов, 31M зарезервированы для пула ликвидности, лимит 10 XCP на адрес, предварительное объявление в блокчейне до открытия минта и окно в 1 000 блоков. Мелкого шрифта читать не нужно, потому что мелкого шрифта нет. Полный набор параметров — на странице Как это работает.
Механизм запуска
Запуск проходит четыре фазы:
- Объявление. Каждый запуск подтверждается в блокчейне до своего
start_block. Пока этот блок не наступил, fairminter находится в статусеpending, и консенсус отклоняет любой минт — никто, включая создателя, не может минтить раньше времени. Скрытых запусков не бывает: все условия лежат в блокчейне и доступны для проверки до того, как можно купить первый лот. - Минт. Окно в 1 000 блоков (~7 дней) начиная с
start_block. Любой может минтить целыми лотами по 1 000 токенов по 0,01 XCP за лот, до 1 000 000 токенов (10 XCP) на адрес. И уплаченные XCP, и заминченные токены лежат в эскроу на нерасходуемом адресе — никто ничего не держит, пока запуск не разрешится. Длина окна лишь откладывает провал: распродажа рассчитывается в момент заполнения, а промах освобождает XCP каждого минтера примерно за неделю. - Разрешение. Всё или ничего при софткапе 69M. Софткап равен всей публичной продаже, поэтому достичь его и есть полная распродажа — частичного успеха не бывает. Распродажа — и пул создаётся; срыв дедлайна — и протокол автоматически возвращает XCP каждому минтеру и уничтожает предложение из эскроу. Разрешение происходит в конце блока даже при заполнении хардкапа, так что никто не может торговать в пуле в той же транзакции, которая его создаёт.
- Торговля. Все собранные 690 XCP и зарезервированные 31M токенов образуют AMM-пул TOKEN/XCP. LP-токены минтятся прямо на нерасходуемый адрес — ликвидность заблокирована консенсусом навсегда. Предложение и описание блокируются в том же блоке, и торговля начинается сразу.
Торговля и цена
Выпустившиеся токены торгуются против пула TOKEN/XCP с постоянным произведением. Цена — это просто отношение резервов пула; каждый обмен её сдвигает. Фиксированная комиссия 50 б.п. с каждого обмена уплачивается самому пулу — а поскольку LP сожжены, комиссии углубляют заблокированную ликвидность, а не выплачиваются кому-либо.
Пул открывается с 690 XCP против 31M токенов: 69/31 ≈ 2.23× от цены минта. Каждый минтер структурно в плюсе на открытии, а ранние выходы поглощает пул — а не более поздние покупатели.
Ордер DEX Counterparty — единственный торговый примитив: сведение идёт через пул всякий раз, когда цена пула лучше книги ордеров. Рыночный ордер — это ордер по выходу, рассчитанному маршрутизатором: он немедленно исполняется из пула и книги по лучшей цене. Лимитный ордер лежит в книге, и пул исполнит его автоматически, если его цена когда-нибудь пересечёт вашу.
- Цена
- Резерв XCP ÷ резерв токенов. Меняется с каждым обменом; ни книги ордеров, ни маркетмейкера нет.
- Капитализация
- Цена пула × предложение в обращении (выпущено минус сожжено). Условность, а не обещание — пул не смог бы это выплатить.
- Влияние на цену
- Насколько ваш собственный обмен сдвигает цену. Чем крупнее обмен против фиксированных резервов, тем хуже средняя цена.
- Проскальзывание
- Разница между котировкой и ценой исполнения, если пул сдвинется между вашей котировкой и подтверждением.
Выпускной
На других лаунчпадах выпускной — это порог внутри живого рынка: токен торгуется по кривой, пока все надеются, что он дойдёт до заветной цифры. Выпускной в XCP-69 бинарен и происходит до того, как существует какая-либо торговля. Распродайте 69M за 1 000 блоков — и запуск выпустится: пул создан, LP сожжены, предложение заблокировано, торговля идёт уже в фазе разрешения того же блока. Не успели — и запуск не торгуется вообще никогда.
Возврат — это не обращение в поддержку. Это автоматическое поведение протокола: в дедлайн XCP каждого минтера возвращаются, а предложение из эскроу уничтожается в том же блоке. Провалившиеся запуски переезжают на кладбище, где сохраняется их история — лента минтов, число участников и доказательство в блокчейне: запись об уничтожении с тегом "soft cap not reached".
Комиссии
- Creator's share of the 690 XCP raise
- 0%
- Protocol / platform share of the raise
- 0%
- Premine or mint commission to the creator
- 0
- LP tokens
- burned at the unspendable address, forever
- Swap fee after launch
- 50 bps, paid to the pool (the LP is burned, so it deepens locked liquidity)
Таблицы распределения комиссий нет, потому что распределять нечего. Каждый сатоши XCP, уплаченный минтерами, уходит в пул. Единственные расходы во всей системе — комиссии за биткоин-транзакции, комиссия 0,5 XCP за регистрацию имени для именованных активов и комиссия протокола pooldeposit за газ, списываемая при создании, — расходы в пользу сети, а не нас или создателя.
Раскрытие рисков
Стандарт убирает рагпулл и премайн. Риск он не убирает, и мы не будем делать вид, что это не так:
- Лимит на адрес устойчив к сибил-атаке только по стоимости, а не в принципе. Лимит действует на адрес, а не на человека. Он повышает стоимость подделки толпы из 69 участников, но не исключает саму подделку.
- Возврат возвращает количество XCP, а не стоимость в фиате. Если цена XCP изменится за ~7-дневное окно, возврат вернёт вам ту же сумму только в XCP.
- Стартовая премия 2.23× — следствие структуры, а не гарантия цены. Дно пула опускается по мере того, как в него продают. Ничто не мешает токену торговаться ниже цены минта.
- Медиа токена лежит в блокчейне, только если так решил создатель. По умолчанию блокчейн навсегда хранит URL JSON-файла с информацией об активе (через
lock_description), а изображение и описание размещены вне блокчейна и редактируются только текущим владельцем актива в блокчейне через сообщение, подписанное кошельком. Если такой хостинг исчезнет, экономика токена — предложение, пул, возвраты — не пострадает; пострадает только картинка. Создатели, запускающие с Taproot-кошелька, могут полностью убрать эту зависимость, записав изображение в блокчейн как постоянное описание.
Интеграция
Всё, что показывает этот сайт, берётся из публичных API. Вы можете построить свой лаунчпад, бота или дашборд на тех же данных — ничто из перечисленного ниже не требует нашего разрешения.
Сеть
- Блокчейн: Counterparty в основной сети Bitcoin. Запуски XCP-69 — это обычные биткоин-транзакции, несущие сообщения Counterparty.
- Базовый URL API:
https://api.counterparty.io:4000/v2— или запустите собственную ноду counterparty-core для чтения без доверия. - Функция протокола:
fairmint_pool, активированы в основной сети на блоке 961 100 (2026-08-05). Требуется core v11.2.0 или новее.
Формат сообщений
Запуски используют сообщение fairminter (ID 90) с заполненными полями пула pool_quantity и lp_asset. Минты — обычные сообщения fairmint, кратные целому лоту quantity_by_price.
Одна ловушка интеграции, о которой стоит знать: Counterparty Core 11.3+ возвращает pool_quantity_normalized и max_mint_per_address_normalized при verbose=true. Используйте их для отображения, но математику соответствия стандарту ведите в сырых целых satoshi (×10⁸), чтобы сравнения оставались точными и совпадали с данными событий и мемпула без verbose.
Составление транзакций
API compose возвращает неподписанную сырую биткоин-транзакцию — нода никогда не видит ключ. Подпишите своим кошельком, транслируйте — готово. Добавьте verbose=true, чтобы получить PSBT и эхо параметров; все количества — сырые целые числа.
# Compose an XCP-69 launch (unsigned tx back; sign + broadcast yourself).
# START = a future block: the pre-announcement window. The launch must
# CONFIRM before START or it opens instantly and fails conformance.
curl -G "https://api.counterparty.io:4000/v2/addresses/$ISSUER/compose/fairminter" \
--data-urlencode "asset=MYTOKEN" \
--data-urlencode "price=1000000" \
--data-urlencode "quantity_by_price=100000000000" \
--data-urlencode "hard_cap=10000000000000000" \
--data-urlencode "soft_cap=6900000000000000" \
--data-urlencode "pool_quantity=3100000000000000" \
--data-urlencode "lp_asset=$LP_NAME" \ # any unissued numeric; house style: 69…69, ≡69 (mod 97)
--data-urlencode "max_mint_per_address=100000000000000" \
--data-urlencode "max_mint_per_tx=100000000000000" \
--data-urlencode "start_block=$START" \
--data-urlencode "soft_cap_deadline_block=$((START + 1000))" \
--data-urlencode "end_block=0" \
--data-urlencode "premint_quantity=0" \
--data-urlencode "minted_asset_commission=0" \
--data-urlencode "burn_payment=false" \
--data-urlencode "lock_quantity=true" \
--data-urlencode "lock_description=true" \
--data-urlencode "divisible=true" \
--data-urlencode "description=https://…/MYTOKEN.json" \
--data-urlencode "sat_per_vbyte=$FEE_RATE" \
--data-urlencode "verbose=true"Консенсус проверяет согласованность стандарта при разборе: soft_cap должен равняться hard_cap − premint − pool_quantity, когда pool_quantity > 0 — «всё или ничего» — это правило протокола, а не политика сайта. На адресе эмитента должны лежать 0,5 XCP комиссии за регистрацию имени плюс комиссия pooldeposit за газ; обе списываются при подтверждении, так что последующий расчёт ничего не стоит. Выбирайте lp_asset по-настоящему случайно: числовая эмиссия бесплатна, а предсказуемое имя позволяет любому зарегистрировать его между трансляцией и подтверждением и тем самым сорвать запуск.
# Compose a mint. quantity is the TOKEN amount (raw, whole lots) —
# the XCP price is computed by consensus and debited from the minter's
# on-ledger XCP balance; nothing rides in the Bitcoin outputs.
curl -G "https://api.counterparty.io:4000/v2/addresses/$MINTER/compose/fairmint" \
--data-urlencode "asset=MYTOKEN" \
--data-urlencode "quantity=100000000000000" \
--data-urlencode "sat_per_vbyte=$FEE_RATE"
# Issuer-side XCP cost of the pool settlement (prepaid at creation):
curl "https://api.counterparty.io:4000/v2/addresses/$ISSUER/compose/pooldeposit/estimatexcpfees"Минты должны быть кратны целому лоту quantity_by_price, укладываться в лимит на транзакцию и в остаток лимита адреса — частично использованный лимит можно добрать несколькими транзакциями. Минтеру нужны XCP на балансе Counterparty; кошелёк с BTC, но без XCP, при составлении транзакции получит ошибку "insufficient XCP balance".
Соответствие стандарту
В Core нет маркера стандарта в блокчейне, поэтому соответствие — это предикат: точное равенство фиксированным сырым значениям стандарта. Именно эту функцию выполняет сайт — запуск либо проходит её, либо не является XCP-69.
export const XCP69 = {
/** 100M supply */
HARD_CAP: 10_000_000_000_000_000,
/** 69M public sale — reaching it IS selling out (all-or-nothing) */
SOFT_CAP: 6_900_000_000_000_000,
/** 31M seeded into the TOKEN/XCP pool at close, LP burned */
POOL_QUANTITY: 3_100_000_000_000_000,
/** 1,000-token lots */
QUANTITY_BY_PRICE: 100_000_000_000,
/** 0.01 XCP per lot */
PRICE: 1_000_000,
/** 1M tokens = 10 XCP per address; 69M ÷ 1M = 69 participants */
MAX_MINT_PER_ADDRESS: 100_000_000_000_000,
MAX_MINT_PER_TX: 100_000_000_000_000,
/** Mint window: soft_cap_deadline_block − start_block, exactly (~7 days) */
DEADLINE_BLOCKS: 1_000,
} as const;
/** core's block_index sentinel for unconfirmed transactions */
const MEMPOOL_BLOCK_INDEX = 9_999_999;
export function isXcp69(fm: Fairminter): boolean {
return (
(fm.status === "pending" || fm.status === "open" || fm.status === "closed") &&
fm.pool_quantity === XCP69.POOL_QUANTITY &&
fm.soft_cap === XCP69.SOFT_CAP &&
fm.hard_cap === XCP69.HARD_CAP &&
fm.quantity_by_price === XCP69.QUANTITY_BY_PRICE &&
fm.price === XCP69.PRICE &&
fm.max_mint_per_address === XCP69.MAX_MINT_PER_ADDRESS &&
fm.max_mint_per_tx === XCP69.MAX_MINT_PER_TX &&
fm.premint_quantity === 0 &&
(fm.minted_asset_commission_int ?? 0) === 0 &&
fm.lock_quantity &&
fm.lock_description &&
fm.divisible &&
!fm.burn_payment &&
!fm.asset.startsWith("A") && // named assets only
// timing: scheduled start, fixed window, no end_block
fm.start_block > 0 &&
fm.end_block === 0 &&
(fm.confirmed === false ||
fm.block_index >= MEMPOOL_BLOCK_INDEX || // unconfirmed sentinel
fm.start_block > fm.block_index) && // confirmed before start
(fm.status === "closed"
// core rewrites the deadline to the fill block on early sell-out
? fm.soft_cap_deadline_block <= fm.start_block + XCP69.DEADLINE_BLOCKS
: fm.soft_cap_deadline_block === fm.start_block + XCP69.DEADLINE_BLOCKS)
);
}Пункт о комиссии — тот, что пропускают наивные проверки. Протокол позволяет fairminter отчислять создателю до 99 % каждого минта — премайн с лишними шагами, — и никакое другое поле этого не ловит. XCP-69 требует ровно 0.
Условия по времени — два намеренных неравенства. Консенсус не требует будущего старта: запуск, подтверждённый с опозданием, просто открывается сразу, — поэтому гарантия предварительного объявления живёт здесь: start_block должен быть больше блока подтверждения. Без этого условия создатель мог бы транслировать номинально тысячеблочную продажу с опозданием, подтвердить её перед самым дедлайном и провести почти мгновенный инсайдерский минт под прикрытием метаданных о тысяче блоков. А в записи fairminter проверка окна ослабляется до ≤ после закрытия, потому что core перезаписывает дедлайн при ранней распродаже — для закрытых запусков этот сайт восстанавливает точное равенство из неизменяемого события NEW_FAIRMINTER (см. ловушку в разделе «Чтение состояния»). Всё остальное — точное равенство по записи.
События в блокчейне
Весь жизненный цикл наблюдаем как события Counterparty через GET /v2/events/<EVENT>:
- NEW_FAIRMINTER
- a launch is created
- NEW_FAIRMINT
- someone mints (also visible in the mempool before confirmation)
- OPEN_POOL
- the launch graduated — the TOKEN/XCP pool was seeded
- POOL_MATCH
- a swap executed against the pool
- ASSET_DESTRUCTION
- escrowed supply destroyed — on a missed soft cap, tagged “soft cap not reached”
Чтение состояния
Всё доступно через curl. Запуски и минты:
# All fairminters currently minting (filter with isXcp69 client-side)
curl "https://api.counterparty.io:4000/v2/fairminters?status=open&verbose=true"
# Every mint into one launch
curl "https://api.counterparty.io:4000/v2/fairminters/<TX_HASH>/fairmints"Пулы, цены и котировки:
# Pool state (reserves) — a row here means the launch graduated
curl "https://api.counterparty.io:4000/v2/pools/<ASSET>/XCP"
# Price series: one row per reserve mutation
curl "https://api.counterparty.io:4000/v2/pools/<ASSET>/XCP/price_history"
# Swap quote for a given input quantity (raw integer)
curl "https://api.counterparty.io:4000/v2/pools/<ASSET>/XCP/quote?quantity=100000000"Холдеры:
# Holders — the unspendable address appears holding the burned LP
curl "https://api.counterparty.io:4000/v2/assets/<ASSET>/holders"Рецепт определения стадии. И успех, и провал заканчиваются статусом fairminter closed, поэтому различить их позволяет запись пула:
pending→ запланированopen→ идёт минтclosedи/v2/pools/<ASSET>/XCPвозвращает пул → выпустилсяclosedбез записи пула → возвращено (подтверждается записью об уничтожении с тегом "soft cap not reached")
Вторая ловушка интеграции: soft_cap_deadline_block перезаписывается, когда запуск распродаётся раньше срока — core сдвигает его к блоку заполнения, чтобы пул создался в фазе конца этого блока. У закрытой записи это поле — блок расчёта, а не исходный дедлайн. Обратный отсчёт в интерфейсе имеет смысл только пока статус равен open. Исходное значение сохраняется в истории событий (только добавление): GET /v2/transactions/<tx_hash>/events/NEW_FAIRMINTER возвращает исходные привязки (перезапись — отдельное событие FAIRMINTER_UPDATE), и именно так этот сайт проверяет точное окно закрытых запусков.
Эталонный запуск
Поддержка и условия
Все данные на этом сайте — публичные данные блокчейна; всё, что вы здесь видите, можно проверить самостоятельно по ноде Counterparty. Сайт — это интерфейс, а не сторона какой-либо транзакции: он никогда не хранит средства и не может ничего отменить, ускорить или вернуть (возвраты протокол выполняет сам). Ничто здесь не является инвестиционной рекомендацией; токены, запущенные через XCP-69, могут терять и будут терять в цене. Прочитайте раскрытие рисков перед минтом.