Learn-skills.dev basket-settle
Use when the agent has the settler role and needs to propose or finalize a basket settlement via vara-wallet. Do not use without settler role permissions. Do not use for regular user actions.
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/adityaakr/polybaskets/basket-settle" ~/.claude/skills/neversight-learn-skills-dev-basket-settle && rm -rf "$T"
manifest:
data/skills-md/adityaakr/polybaskets/basket-settle/SKILL.mdsource content
Basket Settle
Propose and finalize settlement for PolyBaskets baskets. Requires the settler role.
Setup
MAINNET ONLY. Run
vara-wallet config set network mainnet before anything else. NEVER switch to testnet — there are no contracts there.
vara-wallet config set network mainnet BASKET_MARKET="0x1fa6fd12433accef350a68da4555a2a71acab261c4ae9eb713033023fc0775ea" _PB="${POLYBASKETS_SKILLS_DIR:-skills}" IDL="$_PB/idl/polymarket-mirror.idl"
Verify Settler Role
Only the address assigned as
settler_role in the contract config can call settlement methods.
# Check who has settler role vara-wallet call $BASKET_MARKET BasketMarket/GetConfig --args '[]' --idl $IDL | jq '.settler_role' # Check agent's address vara-wallet wallet list | jq -r '.[0].address'
If your address does not match
settler_role, you cannot settle. Contact the admin.
Settlement Flow
1. Check basket is Active 2. Verify all items have resolved on Polymarket 3. ProposeSettlement → starts 12-minute challenge window 4. Wait for challenge_deadline to pass 5. FinalizeSettlement → basket becomes Settled, users can claim
Step 1: Check Basket Status
vara-wallet call $BASKET_MARKET BasketMarket/GetBasket \ --args '[<basket_id>]' --idl $IDL | jq '.result.ok.status'
Must be
"Active".
Step 2: Check Polymarket Resolution
For each item in the basket, check if the market has resolved on Polymarket:
curl -s "https://gamma-api.polymarket.com/markets?slug=<poly_slug>" | jq '.[0] | {closed, outcomePrices}'
All items must be resolved (
closed: true) with final prices near 0 or 1.
Step 3: Propose Settlement
Build the
item_resolutions array — one ItemResolution per basket item:
{ "item_index": 0, "resolved": "YES", "poly_slug": "will-btc-hit-100k", "poly_condition_id": "0xabc123...", "poly_price_yes": 9900, "poly_price_no": 100 }
Rules:
- Provide exactly one resolution per basket item
is 0-based, must be unique, and within basket items rangeitem_index
must match the basket item's slug exactlypoly_slug
+poly_price_yes
should reflect final Polymarket prices in bpspoly_price_no
is the final outcome:resolved
or"YES""NO"
is optionalpoly_condition_id
Example: Propose settlement for a 2-item basket
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
After proposal, the basket enters
SettlementPending status and the 12-minute challenge window begins.
Step 4: Wait for Challenge Window
# Check challenge deadline vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \ --args '[<basket_id>]' --idl $IDL | jq '.result.ok | {status, challenge_deadline, proposed_at}'
The
challenge_deadline is a block timestamp. The liveness window is configured in liveness_ms (default 720000ms = 12 minutes).
Wait until the current block timestamp exceeds
challenge_deadline.
Step 5: Finalize Settlement
vara-wallet --account agent call $BASKET_MARKET BasketMarket/FinalizeSettlement --voucher $VOUCHER_ID \ --args '[<basket_id>]' --idl $IDL
After finalization:
- Basket status becomes
Settled
is setfinalized_at- Users can now claim payouts via
../basket-claim/SKILL.md
Verify
vara-wallet call $BASKET_MARKET BasketMarket/GetSettlement \ --args '[<basket_id>]' --idl $IDL | jq '.result.ok | {status, payout_per_share, finalized_at}'
Common Errors
| Error | Cause | Fix |
|---|---|---|
| Not the settler role | Check config for settler_role address |
| Basket already in settlement | Check status |
| Already proposed | Wait and finalize |
| Wrong number of resolutions | Provide one per item |
| Slug doesn't match basket item | Use exact slug from basket |
| Same item_index twice | Make indices unique |
| Index >= items count | Use 0 to items.length-1 |
| Too early to finalize | Wait for challenge window |
| No proposal exists | Propose first |
| Settlement not yet finalized | Call FinalizeSettlement after challenge window |