jpskill.com
🛠️ 開発・MCP コミュニティ

basket-bet

vara-walletを通じて既存のバスケットにCHIPトークンを使い賭けを行う際に利用し、バスケットの作成や照会、払い戻しの請求には使用しない、主要なエージェントアクションを実行するSkill。

📜 元の英語説明(参考)

Use when the agent needs to claim CHIP tokens and place a bet on an existing basket via vara-wallet. This is the primary agent action. Do not use for basket creation, querying, or claiming payouts.

🇯🇵 日本人クリエイター向け解説

一言でいうと

vara-walletを通じて既存のバスケットにCHIPトークンを使い賭けを行う際に利用し、バスケットの作成や照会、払い戻しの請求には使用しない、主要なエージェントアクションを実行するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o basket-bet.zip https://jpskill.com/download/9662.zip && unzip -o basket-bet.zip && rm basket-bet.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9662.zip -OutFile "$d\basket-bet.zip"; Expand-Archive "$d\basket-bet.zip" -DestinationPath $d -Force; ri "$d\basket-bet.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して basket-bet.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → basket-bet フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Basket Bet

vara-wallet を介して CHIP トークンを請求し、PolyBaskets のバスケットに賭けます。

セットアップ

メインネットのみ。 他の操作を行う前に、vara-wallet config set network mainnet を実行してください。テストネットには絶対に切り替えないでください。そこにはコントラクトがありません。呼び出しが失敗した場合は、エラーをデバッグし、テストネットにフォールバックしないでください。

hex→bytes の自動変換には vara-wallet 0.10+ が必要です。 npm install -g vara-wallet@latest でアップデートしてください。

# メインネットを確認 (デフォルト RPC)
vara-wallet config set network mainnet

BASKET_MARKET="0x1fa6fd12433accef350a68da4555a2a71acab261c4ae9eb713033023fc0775ea"
BET_TOKEN="0xad1a120f24f62eb68537791fe94c3b381e81677e9bd73d811c319838846c27dd"
BET_LANE="0x40dc1597c8e3beb3523f9c05ad2b44e00a11be6e665da20e4323bb7dfae1ecda"
_PB="${POLYBASKETS_SKILLS_DIR:-skills}"
IDL="$_PB/idl/polymarket-mirror.idl"
BET_TOKEN_IDL="$_PB/idl/bet_token_client.idl"
BET_LANE_IDL="$_PB/idl/bet_lane_client.idl"
BET_QUOTE_URL="https://bet-quote-service-production.up.railway.app"
MY_ADDR=$(vara-wallet balance --account agent | jq -r .address)
VOUCHER_URL="https://voucher-backend-production-5a1b.up.railway.app/voucher"

ガスバウチャーの請求 (オンチェーン呼び出しの前に必須)

無料のガスバウチャーを請求します。program フィールドは、コントラクトプログラム ID であり、ウォレットアドレスではありません。

# 3 つのプログラムすべてのバウチャーを請求 (期限切れのバウチャーを更新するためにいつでも再実行)
# ⚠ "program" = ホワイトリストに登録されたコントラクト ID であり、エージェントアドレスではありません
VOUCHER_ID=$(curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BASKET_MARKET"'"}' | jq -r .voucherId)
curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BET_TOKEN"'"}'
curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BET_LANE"'"}'
echo "Voucher: $VOUCHER_ID"

# 後でバウチャーのステータスを確認するには:
# VOUCHER_ID=$(vara-wallet voucher list $MY_ADDR | jq -r '.[0].id // .[0].voucherId')

CHIP レーン (プライマリパス)

ほとんどのバスケットは asset_kind: "Bet" (CHIP トークン) を使用します。これはデフォルトのエージェントワークフローです。

ステップ 1: 毎日の CHIP を請求する

エージェントは毎日無料の CHIP トークンを取得します。連続した日数は、金額を増やすストリークを構築します (基本 100 CHIP、+8.33/日ストリーク、最大 150 CHIP (7 日間の上限))。

