Docs
XCP-69 のすべてを一箇所に。前半は誰にでも分かるローンチの仕組み。後半は、このサイトと同じオンチェーンデータを読み、その上に構築したい開発者向けです。
概要
XCP-69 は Counterparty のフェアミントプールの上に築かれた固定パラメータのトークンローンチ標準です。ファクトリーコントラクトも管理者キーもなく、どの時点でもプラットフォームによる資産管理はありません: プロトコルそのままがプラットフォームです。ローンチの作成、ミント、スワップなど、あらゆる操作は自分のウォレットで署名して Bitcoin にブロードキャストするトランザクションです。このサイトは公開オンチェーンデータの上のインターフェースであり、明日消えても、すべてのローンチ、返金、プールはこれまで通り動き続けます。
XCP-69 のローンチはすべて同一です: 発行量 100M、1,000 トークンのロットあたり 0.01 XCP で 69M を公開販売、31M は流動性プール用に確保、アドレスごとの上限 10 XCP、ミント開始前のオンチェーン事前告知、そして 1,000 ブロックの期間。細則がないので、読むべき細則もありません。パラメータの全セットは仕組みページにあります。
ローンチの仕組み
ローンチは 4 つのフェーズを経ます:
- 告知。 すべてのローンチは
start_blockより前にオンチェーンで承認されます。そのブロックが来るまでフェアミンターはpendingで、コンセンサスはすべてのミントを拒否します — 作成者を含め、誰も先にミントできません。ステルスローンチは存在しません: 最初のロットが買われる前に、条件の全文がオンチェーンで検証可能な形で置かれます。 - ミント。
start_blockから 1,000 ブロック(約 7 日)の期間。誰でも 1,000 トークンのロット単位で、ロットあたり 0.01 XCP、アドレスごとに最大 1,000,000 トークン(10 XCP)までミントできます。支払った XCP もミントされたトークンも使用不可アドレスにエスクローされ、ローンチが確定するまで誰も何も保有しません。期間の長さが遅らせるのは失敗だけです: 完売は埋まった瞬間に精算され、未達なら約 1 週間以内に全ミンターの XCP が解放されます。 - 確定。 69M のソフトキャップでオール・オア・ナッシング。ソフトキャップは公開販売の全量と等しいので、到達はそのまま完売を意味します — 部分的な成功はありません。完売すればプールが作られ、締切に届かなければプロトコルが全ミンターに自動で返金し、エスクローされた供給を破棄します。ハードキャップで埋まった場合でも確定はブロック末尾で行われるため、プールを作るトランザクションの中でプールを取引することは誰にもできません。
- 取引。 調達した 690 XCP 全額と準備分の 31M トークンで TOKEN/XCP の AMM プールを作ります。LP トークンは使用不可アドレスへ直接発行され、流動性はコンセンサスにより永久にロックされます。発行量と説明文も同じブロックでロックされ、取引はすぐに始まります。
取引と価格
卒業したトークンは定数積の TOKEN/XCP プールで取引されます。価格は単にプールの準備金の比率で、スワップのたびに動きます。各スワップの固定手数料 50 bps はプール自身に支払われます — LP はバーン済みなので、手数料は誰かに配られるのではなく、ロックされた流動性を厚くします。
プールは 690 XCP 対 31M トークンでオープンします: 69/31 ≈ ミント価格の 2.23×。すべてのミンターは構造上オープン時点で含み益があり、早期の売り抜けは後の買い手ではなくプールが吸収します。
Counterparty の DEX 注文が唯一の取引プリミティブです: プールの価格が板より良いときは常にプール経由でマッチングされます。成行注文はルーターの見積もり出力での注文で、プールと板から最良価格で即時に約定します。指値注文は板で待機し、プールの価格があなたの価格を越えれば自動的に約定します。
- 価格
- XCP 準備金 ÷ トークン準備金。スワップのたびに動きます。板もマーケットメイカーもありません。
- 時価総額
- プール価格 × 流通供給量(発行済みからバーン分を引いたもの)。慣例であって約束ではありません — プールがその額を支払えるわけではありません。
- 価格インパクト
- 自分のスワップがどれだけ価格を動かすか。固定された準備金に対して大きなスワップほど平均価格は悪くなります。
- スリッページ
- 見積もりから承認までの間にプールが動いた場合の、見積価格と実際の約定価格の差。
卒業
他のローンチパッドでは、卒業は稼働中のマーケット内の閾値です: 皆が魔法の数字に届くことを願う間、トークンはカーブ上で取引されます。XCP-69 の卒業は二択で、取引が存在する前に起こります。1,000 ブロック以内に 69M の販売を完売させればローンチは卒業します — プールが作られ、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 は 1 satoshi 残らずプールに入ります。システム内で発生する費用は、Bitcoin のトランザクション手数料、名前付きアセットの 0.5 XCP 名前登録手数料、そして作成時に引き落とされるプロトコルの pooldeposit ガス手数料だけです — いずれもネットワークに支払われ、私たちや作成者には支払われません。
リスク開示
この標準はラグプルとプレマインを排除します。リスクは排除しませんし、そう装うつもりもありません:
- アドレスごとの上限はコスト面でのみシビル耐性があり、原理的にはありません。 上限は人ではなくアドレスごとです。69 人の群衆を偽装するコストを引き上げますが、防ぐことはできません。
- 返金で戻るのは XCP の数量であり、法定通貨換算の価値ではありません。 約 7 日間の期間中に XCP の価格が動いた場合、返金で元通りになるのは XCP 建てでのみです。
- 2.23× のオープニングプレミアムは構造上の結果であり、価格の保証ではありません。 プールのフロアは売られるほど下がります。トークンがミント価格を下回って取引されることを止めるものはありません。
- トークンの画像は作成者が選んだ場合のみオンチェーンです。 デフォルトでは、チェーンはアセット情報 JSON の URL を(
lock_descriptionにより)永久に保持し、画像と情報はオフチェーンでホストされ、アセットの現在のオンチェーン所有者だけがウォレット署名付きメッセージで編集できます。そのホスティングが消えても、トークンの経済面 — 発行量、プール、返金 — は影響を受けず、失われるのはアートだけです。Taproot ウォレットからローンチする作成者は、画像を永久の説明文としてオンチェーンに刻むことで、この依存を完全になくせます。
連携
このサイトが表示するものはすべて公開 API から来ています。同じデータの上に独自のローンチパッド、ボット、ダッシュボードを作れます — 以下のどれにも私たちの許可は要りません。
ネットワーク
- チェーン: Bitcoin メインネット上の Counterparty。XCP-69 のローンチは Counterparty メッセージを載せた通常の Bitcoin トランザクションです。
- API ベース:
https://api.counterparty.io:4000/v2— または自前の counterparty-core ノードを動かしてトラストレスに読み取ります。 - プロトコル機能:
fairmint_pool、メインネットのブロック 961,100(2026-08-05)で有効化。core v11.2.0 以上が必要です。
メッセージ形式
ローンチはプール用フィールド pool_quantity と lp_asset を設定した フェアミンター メッセージ(ID 90)を使います。ミントは quantity_by_price のロット単位の倍数による通常の fairmint メッセージです。
知っておくべき連携時の落とし穴: Counterparty Core 11.3 以降は verbose=true のとき pool_quantity_normalized と max_mint_per_address_normalized を返します。表示には使って構いませんが、標準準拠の計算は生の整数 satoshi 単位(×10⁸)で行い、比較を正確に保ち、verbose でないイベントやメンプールのデータと一致させてください。
トランザクションの作成
compose API は未署名の生の Bitcoin トランザクションを返します — ノードは鍵を一切見ません。自分のウォレットで署名し、ブロードキャストすれば完了です。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"コンセンサスは解析時に標準の整合性を強制します: pool_quantity > 0 のとき soft_cap は hard_cap − premint − pool_quantity と等しくなければなりません — オール・オア・ナッシングはサイトの方針ではなくプロトコルのルールです。発行者のアドレスは 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 残高に 持っている必要があり、XCP のない BTC ウォレットでは "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)
);
}コミッションの条項は素朴なチェックが見落とすものです。プロトコルはフェアミンターが各ミントの最大 99% を作成者に還流させることを許します — 手間のかかったプレマインです — そして他のどのフィールドもそれを捕捉しません。XCP-69 はこれを厳密に 0 と要求します。
タイミングの条項は意図的な 2 つの不等式です。コンセンサスは未来の開始を要求しません — 遅れて承認されたローンチは単に即座に開くだけです — ので、事前告知の保証はここにあります: start_block は承認ブロックより大きくなければなりません。この条項がなければ、作成者は名目上 1,000 ブロックの販売を遅くブロードキャストし、自らの締切直前に承認させ、千ブロックのメタデータの裏でほぼ即時のインサイダーミントを行えます。また、フェアミンター行の期間チェックは終了後には ≤ に緩みます。core が早期完売時に締切を書き換えるためで、終了済みローンチについてこのサイトは不変の NEW_FAIRMINTER イベントから厳密な等価性を復元します(「状態の読み取り」の落とし穴を参照)。それ以外はすべて行に対する厳密な等価性です。
オンチェーンイベント
ライフサイクル全体は GET /v2/events/<EVENT> 経由で Counterparty のイベントとして観測できます:
- 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"ライフサイクル判定のレシピ。 成功も失敗もフェアミンターのステータスは closed で終わるため、プールの行が判別材料になります:
pending→ 予定open→ ミント中closedかつ/v2/pools/<ASSET>/XCPがプールを返す → 卒業closedでプールの行がない → 返金("soft cap not reached" とタグ付けされた破棄記録で裏付け)
連携時の落とし穴その 2: ローンチが早期に完売すると soft_cap_deadline_block は書き換えられます — core がそれを埋まったブロックまで前倒しし、そのブロックの末尾フェーズでプールが作られます。終了済みの記録ではこのフィールドは元の締切ではなく精算ブロックです。カウントダウン UI はステータスが open の間だけ意味を持ちます。作成時の値は追記専用のイベント履歴に残ります: GET /v2/transactions/<tx_hash>/events/NEW_FAIRMINTER は元のバインディングを返し(書き換えは別の FAIRMINTER_UPDATE イベント)、このサイトはそれを使って終了済みローンチの正確な期間を検証しています。
リファレンスローンチ
サポートと規約
このサイトに表示されるデータはすべて公開のオンチェーンデータで、ここで見るものはすべて Counterparty ノードで自分で検証できます。このサイトはインターフェースであり、いかなるトランザクションの相手方でもありません — 資金を保持せず、取り消し・優先処理・返金はできません(返金はプロトコルが自ら処理します)。ここにあるものは投資助言ではなく、XCP-69 でローンチされたトークンは価値を失い得るし、実際に失います。ミントの前にリスク開示をお読みください。