文档

关于 XCP-69 的一切,尽在一处。前半部分向所有人解释发射如何运作。后半部分面向开发者,帮助他们读取本站所用的同一份链上数据,或在其之上构建。

概览

XCP-69 是一套建立在 Counterparty 公平铸造池之上的固定参数代币发射标准。没有工厂合约,没有管理员密钥,任何时候都没有平台托管:协议就是平台。每一个操作 — 创建发射、铸造、兑换 — 都是你在自己钱包里签名并广播到比特币网络的交易。本站只是公开链上数据之上的一个界面;即使它明天消失,每一次发射、退款和流动性池都会一如既往地运作。

每一次 XCP-69 发射都完全相同:1 亿供应量,6900 万公开发售、每份 1,000 枚代币 0.01 XCP,3100 万预留给流动性池,每地址上限 10 XCP,铸造开启前的链上预公告,以及 1,000 个区块的窗口期。没有小字条款可读,因为根本没有小字条款。完整参数集见运作机制页面。

发射机制

反转: 在大多数发射台上,交易立刻开始,人群之后才来 — 如果会来的话。XCP-69 把这一点反过来 — 在社区把发射完全认购之前,交易无法开始。每地址 10 XCP 的上限意味着,没有至少 69 个不同地址,就不可能完成 6900 万的公开发售。从机制上讲,没有任何代币会在真实的人群付款之前开始交易。

一次发射会经历四个阶段:

  1. 公告。 每次发射都会在其 start_block 之前于链上确认。在该区块到来前,公平铸造合约处于 pending 状态,共识会拒绝所有铸造 — 包括创建者在内,没有人能提前铸造。不存在偷偷发射:在第一份可被买入之前,全部条款已经放在链上,任何人都可以查验。
  2. 铸造。 从 start_block 起的 1,000 个区块窗口期(约 7 天)。任何人都可以按每份 0.01 XCP 铸造整份 1,000 枚代币,每地址最多 1,000,000 枚(10 XCP)。支付的 XCP 和铸造的代币都由协议锁定在不可花费地址 — 在发射结束之前,没有人持有任何东西。窗口期长度只会推迟失败:售罄的那一刻就会结算,而未售罄则会在大约一周内释放每位铸造者的 XCP。
  3. 结算。 6900 万软顶,全有或全无。软顶等于整个公开发售量,所以达到软顶就是售罄 — 不存在部分成功。售罄则注入流动性池;错过截止期则协议自动退款给每位铸造者,并销毁托管中的供应量。即使达到硬顶,结算也在区块末尾进行,因此没有人能在创建流动性池的那笔交易里对其交易。
  4. 交易。 募集到的全部 690 XCP 加上预留的 3100 万代币,注入一个 TOKEN/XCP AMM 流动性池。LP 代币直接铸造到不可花费地址 — 流动性由共识永久锁定。供应量和描述在同一区块锁定,交易立即开始。

交易与定价

已毕业的代币在一个恒定乘积的 TOKEN/XCP 流动性池中交易。价格就是池中两种储备的比率;每一次兑换都会移动它。每次兑换固定收取 50 bps 的费用,支付给池子本身 — 由于 LP 已销毁,费用会加深锁定的流动性,而不会付给任何人。

流动性池以 690 XCP 对 3100 万代币开盘:69/31 ≈ 铸造价的 2.23×。每位铸造者在开盘时从结构上就处于盈利,而吸收早期离场的是池子 — 不是后来的买家。

Counterparty 的 DEX 订单是唯一的交易原语:只要流动性池的价格优于订单簿,撮合就会经由池子进行。市价单是按路由器报价输出下的订单 — 它会立即以最优价格从池子和订单簿成交。限价单挂在订单簿上,一旦池子价格越过你的价格,就会自动成交。

价格
池价等于 XCP 储备 ÷ 代币储备。兑换会改变这一比率。限价单也可以在 Counterparty 的订单簿上成交。
市值
池子价格 × 流通供应量(已发行减去已销毁)。这是一种惯例,不是承诺 — 池子无法兑付这个数字。
价格影响
你自己的兑换会让价格移动多少。面对固定的储备,兑换量越大,平均价格越差。
滑点
如果在你获得报价与确认之间池子发生了变动,报价与实际成交价之间的差额。

毕业

在其他发射台上,毕业是活跃市场中的一条阈值线:代币在曲线上交易,所有人都盼着它触到那个神奇的数字。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)

没有费用分成表,因为没有费用可分。铸造者支付的每一聪 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 事件),本站正是借此核验已关闭发射的确切窗口期。

参考发射

公平铸造池已于 2026-08-05 激活,目前尚无 XCP-69 发射。第一次发射将在此链接为参考代币 — 用于校验你的集成的标准记录:它的公平铸造合约记录应通过上述判定式,它的铸造记录应显示 ≥69 个不同地址,它的流动性池记录应显示已销毁的 LP 位于不可花费地址。

支持与条款

本站展示的所有数据都是公开的链上数据;你在这里看到的一切,都可以自行对照 Counterparty 节点核验。本站只是一个界面,不是任何交易的对手方 — 它从不持有资金,也无法撤销、加速或退款(退款由协议自行处理)。这里没有任何内容构成投资建议;通过 XCP-69 发射的代币可能贬值,也确实会贬值。铸造前请阅读风险披露。