# ヘックスアドレスを取得 (actor_id 引数に必要 — SS58 は機能しません)
MY_ADDR=$(vara-wallet balance | jq -r .address)

# バウチャー ID を取得 (最初に請求 — SKILL.md のクイックスタートを参照)
VOUCHER_ID=$(vara-wallet voucher list $MY_ADDR | jq -r '.[0].id // .[0].voucherId')

# 請求が可能かどうか、および取得できる金額を確認
vara-wallet call $BET_TOKEN BetToken/GetClaimPreview \
  --args '["'$MY_ADDR'"]' --idl $BET_TOKEN_IDL

# 毎日の CHIP を請求 (ストリークを構築するために毎日これを行います)
# 注: --voucher はすべての書き込み呼び出しで必須です (エージェントはガス用の VARA を持っていません)
vara-wallet --account agent call $BET_TOKEN BetToken/Claim \
  --args '[]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

レスポンスには、streak_daystotal_claimed が含まれます。ストリークが高いほど、請求ごとの CHIP が多くなります。

ステップ 2: CHIP 残高を確認する

vara-wallet call $BET_TOKEN BetToken/BalanceOf \
  --args '["'$MY_ADDR'"]' --idl $BET_TOKEN_IDL

ステップ 3: バスケットを選択する

アクティブなバスケットを参照して、賭けるバスケットを見つけます。

# 存在するバスケットの数
vara-wallet call $BASKET_MARKET BasketMarket/GetBasketCount --args '[]' --idl $IDL

# 特定のバスケットを表示
vara-wallet call $BASKET_MARKET BasketMarket/GetBasket --args '[0]' --idl $IDL
# ⚠ レスポンスは .ok ではなく、.result.ok の下にネストされています!
# 例: {"result":{"ok":{"id":0,"name":"...","status":"Active","asset_kind":"Bet",...}}}
# jq を使用: | jq '.result.ok'
# 名前とステータスのみを取得するには: | jq '.result.ok | {name, status}'

status"Active" であり、asset_kind"Bet" であることを確認してください。バスケットデータは、JSON レスポンスの .result.ok にあります。

重要: PlaceBetbasket_id は、16 進プログラム ID ではなく、プレーンな整数 (例: 012) です。

ステップ 4: CHIP の使用を承認する

BetLane コントラクトが CHIP を使用できるようにします。

vara-wallet --account agent call $BET_TOKEN BetToken/Approve \
  --args '["'$BET_LANE'", <amount>]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

注: Approve は "result":false を返します — これは正常であり、以前の承認状態です (エラーではありません)。必要に応じて BetToken/Allowance で確認してください。

ステップ 5: 署名付きの見積もりを取得 + ベットを配置

ベットには、bet-quote-service からの署名付きの見積もりが必要です。見積もりサービスは、ライブ Polymarket 価格を取得し、インデックスを計算し、ペイロードに署名します。コントラクトは、オンチェーンで署名を確認します。

オールインワンコマンド (見積もりを取得 + ベットを配置 — 30 秒の見積もり有効期限内に収まるように、一緒に実行する必要があります):

# <BASKET_ID> と <AMOUNT_RAW> を実際の値に置き換えます
QUOTE=$(curl -s -X POST "$BET_QUOTE_URL/api/bet-lane/quote" \
  -H 'Content-Type: application/json' \
  -d '{"user":"'"$MY_ADDR"'","basketId":<BASKET_ID>,"amount":"<AMOUNT_RAW>","targetProgramId":"'"$BET_LANE"'"}') && \
echo "$QUOTE" | jq -e '.payload' >/dev/null 2>&1 || { echo "Quote failed: $QUOTE"; exit 1; } && \
vara-wallet --account agent call $BET_LANE BetLane/PlaceBet \
  --args "[<BASKET_ID>, \"<AMOUNT_RAW>\", $QUOTE]" \
  --voucher $VOUCHER_ID --idl $BET_LANE_IDL

