测试前先定义这些变量:
# 地址
btcAddress="<你的_BTC_地址>"
dogeAddress="<你的_DOGE_地址>"
# 代币信息(测试过程中会生成)
TICK_ID="" # deploy 后获得
DEPLOY_PIN_ID="" # deploy PIN ID
MINT_PIN_1="" # 第一个 mint PIN
ASSET_OUTPOINT="" # 要 teleport 的 UTXO (格式: txid:vout)
ARRIVAL_PIN_ID="" # arrival PIN ID路径: /ft/mrc20/deploy
Body:
{
"p": "mrc-20",
"op": "deploy",
"tick": "TEST",
"max": "21000000",
"lim": "1000",
"dec": "8"
}创建命令:
# 使用你的工具创建 deploy PIN
# 创建后记录:
DEPLOY_PIN_ID="<pin_id>"
TICK_ID="<genesis_tx_id>"验证:
curl "http://localhost:7777/api/mrc20/tick/info/${TICK_ID}"路径: /ft/mrc20/mint
Body:
{
"p": "mrc-20",
"op": "mint",
"id": "${TICK_ID}",
"vout": 0
}创建命令:
# Mint 1
# 创建 mint PIN (会生成 1000 个代币)
MINT_PIN_1="<pin_id_1>"
MINT_TX_1="<tx_id_1>"
# Mint 2
MINT_PIN_2="<pin_id_2>"
MINT_TX_2="<tx_id_2>"
# Mint 3
MINT_PIN_3="<pin_id_3>"
MINT_TX_3="<tx_id_3>"
# 挖矿确认
bitcoin-cli -regtest generatetoaddress 1 $btcAddress验证:
# 应该看到 3000 个 TEST 代币
curl "http://localhost:7777/api/mrc20/address/balance/${btcAddress}?chain=btc"预期输出:
{
"code": 1,
"data": {
"list": [{
"name": "TEST",
"balance": "3000",
"pendingInBalance": "0",
"pendingOutBalance": "0"
}]
}
}路径: /ft/mrc20/arrival
Body:
{
"p": "mrc-20",
"op": "arrival",
"id": "${TICK_ID}",
"chain": "doge",
"amount": "500",
"to": "${dogeAddress}",
"assetOutpoint": "${ASSET_OUTPOINT}"
}准备工作:
# 1. 先获取要转移的 UTXO
# 假设使用第一个 mint 的输出
ASSET_OUTPOINT="${MINT_TX_1}:0"
# 2. 创建 arrival.json
cat > arrival.json <<'EOF'
{
"p": "mrc-20",
"op": "arrival",
"id": "TICK_ID_HERE",
"chain": "doge",
"amount": "500",
"to": "DOGE_ADDRESS_HERE",
"assetOutpoint": "ASSET_OUTPOINT_HERE"
}
EOF
# 3. 替换占位符
sed -i "s/TICK_ID_HERE/${TICK_ID}/g" arrival.json
sed -i "s/DOGE_ADDRESS_HERE/${dogeAddress}/g" arrival.json
sed -i "s/ASSET_OUTPOINT_HERE/${ASSET_OUTPOINT}/g" arrival.json创建命令:
# 在 DOGE 链创建 arrival PIN
# 使用你的工具创建
ARRIVAL_PIN_ID="<arrival_pin_id>"
ARRIVAL_TX_ID="<arrival_tx_id>"
# 挖矿确认(DOGE 链)
dogecoin-cli -regtest generatetoaddress 1 $dogeAddress验证:
# 检查 arrival 是否被索引
curl "http://localhost:7777/api/mrc20/admin/teleport/check-arrival/${ARRIVAL_PIN_ID}"路径: /ft/mrc20/transfer
Body:
{
"p": "mrc-20",
"op": "transfer",
"id": "${TICK_ID}",
"data": [
{
"type": "teleport",
"chain": "doge",
"amount": "500",
"coord": "${ARRIVAL_PIN_ID}"
}
]
}准备工作:
# 创建 teleport.json
cat > teleport.json <<'EOF'
{
"p": "mrc-20",
"op": "transfer",
"id": "TICK_ID_HERE",
"data": [
{
"type": "teleport",
"chain": "doge",
"amount": "500",
"coord": "ARRIVAL_PIN_ID_HERE"
}
]
}
EOF
# 替换占位符
sed -i "s/TICK_ID_HERE/${TICK_ID}/g" teleport.json
sed -i "s/ARRIVAL_PIN_ID_HERE/${ARRIVAL_PIN_ID}/g" teleport.json创建命令:
# 在 BTC 链创建 teleport PIN
# ⚠️ 重要:这个交易必须花费 ASSET_OUTPOINT 对应的 UTXO
# 使用你的工具创建,指定要花费的 UTXO
TELEPORT_TX_ID="<teleport_tx_id>"
# ⚠️ 不要立即挖矿!先验证 mempool 阶段curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${btcAddress}&tickId=${TICK_ID}&chain=btc"期望:
{
"balance": "3000",
"pendingIn": "0",
"pendingOut": "0"
}BTC 链(源链):
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${btcAddress}&tickId=${TICK_ID}&chain=btc"期望:
{
"balance": "2500", // ✅ 减少了 500
"pendingIn": "0",
"pendingOut": "500" // ✅ 增加了 500
}DOGE 链(目标链):
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${dogeAddress}&tickId=${TICK_ID}&chain=doge"期望:
{
"balance": "0",
"pendingIn": "500", // ✅ 增加了 500
"pendingOut": "0"
}# 挖矿确认 BTC 交易
bitcoin-cli -regtest generatetoaddress 1 $btcAddress
sleep 5BTC 链(源链):
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${btcAddress}&tickId=${TICK_ID}&chain=btc"期望:
{
"balance": "2500", // ✅ 保持 2500
"pendingIn": "0",
"pendingOut": "0" // ✅ 清零
}DOGE 链(目标链):
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${dogeAddress}&tickId=${TICK_ID}&chain=doge"期望:
{
"balance": "500", // ✅ 增加了 500
"pendingIn": "0", // ✅ 清零
"pendingOut": "0"
}curl "http://localhost:7777/api/mrc20/admin/verify/supply/${TICK_ID}"期望:
{
"status": "✅ PASSED",
"totalUtxo": "3000",
"totalBalance": "3000",
"totalPendingOut": "0",
"totalPendingIn": "0",
"utxoByChain": {
"btc": "2500",
"doge": "500"
},
"errors": [],
"warnings": []
}tail -f app.log | grep "💡"期望看到:
[API] 💡 使用 UTXO 实时计算余额: address=xxx, chain=btc
[Balance] Calculated from UTXO: chain=btc, address=xxx, tick=TEST, balance=2500, pendingOut=0, pendingIn=0
[TeleportV2] 💡 余额通过UTXO状态实时计算: Balance = Available, PendingOut = TeleportPending
tail -f app.log | grep "TeleportV2"期望看到:
[TeleportV2] 🚀 Processing: id=xxx, coord=xxx, txId=xxx
[TeleportV2] ✨ Created new transaction: xxx
[TeleportV2] Pre-check: Verifying arrival exists before locking
[TeleportV2] ✅ Pre-check passed: arrival=xxx
[TeleportV2] ✅ Source UTXO locked: xxx
[TeleportV2] ✅ Arrival verified: coord=xxx
[TeleportV2] 🎉 Teleport completed: id=xxx
原因: Arrival PIN 还未被索引或 coord 不正确
解决:
# 1. 检查 arrival 是否存在
curl "http://localhost:7777/api/mrc20/admin/teleport/check-arrival/${ARRIVAL_PIN_ID}"
# 2. 如果不存在,等待几秒后重试
sleep 5
# 3. 检查索引高度
curl "http://localhost:7777/api/mrc20/admin/index-height/doge"原因: ASSET_OUTPOINT 不正确或已被花费
解决:
# 检查 UTXO 状态
curl "http://localhost:7777/api/mrc20/tx/history?txId=${MINT_TX_1}&index=0"原因: Teleport 和 Arrival 的 amount 不一致
解决: 确保两边的 amount 完全一致(都是 "500")
你可以创建一个自动化测试脚本:
#!/bin/bash
# 设置变量
btcAddress="你的BTC地址"
dogeAddress="你的DOGE地址"
# 1. Deploy
echo "Creating deploy PIN..."
# 你的 deploy 命令
TICK_ID="获取的tick_id"
# 2. Mint
echo "Minting tokens..."
# 你的 mint 命令(3次)
bitcoin-cli -regtest generatetoaddress 1 $btcAddress
# 3. 验证 Mint
echo "Verifying mint..."
curl "http://localhost:7777/api/mrc20/address/balance/${btcAddress}?chain=btc" | jq '.data.list[0].balance'
# 4. Teleport
ASSET_OUTPOINT="${MINT_TX_1}:0"
echo "Creating arrival PIN..."
# 你的 arrival 命令
ARRIVAL_PIN_ID="获取的arrival_pin_id"
dogecoin-cli -regtest generatetoaddress 1 $dogeAddress
echo "Creating teleport PIN..."
# 你的 teleport 命令
# 5. 验证 Mempool
sleep 5
echo "Checking mempool balances..."
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${btcAddress}&tickId=${TICK_ID}&chain=btc" | jq '.data'
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${dogeAddress}&tickId=${TICK_ID}&chain=doge" | jq '.data'
# 6. 挖矿确认
bitcoin-cli -regtest generatetoaddress 1 $btcAddress
sleep 5
# 7. 验证 Block
echo "Checking final balances..."
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${btcAddress}&tickId=${TICK_ID}&chain=btc" | jq '.data'
curl "http://localhost:7777/api/mrc20/tick/AddressBalance?address=${dogeAddress}&tickId=${TICK_ID}&chain=doge" | jq '.data'
# 8. 资产验证
echo "Verifying total supply..."
curl "http://localhost:7777/api/mrc20/admin/verify/supply/${TICK_ID}" | jq '.data | {status, totalBalance, totalUtxo}'
echo "Test completed!"准备好开始测试了吗? 🚀