文件
關於 XCP-69 的一切,盡在一處。前半部分向所有人解釋發射如何運作。後半部分面向開發者,幫助他們讀取本站所用的同一份鏈上數據,或在其之上構建。
概覽
XCP-69 是一套建立在 Counterparty 公平鑄造池之上的固定參數代幣發射標準。沒有工廠合約,沒有管理員密鑰,任何時候都沒有平台託管:協議就是平台。每一個操作 — 建立發射、鑄造、兌換 — 都是你在自己錢包裏簽名並廣播到比特幣網絡的交易。本站只是公開鏈上數據之上的一個界面;即使它明天消失,每一次發射、退款和流動性池都會一如既往地運作。
每一次 XCP-69 發射都完全相同:1 億供應量,6900 萬公開發售、每份 1,000 枚代幣 0.01 XCP,3100 萬預留給流動性池,每地址上限 10 XCP,鑄造開啓前的鏈上預公告,以及 1,000 個區塊的窗口期。沒有小字條款可讀,因為根本沒有小字條款。完整參數集見運作機制頁面。
發射機制
一次發射會經歷四個階段:
- 公告。 每次發射都會在其
start_block之前於鏈上確認。在該區塊到來前,公平鑄造合約處於pending狀態,共識會拒絕所有鑄造 — 包括建立者在內,沒有人能提前鑄造。不存在偷偷發射:在第一份可被買入之前,全部條款已經放在鏈上,任何人都可以查驗。 - 鑄造。 從
start_block起的 1,000 個區塊窗口期(約 7 天)。任何人都可以按每份 0.01 XCP 鑄造整份 1,000 枚代幣,每地址最多 1,000,000 枚(10 XCP)。支付的 XCP 和鑄造的代幣都託管在不可花費地址 — 在發射結束之前,沒有人持有任何東西。窗口期長度只會推遲失敗:售罄的那一刻就會結算,而未售罄則會在大約一週內釋放每位鑄造者的 XCP。 - 結算。 6900 萬軟頂,全有或全無。軟頂等於整個公開發售量,所以達到軟頂就是售罄 — 不存在部分成功。售罄則注入流動性池;錯過截止期則協議自動退款給每位鑄造者,並銷毀託管中的供應量。即使達到硬頂,結算也在區塊末尾進行,因此沒有人能在建立流動性池的那筆交易裏對其交易。
- 交易。 募集到的全部 690 XCP 加上預留的 3100 萬代幣,注入一個 TOKEN/XCP AMM 流動性池。LP 代幣直接鑄造到不可花費地址 — 流動性由共識永久鎖定。供應量和描述在同一區塊鎖定,交易立即開始。
交易與定價
已畢業的代幣在一個恆定乘積的 TOKEN/XCP 流動性池中交易。價格就是池中兩種儲備的比率;每一次兌換都會移動它。每次兌換固定收取 50 bps 的費用,支付給池子本身 — 由於 LP 已銷毀,費用會加深鎖定的流動性,而不會付給任何人。
流動性池以 690 XCP 對 3100 萬代幣開盤:69/31 ≈ 鑄造價的 2.23×。每位鑄造者在開盤時從結構上就處於盈利,而吸收早期離場的是池子 — 不是後來的買家。
Counterparty 的 DEX 訂單是唯一的交易原語:只要流動性池的價格優於訂單簿,撮合就會經由池子進行。市價單是按路由器報價輸出下的訂單 — 它會立即以最優價格從池子和訂單簿成交。限價單掛在訂單簿上,一旦池子價格越過你的價格,就會自動成交。
- 價格
- XCP 儲備 ÷ 代幣儲備。每次兌換都會變動;沒有訂單簿,也沒有做市商。
- 市值
- 池子價格 × 流通供應量(已發行減去已銷毀)。這是一種慣例,不是承諾 — 池子無法兑付這個數字。
- 價格影響
- 你自己的兌換會讓價格移動多少。面對固定的儲備,兌換量越大,平均價格越差。
- 滑點
- 如果在你獲得報價與確認之間池子發生了變動,報價與實際成交價之間的差額。
畢業
在其他發射台上,畢業是活躍市場中的一條閾值線:代幣在曲線上交易,所有人都盼着它觸到那個神奇的數字。XCP-69 的畢業是二元的,而且發生在任何交易存在之前。在 1,000 個區塊內售罄 6900 萬,發射就畢業 — 流動性池注入、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)
沒有費用分成表,因為沒有費用可分。鑄造者支付的每一個 satoshi 的 XCP 都進入流動性池。整個系統中唯一的成本是比特幣交易費、命名資產的 0.5 XCP 資產名稱註冊費,以及建立時扣除的協議 pooldeposit gas 費 — 這些都付給網絡,而不是付給我們或建立者。
風險披露
這套標準消除了跑路和預挖。它並不消除風險,我們也不會假裝它能:
- 每地址上限只在成本上抗女巫攻擊,在原理上並不能。 上限按地址計,而非按人計。它抬高了偽造 69 人蔘與的成本,但無法杜絕。
- 退款退回的是 XCP 數量,而不是法幣價值。 如果 XCP 價格在約 7 天的窗口期內波動,退款只能讓你在 XCP 數量上不受損失。
- 2.23× 的開盤溢價是結構性的,不是價格保證。 隨着人們向池中賣出,池底價會不斷下降。沒有什麼能阻止代幣跌破鑄造價。
- 代幣圖片只有在建立者選擇時才會上鍊。 默認情況下,鏈上永久保存資產信息 JSON 的 URL(通過
lock_description),而圖片和信息託管在鏈下,只有該資產當前的鏈上所有者才能通過錢包簽名消息修改。即使託管消失,代幣的經濟機制 — 供應量、流動性池、退款 — 都不受影響;受影響的只有圖片。使用 Taproot 錢包發射的建立者可以把圖片銘刻上鍊作為永久描述,徹底消除這一依賴。
集成
本站展示的一切都來自公開 API。你可以基於同一份數據構建自己的發射台、機器人或看板 — 下面的內容都不需要我們的許可。
網絡
- 鏈: 比特幣主網上的 Counterparty。XCP-69 發射就是攜帶 Counterparty 消息的普通比特幣交易。
- 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)。鑄造是普通的 fairmint 消息,數量為 quantity_by_price 的整份倍數。
一個值得了解的集成陷阱:Counterparty Core 11.3 及以上在 verbose=true 下會返回 pool_quantity_normalized 和 max_mint_per_address_normalized。它們可用於展示,但標準合規性的計算請保持使用原始整數 satoshi 單位(×10⁸),這樣比較才精確,並與非 verbose 的事件和內存池數據一致。
構造交易
compose API 返回一筆未簽名的原始比特幣交易 — 節點永遠接觸不到私鑰。用你自己的錢包簽名、廣播,即可完成。加上 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 的 gas 費;兩者都在確認時扣除,因此之後的結算不產生任何費用。請用真正的隨機數來選擇 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 的整份倍數,且不超過單筆交易上限和該地址的剩餘額度 — 用掉一部分的額度可以分多筆交易補滿。鑄造者需要 在其 Counterparty 餘額中 有 XCP;只有 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)
);
}佣金條款是粗略檢查最容易漏掉的一項。協議允許公平鑄造合約把每次鑄造的最多 99% 抽回給建立者 — 相當於多繞幾步的預挖 — 而沒有其他字段能發現它。XCP-69 要求它必須精確為 0。
時間條款是兩處刻意的不等式。共識並不要求未來的起始 — 一個遲到確認的發射只是立即開啓而已 — 所以預公告的保證就在這裏: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" 的銷毀記錄佐證)
第二個集成陷阱: 當發射提前售罄時,soft_cap_deadline_block 會被改寫 — core 會把它提前到售罄的那個區塊,以便在該區塊的末尾階段注入流動性池。在已關閉的記錄中,該字段是結算區塊,而不是原始截止期。倒計時界面只在狀態為 open 時才有意義。構造時的值保留在只增不改的事件歷史中:GET /v2/transactions/<tx_hash>/events/NEW_FAIRMINTER 返回原始綁定值(改寫是一個單獨的 FAIRMINTER_UPDATE 事件),本站正是藉此核驗已關閉發射的確切窗口期。
參考發射
支持與條款
本站展示的所有數據都是公開的鏈上數據;你在這裏看到的一切,都可以自行對照 Counterparty 節點核驗。本站只是一個界面,不是任何交易的對手方 — 它從不持有資金,也無法撤銷、加速或退款(退款由協議自行處理)。這裏沒有任何內容構成投資建議;通過 XCP-69 發射的代幣可能貶值,也確實會貶值。鑄造前請閲讀風險披露。