在您的代币能够在 Spark 上存在之前,它需要在比特币 L1 上公开且不可变地进行公告。
为此,您广播一个交易,将您的代币标识符和元数据嵌入到 OP_RETURN 输出中,这是比特币交易中允许您附加任意数据的特殊字段。了解更多关于 OP_RETURN。
这是一次性承诺。一旦交易被挖出,您的 BTKN 代币就被锁定 — 名称、供应量、小数位数和任何其他设置都成为比特币规范历史的一部分。这就像将蓝图刻在石头上 — 一旦设置,就无法回头。
您需要知道的事项
- 每个发行者钱包只能发行一个代币
- 公告需要支付比特币网络费用
- 确认通常需要 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()
函数接受以下元数据:
参数 | 类型 | 描述 |
---|
tokenName | string | 人类可读的代币名称(例如,“USD Coin”) |
tokenTicker | string | 代币符号(例如,“USDC”) |
decimals | number | 小数位数(例如,USDC 为 6,BTC 为 8) |
maxSupply | bigint | 基本单位的最大代币供应量。设为 0n 表示无限供应 |
isFreezeable | boolean | 代币发行后是否可以被冻结 |
返回值
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,
);
下一步
一旦您的代币创建完成,您可以铸造一些代币。