文档

关于 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 储备 ÷ 代币储备。每次兑换都会变动;没有订单簿,也没有做市商。
市值
池子价格 × 流通供应量(已发行减去已销毁)。这是一种惯例,不是承诺 — 池子无法兑付这个数字。
价格影响
你自己的兑换会让价格移动多少。面对固定的储备,兑换量越大,平均价格越差。
滑点
如果在你获得报价与确认之间池子发生了变动,报价与实际成交价之间的差额。

毕业

在其他发射台上,毕业是活跃市场中的一条阈值线:代币在曲线上交易,所有人都盼着它触到那个神奇的数字。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_quantitylp_asset公平铸造合约 消息(ID 90)。铸造是普通的 fairmint 消息,数量为 quantity_by_price 的整份倍数。

一个值得了解的集成陷阱:Counterparty Core 11.3 及以上在 verbose=true 下会返回 pool_quantity_normalizedmax_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 发射的代币可能贬值,也确实会贬值。铸造前请阅读风险披露