Docs

Всё об XCP-69 в одном месте. Первая половина объясняет, как работают запуски, для всех. Вторая — для разработчиков, которые хотят читать те же данные из блокчейна, что и этот сайт, или строить на них.

Обзор

XCP-69 — стандарт запуска токенов с фиксированными параметрами, построенный на пулы fairmint Counterparty. Нет ни контракта-фабрики, ни ключа администратора, ни хранения средств платформой на каком-либо этапе: протокол и есть платформа. Каждое действие — создание запуска, минт, обмен — это транзакция, которую вы подписываете в своём кошельке и транслируете в Bitcoin. Этот сайт — интерфейс поверх публичных данных сети; исчезни он завтра, каждый запуск, возврат и пул продолжили бы работать ровно как прежде.

Каждый запуск XCP-69 одинаков: предложение 100M, публичная продажа 69M по 0,01 XCP за лот в 1 000 токенов, 31M зарезервированы для пула ликвидности, лимит 10 XCP на адрес, предварительное объявление в блокчейне до открытия минта и окно в 1 000 блоков. Мелкого шрифта читать не нужно, потому что мелкого шрифта нет. Полный набор параметров — на странице Как это работает.

Механизм запуска

Переворот: на большинстве лаунчпадов торговля начинается сразу, а толпа приходит позже — если приходит вообще. XCP-69 переворачивает это: торговля не может начаться, пока сообщество полностью не профинансирует запуск. Лимит 10 XCP на адрес означает, что продажа 69M недостижима без как минимум 69 разных адресов. По построению ни один токен не торгуется, пока за него не заплатила настоящая толпа.

Запуск проходит четыре фазы:

  1. Объявление. Каждый запуск подтверждается в блокчейне до своего start_block. Пока этот блок не наступил, fairminter находится в статусе pending, и консенсус отклоняет любой минт — никто, включая создателя, не может минтить раньше времени. Скрытых запусков не бывает: все условия лежат в блокчейне и доступны для проверки до того, как можно купить первый лот.
  2. Минт. Окно в 1 000 блоков (~7 дней) начиная с start_block. Любой может минтить целыми лотами по 1 000 токенов по 0,01 XCP за лот, до 1 000 000 токенов (10 XCP) на адрес. И уплаченные XCP, и заминченные токены лежат в эскроу на нерасходуемом адресе — никто ничего не держит, пока запуск не разрешится. Длина окна лишь откладывает провал: распродажа рассчитывается в момент заполнения, а промах освобождает XCP каждого минтера примерно за неделю.
  3. Разрешение. Всё или ничего при софткапе 69M. Софткап равен всей публичной продаже, поэтому достичь его и есть полная распродажа — частичного успеха не бывает. Распродажа — и пул создаётся; срыв дедлайна — и протокол автоматически возвращает XCP каждому минтеру и уничтожает предложение из эскроу. Разрешение происходит в конце блока даже при заполнении хардкапа, так что никто не может торговать в пуле в той же транзакции, которая его создаёт.
  4. Торговля. Все собранные 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), и именно так этот сайт проверяет точное окно закрытых запусков.

Эталонный запуск

Пулы fairmint активированы 2026-08-05, и ни одного запуска XCP-69 пока нет. Первый запуск будет указан здесь как эталонный токен — каноническая запись для проверки вашей интеграции: его запись fairminter должна проходить предикат выше, лента минтов должна показывать ≥69 разных адресов, а запись пула — сожжённые LP на нерасходуемом адресе.

Поддержка и условия

Все данные на этом сайте — публичные данные блокчейна; всё, что вы здесь видите, можно проверить самостоятельно по ноде Counterparty. Сайт — это интерфейс, а не сторона какой-либо транзакции: он никогда не хранит средства и не может ничего отменить, ускорить или вернуть (возвраты протокол выполняет сам). Ничто здесь не является инвестиционной рекомендацией; токены, запущенные через XCP-69, могут терять и будут терять в цене. Прочитайте раскрытие рисков перед минтом.