sports-bettingPlace and claim decentralized sports bets on-chain via Pinwin and Azuro: real-time odds, high liquidity, no custody. Fetch prematch and live games from the d...
Install via ClawdBot CLI:
clawdbot install skinnynoizze/sports-bettingPlace and claim decentralized sports bets on Polygon via Pinwin and Azuro, with on-chain execution. The agent fetches prematch and live games from the data-feed, you pick a selection, then it calls Pinwin, signs (and optionally approves USDT), and submits.
Invocation: This skill is invocation-only: the assistant will not use it unless you explicitly ask (e.g. “place a bet with Pinwin”) or use the slash command. That avoids accidental bets.
/sports_betting (or /skill sports-betting) and optionally add your request, e.g. /sports_betting place 5 USDT on the first Premier League game or /sports_betting show my bets.first), order (turnover vs startsAt), sport/country/league filters, and which selection you want. It should not suggest or pick a bet unless you explicitly ask for a suggestion (meaningful suggestions would require external data, e.g. news or stats, and could be a separate skill)./agent/bet → approve token if needed → sign EIP-712 → POST signature to returned apiUrl.isRedeemable && !isRedeemed, call Pinwin /agent/claim with those betIds → sign and send the returned transaction with viem.outcomeId and odds; this package is the only way to map them to human-readable market and selection names (e.g. "Total Goals", "Over (2.5)"). See references/dictionaries.md.getSelectionName({ outcomeId, withPoint: true })). Respect first, orderBy, filters or defaults.conditionId + outcomeId from an Active condition. minOdds: single = Math.round(parseFloat(currentOdds) * 1e12); combo = product of each selection’s odds in 12-decimal space (e.g. (odds1×1e12 × odds2×1e12) / 1e12).POST https://api.pinwin.xyz/agent/bet with JSON body (see references/api.md). Response: { "encoded": "" } . Decode: payload = JSON.parse(atob(response.encoded)).signableClientBetData.bets, relayerFeeAmount, apiUrl, environment, clientData (human-readable names per references/dictionaries.md); then a short summary. See references/api.md.allowance(bettor, relayer) on Polygon. If < bet amount + relayer fee + 0.2 USDT, sign approve(relayer, bet amount + relayer fee + 0.2 USDT) on the bet token. Approval is bounded to this bet plus a small buffer for security; the agent may need to approve again for the next bet. Addresses: references/polygon.md. Steps: references/viem.md.bets), clientData.core = claimContract, relayer from references/polygon.md only. See references/api.md. If anything does not match, do not sign and inform the user.signTypedData with payload.domain, payload.types, primaryType (see references/api.md), and message: payload.signableClientBetData. Then POST to payload.apiUrl with environment, bettor, betOwner, clientBetData (= payload.apiClientBetData), bettorSignature. The order id is in the POST response: use response.id. If you get an order id, poll until the order settles (see references/api.md): GET {apiBase}/bet/orders/{orderId}. Success = response has txHash; failure = state is Rejected or Canceled (use errorMessage).To know when a bet is resolved and whether it won or lost, and whether the user can redeem, query the bets subgraph (different from the data-feed). See references/bets-subgraph.md.
v3Bets with where: { bettor: "" } (address in lowercase). To fetch only bets that can be claimed, add isRedeemable: true to the where clause (see references/bets-subgraph.md). Request at least: betId, status, result, isRedeemable, isRedeemed, amount, payout.Accepted (pending) | Resolved (settled) | Canceled. When status === Resolved, result = Won or Lost. When isRedeemable === true and isRedeemed === false, the user can claim; collect those bets’ betId values for the claim flow.Only for bets that are resolved (or canceled) and have isRedeemable true and isRedeemed false; get betIds from the bets subgraph (see Check bet status).
POST https://api.pinwin.xyz/agent/claim with betIds (array of on-chain bet ids) and chain: "polygon". Decode the response encoded payload. Explain to the user in human-readable terms what they are sending: e.g. claiming winnings for bet IDs X, Y; the transaction will go to the Azuro ClientCore contract on Polygon; no value (ETH/POL) is sent. Display the full decoded claim payload (to, chainId, value, and any other keys returned) for transparency.payload.to (lowercase) equals the documented claimContract (ClientCore) for Polygon in references/polygon.md. This is the redeem contract for won/canceled bets, not the Cashout (early-exit) contract. If it does not match, do not send the tx and report the mismatch.sendTransaction with { to: payload.to, data: payload.data, value: 0n, chainId: payload.chainId }. Wait for receipt. Details: references/viem.md.After fetching games and choosing one outcome:
POST https://api.pinwin.xyz/agent/bet
{ "amount": 1000000, "minOdds": 1500000000000, "chain": "polygon", "selections": [{ "conditionId": "<from data-feed>", "outcomeId": 21 }] }
Decode response.encoded, sign payload.signableClientBetData with viem signTypedData, then POST to payload.apiUrl with clientBetData and bettorSignature.
Get betIds from the bets subgraph (e.g. query with isRedeemable: true). Then:
POST https://api.pinwin.xyz/agent/claim
{ "betIds": [215843], "chain": "polygon" }
Decode response.encoded → payload. Display payload to the user; verify payload.to equals the claimContract (ClientCore) in references/polygon.md. Then send tx with viem: sendTransaction({ to: payload.to, data: payload.data, value: 0n, chainId: payload.chainId }). Wait for receipt.
| Step | Tool | Purpose |
|------|------|---------|
| Games | Data-feed subgraph (GraphQL) | Get games, conditions, outcomes, odds |
| Bet status | Bets subgraph (GraphQL) | Get bettor’s bets: status (Accepted/Resolved/Canceled), result (Won/Lost), isRedeemable, betId |
| Names | @azuro-org/dictionaries (required) | Map outcomeId → human-readable market/selection names; only way to get labels from subgraph data. |
| Bet/claim | Pinwin API | Get encoded payload and apiUrl |
| Chain | viem + RPC | getBalance (POL), readContract (allowance, balanceOf USDT), sendTransaction (approve, claim), signTypedData (bet) |
Required packages: npm install viem @azuro-org/dictionaries. Setup and chain calls: references/viem.md. Dictionaries usage: references/dictionaries.md.
error or message in the response body.data.errors in the JSON body (GraphQL can return 200 with data.errors).Load these when you need full request/response shapes, queries, or addresses:
Generated Feb 28, 2026
A platform where users can place real-time bets on sports events using blockchain technology, ensuring transparency and no custody of funds. It leverages Pinwin and Azuro for on-chain execution, fetching live and prematch games to offer diverse betting options.
An AI-driven assistant that helps users browse sports games, place bets, and manage winnings through a conversational interface. It integrates with decentralized protocols to handle betting logistics, requiring user confirmation for each action to prevent errors.
A tool for bettors to track their betting history, check bet statuses, and redeem winnings automatically. It uses subgraph queries to monitor on-chain bets and provides insights into performance, enhancing user control over decentralized betting activities.
Embedding this skill into existing sports apps or websites to add betting functionality without building infrastructure from scratch. It allows users to place bets directly within the app, using their own wallets and real-time odds from decentralized feeds.
A learning environment where users can practice placing bets in a simulated or low-stakes setting, understanding how decentralized betting works with tools like viem and Azuro dictionaries. It focuses on teaching blockchain interactions and secure wallet management.
Generate revenue by charging a small fee on each bet placed or winnings redeemed through the platform. This model leverages the on-chain nature of bets, where fees can be integrated into the relayer or service charges, providing a steady income stream from user activity.
Offer a subscription plan that provides advanced features such as automated betting strategies, detailed analytics, or priority support. This model targets serious bettors who value enhanced tools and insights, creating recurring revenue from dedicated users.
License the betting skill as a white-label solution to other companies, such as sports leagues or media outlets, enabling them to offer betting services under their brand. This model generates revenue through licensing fees or revenue-sharing agreements based on betting volume.
đź’¬ Integration Tip
Ensure secure handling of BETTOR_PRIVATE_KEY and use default RPCs if POLYGON_RPC_URL is not set to avoid integration failures.
Browse, filter, and discover games in a Steam library. Filter by playtime, reviews, Steam Deck compatibility, genres, and tags. Use when user asks about their Steam games, what to play, game recommendations, or Steam Deck compatible games.
$1 USDC entry. 14 coin flips. Get all 14 right, take the entire jackpot. Live on Solana devnet — continuous game, enter anytime.
Track live NFL, NBA, NHL, or MLB games and automatically change Hue light colors based on which team is leading. Use when user wants to sync smart lights with live sports scores for visual game tracking. Supports NFL, NBA, NHL, and MLB games with customizable team colors.
Place MML blocks in Doppel worlds. Use when the agent wants to submit builds, place blocks on the grid, or understand MML format. Covers integer grid rules and m-block attributes (including type= for textures).
Queries csfloat.com for data on skins
Identifies playful social dynamics where humor and gentle misalignment ease pressure, expand perspective, and soften rigid seriousness without demanding outc...