[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CS71D42M6B8A0R7FGCDYY7":3,"skill-same:01M6CS71D42M6B8A0R7FGCDYY7":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":32,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":50,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M6CS71D42M6B8A0R7FGCDYY7","risk-graph",null,"Use Risk Graph's paid agent API (`\u002Fapi\u002Fv1\u002Fagent\u002F*`) — a DeFi risk-intelligence graph covering pools, assets, protocols, and chains, monetised via the [x402](https:\u002F\u002Fx402.org) micropayment standard over USDC on Base mainnet (chain id `8453`). Every endpoint costs between $0.001 and $0.75 per call; the payer pays no gas — settlement is EIP-3009 `transferWithAuthorization` via the Coinbase CDP facilitator. Use whenever an agent needs structured, programmatic DeFi-risk data and is willing to pay per call: ranking pools by risk, comparing protocols, fetching chain-level risk signals, mapping dependency chains between pools\u002Fassets, extracting subgraphs around a node, explaining why a node is risky, or building an autonomous agent that consumes on-chain risk intelligence. Make sure to use this skill whenever the user mentions Risk Graph, risk-graph, DeFi risk score, pool risk, protocol risk, chain risk, asset risk, node risk explain, subgraph extraction, dependency chain, `\u002Fapi\u002Fv1\u002Fagent\u002F`, x402, paid agent API, USDC paywall, EIP-3009 paywall, Coinbase CDP facilitator, or building AI agents that consume on-chain risk intelligence — even if they don't explicitly name \"Risk Graph\". Triggers on mentions of Risk Graph, risk-graph API, DeFi risk scoring, x402 paywall, USDC micropayments on Base, agent-facing DeFi data, pool\u002Fprotocol\u002Fasset\u002Fchain risk lookup, dependency-graph traversal, subgraph extraction, or paid `\u002Fapi\u002Fv1\u002Fagent\u002F*` endpoints.","yoprotocol\u002Fyo-protocol-skills","yoprotocol","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193741819?v=4","01M6CS6X80H0ER1497K71NZR8F","Yo Protocol","01M6CS6XC2ZHV2QCRE9SB40KES",1,"MIT","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Frisk-graph\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"risk graph","graph","risk","autonomous","intelligence","scoring","coinbase","x402","main","cdp","dependency","gas","ai agents","node","why","api","endpoint","data","defi","risk scoring","2026-11-10 10:12:30",false,"---\nname: risk-graph\ndescription: >-\n  Use Risk Graph's paid agent API (`\u002Fapi\u002Fv1\u002Fagent\u002F*`) — a DeFi risk-intelligence\n  graph covering pools, assets, protocols, and chains, monetised via the\n  [x402](https:\u002F\u002Fx402.org) micropayment standard over USDC on Base mainnet\n  (chain id `8453`). Every endpoint costs between $0.001 and $0.75 per call;\n  the payer pays no gas — settlement is EIP-3009 `transferWithAuthorization`\n  via the Coinbase CDP facilitator. Use whenever an agent needs structured,\n  programmatic DeFi-risk data and is willing to pay per call: ranking pools by\n  risk, comparing protocols, fetching chain-level risk signals, mapping\n  dependency chains between pools\u002Fassets, extracting subgraphs around a node,\n  explaining why a node is risky, or building an autonomous agent that\n  consumes on-chain risk intelligence. Make sure to use this skill whenever\n  the user mentions Risk Graph, risk-graph, DeFi risk score, pool risk,\n  protocol risk, chain risk, asset risk, node risk explain, subgraph\n  extraction, dependency chain, `\u002Fapi\u002Fv1\u002Fagent\u002F`, x402, paid agent API, USDC\n  paywall, EIP-3009 paywall, Coinbase CDP facilitator, or building AI agents\n  that consume on-chain risk intelligence — even if they don't explicitly\n  name \"Risk Graph\". Triggers on mentions of Risk Graph, risk-graph API,\n  DeFi risk scoring, x402 paywall, USDC micropayments on Base, agent-facing\n  DeFi data, pool\u002Fprotocol\u002Fasset\u002Fchain risk lookup, dependency-graph traversal,\n  subgraph extraction, or paid `\u002Fapi\u002Fv1\u002Fagent\u002F*` endpoints.\nauthor: yoprotocol\nhomepage: https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\nsource: https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Ftree\u002Fmain\u002Fskills\u002Frisk-graph\n---\n\nOfficial Yo Protocol skill.\nCanonical repository: https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\n\n# Risk Graph Agent API — Complete Reference\n\nRisk Graph quantifies DeFi risk as a graph: every Pool, Asset, Protocol, and\nChain is a node, every dependency between them (collateral, allocations,\nissuance, hosting, etc.) is a typed edge, and every node carries a composite\nrisk score that propagates through its neighborhood.\n\nThe `\u002Fapi\u002Fv1\u002Fagent\u002F*` namespace is the **public, paid, machine-readable**\nsurface designed for autonomous consumption. It is monetised via the\n[x402 payment standard](https:\u002F\u002Fx402.org) v2 — agents pay tiny amounts of\nUSDC per call, no API keys, no signup.\n\n## Base URL\n\n```\nhttps:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\n```\n\nEvery endpoint below resolves to `https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002F...`. The 402 challenge's `resource.url` field is the canonical source — agents reading the URL from the invoice keep working if the host ever moves.\n\n## Installation\n\n```bash\nnpm install @x402\u002Ffetch @x402\u002Fcore @x402\u002Fevm viem\n# or\npnpm add @x402\u002Ffetch @x402\u002Fcore @x402\u002Fevm viem\n```\n\n`@x402\u002Ffetch` wraps the standard `fetch` API: when a request returns `402 Payment Required`, the wrapper signs an EIP-3009 USDC authorization and retries\nautomatically.\n\n## Wallet and funding\n\nTo consume the API the agent needs:\n\n1. A Base-mainnet EVM private key (e.g. via `viem`'s `privateKeyToAccount`).\n1. **USDC on Base mainnet** at `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`\n   (6 decimals). Approximately $1 covers ~1000 cheap calls.\n1. **No ETH required.** Settlement uses EIP-3009 `transferWithAuthorization`,\n   so the CDP facilitator submits the on-chain transaction and pays the gas.\n   The agent only signs.\n\n## The x402 payment handshake\n\nEvery paid endpoint follows the same three-step pattern. Use `@x402\u002Ffetch` and\nall of this happens automatically; the description below is for understanding\nand debugging.\n\n**Step 1 — unpaid request:**\n\n```http\nGET \u002Fapi\u002Fv1\u002Fagent\u002Fpools HTTP\u002F1.1\nAccept: application\u002Fjson\n```\n\n**Step 2 — `402 Payment Required`.** The body is empty. The invoice lives in\nthe `PAYMENT-REQUIRED` response header as base64-encoded JSON:\n\n```json\n{\n  \"x402Version\": 2,\n  \"error\": \"Payment required\",\n  \"resource\": {\n    \"url\": \"https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002Fpools\",\n    \"description\": \"All risk-scored pools, sortable + filterable — primary agent payload\",\n    \"mimeType\": \"\"\n  },\n  \"accepts\": [\n    {\n      \"scheme\": \"exact\",\n      \"network\": \"eip155:8453\",\n      \"amount\": \"10000\",\n      \"asset\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"payTo\": \"0x\u003Crecipient>\",\n      \"maxTimeoutSeconds\": 300,\n      \"extra\": { \"name\": \"USD Coin\", \"version\": \"2\" }\n    }\n  ]\n}\n```\n\n`resource.url` is the canonical, self-describing URL — treat it as the source\nof truth for the production base URL instead of hard-coding any host. Amounts\nare USDC atomic units (six decimals): `\"1000\"` = $0.001, `\"10000\"` = $0.01,\n`\"100000\"` = $0.10, `\"750000\"` = $0.75.\n\n**Step 3 — paid retry.** Sign the EIP-3009 authorization, base64-encode it,\nsend it in an `X-PAYMENT` request header. The server verifies, executes the\nhandler, settles on-chain after the response is buffered, and returns:\n\n```http\nHTTP\u002F1.1 200 OK\nPAYMENT-RESPONSE: \u003Cbase64(json)>\nContent-Type: application\u002Fjson\n\n{ \"data\": { … }, \"message\": \"OK\", \"statusCode\": 200 }\n```\n\nThe decoded `PAYMENT-RESPONSE` carries the on-chain confirmation:\n\n```json\n{\n  \"success\": true,\n  \"payer\": \"0x\u003Cagent-wallet>\",\n  \"transaction\": \"0x\u003Cbase-mainnet-tx-hash>\",\n  \"network\": \"eip155:8453\"\n}\n```\n\nThe `transaction` field is a verifiable Base mainnet transaction hash (look\nit up on [basescan.org](https:\u002F\u002Fbasescan.org)).\n\n### No-charge guarantee on failure\n\nSettlement runs **after** the handler responds, and **only on 2xx**. If the\nhandler returns `400` (validation), `404` (node not found), or `5xx` (server\nerror), there is no `PAYMENT-RESPONSE` header and no on-chain transfer — the\nwallet is debited only when data is actually delivered. This makes it safe\nto probe with imperfect inputs.\n\n______________________________________________________________________\n\n## Endpoint catalogue\n\nAll endpoints are `GET`. Prices are in USDC. Paths are versioned at `\u002Fv1`;\nbreaking changes ship under `\u002Fv2`.\n\n### Discovery — $0.001 each\n\n| Path                            | Returns                                                    | When to call                            |\n| ------------------------------- | ---------------------------------------------------------- | --------------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fschema`          | `{ riskTiers, nodeTypes, edgeTypes, edgeConstraints }`     | **First call** — defines the data model |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fstats`           | `{ nodes, edges, byNetwork, byProtocol, byTier, avgRisk }` | Query-scope sizing                      |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fchains`          | `{ items, total, page, hasMore }` of `Chain` nodes         | Catalogue by chain                      |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fprotocols`       | `{ items, total, page, hasMore }` of `Protocol` nodes      | Catalogue by protocol                   |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fsearch?q=\u003Ctext>` | `{ nodes }`                                                | Full-text node search by name\u002Fsymbol    |\n\n### Core lists & lookups — $0.01 each\n\n| Path                                    | Returns                                                  | When to call               |\n| --------------------------------------- | -------------------------------------------------------- | -------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fassets`                  | `{ items, total, page, hasMore }` of `Asset` nodes       | Asset catalogue + risk     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fpools`                   | `{ items, total, page, hasMore }` of `Pool` nodes        | **Primary agent payload**  |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fnodes?label=\u003CNodeLabel>` | `{ nodes, total, page }`                                 | Generic paginated listing  |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F:nodeId`          | `{ nodeId, labels, score, penaltyBps, tier, breakdown }` | Raw score for one node     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscorecards`              | Bare array of scoring rubrics \u002F question sets            | How scores are constructed |\n\n### Computed — $0.05 each\n\n| Path                                            | Returns                         | When to call                                                           |\n| ----------------------------------------------- | ------------------------------- | ---------------------------------------------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fnode\u002F:nodeId`                    | `{ node, edges, neighbors }`    | One node + full 1-hop neighborhood                                     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fcompare?nodeId=\u003Cid>&days=\u003C1-90>` | Time-series snapshot comparison | Risk drift over a window (`404` if snapshots insufficient — no charge) |\n\n### Research-grade — $0.10 each\n\n| Path                                   | Returns                                                                                            | When to call                |\n| -------------------------------------- | -------------------------------------------------------------------------------------------------- | --------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F:nodeId\u002Fexplain` | Full recursive score breakdown — component sub-scores, composite traversal, contributing neighbors | \"Why is this node risky?\"   |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fstatus`                 | `{ summary, byType, incomplete, unscored }`                                                        | Scoring completion overview |\n\n### Heavy traversal — $0.75 each\n\n| Path                                                    | Returns                                                                | When to call                      |\n| ------------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fdependencies?nodeId=\u003Cid>&maxHops=\u003C1-10>` | `{ paths }` — dependency chain from a node, optionally toward an asset | Reachability \u002F dependency mapping |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fsubgraph?nodeId=\u003Cid>&maxHops=\u003C1-5>`      | `{ nodes, edges }`                                                     | Deep neighborhood research        |\n\nOptional `targetAsset=\u003CnodeId>` on `\u002Fdependencies` constrains paths that reach\nthat specific asset.\n\n______________________________________________________________________\n\n## Response envelope and shape exceptions\n\nEvery response is wrapped:\n\n```json\n{ \"data\": \u003Cpayload>, \"message\": \"OK\", \"statusCode\": 200 }\n```\n\nAlways read your payload from `data`. The shape of `data` varies by endpoint:\n\n| Endpoint family                                            | `data` shape                                            |\n| ---------------------------------------------------------- | ------------------------------------------------------- |\n| Sorted listings (`chains`, `protocols`, `assets`, `pools`) | `{ items, total, page, hasMore }`                       |\n| `\u002Fagent\u002Fnodes`                                             | `{ nodes, total, page }` *(note: `nodes`, not `items`)* |\n| `\u002Fagent\u002Fsearch`                                            | `{ nodes }`                                             |\n| `\u002Fagent\u002Fscorecards`                                        | Bare array — not wrapped                                |\n| Single-node endpoints                                      | A single object                                         |\n\nThese quirks are stable but easy to miss — when the LLM is unsure, prefer\ndefensive access: `data?.items ?? data?.nodes ?? data ?? []`.\n\n`Cache-Control` is `no-cache, no-store, must-revalidate` on every paid\nresponse. Do not rely on shared HTTP caches; cache locally if needed.\n\n______________________________________________________________________\n\n## Common types\n\n```ts\ntype NodeId = string;                              \u002F\u002F e.g. \"pool:base:0x8eff…\"\ntype NodeLabel = \"Pool\" | \"Asset\" | \"Protocol\" | \"Chain\";\n\ntype EdgeType =\n  | \"TOKENIZES\"\n  | \"ACCEPTS_DEPOSITS_IN\"\n  | \"IS_COLLATERALIZED_BY\"\n  | \"BORROWS\"\n  | \"ALLOCATES\"\n  | \"BACKED_BY\"\n  | \"ISSUED_BY\"\n  | \"OPERATED_BY\"\n  | \"USES_LENDING_VENUE\"\n  | \"USES_TRADING_VENUE\"\n  | \"LIVES_ON\"\n  | \"BRIDGED_VIA\"\n  | \"DEPENDS_ON_PROTOCOL\";\n\ntype PropertyValue = string | number | boolean | null;\n\ninterface GraphNode {\n  id: NodeId;\n  labels: NodeLabel[];\n  properties: Record\u003Cstring, PropertyValue>;\n}\n\ninterface GraphEdge {\n  type: EdgeType;\n  sourceId: NodeId;\n  targetId: NodeId;\n  properties?: Record\u003Cstring, PropertyValue>;\n}\n```\n\n### Risk-related properties on nodes\n\n| Property           | Meaning                                                           |\n| ------------------ | ----------------------------------------------------------------- |\n| `_riskScore`       | Composite risk score, `0..1` (lower is riskier)                   |\n| `_riskTier`        | Coarse tier letter (`A` best → `F` worst); exact set in `\u002Fschema` |\n| `_riskPenaltyBps`  | Cumulative penalty in basis points                                |\n| `_riskCompositeOf` | JSON string of the component nodes that contributed               |\n\n### `NodeId` convention\n\nDeterministic, content-addressable: `\u003Clabel>:\u003Cchain-or-namespace>:\u003Caddress-or-slug>`.\nExamples:\n\n- `pool:base:0x8effa741061aaa2d8a5012a9b09a2d31d8b628d7`\n- `asset:ethereum:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48` (USDC)\n- `protocol:morpho`\n- `chain:base`\n\n______________________________________________________________________\n\n## Listing query params\n\nThe sorted listing endpoints (`\u002Fchains`, `\u002Fprotocols`, `\u002Fassets`, `\u002Fpools`)\nshare this parameter set:\n\n| Param         | Type            | Default      | Notes                                |\n| ------------- | --------------- | ------------ | ------------------------------------ |\n| `sortBy`      | string          | `_riskScore` | any property on the node             |\n| `sortDir`     | `asc` \\| `desc` | `desc`       |                                      |\n| `tiers`       | csv string      | —            | e.g. `A,B,C` — filter by `_riskTier` |\n| `chains`      | csv string      | —            | filter by chain slug                 |\n| `protocols`   | csv string      | —            | filter by protocol slug              |\n| `q`           | string          | —            | substring search on name             |\n| `filterKey`   | string          | —            | property key to filter on            |\n| `filterValue` | string          | —            | exact-match value for `filterKey`    |\n| `page`        | int ≥ 1         | —            | omit to return all rows              |\n| `limit`       | int 1–200       | —            | omit to return all rows              |\n\n`\u002Fagent\u002Fnodes` accepts a different (smaller) set: `label`, `protocol`,\n`network`, `page` (default `1`), `limit` (default `20`, max `100`).\n\n______________________________________________________________________\n\n## Minimal client (~10 lines, Node)\n\n```ts\nimport { x402Client }            from '@x402\u002Fcore\u002Fclient';\nimport { ExactEvmScheme }        from '@x402\u002Fevm\u002Fexact\u002Fclient';\nimport { wrapFetchWithPayment }  from '@x402\u002Ffetch';\nimport { privateKeyToAccount }   from 'viem\u002Faccounts';\n\nconst signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`);\nconst client = new x402Client();\nclient.register('eip155:*', new ExactEvmScheme(signer));  \u002F\u002F wildcard covers any eip155 chain\nconst fetchPaid = wrapFetchWithPayment(fetch, client);\n\nconst res    = await fetchPaid('https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002Fpools?limit=10');\nconst json   = await res.json();                           \u002F\u002F { data: { items, … }, … }\nconst items  = json?.data?.items ?? [];\nconst txHash = res.headers.get('payment-response');        \u002F\u002F base64 settlement receipt\n```\n\nRegister `eip155:*` rather than a specific chain — the wildcard handles any\nEVM network the invoice declares, so the same client works against mainnet,\ntestnet, or a future chain without code changes.\n\n______________________________________________________________________\n\n## Workflow examples\n\n### Discover, then deep-dive on a pool\n\n```ts\n\u002F\u002F 1. Learn the data model (one-time, $0.001)\nconst schema = (await (await fetchPaid(`${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fschema`)).json()).data;\n\n\u002F\u002F 2. Find candidate pools — top 50 by TVL ($0.01)\nconst pools = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fpools?sortBy=totalAssetsUsd&sortDir=desc&limit=50`\n)).json()).data.items;\n\n\u002F\u002F 3. Drill into one (full breakdown, $0.10)\nconst top = pools[0];\nconst explain = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F${encodeURIComponent(top.id)}\u002Fexplain`\n)).json()).data;\n\n\u002F\u002F 4. Map the surrounding risk graph ($0.75)\nconst subgraph = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fsubgraph?nodeId=${encodeURIComponent(top.id)}&maxHops=2`\n)).json()).data;\n```\n\nTotal spend: $0.861.\n\n### Rank protocols by risk and compare\n\n```ts\nconst protocols = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fprotocols?sortBy=_riskScore&sortDir=asc&limit=20`\n)).json()).data.items;\n\nfor (const p of protocols.slice(0, 3)) {\n  const r = (await (await fetchPaid(\n    `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F${encodeURIComponent(p.id)}`\n  )).json()).data;\n  console.log(p.properties.name, r.score.toFixed(3), r.tier);\n}\n```\n\n### Find what an asset depends on\n\n```ts\nconst paths = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fdependencies?nodeId=${encodeURIComponent('pool:base:0x8eff…')}&maxHops=5&targetAsset=${encodeURIComponent('asset:base:0x8335…2913')}`\n)).json()).data.paths;\n```\n\n______________________________________________________________________\n\n## Important notes\n\n1. **`resource.url` from the invoice is canonical.** It carries the production\n   host. Don't hard-code a base URL — read it from the first 402 response and\n   cache it for the session.\n\n1. **Wildcard signer registration.** Register `eip155:*` so the client works\n   whatever network the invoice declares. The wildcard scheme covers both\n   Base mainnet today and any future EVM network.\n\n1. **Fund with USDC, not ETH.** EIP-3009 settlements are gasless from the\n   payer's perspective — only USDC is required in the wallet. The facilitator\n   pays gas.\n\n1. **No-charge on failure means you can probe.** Trying an unknown `nodeId`\n   returns `404` with no settlement, so it's safe to call `\u002Fscores\u002F:id` or\n   `\u002Fnode\u002F:id` with uncertain input. Validation errors (`400`) and server\n   errors (`5xx`) likewise skip settlement.\n\n1. **`\u002Fcompare` is the one endpoint that often `404`s legitimately.** It\n   requires at least two snapshots in the requested window — for a freshly\n   indexed node there may not be enough history yet. Don't treat the 404 as\n   an error; treat it as \"no data available for this window\".\n\n1. **Cache the schema response.** `\u002Fagent\u002Fschema` rarely changes; caching it\n   for the agent session saves $0.001 on every subsequent call and avoids\n   re-fetching the static data-model declaration.\n\n1. **List responses can be large.** `\u002Fagent\u002Fpools` without a `limit` returns\n   the full catalogue (sometimes >1 MB). Pass `limit` and `page` to bound\n   payload size; iterate via `hasMore`.\n\n1. **Sibling discovery surfaces.** The same content is also exposed at\n   `https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fllms.txt` (overview + catalogue) and `\u002Fllms-full.txt`\n   (full reference). Both are crawlable by AI assistants and listed in the\n   site's sitemap — this skill is the in-IDE equivalent for Claude Code.\n","Official Yo Protocol skill.\nCanonical repository: https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\n\n# Risk Graph Agent API — Complete Reference\n\nRisk Graph quantifies DeFi risk as a graph: every Pool, Asset, Protocol, and\nChain is a node, every dependency between them (collateral, allocations,\nissuance, hosting, etc.) is a typed edge, and every node carries a composite\nrisk score that propagates through its neighborhood.\n\nThe `\u002Fapi\u002Fv1\u002Fagent\u002F*` namespace is the **public, paid, machine-readable**\nsurface designed for autonomous consumption. It is monetised via the\n[x402 payment standard](https:\u002F\u002Fx402.org) v2 — agents pay tiny amounts of\nUSDC per call, no API keys, no signup.\n\n## Base URL\n\n```\nhttps:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\n```\n\nEvery endpoint below resolves to `https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002F...`. The 402 challenge's `resource.url` field is the canonical source — agents reading the URL from the invoice keep working if the host ever moves.\n\n## Installation\n\n```bash\nnpm install @x402\u002Ffetch @x402\u002Fcore @x402\u002Fevm viem\n# or\npnpm add @x402\u002Ffetch @x402\u002Fcore @x402\u002Fevm viem\n```\n\n`@x402\u002Ffetch` wraps the standard `fetch` API: when a request returns `402 Payment Required`, the wrapper signs an EIP-3009 USDC authorization and retries\nautomatically.\n\n## Wallet and funding\n\nTo consume the API the agent needs:\n\n1. A Base-mainnet EVM private key (e.g. via `viem`'s `privateKeyToAccount`).\n1. **USDC on Base mainnet** at `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`\n   (6 decimals). Approximately $1 covers ~1000 cheap calls.\n1. **No ETH required.** Settlement uses EIP-3009 `transferWithAuthorization`,\n   so the CDP facilitator submits the on-chain transaction and pays the gas.\n   The agent only signs.\n\n## The x402 payment handshake\n\nEvery paid endpoint follows the same three-step pattern. Use `@x402\u002Ffetch` and\nall of this happens automatically; the description below is for understanding\nand debugging.\n\n**Step 1 — unpaid request:**\n\n```http\nGET \u002Fapi\u002Fv1\u002Fagent\u002Fpools HTTP\u002F1.1\nAccept: application\u002Fjson\n```\n\n**Step 2 — `402 Payment Required`.** The body is empty. The invoice lives in\nthe `PAYMENT-REQUIRED` response header as base64-encoded JSON:\n\n```json\n{\n  \"x402Version\": 2,\n  \"error\": \"Payment required\",\n  \"resource\": {\n    \"url\": \"https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002Fpools\",\n    \"description\": \"All risk-scored pools, sortable + filterable — primary agent payload\",\n    \"mimeType\": \"\"\n  },\n  \"accepts\": [\n    {\n      \"scheme\": \"exact\",\n      \"network\": \"eip155:8453\",\n      \"amount\": \"10000\",\n      \"asset\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"payTo\": \"0x\u003Crecipient>\",\n      \"maxTimeoutSeconds\": 300,\n      \"extra\": { \"name\": \"USD Coin\", \"version\": \"2\" }\n    }\n  ]\n}\n```\n\n`resource.url` is the canonical, self-describing URL — treat it as the source\nof truth for the production base URL instead of hard-coding any host. Amounts\nare USDC atomic units (six decimals): `\"1000\"` = $0.001, `\"10000\"` = $0.01,\n`\"100000\"` = $0.10, `\"750000\"` = $0.75.\n\n**Step 3 — paid retry.** Sign the EIP-3009 authorization, base64-encode it,\nsend it in an `X-PAYMENT` request header. The server verifies, executes the\nhandler, settles on-chain after the response is buffered, and returns:\n\n```http\nHTTP\u002F1.1 200 OK\nPAYMENT-RESPONSE: \u003Cbase64(json)>\nContent-Type: application\u002Fjson\n\n{ \"data\": { … }, \"message\": \"OK\", \"statusCode\": 200 }\n```\n\nThe decoded `PAYMENT-RESPONSE` carries the on-chain confirmation:\n\n```json\n{\n  \"success\": true,\n  \"payer\": \"0x\u003Cagent-wallet>\",\n  \"transaction\": \"0x\u003Cbase-mainnet-tx-hash>\",\n  \"network\": \"eip155:8453\"\n}\n```\n\nThe `transaction` field is a verifiable Base mainnet transaction hash (look\nit up on [basescan.org](https:\u002F\u002Fbasescan.org)).\n\n### No-charge guarantee on failure\n\nSettlement runs **after** the handler responds, and **only on 2xx**. If the\nhandler returns `400` (validation), `404` (node not found), or `5xx` (server\nerror), there is no `PAYMENT-RESPONSE` header and no on-chain transfer — the\nwallet is debited only when data is actually delivered. This makes it safe\nto probe with imperfect inputs.\n\n______________________________________________________________________\n\n## Endpoint catalogue\n\nAll endpoints are `GET`. Prices are in USDC. Paths are versioned at `\u002Fv1`;\nbreaking changes ship under `\u002Fv2`.\n\n### Discovery — $0.001 each\n\n| Path                            | Returns                                                    | When to call                            |\n| ------------------------------- | ---------------------------------------------------------- | --------------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fschema`          | `{ riskTiers, nodeTypes, edgeTypes, edgeConstraints }`     | **First call** — defines the data model |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fstats`           | `{ nodes, edges, byNetwork, byProtocol, byTier, avgRisk }` | Query-scope sizing                      |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fchains`          | `{ items, total, page, hasMore }` of `Chain` nodes         | Catalogue by chain                      |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fprotocols`       | `{ items, total, page, hasMore }` of `Protocol` nodes      | Catalogue by protocol                   |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fsearch?q=\u003Ctext>` | `{ nodes }`                                                | Full-text node search by name\u002Fsymbol    |\n\n### Core lists & lookups — $0.01 each\n\n| Path                                    | Returns                                                  | When to call               |\n| --------------------------------------- | -------------------------------------------------------- | -------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fassets`                  | `{ items, total, page, hasMore }` of `Asset` nodes       | Asset catalogue + risk     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fpools`                   | `{ items, total, page, hasMore }` of `Pool` nodes        | **Primary agent payload**  |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fnodes?label=\u003CNodeLabel>` | `{ nodes, total, page }`                                 | Generic paginated listing  |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F:nodeId`          | `{ nodeId, labels, score, penaltyBps, tier, breakdown }` | Raw score for one node     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscorecards`              | Bare array of scoring rubrics \u002F question sets            | How scores are constructed |\n\n### Computed — $0.05 each\n\n| Path                                            | Returns                         | When to call                                                           |\n| ----------------------------------------------- | ------------------------------- | ---------------------------------------------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fnode\u002F:nodeId`                    | `{ node, edges, neighbors }`    | One node + full 1-hop neighborhood                                     |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fcompare?nodeId=\u003Cid>&days=\u003C1-90>` | Time-series snapshot comparison | Risk drift over a window (`404` if snapshots insufficient — no charge) |\n\n### Research-grade — $0.10 each\n\n| Path                                   | Returns                                                                                            | When to call                |\n| -------------------------------------- | -------------------------------------------------------------------------------------------------- | --------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F:nodeId\u002Fexplain` | Full recursive score breakdown — component sub-scores, composite traversal, contributing neighbors | \"Why is this node risky?\"   |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fstatus`                 | `{ summary, byType, incomplete, unscored }`                                                        | Scoring completion overview |\n\n### Heavy traversal — $0.75 each\n\n| Path                                                    | Returns                                                                | When to call                      |\n| ------------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------- |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fdependencies?nodeId=\u003Cid>&maxHops=\u003C1-10>` | `{ paths }` — dependency chain from a node, optionally toward an asset | Reachability \u002F dependency mapping |\n| `\u002Fapi\u002Fv1\u002Fagent\u002Fsubgraph?nodeId=\u003Cid>&maxHops=\u003C1-5>`      | `{ nodes, edges }`                                                     | Deep neighborhood research        |\n\nOptional `targetAsset=\u003CnodeId>` on `\u002Fdependencies` constrains paths that reach\nthat specific asset.\n\n______________________________________________________________________\n\n## Response envelope and shape exceptions\n\nEvery response is wrapped:\n\n```json\n{ \"data\": \u003Cpayload>, \"message\": \"OK\", \"statusCode\": 200 }\n```\n\nAlways read your payload from `data`. The shape of `data` varies by endpoint:\n\n| Endpoint family                                            | `data` shape                                            |\n| ---------------------------------------------------------- | ------------------------------------------------------- |\n| Sorted listings (`chains`, `protocols`, `assets`, `pools`) | `{ items, total, page, hasMore }`                       |\n| `\u002Fagent\u002Fnodes`                                             | `{ nodes, total, page }` *(note: `nodes`, not `items`)* |\n| `\u002Fagent\u002Fsearch`                                            | `{ nodes }`                                             |\n| `\u002Fagent\u002Fscorecards`                                        | Bare array — not wrapped                                |\n| Single-node endpoints                                      | A single object                                         |\n\nThese quirks are stable but easy to miss — when the LLM is unsure, prefer\ndefensive access: `data?.items ?? data?.nodes ?? data ?? []`.\n\n`Cache-Control` is `no-cache, no-store, must-revalidate` on every paid\nresponse. Do not rely on shared HTTP caches; cache locally if needed.\n\n______________________________________________________________________\n\n## Common types\n\n```ts\ntype NodeId = string;                              \u002F\u002F e.g. \"pool:base:0x8eff…\"\ntype NodeLabel = \"Pool\" | \"Asset\" | \"Protocol\" | \"Chain\";\n\ntype EdgeType =\n  | \"TOKENIZES\"\n  | \"ACCEPTS_DEPOSITS_IN\"\n  | \"IS_COLLATERALIZED_BY\"\n  | \"BORROWS\"\n  | \"ALLOCATES\"\n  | \"BACKED_BY\"\n  | \"ISSUED_BY\"\n  | \"OPERATED_BY\"\n  | \"USES_LENDING_VENUE\"\n  | \"USES_TRADING_VENUE\"\n  | \"LIVES_ON\"\n  | \"BRIDGED_VIA\"\n  | \"DEPENDS_ON_PROTOCOL\";\n\ntype PropertyValue = string | number | boolean | null;\n\ninterface GraphNode {\n  id: NodeId;\n  labels: NodeLabel[];\n  properties: Record\u003Cstring, PropertyValue>;\n}\n\ninterface GraphEdge {\n  type: EdgeType;\n  sourceId: NodeId;\n  targetId: NodeId;\n  properties?: Record\u003Cstring, PropertyValue>;\n}\n```\n\n### Risk-related properties on nodes\n\n| Property           | Meaning                                                           |\n| ------------------ | ----------------------------------------------------------------- |\n| `_riskScore`       | Composite risk score, `0..1` (lower is riskier)                   |\n| `_riskTier`        | Coarse tier letter (`A` best → `F` worst); exact set in `\u002Fschema` |\n| `_riskPenaltyBps`  | Cumulative penalty in basis points                                |\n| `_riskCompositeOf` | JSON string of the component nodes that contributed               |\n\n### `NodeId` convention\n\nDeterministic, content-addressable: `\u003Clabel>:\u003Cchain-or-namespace>:\u003Caddress-or-slug>`.\nExamples:\n\n- `pool:base:0x8effa741061aaa2d8a5012a9b09a2d31d8b628d7`\n- `asset:ethereum:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48` (USDC)\n- `protocol:morpho`\n- `chain:base`\n\n______________________________________________________________________\n\n## Listing query params\n\nThe sorted listing endpoints (`\u002Fchains`, `\u002Fprotocols`, `\u002Fassets`, `\u002Fpools`)\nshare this parameter set:\n\n| Param         | Type            | Default      | Notes                                |\n| ------------- | --------------- | ------------ | ------------------------------------ |\n| `sortBy`      | string          | `_riskScore` | any property on the node             |\n| `sortDir`     | `asc` \\| `desc` | `desc`       |                                      |\n| `tiers`       | csv string      | —            | e.g. `A,B,C` — filter by `_riskTier` |\n| `chains`      | csv string      | —            | filter by chain slug                 |\n| `protocols`   | csv string      | —            | filter by protocol slug              |\n| `q`           | string          | —            | substring search on name             |\n| `filterKey`   | string          | —            | property key to filter on            |\n| `filterValue` | string          | —            | exact-match value for `filterKey`    |\n| `page`        | int ≥ 1         | —            | omit to return all rows              |\n| `limit`       | int 1–200       | —            | omit to return all rows              |\n\n`\u002Fagent\u002Fnodes` accepts a different (smaller) set: `label`, `protocol`,\n`network`, `page` (default `1`), `limit` (default `20`, max `100`).\n\n______________________________________________________________________\n\n## Minimal client (~10 lines, Node)\n\n```ts\nimport { x402Client }            from '@x402\u002Fcore\u002Fclient';\nimport { ExactEvmScheme }        from '@x402\u002Fevm\u002Fexact\u002Fclient';\nimport { wrapFetchWithPayment }  from '@x402\u002Ffetch';\nimport { privateKeyToAccount }   from 'viem\u002Faccounts';\n\nconst signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`);\nconst client = new x402Client();\nclient.register('eip155:*', new ExactEvmScheme(signer));  \u002F\u002F wildcard covers any eip155 chain\nconst fetchPaid = wrapFetchWithPayment(fetch, client);\n\nconst res    = await fetchPaid('https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fapi\u002Fv1\u002Fagent\u002Fpools?limit=10');\nconst json   = await res.json();                           \u002F\u002F { data: { items, … }, … }\nconst items  = json?.data?.items ?? [];\nconst txHash = res.headers.get('payment-response');        \u002F\u002F base64 settlement receipt\n```\n\nRegister `eip155:*` rather than a specific chain — the wildcard handles any\nEVM network the invoice declares, so the same client works against mainnet,\ntestnet, or a future chain without code changes.\n\n______________________________________________________________________\n\n## Workflow examples\n\n### Discover, then deep-dive on a pool\n\n```ts\n\u002F\u002F 1. Learn the data model (one-time, $0.001)\nconst schema = (await (await fetchPaid(`${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fschema`)).json()).data;\n\n\u002F\u002F 2. Find candidate pools — top 50 by TVL ($0.01)\nconst pools = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fpools?sortBy=totalAssetsUsd&sortDir=desc&limit=50`\n)).json()).data.items;\n\n\u002F\u002F 3. Drill into one (full breakdown, $0.10)\nconst top = pools[0];\nconst explain = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F${encodeURIComponent(top.id)}\u002Fexplain`\n)).json()).data;\n\n\u002F\u002F 4. Map the surrounding risk graph ($0.75)\nconst subgraph = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fsubgraph?nodeId=${encodeURIComponent(top.id)}&maxHops=2`\n)).json()).data;\n```\n\nTotal spend: $0.861.\n\n### Rank protocols by risk and compare\n\n```ts\nconst protocols = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fprotocols?sortBy=_riskScore&sortDir=asc&limit=20`\n)).json()).data.items;\n\nfor (const p of protocols.slice(0, 3)) {\n  const r = (await (await fetchPaid(\n    `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fscores\u002F${encodeURIComponent(p.id)}`\n  )).json()).data;\n  console.log(p.properties.name, r.score.toFixed(3), r.tier);\n}\n```\n\n### Find what an asset depends on\n\n```ts\nconst paths = (await (await fetchPaid(\n  `${BASE}\u002Fapi\u002Fv1\u002Fagent\u002Fdependencies?nodeId=${encodeURIComponent('pool:base:0x8eff…')}&maxHops=5&targetAsset=${encodeURIComponent('asset:base:0x8335…2913')}`\n)).json()).data.paths;\n```\n\n______________________________________________________________________\n\n## Important notes\n\n1. **`resource.url` from the invoice is canonical.** It carries the production\n   host. Don't hard-code a base URL — read it from the first 402 response and\n   cache it for the session.\n\n1. **Wildcard signer registration.** Register `eip155:*` so the client works\n   whatever network the invoice declares. The wildcard scheme covers both\n   Base mainnet today and any future EVM network.\n\n1. **Fund with USDC, not ETH.** EIP-3009 settlements are gasless from the\n   payer's perspective — only USDC is required in the wallet. The facilitator\n   pays gas.\n\n1. **No-charge on failure means you can probe.** Trying an unknown `nodeId`\n   returns `404` with no settlement, so it's safe to call `\u002Fscores\u002F:id` or\n   `\u002Fnode\u002F:id` with uncertain input. Validation errors (`400`) and server\n   errors (`5xx`) likewise skip settlement.\n\n1. **`\u002Fcompare` is the one endpoint that often `404`s legitimately.** It\n   requires at least two snapshots in the requested window — for a freshly\n   indexed node there may not be enough history yet. Don't treat the 404 as\n   an error; treat it as \"no data available for this window\".\n\n1. **Cache the schema response.** `\u002Fagent\u002Fschema` rarely changes; caching it\n   for the agent session saves $0.001 on every subsequent call and avoids\n   re-fetching the static data-model declaration.\n\n1. **List responses can be large.** `\u002Fagent\u002Fpools` without a `limit` returns\n   the full catalogue (sometimes >1 MB). Pass `limit` and `page` to bound\n   payload size; iterate via `hasMore`.\n\n1. **Sibling discovery surfaces.** The same content is also exposed at\n   `https:\u002F\u002Frisk-graph-gx7v4.ondigitalocean.app\u002Fllms.txt` (overview + catalogue) and `\u002Fllms-full.txt`\n   (full reference). Both are crawlable by AI assistants and listed in the\n   site's sitemap — this skill is the in-IDE equivalent for Claude Code.\n",{"name":5,"author":9,"source":49,"homepage":50,"description":7},"https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Ftree\u002Fmain\u002Fskills\u002Frisk-graph","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills","85ca86ba6f1e897b87386540895633537cd0567a","skills\u002Frisk-graph",0,"https:\u002F\u002Fwww.yo.xyz","https:\u002F\u002Fgithub.com\u002Fyoprotocol","https:\u002F\u002Fwww.yo.xyz\u002F","The best yield in DeFi, period.","2026-06-02 15:57:30",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add yoprotocol\u002Fyo-protocol-skills --skill risk-graph",{"tool":65,"command":66},"bunx","bunx skills add yoprotocol\u002Fyo-protocol-skills --skill risk-graph",{"tool":68,"command":69},"pnpm","pnpm dlx skills add yoprotocol\u002Fyo-protocol-skills --skill risk-graph","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Frisk-graph\u002FSKILL.md",true,[],[74,102,124,144,172,190],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":83,"publishedAt":44},"01M6CS7MTTR71862B7EF3BS8G9","yo-protocol-sdk","ALWAYS use this skill when the user writes TypeScript or JavaScript code that imports from `@yo-protocol\u002Fcore`, uses `createYoClient`, or programmatically interacts with Yo Protocol vaults (yoETH, yoUSD, yoBTC, yoEUR, yoGOLD, yoUSDT) via the SDK. This skill covers the complete `@yo-protocol\u002Fcore` SDK: client initialization (createYoClient, multi-chain publicClients, partnerId), vault reads (getVaultState, previewDeposit, previewRedeem, isPaused), user reads (getUserPosition, getShareBalance, getTokenBalance, getAllowance), prepared transactions (prepareDepositWithApproval, prepareRedeemWithApproval, prepareApprove), REST API queries (getVaultSnapshot, getVaultYieldHistory, getVaultTvlHistory, getUserHistory, getUserPerformance), Merkl reward claims (getClaimableRewards, prepareClaimMerklRewards), and utilities (parseTokenAmount, formatTokenAmount, VAULTS registry, gateway address). Trigger for Node.js scripts, backend services, bots, Safe\u002FAA batch transaction builders, or any non-React TypeScript code that interacts with Yo Protocol. Also trigger when the user mentions the Yo gateway, PreparedTransaction, ERC-4626 vault interactions specific to Yo, or asks about vault addresses and token addresses per chain. Do NOT use for React hooks (use yo-protocol-react) or CLI shell commands (use yo-protocol-cli).","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyo-protocol-sdk\u002FSKILL.md",[80],{"categoryNo":81,"categoryName":82,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[84,85,86,87,88,89,90,91,92,93,94,39,95,96,97,98,99,32,100,101],"sdk","protocol","yo protocol","yo protocol sdk","javascript","react","core","code","batch","gateway","REST","transactions","use","hooks","queries","do","bots","backend services",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":112,"publishedAt":44},"01M6CS7H051N19JKSVQD7AFFDM","yo-protocol-react-sdk","ALWAYS use this skill when the user is working with React components or hooks that interact with Yo Protocol vaults, or imports from `@yo-protocol\u002Freact`. This skill covers the full React SDK: YieldProvider setup, query hooks (useVaultState, useVaultSnapshot, useUserPosition, useTokenBalance, useShareBalance, useAllowance, useMerklRewards, useLeaderboard, usePrices, etc.), action hooks (useDeposit, useRedeem, useApprove, useClaimMerklRewards), and migration from the old API (useVault→useVaultState, useUserBalance→useUserPosition, inputToken→token, account→owner, partnerId string→number, publicClient→publicClients). Trigger whenever the user mentions yo protocol React hooks, vault dashboard components, deposit\u002Fredeem UI flows, YieldProvider, useYoClient, @yo-protocol\u002Freact, yo-kit, or asks to build React components for yoETH, yoUSD, yoBTC, yoEUR, yoGOLD, or yoUSDT vaults. Also trigger when the user has broken imports or API changes after upgrading @yo-protocol\u002Freact. Do NOT use for CLI shell commands (use yo-protocol-cli) or server-side Node.js scripts without React (use yo-protocol-sdk).","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyo-protocol-react\u002FSKILL.md",[108,111],{"categoryNo":109,"categoryName":110,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":81,"categoryName":82,"taxonomyType":21,"taxonomyTypeDesc":22},[84,89,85,86,113,114,115,116,117,118,119,120,39,121,96,97,122,99,32,123],"yo protocol react sdk","cli","github","dashboard","components","react components","server","vault","broken","build","query",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":44},"01M6CS7CXA28R1NED0WTPBVGD5","yo-protocol-cli","ALWAYS use this skill when the user mentions the YO Protocol CLI, the `yo` command, `@yo-protocol\u002Fcli`, or wants to interact with YO Protocol vaults (yoETH, yoUSD, yoBTC, yoEUR, yoGOLD, yoUSDT) from a shell script, terminal, or command line. The `yo` binary is an agent-first interface for ERC-4626 yield vaults on Ethereum (1), Base (8453), and Arbitrum (42161). It outputs structured JSON to stdout, never requires or accepts private keys, and produces unsigned calldata routed through the YO Gateway — ready for Safe\u002FAA wallets and Base MCP `send_calls`. Use it for: building unsigned transactions (`yo prepare {approve,deposit,redeem,deposit-with-approval}`), reading positions and rewards (`yo position`, `yo portfolio`, `yo pending-redeems`, `yo rewards`, `yo yo-rewards`, `yo user-perf`), listing vaults and history (`yo vaults`, `yo vault`, `yo history`, `yo prices`, `yo yield`, `yo tvl`, `yo share-price`, `yo perf`, `yo leaderboard`), self-describing the command surface for an agent (`yo schema`), setting up `YO_RPC_URL`, or piping output into jq or other tools. Do NOT use for React hooks (`@yo-protocol\u002Freact`) or TypeScript SDK code (`@yo-protocol\u002Fcore`) — those have dedicated skills.","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyo-protocol-cli\u002FSKILL.md",[130],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[114,85,86,132,133,134,135,136,89,91,137,95,138,139,140,141,142,97,32,143],"yo protocol cli","MCP","terminal","safe","typescript","ethereum","command","portfolio","never","ready","up","self",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":159,"publishedAt":44},"01M6CS79KBBDT71057WFHMQVHC","yo-design","Create distinctive, production-grade React + Tailwind v4 interfaces in YO's dark-theme aesthetic (#000 background, #D6FF34 neon accent, Space Grotesk). Use this skill when the user asks to build web components, pages, dashboards, or applications for YO — including vault displays, DeFi interfaces, landing pages, or any UI that should follow the YO brand. Also use when the user mentions \"YO theme\", \"YO style\", \"YO brand\", or asks to style something with the neon-on-black look.","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyo-design\u002FSKILL.md",[150,151,154],{"categoryNo":109,"categoryName":110,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":152,"categoryName":153,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":155,"categoryName":156,"taxonomyType":157,"taxonomyTypeDesc":158},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[160,161,115,162,117,89,163,164,85,165,166,120,167,168,169,96,170,171,122,32],"design","yo design","web","web components","create","https","applications","Tailwind","brand","landing","aesthetic","tailwind v4",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":179,"publishedAt":44},"01M6CS75XVA4Y5XD6X884A8MVN","yo-base-mcp-plugin","Base MCP plugin for YO Protocol — ERC-4626 yield vaults with ERC-7540 async redemption on Ethereum (1), Base (8453), and Arbitrum (42161). Both deposit and withdraw route through the YO Gateway. Use when the user wants to view YO vaults, check positions\u002Fbalances\u002Frewards, deposit, request a redeem (instant or async), or claim Merkl rewards via Base MCP's `send_calls`. Triggers on YO Protocol, yoUSD, yoETH, yoBTC, yoEUR, yoGOLD, yoUSDT, \"deposit into yo\", \"withdraw from yo\", \"yo vault\", or \"claim yo rewards\".","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002Fskills\u002Fyo-base-mcp-plugin\u002FSKILL.md",[178],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[133,180,181,182,115,85,93,165,137,120,183,184,185,186,96,187,32,188,189,86],"plugin","base","yo base mcp plugin","instant","check","view","redemption","async","route","claim",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":44},"01M6CS6YVBG96M4AG32H5SG51F","yo-protocol-skills","Official Yo Protocol skills bundle (SDK, CLI, React)","https:\u002F\u002Fgithub.com\u002Fyoprotocol\u002Fyo-protocol-skills\u002Fblob\u002Fmain\u002FSKILL.md",[],[85,197,114,115,84,89,198,165],"yo protocol skills","official"]