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. Софткап дорівнює всьому публічному продажу, тож досягнення софткапу і є повний розпродаж — часткового успіху не буває. Розпродано — і пул засівається; пропущено дедлайн — і протокол автоматично повертає кошти кожному мінтеру та знищує пропозицію з ескроу. Завершення відбувається наприкінці блоку навіть при заповненні хардкапу, тож ніхто не може торгувати в пулі в тій самій транзакції, що його створює.
  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.
  • База 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. Використовуйте їх для показу, але математику відповідності стандарту тримайте в сирих цілих сатоші (×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 має перевищувати блок підтвердження. Без цієї умови творець міг би надіслати в мережу номінально 1 000-блоковий продаж із запізненням, підтвердити його перед самим дедлайном і провести майже миттєвий інсайдерський мінт за метаданими на тисячу блоків. А в рядку 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, можуть втратити вартість — і втрачатимуть. Прочитайте розкриття ризиків перед мінтом.