{
  "schemaVersion": "1.0",
  "item": {
    "slug": "vincent",
    "name": "Vincent - Agent Wallet",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/glitch003/vincent",
    "canonicalUrl": "https://clawhub.ai/glitch003/vincent",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/vincent",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vincent",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.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",
      "slug": "vincent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-04T09:09:50.504Z",
      "expiresAt": "2026-05-11T09:09:50.504Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vincent",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vincent",
        "contentDisposition": "attachment; filename=\"vincent-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "vincent"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/vincent"
    },
    "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/vincent",
    "agentPageUrl": "https://openagent3.xyz/skills/vincent/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vincent/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vincent/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": "Vincent - A wallet for agents",
        "body": "Use this skill to safely create a wallet the agent can use for transfers, swaps, and any EVM chain transaction without ever exposing private keys to the agent. Create a wallet, set spending policies, and your agent can transfer tokens, do swaps, and interact with smart contracts within the boundaries you define.\n\nThe agent never sees the private key. All transactions are executed server-side through a smart account. The wallet owner controls what the agent can do via configurable policies."
      },
      {
        "title": "Which Wallet Type to Use",
        "body": "TypeUse CaseNetworkGasEVM_WALLETTransfers, swaps, DeFi, contract callsAny EVM chainSponsored (free)RAW_SIGNERRaw message signing for special protocolsAny (Ethereum + Solana)You payPOLYMARKET_WALLETPrediction market tradingPolygon onlySponsored (free)\n\nChoose EVM_WALLET (default) for:\n\nSending ETH or tokens\nSwapping tokens on DEXs\nInteracting with smart contracts\nAny standard EVM transaction\n\nChoose RAW_SIGNER only when you need:\n\nRaw ECDSA/Ed25519 signatures for protocols that don't work with smart accounts\nTo sign transaction hashes you'll broadcast yourself\nSolana signatures\n\nChoose POLYMARKET_WALLET only for:\n\nBetting on Polymarket prediction markets\nRequires USDC.e on Polygon for funding"
      },
      {
        "title": "Configuration",
        "body": "All API requests require a Bearer token (the API key returned when creating a wallet). If you're an openclaw instance, store and retrieve it from ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can store it in your current working directory at agentwallet/<API_KEY_ID>.json.\n\nAuthorization: Bearer <API_KEY>"
      },
      {
        "title": "1. Create a Wallet",
        "body": "Create a new smart account wallet for your agent. This generates a private key server-side (you never see it), creates a ZeroDev smart account, and returns an API key for the agent plus a claim URL for the wallet owner.\n\ncurl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"EVM_WALLET\",\n    \"memo\": \"My agent wallet\",\n    \"chainId\": 84532\n  }'\n\nResponse includes:\n\napiKey -- store this securely; use it as the Bearer token for all future requests\nclaimUrl -- share this with the user so they can claim the wallet and set policies\naddress -- the smart account address\n\nAfter creating, tell the user:\n\n\"Here is your wallet claim URL: <claimUrl>. Use this to claim ownership, set spending policies, and monitor your agent's wallet activity.\""
      },
      {
        "title": "2. Get Wallet Address",
        "body": "curl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/address\" \\\n  -H \"Authorization: Bearer <API_KEY>\""
      },
      {
        "title": "3. Check Balances",
        "body": "# Get all token balances across all supported chains (ETH, WETH, USDC, etc.)\ncurl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/balances\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Filter to specific chains (comma-separated chain IDs)\ncurl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/balances?chainIds=1,137,42161\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nReturns all ERC-20 tokens and native balances with symbols, decimals, logos, and USD values."
      },
      {
        "title": "4. Transfer ETH or Tokens",
        "body": "# Transfer native ETH\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/transfer\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xRecipientAddress\",\n    \"amount\": \"0.01\"\n  }'\n\n# Transfer ERC-20 token\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/transfer\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xRecipientAddress\",\n    \"amount\": \"100\",\n    \"token\": \"0xTokenContractAddress\"\n  }'"
      },
      {
        "title": "5. Swap Tokens",
        "body": "Swap one token for another using DEX liquidity (powered by 0x).\n\n# Preview a swap (no execution, just pricing)\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/swap/preview\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"sellToken\": \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\",\n    \"buyToken\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n    \"sellAmount\": \"0.1\",\n    \"chainId\": 1\n  }'\n\n# Execute a swap\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/swap/execute\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"sellToken\": \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\",\n    \"buyToken\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n    \"sellAmount\": \"0.1\",\n    \"chainId\": 1,\n    \"slippageBps\": 100\n  }'\n\nsellToken / buyToken: Token contract addresses. Use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH.\nsellAmount: Human-readable amount to sell (e.g. \"0.1\" for 0.1 ETH).\nchainId: The chain to swap on (1 = Ethereum, 137 = Polygon, 42161 = Arbitrum, 10 = Optimism, 8453 = Base, etc.).\nslippageBps: Optional slippage tolerance in basis points (100 = 1%). Defaults to 100.\n\nThe preview endpoint returns expected buy amount, route info, and fees without executing. The execute endpoint performs the actual swap through the smart account, handling ERC20 approvals automatically."
      },
      {
        "title": "6. Send Arbitrary Transaction",
        "body": "Interact with any smart contract by sending custom calldata.\n\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/send-transaction\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xContractAddress\",\n    \"data\": \"0xCalldata\",\n    \"value\": \"0\"\n  }'"
      },
      {
        "title": "Policies",
        "body": "The wallet owner controls what the agent can do by setting policies via the claim URL. If a transaction violates a policy, the API will reject it or require human approval via Telegram.\n\nPolicyWhat it doesAddress allowlistOnly allow transfers/calls to specific addressesToken allowlistOnly allow transfers of specific ERC-20 tokensFunction allowlistOnly allow calling specific contract functions (by 4-byte selector)Spending limit (per tx)Max USD value per transactionSpending limit (daily)Max USD value per rolling 24 hoursSpending limit (weekly)Max USD value per rolling 7 daysRequire approvalEvery transaction needs human approval via TelegramApproval thresholdTransactions above a USD amount need human approval\n\nIf no policies are set, all actions are allowed by default. Once the owner claims the wallet and adds policies, the agent operates within those boundaries."
      },
      {
        "title": "Re-linking (Recovering API Access)",
        "body": "If the agent loses its API key, the wallet owner can generate a re-link token from the frontend. The agent then exchanges this token for a new API key.\n\nHow it works:\n\nThe user generates a re-link token from the wallet detail page in the frontend\nThe user gives the token to the agent (e.g. by pasting it in chat)\nThe agent calls the re-link endpoint to exchange the token for a new API key\n\ncurl -X POST \"https://heyvincent.ai/api/secrets/relink\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"relinkToken\": \"<TOKEN_FROM_USER>\",\n    \"apiKeyName\": \"Re-linked API Key\"\n  }'\n\nResponse includes:\n\nsecret -- the wallet metadata (id, type, address, chainId, etc.)\napiKey.key -- the new API key to use as Bearer token for all future requests\n\nImportant: Re-link tokens are one-time use and expire after 10 minutes. No authentication is required on this endpoint -- the token itself is the authorization.\n\nIf a user tells you they have a re-link token, use this endpoint to regain access to the wallet. Store the returned API key and use it for all subsequent requests."
      },
      {
        "title": "Important Notes",
        "body": "No gas needed. A paymaster is fully set up -- all transaction gas fees are sponsored automatically. The wallet does not need ETH for gas.\nNever try to access raw secret values. The private key stays server-side -- that's the whole point.\nAlways store the API key from wallet creation. If you're an openclaw instance, store it in ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can store it in your current working directory at agentwallet/<API_KEY_ID>.json.\nAlways search for the API keys in the credentials folder before using the API. If you're an openclaw instance, search for the API key in ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can search for the API key in your current working directory at agentwallet/<API_KEY_ID>.json.\nAlways share the claim URL with the user after creating a wallet.\nIf a transaction is rejected, it may be blocked by a policy. Tell the user to check their policy settings via the frontend at https://heyvincent.ai.\nIf a transaction requires approval, it will return status: \"pending_approval\". The wallet owner will receive a Telegram notification to approve or deny."
      },
      {
        "title": "Raw Signer (Advanced)",
        "body": "For raw ECDSA/Ed25519 signing when smart accounts won't work."
      },
      {
        "title": "Create a Raw Signer",
        "body": "curl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"RAW_SIGNER\",\n    \"memo\": \"My raw signer\"\n  }'\n\nResponse includes both Ethereum (secp256k1) and Solana (ed25519) addresses derived from the same seed."
      },
      {
        "title": "Get Addresses",
        "body": "curl -X GET \"https://heyvincent.ai/api/skills/raw-signer/addresses\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nReturns ethAddress and solanaAddress."
      },
      {
        "title": "Sign a Message",
        "body": "curl -X POST \"https://heyvincent.ai/api/skills/raw-signer/sign\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"0x<hex-encoded-bytes>\",\n    \"curve\": \"ethereum\"\n  }'\n\nmessage: Hex-encoded bytes to sign (must start with 0x)\ncurve: \"ethereum\" for secp256k1 ECDSA, \"solana\" for ed25519\n\nReturns a hex-encoded signature. For Ethereum, this is r || s || v (65 bytes). For Solana, it's a 64-byte ed25519 signature."
      },
      {
        "title": "Polymarket Prediction Markets",
        "body": "Polymarket wallets use Gnosis Safe wallets on Polygon with gasless trading through Polymarket's relayer."
      },
      {
        "title": "Create a Polymarket Wallet",
        "body": "curl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"POLYMARKET_WALLET\",\n    \"memo\": \"My prediction market wallet\"\n  }'\n\nResponse includes:\n\napiKey -- use as Bearer token for all Polymarket requests\nclaimUrl -- share with the user to claim ownership and set policies\nwalletAddress -- the EOA address (Safe is deployed lazily on first use)\n\nImportant: After creation, the wallet has no funds. The user must send USDC.e (bridged USDC) on Polygon to the Safe address before placing bets."
      },
      {
        "title": "Get Balance",
        "body": "curl -X GET \"https://heyvincent.ai/api/skills/polymarket/balance\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nReturns:\n\nwalletAddress -- the Safe address (deployed on first call if needed)\ncollateral.balance -- USDC.e balance available for trading\ncollateral.allowance -- approved amount for Polymarket contracts\n\nNote: The first balance call triggers Safe deployment and collateral approval (gasless via relayer). This may take 30-60 seconds."
      },
      {
        "title": "Fund the Wallet",
        "body": "Before placing bets, the user must send USDC.e to the Safe address:\n\nGet the wallet address from /balance endpoint\nSend USDC.e (bridged USDC, contract 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) on Polygon to that address\nMinimum $1 required per bet (Polymarket minimum)\n\nDo not send native USDC (0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359). Polymarket only accepts bridged USDC.e."
      },
      {
        "title": "Browse & Search Markets",
        "body": "# Search markets by keyword (recommended)\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/markets?query=bitcoin&limit=20\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get all active markets (paginated)\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/markets?active=true&limit=50\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get specific market by condition ID\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/market/<CONDITION_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nMarket response includes:\n\nquestion: The market question\noutcomes: Array like [\"Yes\", \"No\"] or [\"Team A\", \"Team B\"]\noutcomePrices: Current prices for each outcome\ntokenIds: Array of token IDs for each outcome - use these for placing bets\nacceptingOrders: Whether the market is open for trading\nclosed: Whether the market has resolved\n\nImportant: Always use the tokenIds array from the market response. Each outcome has a corresponding token ID at the same index. For a \"Yes/No\" market:\n\ntokenIds[0] = \"Yes\" token ID\ntokenIds[1] = \"No\" token ID"
      },
      {
        "title": "Get Order Book",
        "body": "curl -X GET \"https://heyvincent.ai/api/skills/polymarket/orderbook/<TOKEN_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nReturns bids and asks with prices and sizes. Use this to determine current market prices before placing orders."
      },
      {
        "title": "Place a Bet",
        "body": "curl -X POST \"https://heyvincent.ai/api/skills/polymarket/bet\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tokenId\": \"<OUTCOME_TOKEN_ID>\",\n    \"side\": \"BUY\",\n    \"amount\": 5,\n    \"price\": 0.55\n  }'\n\nParameters:\n\ntokenId: The outcome token ID (from market data or order book)\nside: \"BUY\" or \"SELL\"\namount: For BUY orders, USD amount to spend. For SELL orders, number of shares to sell.\nprice: Limit price (0.01 to 0.99). Optional -- omit for market order.\n\nBUY orders:\n\namount is the USD you want to spend (e.g., 5 = $5)\nYou'll receive amount / price shares (e.g., $5 at 0.50 = 10 shares)\nMinimum order is $1\n\nSELL orders:\n\namount is the number of shares to sell\nYou'll receive amount * price USD\nMust own the shares first (from a previous BUY)\n\nImportant timing: After a BUY fills, wait a few seconds before selling. Shares need time to settle on-chain."
      },
      {
        "title": "View Positions & Orders",
        "body": "# Get open orders\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/positions\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get trade history\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/trades\" \\\n  -H \"Authorization: Bearer <API_KEY>\""
      },
      {
        "title": "Cancel Orders",
        "body": "# Cancel specific order\ncurl -X DELETE \"https://heyvincent.ai/api/skills/polymarket/orders/<ORDER_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Cancel all open orders\ncurl -X DELETE \"https://heyvincent.ai/api/skills/polymarket/orders\" \\\n  -H \"Authorization: Bearer <API_KEY>\""
      },
      {
        "title": "Polymarket Workflow Example",
        "body": "Create wallet:\nPOST /api/secrets {\"type\": \"POLYMARKET_WALLET\", \"memo\": \"Betting wallet\"}\n\n\n\nGet Safe address (triggers deployment):\nGET /api/skills/polymarket/balance\n# Returns walletAddress -- give this to user to fund\n\n\n\nUser sends USDC.e to the Safe address on Polygon\n\n\nSearch for a market:\n# Search by keyword - returns only active, tradeable markets\nGET /api/skills/polymarket/markets?query=bitcoin&active=true\n\nResponse example:\n{\n  \"markets\": [\n    {\n      \"question\": \"Will Bitcoin hit $100k by end of 2025?\",\n      \"outcomes\": [\"Yes\", \"No\"],\n      \"outcomePrices\": [\"0.65\", \"0.35\"],\n      \"tokenIds\": [\"123456...\", \"789012...\"],\n      \"acceptingOrders\": true\n    }\n  ]\n}\n\n\n\nCheck order book for the outcome you want:\n# Use the tokenId from the market response\nGET /api/skills/polymarket/orderbook/123456...\n# Note the bid/ask prices\n\n\n\nPlace BUY bet using the correct token ID:\n# tokenId must be from the tokenIds array, NOT the conditionId\nPOST /api/skills/polymarket/bet\n{\"tokenId\": \"123456...\", \"side\": \"BUY\", \"amount\": 5, \"price\": 0.55}\n\n\n\nWait for settlement (a few seconds)\n\n\nSell position:\nPOST /api/skills/polymarket/bet\n{\"tokenId\": \"123456...\", \"side\": \"SELL\", \"amount\": 9.09, \"price\": 0.54}\n\nCommon Errors:\n\n\"No orderbook exists for the requested token id\" - The market is closed or you're using the wrong ID. Make sure:\n\nThe market has acceptingOrders: true\nYou're using a tokenId from the tokenIds array, not the conditionId\nThe market hasn't already resolved"
      }
    ],
    "body": "Vincent - A wallet for agents\n\nUse this skill to safely create a wallet the agent can use for transfers, swaps, and any EVM chain transaction without ever exposing private keys to the agent. Create a wallet, set spending policies, and your agent can transfer tokens, do swaps, and interact with smart contracts within the boundaries you define.\n\nThe agent never sees the private key. All transactions are executed server-side through a smart account. The wallet owner controls what the agent can do via configurable policies.\n\nWhich Wallet Type to Use\nType\tUse Case\tNetwork\tGas\nEVM_WALLET\tTransfers, swaps, DeFi, contract calls\tAny EVM chain\tSponsored (free)\nRAW_SIGNER\tRaw message signing for special protocols\tAny (Ethereum + Solana)\tYou pay\nPOLYMARKET_WALLET\tPrediction market trading\tPolygon only\tSponsored (free)\n\nChoose EVM_WALLET (default) for:\n\nSending ETH or tokens\nSwapping tokens on DEXs\nInteracting with smart contracts\nAny standard EVM transaction\n\nChoose RAW_SIGNER only when you need:\n\nRaw ECDSA/Ed25519 signatures for protocols that don't work with smart accounts\nTo sign transaction hashes you'll broadcast yourself\nSolana signatures\n\nChoose POLYMARKET_WALLET only for:\n\nBetting on Polymarket prediction markets\nRequires USDC.e on Polygon for funding\nConfiguration\n\nAll API requests require a Bearer token (the API key returned when creating a wallet). If you're an openclaw instance, store and retrieve it from ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can store it in your current working directory at agentwallet/<API_KEY_ID>.json.\n\nAuthorization: Bearer <API_KEY>\n\nQuick Start\n1. Create a Wallet\n\nCreate a new smart account wallet for your agent. This generates a private key server-side (you never see it), creates a ZeroDev smart account, and returns an API key for the agent plus a claim URL for the wallet owner.\n\ncurl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"EVM_WALLET\",\n    \"memo\": \"My agent wallet\",\n    \"chainId\": 84532\n  }'\n\n\nResponse includes:\n\napiKey -- store this securely; use it as the Bearer token for all future requests\nclaimUrl -- share this with the user so they can claim the wallet and set policies\naddress -- the smart account address\n\nAfter creating, tell the user:\n\n\"Here is your wallet claim URL: <claimUrl>. Use this to claim ownership, set spending policies, and monitor your agent's wallet activity.\"\n\n2. Get Wallet Address\ncurl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/address\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n3. Check Balances\n# Get all token balances across all supported chains (ETH, WETH, USDC, etc.)\ncurl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/balances\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Filter to specific chains (comma-separated chain IDs)\ncurl -X GET \"https://heyvincent.ai/api/skills/evm-wallet/balances?chainIds=1,137,42161\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n\nReturns all ERC-20 tokens and native balances with symbols, decimals, logos, and USD values.\n\n4. Transfer ETH or Tokens\n# Transfer native ETH\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/transfer\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xRecipientAddress\",\n    \"amount\": \"0.01\"\n  }'\n\n# Transfer ERC-20 token\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/transfer\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xRecipientAddress\",\n    \"amount\": \"100\",\n    \"token\": \"0xTokenContractAddress\"\n  }'\n\n5. Swap Tokens\n\nSwap one token for another using DEX liquidity (powered by 0x).\n\n# Preview a swap (no execution, just pricing)\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/swap/preview\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"sellToken\": \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\",\n    \"buyToken\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n    \"sellAmount\": \"0.1\",\n    \"chainId\": 1\n  }'\n\n# Execute a swap\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/swap/execute\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"sellToken\": \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\",\n    \"buyToken\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n    \"sellAmount\": \"0.1\",\n    \"chainId\": 1,\n    \"slippageBps\": 100\n  }'\n\nsellToken / buyToken: Token contract addresses. Use 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH.\nsellAmount: Human-readable amount to sell (e.g. \"0.1\" for 0.1 ETH).\nchainId: The chain to swap on (1 = Ethereum, 137 = Polygon, 42161 = Arbitrum, 10 = Optimism, 8453 = Base, etc.).\nslippageBps: Optional slippage tolerance in basis points (100 = 1%). Defaults to 100.\n\nThe preview endpoint returns expected buy amount, route info, and fees without executing. The execute endpoint performs the actual swap through the smart account, handling ERC20 approvals automatically.\n\n6. Send Arbitrary Transaction\n\nInteract with any smart contract by sending custom calldata.\n\ncurl -X POST \"https://heyvincent.ai/api/skills/evm-wallet/send-transaction\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"to\": \"0xContractAddress\",\n    \"data\": \"0xCalldata\",\n    \"value\": \"0\"\n  }'\n\nPolicies\n\nThe wallet owner controls what the agent can do by setting policies via the claim URL. If a transaction violates a policy, the API will reject it or require human approval via Telegram.\n\nPolicy\tWhat it does\nAddress allowlist\tOnly allow transfers/calls to specific addresses\nToken allowlist\tOnly allow transfers of specific ERC-20 tokens\nFunction allowlist\tOnly allow calling specific contract functions (by 4-byte selector)\nSpending limit (per tx)\tMax USD value per transaction\nSpending limit (daily)\tMax USD value per rolling 24 hours\nSpending limit (weekly)\tMax USD value per rolling 7 days\nRequire approval\tEvery transaction needs human approval via Telegram\nApproval threshold\tTransactions above a USD amount need human approval\n\nIf no policies are set, all actions are allowed by default. Once the owner claims the wallet and adds policies, the agent operates within those boundaries.\n\nRe-linking (Recovering API Access)\n\nIf the agent loses its API key, the wallet owner can generate a re-link token from the frontend. The agent then exchanges this token for a new API key.\n\nHow it works:\n\nThe user generates a re-link token from the wallet detail page in the frontend\nThe user gives the token to the agent (e.g. by pasting it in chat)\nThe agent calls the re-link endpoint to exchange the token for a new API key\ncurl -X POST \"https://heyvincent.ai/api/secrets/relink\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"relinkToken\": \"<TOKEN_FROM_USER>\",\n    \"apiKeyName\": \"Re-linked API Key\"\n  }'\n\n\nResponse includes:\n\nsecret -- the wallet metadata (id, type, address, chainId, etc.)\napiKey.key -- the new API key to use as Bearer token for all future requests\n\nImportant: Re-link tokens are one-time use and expire after 10 minutes. No authentication is required on this endpoint -- the token itself is the authorization.\n\nIf a user tells you they have a re-link token, use this endpoint to regain access to the wallet. Store the returned API key and use it for all subsequent requests.\n\nImportant Notes\nNo gas needed. A paymaster is fully set up -- all transaction gas fees are sponsored automatically. The wallet does not need ETH for gas.\nNever try to access raw secret values. The private key stays server-side -- that's the whole point.\nAlways store the API key from wallet creation. If you're an openclaw instance, store it in ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can store it in your current working directory at agentwallet/<API_KEY_ID>.json.\nAlways search for the API keys in the credentials folder before using the API. If you're an openclaw instance, search for the API key in ~/.openclaw/credentials/agentwallet/<API_KEY_ID>.json. Otherwise, you can search for the API key in your current working directory at agentwallet/<API_KEY_ID>.json.\nAlways share the claim URL with the user after creating a wallet.\nIf a transaction is rejected, it may be blocked by a policy. Tell the user to check their policy settings via the frontend at https://heyvincent.ai.\nIf a transaction requires approval, it will return status: \"pending_approval\". The wallet owner will receive a Telegram notification to approve or deny.\nRaw Signer (Advanced)\n\nFor raw ECDSA/Ed25519 signing when smart accounts won't work.\n\nCreate a Raw Signer\ncurl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"RAW_SIGNER\",\n    \"memo\": \"My raw signer\"\n  }'\n\n\nResponse includes both Ethereum (secp256k1) and Solana (ed25519) addresses derived from the same seed.\n\nGet Addresses\ncurl -X GET \"https://heyvincent.ai/api/skills/raw-signer/addresses\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n\nReturns ethAddress and solanaAddress.\n\nSign a Message\ncurl -X POST \"https://heyvincent.ai/api/skills/raw-signer/sign\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"0x<hex-encoded-bytes>\",\n    \"curve\": \"ethereum\"\n  }'\n\nmessage: Hex-encoded bytes to sign (must start with 0x)\ncurve: \"ethereum\" for secp256k1 ECDSA, \"solana\" for ed25519\n\nReturns a hex-encoded signature. For Ethereum, this is r || s || v (65 bytes). For Solana, it's a 64-byte ed25519 signature.\n\nPolymarket Prediction Markets\n\nPolymarket wallets use Gnosis Safe wallets on Polygon with gasless trading through Polymarket's relayer.\n\nCreate a Polymarket Wallet\ncurl -X POST \"https://heyvincent.ai/api/secrets\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"type\": \"POLYMARKET_WALLET\",\n    \"memo\": \"My prediction market wallet\"\n  }'\n\n\nResponse includes:\n\napiKey -- use as Bearer token for all Polymarket requests\nclaimUrl -- share with the user to claim ownership and set policies\nwalletAddress -- the EOA address (Safe is deployed lazily on first use)\n\nImportant: After creation, the wallet has no funds. The user must send USDC.e (bridged USDC) on Polygon to the Safe address before placing bets.\n\nGet Balance\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/balance\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n\nReturns:\n\nwalletAddress -- the Safe address (deployed on first call if needed)\ncollateral.balance -- USDC.e balance available for trading\ncollateral.allowance -- approved amount for Polymarket contracts\n\nNote: The first balance call triggers Safe deployment and collateral approval (gasless via relayer). This may take 30-60 seconds.\n\nFund the Wallet\n\nBefore placing bets, the user must send USDC.e to the Safe address:\n\nGet the wallet address from /balance endpoint\nSend USDC.e (bridged USDC, contract 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) on Polygon to that address\nMinimum $1 required per bet (Polymarket minimum)\n\nDo not send native USDC (0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359). Polymarket only accepts bridged USDC.e.\n\nBrowse & Search Markets\n# Search markets by keyword (recommended)\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/markets?query=bitcoin&limit=20\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get all active markets (paginated)\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/markets?active=true&limit=50\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get specific market by condition ID\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/market/<CONDITION_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n\nMarket response includes:\n\nquestion: The market question\noutcomes: Array like [\"Yes\", \"No\"] or [\"Team A\", \"Team B\"]\noutcomePrices: Current prices for each outcome\ntokenIds: Array of token IDs for each outcome - use these for placing bets\nacceptingOrders: Whether the market is open for trading\nclosed: Whether the market has resolved\n\nImportant: Always use the tokenIds array from the market response. Each outcome has a corresponding token ID at the same index. For a \"Yes/No\" market:\n\ntokenIds[0] = \"Yes\" token ID\ntokenIds[1] = \"No\" token ID\nGet Order Book\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/orderbook/<TOKEN_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n\nReturns bids and asks with prices and sizes. Use this to determine current market prices before placing orders.\n\nPlace a Bet\ncurl -X POST \"https://heyvincent.ai/api/skills/polymarket/bet\" \\\n  -H \"Authorization: Bearer <API_KEY>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tokenId\": \"<OUTCOME_TOKEN_ID>\",\n    \"side\": \"BUY\",\n    \"amount\": 5,\n    \"price\": 0.55\n  }'\n\n\nParameters:\n\ntokenId: The outcome token ID (from market data or order book)\nside: \"BUY\" or \"SELL\"\namount: For BUY orders, USD amount to spend. For SELL orders, number of shares to sell.\nprice: Limit price (0.01 to 0.99). Optional -- omit for market order.\n\nBUY orders:\n\namount is the USD you want to spend (e.g., 5 = $5)\nYou'll receive amount / price shares (e.g., $5 at 0.50 = 10 shares)\nMinimum order is $1\n\nSELL orders:\n\namount is the number of shares to sell\nYou'll receive amount * price USD\nMust own the shares first (from a previous BUY)\n\nImportant timing: After a BUY fills, wait a few seconds before selling. Shares need time to settle on-chain.\n\nView Positions & Orders\n# Get open orders\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/positions\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Get trade history\ncurl -X GET \"https://heyvincent.ai/api/skills/polymarket/trades\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nCancel Orders\n# Cancel specific order\ncurl -X DELETE \"https://heyvincent.ai/api/skills/polymarket/orders/<ORDER_ID>\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\n# Cancel all open orders\ncurl -X DELETE \"https://heyvincent.ai/api/skills/polymarket/orders\" \\\n  -H \"Authorization: Bearer <API_KEY>\"\n\nPolymarket Workflow Example\n\nCreate wallet:\n\nPOST /api/secrets {\"type\": \"POLYMARKET_WALLET\", \"memo\": \"Betting wallet\"}\n\n\nGet Safe address (triggers deployment):\n\nGET /api/skills/polymarket/balance\n# Returns walletAddress -- give this to user to fund\n\n\nUser sends USDC.e to the Safe address on Polygon\n\nSearch for a market:\n\n# Search by keyword - returns only active, tradeable markets\nGET /api/skills/polymarket/markets?query=bitcoin&active=true\n\n\nResponse example:\n\n{\n  \"markets\": [\n    {\n      \"question\": \"Will Bitcoin hit $100k by end of 2025?\",\n      \"outcomes\": [\"Yes\", \"No\"],\n      \"outcomePrices\": [\"0.65\", \"0.35\"],\n      \"tokenIds\": [\"123456...\", \"789012...\"],\n      \"acceptingOrders\": true\n    }\n  ]\n}\n\n\nCheck order book for the outcome you want:\n\n# Use the tokenId from the market response\nGET /api/skills/polymarket/orderbook/123456...\n# Note the bid/ask prices\n\n\nPlace BUY bet using the correct token ID:\n\n# tokenId must be from the tokenIds array, NOT the conditionId\nPOST /api/skills/polymarket/bet\n{\"tokenId\": \"123456...\", \"side\": \"BUY\", \"amount\": 5, \"price\": 0.55}\n\n\nWait for settlement (a few seconds)\n\nSell position:\n\nPOST /api/skills/polymarket/bet\n{\"tokenId\": \"123456...\", \"side\": \"SELL\", \"amount\": 9.09, \"price\": 0.54}\n\n\nCommon Errors:\n\n\"No orderbook exists for the requested token id\" - The market is closed or you're using the wrong ID. Make sure:\nThe market has acceptingOrders: true\nYou're using a tokenId from the tokenIds array, not the conditionId\nThe market hasn't already resolved"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/glitch003/vincent",
    "publisherUrl": "https://clawhub.ai/glitch003/vincent",
    "owner": "glitch003",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/vincent",
    "downloadUrl": "https://openagent3.xyz/downloads/vincent",
    "agentUrl": "https://openagent3.xyz/skills/vincent/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vincent/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vincent/agent.md"
  }
}