{
  "schemaVersion": "1.0",
  "item": {
    "slug": "aavegotchi-gbm-skill",
    "name": "Aavegotchi GBM Skill",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/cinnabarhorse/aavegotchi-gbm-skill",
    "canonicalUrl": "https://clawhub.ai/cinnabarhorse/aavegotchi-gbm-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/aavegotchi-gbm-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=aavegotchi-gbm-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/addresses.md",
      "references/bid-math.md",
      "references/logs.md",
      "references/presets.md",
      "references/recipes.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/aavegotchi-gbm-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/aavegotchi-gbm-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Safety Rules",
        "body": "Default to DRY_RUN=1. Never broadcast unless explicitly instructed.\nAlways verify Base mainnet:\n\n~/.foundry/bin/cast chain-id --rpc-url \"${BASE_MAINNET_RPC:-https://mainnet.base.org}\" must be 8453.\n\n\nAlways verify key/address alignment:\n\n~/.foundry/bin/cast wallet address --private-key \"$PRIVATE_KEY\" must equal $FROM_ADDRESS.\n\n\nAlways refetch from the subgraph immediately before any simulate/broadcast step (auctions can be outbid, ended, claimed, or cancelled).\nAlways gate onchain immediately before simulating or broadcasting:\n\nensure the onchain highestBid matches the highestBid you pass into commitBid / swapAndCommitBid.\nensure token params match (token contract, token id, quantity).\n\n\nNever print or log $PRIVATE_KEY."
      },
      {
        "title": "Shell Input Safety (Avoid RCE)",
        "body": "This skill includes shell commands. Treat any value you copy from a user or an external source (subgraph responses, chat messages, etc.) as untrusted.\n\nRules:\n\nNever execute user-provided strings as shell code (avoid eval, bash -c, sh -c).\nOnly substitute addresses that match 0x + 40 hex chars.\nOnly substitute uint values that are base-10 digits (no commas, no decimals).\nIn the command examples below, auction-specific inputs are written as quoted placeholders like \"<AUCTION_ID>\" to avoid accidental shell interpolation. Replace them with literal values only after validation.\n\nQuick validators (replace the placeholder values):\n\npython3 - <<'PY'\nimport re\n\nauction_id = \"<AUCTION_ID>\"                 # digits only\ntoken_contract = \"<TOKEN_CONTRACT_ADDRESS>\" # 0x + 40 hex chars\ntoken_id = \"<TOKEN_ID>\"                     # digits only\namount = \"<TOKEN_AMOUNT>\"                   # digits only\n\nif not re.fullmatch(r\"[0-9]+\", auction_id):\n    raise SystemExit(\"AUCTION_ID must be base-10 digits only\")\nif not re.fullmatch(r\"0x[a-fA-F0-9]{40}\", token_contract):\n    raise SystemExit(\"TOKEN_CONTRACT_ADDRESS must be a 0x + 40-hex address\")\nif not re.fullmatch(r\"[0-9]+\", token_id):\n    raise SystemExit(\"TOKEN_ID must be base-10 digits only\")\nif not re.fullmatch(r\"[0-9]+\", amount):\n    raise SystemExit(\"TOKEN_AMOUNT must be base-10 digits only\")\n\nprint(\"ok\")\nPY"
      },
      {
        "title": "Required Setup",
        "body": "Required env vars:\n\nPRIVATE_KEY: EOA private key used for cast send (never print/log).\nFROM_ADDRESS: EOA address that owns NFTs and will submit txs.\nBASE_MAINNET_RPC: RPC URL. If unset, use https://mainnet.base.org.\nGBM_SUBGRAPH_URL: Goldsky subgraph endpoint for auctions.\n\nOptional env vars:\n\nDRY_RUN: 1 (default) to only simulate via cast call. Set to 0 to broadcast via cast send.\nRECIPIENT_ADDRESS: for swap flows; receives any excess GHST refunded by the contract. Defaults to FROM_ADDRESS.\nGOLDSKY_API_KEY: optional; if set, include Authorization: Bearer ... header in subgraph calls.\nSLIPPAGE_PCT: defaults to 1 (%); used in swapAmount estimate math.\nGHST_USD_PRICE, ETH_USD_PRICE: optional overrides; if unset, fetch from CoinGecko in the swap math snippets.\n\nRecommended defaults (override via env if needed):\n\nexport BASE_MAINNET_RPC=\"${BASE_MAINNET_RPC:-https://mainnet.base.org}\"\nexport GBM_DIAMOND=\"${GBM_DIAMOND:-0x80320A0000C7A6a34086E2ACAD6915Ff57FfDA31}\"\nexport GHST=\"${GHST:-0xcD2F22236DD9Dfe2356D7C543161D4d260FD9BcB}\"\nexport USDC=\"${USDC:-0x833589fCD6eDb6E08f4c7C32D4f71b54BDA02913}\"\nexport GBM_SUBGRAPH_URL=\"${GBM_SUBGRAPH_URL:-https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-gbm-baazaar-base/prod/gn}\"\nexport DRY_RUN=\"${DRY_RUN:-1}\"\nexport SLIPPAGE_PCT=\"${SLIPPAGE_PCT:-1}\"\n\nNotes:\n\nCommands below use ~/.foundry/bin/cast so they work in cron/non-interactive shells."
      },
      {
        "title": "View / List Auctions (Subgraph First)",
        "body": "See references/subgraph.md for canonical queries.\n\nAuction by id (quick):\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\n  \"query\":\"query($id:ID!){ auction(id:$id){ id type contractAddress tokenId quantity seller highestBid highestBidder totalBids startsAt endsAt claimAt claimed cancelled presetId category buyNowPrice startBidPrice } }\",\n  \"variables\":{\"id\":\"<AUCTION_ID>\"}\n}'\n\nActive auctions (ends soonest first):\n\nNOW=$(date +%s)\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data \"{\n  \\\"query\\\":\\\"query(\\$now:BigInt!){ auctions(first:20, orderBy: endsAt, orderDirection: asc, where:{claimed:false, cancelled:false, startsAt_lte:\\$now, endsAt_gt:\\$now}){ id type contractAddress tokenId quantity highestBid highestBidder totalBids startsAt endsAt claimAt presetId category seller } }\\\",\n  \\\"variables\\\":{\\\"now\\\":\\\"$NOW\\\"}\n}\""
      },
      {
        "title": "Onchain Verification (Required Before Bids / Sends)",
        "body": "The onchain source of truth is the GBM diamond.\n\nConfirm core auction fields (full struct decode):\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'getAuctionInfo(uint256)((address,uint96,address,uint88,uint88,bool,bool,address,(uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),(uint64,uint64,uint64,uint64,uint256),uint96,uint96))' \\\n  \"<AUCTION_ID>\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nUseful individual getters:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionHighestBid(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionHighestBidder(uint256)(address)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionStartTime(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionEndTime(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getContractAddress(uint256)(address)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getTokenId(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getTokenKind(uint256)(bytes4)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Create Auction",
        "body": "Onchain method:\n\ncreateAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)\n\nHigh-level steps:\n\nEnsure the token contract is whitelisted on the GBM diamond (otherwise revert ContractNotAllowed).\nEnsure the token is approved to the GBM diamond:\n\nERC721/1155: setApprovalForAll(GBM_DIAMOND,true)\n\n\nChoose InitiatorInfo:\n\nstartTime must be in the future.\nendTime - startTime must be between 3600 and 604800 seconds (1h to 7d).\ntokenKind is 0x73ad2146 (ERC721) or 0x973bb640 (ERC1155).\nbuyItNowPrice optional; startingBid optional (if nonzero, you must approve GHST for the 4% prepaid fee).\n\n\nSimulate with cast call using --from \"$FROM_ADDRESS\".\nBroadcast with cast send only when explicitly instructed (DRY_RUN=0).\nPost-tx: query subgraph for newest seller auctions and match (contractAddress, tokenId).\n\nSimulate create (ERC721 example):\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'createAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)' \\\n  \"(<START_TIME>,<END_TIME>,1,<CATEGORY>,0x73ad2146,<TOKEN_ID>,<BUY_NOW_GHST_WEI>,<STARTING_BID_GHST_WEI>)\" \\\n  \"<ERC721_CONTRACT_ADDRESS>\" \"<PRESET_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBroadcast create (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'createAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)' \\\n  \"(<START_TIME>,<END_TIME>,1,<CATEGORY>,0x73ad2146,<TOKEN_ID>,<BUY_NOW_GHST_WEI>,<STARTING_BID_GHST_WEI>)\" \\\n  \"<ERC721_CONTRACT_ADDRESS>\" \"<PRESET_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nPost-create (find your newest auctions and confirm):\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\n  \"query\":\"query($seller:Bytes!){ auctions(first:10, orderBy: createdAt, orderDirection: desc, where:{seller:$seller}){ id type contractAddress tokenId quantity createdAt startsAt endsAt claimed cancelled } }\",\n  \"variables\":{\"seller\":\"<FROM_ADDRESS_LOWERCASE>\"}\n}'"
      },
      {
        "title": "Cancel Auction",
        "body": "Onchain method:\n\ncancelAuction(uint256)\n\nSteps:\n\nSubgraph: check claimed, cancelled, endsAt, highestBid.\nOnchain: call getAuctionInfo(auctionId) to verify ownership and state.\nSimulate with cast call (--from \"$FROM_ADDRESS\").\nBroadcast only when explicitly instructed.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'cancelAuction(uint256)' \"<AUCTION_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" 'cancelAuction(uint256)' \"<AUCTION_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Bid With GHST (commitBid)",
        "body": "Onchain method:\n\ncommitBid(uint256,uint256,uint256,address,uint256,uint256,bytes) (last bytes is ignored; pass 0x)\n\nSteps:\n\nSubgraph: fetch auction fields (id, contractAddress, tokenId, quantity, highestBid, startsAt, endsAt, claimed/cancelled).\nOnchain: refetch highestBid and token params; you must pass the exact current onchain highestBid or it reverts UnmatchedHighestBid.\nCompute a safe minimum next bid using references/bid-math.md (uses onchain bidDecimals + stepMin).\nEnsure GHST allowance to the GBM diamond covers bidAmount.\nSimulate via cast call (optional but recommended).\nBroadcast only when explicitly instructed.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'commitBid(uint256,uint256,uint256,address,uint256,uint256,bytes)' \\\n  \"<AUCTION_ID>\" \"<BID_AMOUNT_GHST_WEI>\" \"<HIGHEST_BID_GHST_WEI>\" \"<TOKEN_CONTRACT_ADDRESS>\" \"<TOKEN_ID>\" \"<TOKEN_AMOUNT>\" 0x \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'commitBid(uint256,uint256,uint256,address,uint256,uint256,bytes)' \\\n  \"<AUCTION_ID>\" \"<BID_AMOUNT_GHST_WEI>\" \"<HIGHEST_BID_GHST_WEI>\" \"<TOKEN_CONTRACT_ADDRESS>\" \"<TOKEN_ID>\" \"<TOKEN_AMOUNT>\" 0x \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Bid With USDC Swap (swapAndCommitBid)",
        "body": "Onchain method:\n\nswapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))\n\nStruct fields (in order):\n\ntokenIn (USDC)\nswapAmount (USDC 6dp)\nminGhstOut (GHST wei; must be >= bidAmount)\nswapDeadline (unix; must be <= now + 86400)\nrecipient (refund receiver for excess GHST)\nauctionID\nbidAmount (GHST wei)\nhighestBid (must match onchain)\ntokenContract\ntokenID\namount (tokenAmount/quantity)\n_signature (ignored; pass 0x)\n\nCompute swapAmount estimate in references/swap-math.md.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"($USDC,<SWAP_AMOUNT_USDC_6DP>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"($USDC,<SWAP_AMOUNT_USDC_6DP>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Bid With ETH Swap (swapAndCommitBid)",
        "body": "Same method as above, but:\n\ntokenIn = 0x0000000000000000000000000000000000000000\n--value <SWAP_AMOUNT_WEI> must equal the swapAmount you pass inside the tuple.\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"(0x0000000000000000000000000000000000000000,<SWAP_AMOUNT_WEI>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --value \"<SWAP_AMOUNT_WEI>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Claim Auction",
        "body": "Onchain methods:\n\nclaim(uint256)\nbatchClaim(uint256[])\n\nClaim readiness:\n\nAuction owner can claim at now >= endsAt.\nHighest bidder can claim at now >= endsAt + cancellationTime.\n\ncancellationTime is readable from storage slot 12 (see references/recipes.md).\nSubgraph may provide claimAt (if populated), but always verify onchain.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'claim(uint256)' \"<AUCTION_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" 'claim(uint256)' \"<AUCTION_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Optional: Buy Now",
        "body": "Onchain methods:\n\nbuyNow(uint256)\nswapAndBuyNow((address,uint256,uint256,uint256,address,uint256))\n\nThese are not required for the primary use case, but are adjacent to bidding flows. If you use them, follow the same safety gating:\n\nrefetch from subgraph\nverify onchain price/state\nsimulate (cast call)\nonly broadcast when explicitly instructed"
      },
      {
        "title": "Smoke Tests (No Funds Required)",
        "body": "Subgraph reachable (introspection lists auction, auctions, bid, bids):\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{ \"query\":\"{ __schema { queryType { fields { name } } } }\" }' \\\n  | python3 -c 'import json,sys; f=[x[\\\"name\\\"] for x in json.load(sys.stdin)[\\\"data\\\"][\\\"__schema\\\"][\\\"queryType\\\"][\\\"fields\\\"]]; print([n for n in f if n in (\\\"auction\\\",\\\"auctions\\\",\\\"bid\\\",\\\"bids\\\")])'\n\nSubgraph data sane:\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\\\"query\\\":\\\"query($id:ID!){ auction(id:$id){ id contractAddress tokenId } }\\\",\\\"variables\\\":{\\\"id\\\":\\\"0\\\"}}'\n\nOnchain reachable + matches subgraph:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'getAuctionInfo(uint256)((address,uint96,address,uint88,uint88,bool,bool,address,(uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),(uint64,uint64,uint64,uint64,uint256),uint96,uint96))' \\\n  0 \\\n  --rpc-url \"$BASE_MAINNET_RPC\""
      },
      {
        "title": "Common Failure Modes",
        "body": "UnmatchedHighestBid: you passed a stale highestBid param. Refetch onchain and retry.\nInvalidAuctionParams: token contract / id / amount mismatch. Refetch and verify.\nAuctionNotStarted / AuctionEnded: timing mismatch. Check startsAt/endsAt (subgraph + onchain).\nAuctionClaimed: already claimed or cancelled. Check claimed (subgraph + onchain).\nBiddingNotAllowed: diamond paused, contract bidding disabled, or re-entrancy lock. Refetch onchain state.\nSwap errors:\n\nLibTokenSwap: swapAmount must be > 0\nLibTokenSwap: deadline expired\nLibTokenSwap: Insufficient output amount (increase swapAmount or slippage)"
      }
    ],
    "body": "Safety Rules\nDefault to DRY_RUN=1. Never broadcast unless explicitly instructed.\nAlways verify Base mainnet:\n~/.foundry/bin/cast chain-id --rpc-url \"${BASE_MAINNET_RPC:-https://mainnet.base.org}\" must be 8453.\nAlways verify key/address alignment:\n~/.foundry/bin/cast wallet address --private-key \"$PRIVATE_KEY\" must equal $FROM_ADDRESS.\nAlways refetch from the subgraph immediately before any simulate/broadcast step (auctions can be outbid, ended, claimed, or cancelled).\nAlways gate onchain immediately before simulating or broadcasting:\nensure the onchain highestBid matches the highestBid you pass into commitBid / swapAndCommitBid.\nensure token params match (token contract, token id, quantity).\nNever print or log $PRIVATE_KEY.\nShell Input Safety (Avoid RCE)\n\nThis skill includes shell commands. Treat any value you copy from a user or an external source (subgraph responses, chat messages, etc.) as untrusted.\n\nRules:\n\nNever execute user-provided strings as shell code (avoid eval, bash -c, sh -c).\nOnly substitute addresses that match 0x + 40 hex chars.\nOnly substitute uint values that are base-10 digits (no commas, no decimals).\nIn the command examples below, auction-specific inputs are written as quoted placeholders like \"<AUCTION_ID>\" to avoid accidental shell interpolation. Replace them with literal values only after validation.\n\nQuick validators (replace the placeholder values):\n\npython3 - <<'PY'\nimport re\n\nauction_id = \"<AUCTION_ID>\"                 # digits only\ntoken_contract = \"<TOKEN_CONTRACT_ADDRESS>\" # 0x + 40 hex chars\ntoken_id = \"<TOKEN_ID>\"                     # digits only\namount = \"<TOKEN_AMOUNT>\"                   # digits only\n\nif not re.fullmatch(r\"[0-9]+\", auction_id):\n    raise SystemExit(\"AUCTION_ID must be base-10 digits only\")\nif not re.fullmatch(r\"0x[a-fA-F0-9]{40}\", token_contract):\n    raise SystemExit(\"TOKEN_CONTRACT_ADDRESS must be a 0x + 40-hex address\")\nif not re.fullmatch(r\"[0-9]+\", token_id):\n    raise SystemExit(\"TOKEN_ID must be base-10 digits only\")\nif not re.fullmatch(r\"[0-9]+\", amount):\n    raise SystemExit(\"TOKEN_AMOUNT must be base-10 digits only\")\n\nprint(\"ok\")\nPY\n\nRequired Setup\n\nRequired env vars:\n\nPRIVATE_KEY: EOA private key used for cast send (never print/log).\nFROM_ADDRESS: EOA address that owns NFTs and will submit txs.\nBASE_MAINNET_RPC: RPC URL. If unset, use https://mainnet.base.org.\nGBM_SUBGRAPH_URL: Goldsky subgraph endpoint for auctions.\n\nOptional env vars:\n\nDRY_RUN: 1 (default) to only simulate via cast call. Set to 0 to broadcast via cast send.\nRECIPIENT_ADDRESS: for swap flows; receives any excess GHST refunded by the contract. Defaults to FROM_ADDRESS.\nGOLDSKY_API_KEY: optional; if set, include Authorization: Bearer ... header in subgraph calls.\nSLIPPAGE_PCT: defaults to 1 (%); used in swapAmount estimate math.\nGHST_USD_PRICE, ETH_USD_PRICE: optional overrides; if unset, fetch from CoinGecko in the swap math snippets.\n\nRecommended defaults (override via env if needed):\n\nexport BASE_MAINNET_RPC=\"${BASE_MAINNET_RPC:-https://mainnet.base.org}\"\nexport GBM_DIAMOND=\"${GBM_DIAMOND:-0x80320A0000C7A6a34086E2ACAD6915Ff57FfDA31}\"\nexport GHST=\"${GHST:-0xcD2F22236DD9Dfe2356D7C543161D4d260FD9BcB}\"\nexport USDC=\"${USDC:-0x833589fCD6eDb6E08f4c7C32D4f71b54BDA02913}\"\nexport GBM_SUBGRAPH_URL=\"${GBM_SUBGRAPH_URL:-https://api.goldsky.com/api/public/project_cmh3flagm0001r4p25foufjtt/subgraphs/aavegotchi-gbm-baazaar-base/prod/gn}\"\nexport DRY_RUN=\"${DRY_RUN:-1}\"\nexport SLIPPAGE_PCT=\"${SLIPPAGE_PCT:-1}\"\n\n\nNotes:\n\nCommands below use ~/.foundry/bin/cast so they work in cron/non-interactive shells.\nView / List Auctions (Subgraph First)\n\nSee references/subgraph.md for canonical queries.\n\nAuction by id (quick):\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\n  \"query\":\"query($id:ID!){ auction(id:$id){ id type contractAddress tokenId quantity seller highestBid highestBidder totalBids startsAt endsAt claimAt claimed cancelled presetId category buyNowPrice startBidPrice } }\",\n  \"variables\":{\"id\":\"<AUCTION_ID>\"}\n}'\n\n\nActive auctions (ends soonest first):\n\nNOW=$(date +%s)\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data \"{\n  \\\"query\\\":\\\"query(\\$now:BigInt!){ auctions(first:20, orderBy: endsAt, orderDirection: asc, where:{claimed:false, cancelled:false, startsAt_lte:\\$now, endsAt_gt:\\$now}){ id type contractAddress tokenId quantity highestBid highestBidder totalBids startsAt endsAt claimAt presetId category seller } }\\\",\n  \\\"variables\\\":{\\\"now\\\":\\\"$NOW\\\"}\n}\"\n\nOnchain Verification (Required Before Bids / Sends)\n\nThe onchain source of truth is the GBM diamond.\n\nConfirm core auction fields (full struct decode):\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'getAuctionInfo(uint256)((address,uint96,address,uint88,uint88,bool,bool,address,(uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),(uint64,uint64,uint64,uint64,uint256),uint96,uint96))' \\\n  \"<AUCTION_ID>\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nUseful individual getters:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionHighestBid(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionHighestBidder(uint256)(address)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionStartTime(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getAuctionEndTime(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getContractAddress(uint256)(address)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getTokenId(uint256)(uint256)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'getTokenKind(uint256)(bytes4)' \"<AUCTION_ID>\" --rpc-url \"$BASE_MAINNET_RPC\"\n\nCreate Auction\n\nOnchain method:\n\ncreateAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)\n\nHigh-level steps:\n\nEnsure the token contract is whitelisted on the GBM diamond (otherwise revert ContractNotAllowed).\nEnsure the token is approved to the GBM diamond:\nERC721/1155: setApprovalForAll(GBM_DIAMOND,true)\nChoose InitiatorInfo:\nstartTime must be in the future.\nendTime - startTime must be between 3600 and 604800 seconds (1h to 7d).\ntokenKind is 0x73ad2146 (ERC721) or 0x973bb640 (ERC1155).\nbuyItNowPrice optional; startingBid optional (if nonzero, you must approve GHST for the 4% prepaid fee).\nSimulate with cast call using --from \"$FROM_ADDRESS\".\nBroadcast with cast send only when explicitly instructed (DRY_RUN=0).\nPost-tx: query subgraph for newest seller auctions and match (contractAddress, tokenId).\n\nSimulate create (ERC721 example):\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'createAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)' \\\n  \"(<START_TIME>,<END_TIME>,1,<CATEGORY>,0x73ad2146,<TOKEN_ID>,<BUY_NOW_GHST_WEI>,<STARTING_BID_GHST_WEI>)\" \\\n  \"<ERC721_CONTRACT_ADDRESS>\" \"<PRESET_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nBroadcast create (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'createAuction((uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),address,uint256)(uint256)' \\\n  \"(<START_TIME>,<END_TIME>,1,<CATEGORY>,0x73ad2146,<TOKEN_ID>,<BUY_NOW_GHST_WEI>,<STARTING_BID_GHST_WEI>)\" \\\n  \"<ERC721_CONTRACT_ADDRESS>\" \"<PRESET_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nPost-create (find your newest auctions and confirm):\n\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\n  \"query\":\"query($seller:Bytes!){ auctions(first:10, orderBy: createdAt, orderDirection: desc, where:{seller:$seller}){ id type contractAddress tokenId quantity createdAt startsAt endsAt claimed cancelled } }\",\n  \"variables\":{\"seller\":\"<FROM_ADDRESS_LOWERCASE>\"}\n}'\n\nCancel Auction\n\nOnchain method:\n\ncancelAuction(uint256)\n\nSteps:\n\nSubgraph: check claimed, cancelled, endsAt, highestBid.\nOnchain: call getAuctionInfo(auctionId) to verify ownership and state.\nSimulate with cast call (--from \"$FROM_ADDRESS\").\nBroadcast only when explicitly instructed.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'cancelAuction(uint256)' \"<AUCTION_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" 'cancelAuction(uint256)' \"<AUCTION_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBid With GHST (commitBid)\n\nOnchain method:\n\ncommitBid(uint256,uint256,uint256,address,uint256,uint256,bytes) (last bytes is ignored; pass 0x)\n\nSteps:\n\nSubgraph: fetch auction fields (id, contractAddress, tokenId, quantity, highestBid, startsAt, endsAt, claimed/cancelled).\nOnchain: refetch highestBid and token params; you must pass the exact current onchain highestBid or it reverts UnmatchedHighestBid.\nCompute a safe minimum next bid using references/bid-math.md (uses onchain bidDecimals + stepMin).\nEnsure GHST allowance to the GBM diamond covers bidAmount.\nSimulate via cast call (optional but recommended).\nBroadcast only when explicitly instructed.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'commitBid(uint256,uint256,uint256,address,uint256,uint256,bytes)' \\\n  \"<AUCTION_ID>\" \"<BID_AMOUNT_GHST_WEI>\" \"<HIGHEST_BID_GHST_WEI>\" \"<TOKEN_CONTRACT_ADDRESS>\" \"<TOKEN_ID>\" \"<TOKEN_AMOUNT>\" 0x \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'commitBid(uint256,uint256,uint256,address,uint256,uint256,bytes)' \\\n  \"<AUCTION_ID>\" \"<BID_AMOUNT_GHST_WEI>\" \"<HIGHEST_BID_GHST_WEI>\" \"<TOKEN_CONTRACT_ADDRESS>\" \"<TOKEN_ID>\" \"<TOKEN_AMOUNT>\" 0x \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBid With USDC Swap (swapAndCommitBid)\n\nOnchain method:\n\nswapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))\n\nStruct fields (in order):\n\ntokenIn (USDC)\nswapAmount (USDC 6dp)\nminGhstOut (GHST wei; must be >= bidAmount)\nswapDeadline (unix; must be <= now + 86400)\nrecipient (refund receiver for excess GHST)\nauctionID\nbidAmount (GHST wei)\nhighestBid (must match onchain)\ntokenContract\ntokenID\namount (tokenAmount/quantity)\n_signature (ignored; pass 0x)\n\nCompute swapAmount estimate in references/swap-math.md.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"($USDC,<SWAP_AMOUNT_USDC_6DP>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"($USDC,<SWAP_AMOUNT_USDC_6DP>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nBid With ETH Swap (swapAndCommitBid)\n\nSame method as above, but:\n\ntokenIn = 0x0000000000000000000000000000000000000000\n--value <SWAP_AMOUNT_WEI> must equal the swapAmount you pass inside the tuple.\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" \\\n  'swapAndCommitBid((address,uint256,uint256,uint256,address,uint256,uint256,uint256,address,uint256,uint256,bytes))' \\\n  \"(0x0000000000000000000000000000000000000000,<SWAP_AMOUNT_WEI>,<MIN_GHST_OUT_GHST_WEI>,<SWAP_DEADLINE_UNIX>,${RECIPIENT_ADDRESS:-$FROM_ADDRESS},<AUCTION_ID>,<BID_AMOUNT_GHST_WEI>,<HIGHEST_BID_GHST_WEI>,<TOKEN_CONTRACT_ADDRESS>,<TOKEN_ID>,<TOKEN_AMOUNT>,0x)\" \\\n  --value \"<SWAP_AMOUNT_WEI>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nClaim Auction\n\nOnchain methods:\n\nclaim(uint256)\nbatchClaim(uint256[])\n\nClaim readiness:\n\nAuction owner can claim at now >= endsAt.\nHighest bidder can claim at now >= endsAt + cancellationTime.\ncancellationTime is readable from storage slot 12 (see references/recipes.md).\nSubgraph may provide claimAt (if populated), but always verify onchain.\n\nSimulate:\n\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" 'claim(uint256)' \"<AUCTION_ID>\" \\\n  --from \"$FROM_ADDRESS\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\n\nBroadcast (only when explicitly instructed):\n\n~/.foundry/bin/cast send \"$GBM_DIAMOND\" 'claim(uint256)' \"<AUCTION_ID>\" \\\n  --private-key \"$PRIVATE_KEY\" \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nOptional: Buy Now\n\nOnchain methods:\n\nbuyNow(uint256)\nswapAndBuyNow((address,uint256,uint256,uint256,address,uint256))\n\nThese are not required for the primary use case, but are adjacent to bidding flows. If you use them, follow the same safety gating:\n\nrefetch from subgraph\nverify onchain price/state\nsimulate (cast call)\nonly broadcast when explicitly instructed\nSmoke Tests (No Funds Required)\nSubgraph reachable (introspection lists auction, auctions, bid, bids):\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{ \"query\":\"{ __schema { queryType { fields { name } } } }\" }' \\\n  | python3 -c 'import json,sys; f=[x[\\\"name\\\"] for x in json.load(sys.stdin)[\\\"data\\\"][\\\"__schema\\\"][\\\"queryType\\\"][\\\"fields\\\"]]; print([n for n in f if n in (\\\"auction\\\",\\\"auctions\\\",\\\"bid\\\",\\\"bids\\\")])'\n\nSubgraph data sane:\ncurl -s \"$GBM_SUBGRAPH_URL\" -H 'content-type: application/json' ${GOLDSKY_API_KEY:+-H \"Authorization: Bearer $GOLDSKY_API_KEY\"} --data '{\\\"query\\\":\\\"query($id:ID!){ auction(id:$id){ id contractAddress tokenId } }\\\",\\\"variables\\\":{\\\"id\\\":\\\"0\\\"}}'\n\nOnchain reachable + matches subgraph:\n~/.foundry/bin/cast call \"$GBM_DIAMOND\" \\\n  'getAuctionInfo(uint256)((address,uint96,address,uint88,uint88,bool,bool,address,(uint80,uint80,uint56,uint8,bytes4,uint256,uint96,uint96),(uint64,uint64,uint64,uint64,uint256),uint96,uint96))' \\\n  0 \\\n  --rpc-url \"$BASE_MAINNET_RPC\"\n\nCommon Failure Modes\nUnmatchedHighestBid: you passed a stale highestBid param. Refetch onchain and retry.\nInvalidAuctionParams: token contract / id / amount mismatch. Refetch and verify.\nAuctionNotStarted / AuctionEnded: timing mismatch. Check startsAt/endsAt (subgraph + onchain).\nAuctionClaimed: already claimed or cancelled. Check claimed (subgraph + onchain).\nBiddingNotAllowed: diamond paused, contract bidding disabled, or re-entrancy lock. Refetch onchain state.\nSwap errors:\nLibTokenSwap: swapAmount must be > 0\nLibTokenSwap: deadline expired\nLibTokenSwap: Insufficient output amount (increase swapAmount or slippage)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/cinnabarhorse/aavegotchi-gbm-skill",
    "publisherUrl": "https://clawhub.ai/cinnabarhorse/aavegotchi-gbm-skill",
    "owner": "cinnabarhorse",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/aavegotchi-gbm-skill",
    "agentUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/aavegotchi-gbm-skill/agent.md"
  }
}