仕組み: vara-wallet 0.10+ は、16 進署名 ("0x...") を vec u8 フィールドのバイト配列に自動変換します。手動変換は不要です — curl からの生の引用 JSON を --args に直接渡すだけです。

ベットを配置するための重要なルール:

  1. 見積もりオブジェクトを手動で再構築しないでください。 見積もりには {"payload": {...}, "signature": "0x..."} 構造があります — payload ラッパーなしで再構築すると、コントラクトは InvalidIndexAtCreation で拒否します。
  2. vara-wallet 0.10+ が必要です。 古いバージョンでは、手動で hex→bytes 変換が必要です。vara-wallet --version で確認してください。

見積もりは 30 秒間有効です。期限切れになった場合は、新しい見積もりをリクエストしてください。各見積もりには一意の

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Basket Bet

Claim CHIP tokens and bet on a PolyBaskets basket via vara-wallet.

Setup

MAINNET ONLY. Run vara-wallet config set network mainnet before anything else. NEVER switch to testnet — there are no contracts there. If a call fails, debug the error, do not fall back to testnet.

Requires vara-wallet 0.10+ for hex→bytes auto-conversion. Update with: npm install -g vara-wallet@latest

# Ensure mainnet (default RPC)
vara-wallet config set network mainnet

BASKET_MARKET="0x1fa6fd12433accef350a68da4555a2a71acab261c4ae9eb713033023fc0775ea"
BET_TOKEN="0xad1a120f24f62eb68537791fe94c3b381e81677e9bd73d811c319838846c27dd"
BET_LANE="0x40dc1597c8e3beb3523f9c05ad2b44e00a11be6e665da20e4323bb7dfae1ecda"
_PB="${POLYBASKETS_SKILLS_DIR:-skills}"
IDL="$_PB/idl/polymarket-mirror.idl"
BET_TOKEN_IDL="$_PB/idl/bet_token_client.idl"
BET_LANE_IDL="$_PB/idl/bet_lane_client.idl"
BET_QUOTE_URL="https://bet-quote-service-production.up.railway.app"
MY_ADDR=$(vara-wallet balance --account agent | jq -r .address)
VOUCHER_URL="https://voucher-backend-production-5a1b.up.railway.app/voucher"

Claim Gas Voucher (required before any on-chain call)

Claim a free gas voucher. The program field is the contract program ID, NOT your wallet address.

# Claim voucher for all 3 programs (re-run anytime to renew expired vouchers)
# ⚠ "program" = whitelisted contract ID, NOT your agent address
VOUCHER_ID=$(curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BASKET_MARKET"'"}' | jq -r .voucherId)
curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BET_TOKEN"'"}'
curl -s -X POST "$VOUCHER_URL" \
  -H 'Content-Type: application/json' \
  -d '{"account":"'"$MY_ADDR"'","program":"'"$BET_LANE"'"}'
echo "Voucher: $VOUCHER_ID"

# To check voucher status later:
# VOUCHER_ID=$(vara-wallet voucher list $MY_ADDR | jq -r '.[0].id // .[0].voucherId')

CHIP Lane (Primary Path)

Most baskets use asset_kind: "Bet" (CHIP tokens). This is the default agent workflow.

Step 1: Claim Daily CHIP

Agents get free CHIP tokens every day. Consecutive days build a streak that increases the amount (100 CHIP base, +8.33/day streak, max 150 CHIP at 7-day cap).

# Get your hex address (required for actor_id args — SS58 won't work)
MY_ADDR=$(vara-wallet balance | jq -r .address)

# Get your voucher ID (claim one first — see Quick Start in SKILL.md)
VOUCHER_ID=$(vara-wallet voucher list $MY_ADDR | jq -r '.[0].id // .[0].voucherId')

# Check if claim is available and how much you'll get
vara-wallet call $BET_TOKEN BetToken/GetClaimPreview \
  --args '["'$MY_ADDR'"]' --idl $BET_TOKEN_IDL

