用途
basket-claim 技能用于从已结算的 PolyBaskets 篮子中领取派彩,整个过程通过 vara-wallet 命令行工具完成。该技能明确要求:在结算最终确定之前不要使用。
前置设置
该技能仅适用于主网(MAINNET ONLY)。在执行任何操作之前,应先运行以下命令设置网络:
vara-wallet config set network mainnet
文档明确提示:绝对不要切换到 testnet,因为 testnet 上没有合约。
相关合约地址与变量配置如下:
BASKET_MARKET="0xea8373e8b4441ef6e95325c1044d23ebf615b43fdef60a48623836a15ca7a25a"
BET_LANE="0x35848dea0ab64f283497deaff93b12fe4d17649624b2cd5149f253ef372b29dc"
FREEBET_LEDGER="0x6b4ad81d13194f8e27f71f4046c6e489b2af2b0b1ce835f390899941034fd979"
_PB="${POLYBASKETS_SKILLS_DIR:-skills}"
IDL="$_PB/idl/polymarket-mirror.idl"
BET_LANE_IDL="$_PB/idl/bet_lane_client.idl"
FREEBET_LEDGER_IDL="$_PB/idl/freebet-ledger.idl"
预检查流程
1. 验证结算已最终确定
调用 GetSettlement 查询结算状态:
vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \
--args '[<basket_id>]' --idl $IDL
结果含义:
status: "Finalized"— 已可领取。status: "Proposed"— 挑战窗口尚未结束,或尚无人执行最终确定。任何人都可以在 challenge_deadline 之后调用 FinalizeSettlement;在此之前需要等待。- 错误
SettlementNotFound— 尚未结算。
解析结算状态的示例:
vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \
--args '[<basket_id>]' --idl $IDL | jq '.result.ok.status'
先获取自己的十六进制地址(actor_id 参数不支持 SS58 格式):
MY_ADDR=$(vara-wallet balance | jq -r .address)
2. 验证持仓存在且未领取
# VARA lane
vara-wallet call $BASKET_MARKET BasketMarket/GetPositions \
--args '["'$MY_ADDR'"]' --idl $IDL | jq '.result[] | select(.basket_id == <basket_id>)'
# native VARA freebet lane
vara-wallet call $BASKET_MARKET BasketMarket/GetFreebetPositions \
--args '["'$MY_ADDR'"]' --idl $IDL | jq '.result[] | select(.basket_id == <basket_id>)'
# BET lane
vara-wallet call $BET_LANE BetLane/GetPosition \
--args '["'$MY_ADDR'", <basket_id>]' --idl $BET_LANE_IDL
检查 claimed: false。
领取操作
VARA Lane
适用于 asset_kind: "Vara" 的篮子:
vara-wallet --account agent call $BASKET_MARKET BasketMarket/Claim --voucher $VOUCHER_ID \
--args '[<basket_id>]' --idl $IDL
返回 u128,即派彩金额,单位为最小 VARA 单位(除以 10^12 得到 VARA)。
对于原生 VARA freebet 持仓,使用同样的 BasketMarket/Claim 方法。合约会将 freebet 本金退回 FreebetLedger,仅将超过原始投入的利润发送到用户钱包。
示例:
# Claim from basket 0
PAYOUT=$(vara-wallet --account agent call $BASKET_MARKET BasketMarket/Claim --voucher $VOUCHER_ID \
--args '[0]' --idl $IDL)
echo "Payout: $PAYOUT"
BET Token Lane
适用于 asset_kind: "Bet" 的篮子:
vara-wallet --account agent call $BET_LANE BetLane/Claim --voucher $VOUCHER_ID \
--args '[<basket_id>]' --idl $BET_LANE_IDL
返回 u256,即派彩金额,单位为 BET token 单位。
示例:
# Claim from basket 1 via BET lane
vara-wallet --account agent call $BET_LANE BetLane/Claim --voucher $VOUCHER_ID \
--args '[1]' --idl $BET_LANE_IDL
派彩计算
公式为:
payout = shares * (settlement_index / entry_index)
payout_per_share 在提案期间已预先计算在 Settlement 结构体中。可以在领取前预览预期派彩:
# Get settlement payout_per_share
SETTLEMENT=$(vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \
--args '[<basket_id>]' --idl $IDL)
echo $SETTLEMENT | jq '.result.ok.payout_per_share'
详细公式与示例参见 ../references/index-math.md。
领取后验证
# Check position is now claimed
vara-wallet call $BASKET_MARKET BasketMarket/GetPositions \
--args '["'$MY_ADDR'"]' --idl $IDL | jq '.result[] | select(.basket_id == <basket_id>) | .claimed'
# Check native freebet position is now claimed, when applicable
vara-wallet call $BASKET_MARKET BasketMarket/GetFreebetPositions \
--args '["'$MY_ADDR'"]' --idl $IDL | jq '.result[] | select(.basket_id == <basket_id>) | .claimed'
# Check freebet principal was returned to ledger, when applicable
vara-wallet call $FREEBET_LEDGER FreebetLedger/BalanceOf \
--args '["'$MY_ADDR'"]' --idl $FREEBET_LEDGER_IDL
# Check VARA balance increased
vara-wallet balance
常见错误
| 错误 | 原因 | 处理 |
|---|---|---|
| SettlementNotFinalized | 结算尚未最终确定 | 等待最终确定 |
| AlreadyClaimed | 该篮子已领取过 | 无需操作 |
| NothingToClaim | 在该篮子中没有持仓 | 验证持仓是否存在 |
| SettlementNotFound | 尚未提出结算 | 等待 settler 提出 |
| TransferFailed | VARA 转账失败 | 检查合约余额,重试 |