关于 basket-settle
basket-settle 是用于在 Vara Network 结算 PolyBaskets 篮子的操作技能,指导结算者核对市场结果、提交提案,并在挑战期后完成结算。
主要功能
- 01检查篮子状态和 Polymarket 结果
- 02提交包含逐项结果的结算提案
- 03查看挑战截止时间
- 04完成待处理的结算
- 05核实付款和最终状态
适用场景
- 01所有市场结算后处理篮子
- 02挑战期结束后完成已有提案
- 03排查权限或结果数据错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ adityaakr/ polybaskets --skill basket-settle安装后在 Claude Code 中输入/basket-settle确认已加载。
详细介绍
篮子结算
为 PolyBaskets 篮子提议并完成结算。ProposeSettlement 需要 settler 角色。FinalizeSettlement 不需要 settler 角色,但只能在挑战截止时间过后执行。
设置
仅限主网。 执行任何操作前,先运行 vara-wallet config set network mainnet。切勿切换到测试网——那里没有合约。
vara-wallet config set network mainnet
BASKET_MARKET="0xea8373e8b4441ef6e95325c1044d23ebf615b43fdef60a48623836a15ca7a25a"
_PB="${POLYBASKETS_SKILLS_DIR:-skills}"
IDL="$_PB/idl/polymarket-mirror.idl"
验证 Settler 角色
只有合约配置中指定为 settler_role 的地址才能调用 ProposeSettlement。
# Check who has settler role
vara-wallet call $BASKET_MARKET BasketMarket/GetConfig --args '[]' --idl $IDL | jq -r '.result.settler_role'
# Check agent's hex actor id
MY_ADDR=$(vara-wallet balance --account agent | jq -r .address)
echo "$MY_ADDR"
如果你的地址与 settler_role 不匹配,就无法提议新结算。你仍可在 challenge_deadline 过后完成已提议的结算。
结算流程
1. Check basket is Active
2. Verify all items have resolved on Polymarket
3. ProposeSettlement → starts the configured challenge window
4. Wait for challenge_deadline to pass
5. FinalizeSettlement → basket becomes Settled, users can claim
第 1 步:检查篮子状态
vara-wallet call $BASKET_MARKET BasketMarket/GetBasket \
--args '[<basket_id>]' --idl $IDL | jq '.result.ok.status'
状态必须为 "Active"。
第 2 步:检查 Polymarket 的结果
检查篮子中的每个项目,确认其市场是否已在 Polymarket 上结算:
curl -s "https://gamma-api.polymarket.com/markets?slug=<poly_slug>" | jq '.[0] | {closed, outcomePrices}'
所有项目都必须已结算(closed: true),且最终价格接近 0 或 1。
第 3 步:提议结算
构建 item_resolutions 数组——每个篮子项目对应一个 ItemResolution:
{
"item_index": 0,
"resolved": "YES",
"poly_slug": "will-btc-hit-100k",
"poly_condition_id": "0xabc123...",
"poly_price_yes": 9900,
"poly_price_no": 100
}
规则:
- 每个篮子项目必须且只能提供一个结算结果
item_index从 0 开始,必须唯一,且在篮子项目索引范围内poly_slug必须与篮子项目的 slug 完全匹配poly_price_yes+poly_price_no应反映 Polymarket 的最终价格(单位为基点)resolved是最终结果:"YES"或"NO"poly_condition_id为可选项
示例:为包含 2 个项目的篮子提议结算
vara-wallet --account agent call $BASKET_MARKET BasketMarket/ProposeSettlement --voucher $VOUCHER_ID \
--args '[
0,
[
{
"item_index": 0,
"resolved": "YES",
"poly_slug": "will-btc-hit-100k",
"poly_condition_id": null,
"poly_price_yes": 9900,
"poly_price_no": 100
},
{
"item_index": 1,
"resolved": "NO",
"poly_slug": "will-eth-hit-5k",
"poly_condition_id": null,
"poly_price_yes": 200,
"poly_price_no": 9800
}
],
"Resolved via Polymarket API"
]' \
--idl $IDL
提议后,篮子状态会变为 SettlementPending,并开始配置的挑战期。
第 4 步:等待挑战期结束
# Check challenge deadline
vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \
--args '[<basket_id>]' --idl $IDL | jq '.result.ok | {status, challenge_deadline, proposed_at}'
challenge_deadline 是区块时间戳。存活期在 BasketMarket/GetConfig.liveness_ms 中配置;不要将其时长硬编码。
等待当前区块时间戳超过 challenge_deadline。
第 5 步:完成结算
vara-wallet --account agent call $BASKET_MARKET BasketMarket/FinalizeSettlement --voucher $VOUCHER_ID \
--args '[<basket_id>]' --idl $IDL
完成结算后:
- 篮子状态变为
Settled - 设置
finalized_at - 用户现在可以通过
../basket-claim/SKILL.md领取赔付
验证
vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \
--args '[<basket_id>]' --idl $IDL | jq '.result.ok | {status, payout_per_share, finalized_at}'
常见错误
| 错误 | 原因 | 修复方法 |
|---|---|---|
Unauthorized | 调用 ProposeSettlement 的地址不是 settler 角色 | 在配置中检查 settler_role 地址 |
BasketNotActive | 篮子已进入结算流程 | 检查状态 |
SettlementAlreadyExists | 已提议结算 | 等待后完成结算 |
InvalidResolutionCount | 结算结果数量不正确 | 每个项目提供一个结算结果 |
ResolutionSlugMismatch | slug 与篮子项目不匹配 | 使用篮子中的确切 slug |
DuplicateResolutionIndex | 同一个 item_index 出现两次 | 确保索引唯一 |
ResolutionIndexOutOfBounds | 索引 >= 项目数量 | 使用 0 到 items.length-1 之间的索引 |
ChallengeDeadlineNotPassed | 完成结算的时间过早 | 等待挑战期结束 |
SettlementNotProposed | 不存在结算提议 | 先提议结算 |
评论
支持 Markdown