# Claim daily CHIP (do this every day to build streak)
# NOTE: --voucher is required on ALL write calls (agent has no VARA for gas)
vara-wallet --account agent call $BET_TOKEN BetToken/Claim \
  --args '[]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

The response includes your streak_days and total_claimed. Higher streak = more CHIP per claim.

Step 2: Check CHIP Balance

vara-wallet call $BET_TOKEN BetToken/BalanceOf \
  --args '["'$MY_ADDR'"]' --idl $BET_TOKEN_IDL

Step 3: Pick a Basket

Browse active baskets and find one to bet on:

# How many baskets exist
vara-wallet call $BASKET_MARKET BasketMarket/GetBasketCount --args '[]' --idl $IDL

# View a specific basket
vara-wallet call $BASKET_MARKET BasketMarket/GetBasket --args '[0]' --idl $IDL
# ⚠ Response is nested under .result.ok — NOT .ok!
# Example: {"result":{"ok":{"id":0,"name":"...","status":"Active","asset_kind":"Bet",...}}}
# Use jq: | jq '.result.ok'
# To get just name and status: | jq '.result.ok | {name, status}'

Check that status is "Active" and asset_kind is "Bet". The basket data is at .result.ok in the JSON response.

Important: The basket_id for PlaceBet is a plain integer (e.g., 0, 1, 2), not the hex program ID.

Step 4: Approve CHIP Spend

Allow the BetLane contract to spend your CHIP:

vara-wallet --account agent call $BET_TOKEN BetToken/Approve \
  --args '["'$BET_LANE'", <amount>]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

Note: Approve returns "result":false — this is normal, it's the previous approval state (not an error). Verify with BetToken/Allowance if needed.

Step 5: Get Signed Quote + Place Bet

Bets require a signed quote from the bet-quote-service. The quote service fetches live Polymarket prices, computes the index, and signs the payload. The contract verifies the signature on-chain.

All-in-one command (get quote + place bet — must run together to stay within 30-second quote expiry):

# Replace <BASKET_ID> and <AMOUNT_RAW> with real values
QUOTE=$(curl -s -X POST "$BET_QUOTE_URL/api/bet-lane/quote" \
  -H 'Content-Type: application/json' \
  -d '{"user":"'"$MY_ADDR"'","basketId":<BASKET_ID>,"amount":"<AMOUNT_RAW>","targetProgramId":"'"$BET_LANE"'"}') && \
echo "$QUOTE" | jq -e '.payload' >/dev/null 2>&1 || { echo "Quote failed: $QUOTE"; exit 1; } && \
vara-wallet --account agent call $BET_LANE BetLane/PlaceBet \
  --args "[<BASKET_ID>, \"<AMOUNT_RAW>\", $QUOTE]" \
  --voucher $VOUCHER_ID --idl $BET_LANE_IDL

How it works: vara-wallet 0.10+ auto-converts the hex signature ("0x...") to a byte array for vec u8 fields. No manual conversion needed — just pass the raw quote JSON from curl directly into --args.

CRITICAL rules for placing bets:

  1. Do NOT manually reconstruct the quote object. The quote has a {"payload": {...}, "signature": "0x..."} structure — if you rebuild it without the payload wrapper, the contract will reject it with InvalidIndexAtCreation.
  2. Requires vara-wallet 0.10+. Older versions need manual hex→bytes conversion. Check with vara-wallet --version.

The quote is valid for 30 seconds. If it expires, request a new one. Each quote has a unique nonce and can only be used once.

Returns u256 -- shares received.

Complete CHIP Lane Example

# 0. Vars are set in the Setup block above. If starting fresh:
# MY_ADDR=$(vara-wallet balance --account agent | jq -r .address)
# VOUCHER_ID=$(vara-wallet voucher list $MY_ADDR | jq -r '.[0].id // .[0].voucherId')

# 1. Claim daily CHIP
vara-wallet --account agent call $BET_TOKEN BetToken/Claim \
  --args '[]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

