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を入力して読み込まれたか確認します。
詳細
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 を 1 つ指定します。
{
"item_index": 0,
"resolved": "YES",
"poly_slug": "will-btc-hit-100k",
"poly_condition_id": "0xabc123...",
"poly_price_yes": 9900,
"poly_price_no": 100
}
ルール:
- バスケット内の各アイテムにつき、解決情報を必ず 1 つ指定します
item_indexは 0 始まりで、一意であり、バスケット内のアイテム数の範囲内である必要がありますpoly_slugはバスケットアイテムのスラッグと完全に一致する必要がありますpoly_price_yes+poly_price_noには、bps 単位の 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 | 解決情報の数が正しくありません | アイテムごとに 1 つ指定してください |
ResolutionSlugMismatch | スラッグがバスケットアイテムと一致しません | バスケットに記載されたスラッグをそのまま使用してください |
DuplicateResolutionIndex | 同じ item_index が 2 回指定されています | インデックスを一意にしてください |
ResolutionIndexOutOfBounds | インデックスがアイテム数以上です | 0 から items.length-1 までの値を使用してください |
ChallengeDeadlineNotPassed | 確定するには時期が早すぎます | チャレンジ期間が過ぎるまで待ってください |
SettlementNotProposed | 提案がありません | 先に提案してください |