在您的代币能够在 Spark 上存在之前,它需要在比特币 L1 上公开且不可变地进行公告。

为此,您广播一个交易,将您的代币标识符和元数据嵌入到 OP_RETURN 输出中,这是比特币交易中允许您附加任意数据的特殊字段。了解更多关于 OP_RETURN。

这是一次性承诺。一旦交易被挖出,您的 LRC-20 代币就被锁定 — 名称、供应量、小数位数和任何其他设置都成为比特币规范历史的一部分。这就像将蓝图刻在石头上 — 一旦设置,就无法回头。

您需要知道的事项

  • 每个发行者钱包只能发行一个代币
  • 公告需要支付比特币网络费用
  • 确认通常需要 1-2 个区块(约 10-20 分钟)
  • 代币元数据在公告后是永久性的
  • 保存公告交易 ID,以便稍后引用

前提条件

步骤 1:获取您的 L1 钱包地址

一旦您的钱包初始化,检索其比特币 L1 地址。这是您将发送资金以支付公告交易费用的地址。

const l1Address = wallet.getTokenL1Address();
console.log(l1Address); // 例如:bc1....

步骤 2:为您的 L1 钱包充值

向上面的地址发送少量 BTC - 约 3-5 美元的价值就足够了。这将用于支付您的代币公告的网络费用,确认应该需要约 >10 分钟。

对于 REGTEST,您可以使用我们的水龙头向您的 REGTEST Spark 钱包存入测试资金。

步骤 3:广播 L1 公告交易

您现在准备好在比特币 L1 上公告您的代币。

可能造成 L1 资金损失
同一钱包在 L1 上多次公告将导致 L1 资金损失。
只有钱包在链上确认的首次公告才会被认为有效。

检查返回的 L1 交易 ID 中的 OP_RETURN 是否包含 LRC20 前缀,以验证链上公告。
参考交易: 链接

const announcementTx = await wallet.announceTokenL1(
  tokenName: "Test Token",
  tokenTicker: "TEST",
  decimals: 8,
  maxSupply: 10000000n,
  isFreezable: true,
);

console.log("公告交易:", announcementTx);

参数

announceTokenL1() 函数接受以下元数据:

参数类型描述
tokenNamestring人类可读的代币名称(例如,“USD Coin”)
tokenTickerstring代币符号(例如,“USDC”)
decimalsnumber小数位数(例如,USDC 为 6,BTC 为 8)
maxSupplybigint基本单位的最大代币供应量。设为 0n 表示无限供应
isFreezeableboolean代币发行后是否可以被冻结

返回值

Promise<string>; // 公告的比特币交易 ID

示例

创建无限供应量代币

const txId = await wallet.announceTokenL1(
  tokenName: "USD Coin",
  tokenTicker: "USDC",
  maxSupply: 0n, // 无限供应
  decimals: 6, // 1 USDC = 1_000_000 基本单位
  isFreezeable: true,
);

console.log("公告交易:", txId);

创建固定供应量代币

// 创建最大供应量为 100 万的代币
const txId = await wallet.announceTokenL1(
  tokenName: "My Fixed Token",
  tokenTicker: "MFT",
  maxSupply: 1_000_000_000_000n, // 1,000,000.000000 代币
  decimals: 6,
  feeRateSatsPerVb: 2,
  isFreezeable: false,
);

console.log("公告交易:", txId);
// 创建最大供应量为 2100 万且最小面额为 0.00000001 的代币
const txId = await wallet.announceTokenL1(
  tokenName: "Example Bitcoin",
  tokenTicker: "ExBTC",
  maxSupply: 2_100_000_000_000_000n,
  decimals: 8,
  feeRateSatsPerVb: 2,
  isFreezeable: false,
);

下一步

一旦您的代币创建完成,您可以铸造一些代币