# 2. Approve BetLane to spend 100 CHIP
vara-wallet --account agent call $BET_TOKEN BetToken/Approve \
  --args '["'$BET_LANE'", "100000000000000"]' --voucher $VOUCHER_ID --idl $BET_TOKEN_IDL

# 3. Get quote + place bet (30s expiry — run together!)
# ⚠ Do NOT manually reconstruct the quote. Pass the raw curl response directly.
QUOTE=$(curl -s -X POST "$BET_QUOTE_URL/api/bet-lane/quote" \
  -H 'Content-Type: application/json' \
  -d '{"user":"'"$MY_ADDR"'","basketId":0,"amount":"100000000000000","targetProgramId":"'"$BET_LANE"'"}') && \
vara-wallet --account agent call $BET_LANE BetLane/PlaceBet \
  --args "[0, \"100000000000000\", $QUOTE]" \
  --voucher $VOUCHER_ID --idl $BET_LANE_IDL

# 5. Verify position
vara-wallet call $BET_LANE BetLane/GetPosition \
  --args '["'$MY_ADDR'", 0]' --idl $BET_LANE_IDL

Important: CHIP has 12 decimals. 100 CHIP = 100000000000000 (100 * 10^12) in raw units.

How the Quote Works

The agent does NOT calculate index_at_creation_bps manually anymore. The bet-quote-service:

  1. Reads the basket from chain (validates it's active + Bet kind)
  2. Fetches live Polymarket prices for each outcome
  3. Computes the weighted quoted_index_bps
  4. Signs the payload with SR25519 (includes user, basket_id, amount, deadline, nonce)
  5. Returns the signed quote

The BetLane contract verifies the signature on-chain. This prevents price manipulation.

Quote properties:

  • Valid for 30 seconds (deadline_ms)
  • One-time use (nonce prevents replay)
  • Bound to specific user, basket, and amount

See ../references/index-math.md for payout formula: payout = shares * (settlement_index / entry_index).

VARA Lane (asset_kind: Vara)

Some baskets accept native VARA instead of CHIP. Check basket's asset_kind.

# Bet 100 VARA on basket 0 at index 6120
vara-wallet --account agent call $BASKET_MARKET BasketMarket/BetOnBasket \
  --args '[0, 6120]' \
  --value 100 \
  --idl $IDL

Returns u128 — shares received (equal to VARA sent in minimal units).

Note: VARA lane may be disabled on some deployments. Check with:

vara-wallet call $BASKET_MARKET BasketMarket/IsVaraEnabled --args '[]' --idl $IDL

After Betting

Check your position (use BetLane/GetPosition, NOT GetUserPositions which doesn't exist):

vara-wallet call $BET_LANE BetLane/GetPosition \
  --args '["'$MY_ADDR'", <BASKET_ID>]' --idl $BET_LANE_IDL
  • Wait for settlement, then claim payout: ../basket-claim/SKILL.md
  • Come back tomorrow for more CHIP: repeat Step 1

Common Errors

Error Cause Fix
InvalidIndexAtCreation Malformed quote struct (missing payload wrapper) Do NOT manually reconstruct the quote — pipe the raw curl response through python3
InvalidQuoteSignature Quote not signed by configured signer Check bet-quote-service config
QuoteExpired Quote older than 30 seconds Request a fresh quote
QuoteNonceAlreadyUsed Same quote submitted twice Request a new quote for each bet
QuoteTargetMismatch Quote was for a different BetLane Check targetProgramId matches $BET_LANE
InvalidBetAmount No --value attached (VARA lane) Add --value <amount>
BasketNotActive Basket in settlement/settled Cannot bet on non-active baskets
BasketAssetMismatch Wrong lane for basket Check basket's asset_kind
VaraDisabled VARA betting off Use CHIP lane instead
AmountBelowMinBet CHIP amount too low Check BetLane config for min_bet
AmountAboveMaxBet CHIP amount too high Check BetLane config for max_bet
BetTokenTransferFromFailed Insufficient CHIP balance or approval Claim more tokens or increase approval