Skip to main content
Glama

Check whether wallets are one actor

audit_cluster
Read-onlyIdempotent

Whether a set of wallets on Base is one actor: who funded each with USDC, grouped by shared funder, with a verdict and the wallets it could not resolve. Turns "55 distinct payers" into "one actor with 55 wallets", or fails to. A shared funder is not counted as control when it is a contract or a distributor, an account that paid 100+ distinct recipients within the blocks scanned (an exchange hot wallet); dead_ends lists it with the wallets it funded and the reading names it. Whether an account is a distributor depends on the range: over fewer blocks it may have paid fewer and count. A call without a line has only a moment, enough for a small range of recent blocks, and is cut, uncharged, when it needs longer. from_block is a block number and defaults to the whole history; Base adds about 43,200 blocks a day. The first answer says how many windows the scan will take and, at the pace of recent scans, how many milliseconds it likely takes (likely_ms) and at most (about_ms, the time a line should hold), and each one after says how many are done and what the rest needs. Paid, on a line: $0.000001 per millisecond. With no wallet code, ZEAM :: Pass buys the time and opens the line: a pass (https://mcp.zeamprism.com/pass) or your own wallet (https://mcp.zeamprism.com/how-to-pay). Example: {"addresses":["0x000000000000000000000000000000000000dEaD","0x0000000000000000000000000000000000000001"],"from_block":51000000}

Input Schema

NameRequiredDescriptionDefault
lineNoOptional. A line credential, for a client that cannot send the x-line header or _meta["zeam-pass/line"]: the call runs on that line's time.
tokenNooptional string — the asset to follow, 0x form; default USDC.
windowNooptional int — blocks per snapshot, default 10000; smaller lands the first snapshot sooner.
to_blockNooptional int — stop; default the head.
addressesYesarray — 2 to 400 wallets, 0x form.
from_blockNooptional int — first block; default the whole history. To continue a partial answer, keep it and set to_block one below its scanned.from.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block set to one below scanned.from."New value: +"optional int — first block; default the whole history. To continue a partial answer, keep it and set to_block one below its scanned.from."
    • changedInput schema / properties / window / description
      Previous value: -"optional int — blocks per snapshot, default 10000; smaller gives a short line its first snapshot sooner."New value: +"optional int — blocks per snapshot, default 10000; smaller lands the first snapshot sooner."
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "about_ms": {
      -        "anyOf": [
      -          {
      -            "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "caveat": {
      -        "anyOf": [
      -          {
      -            "description": "what the verdict does not cover",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "clusters": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "groups of wallets that share a funder; null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "clusters_detail": {
      -        "anyOf": [
      -          {
      -            "description": "one entry per group: members, subjects, funders",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "dead_ends": {
      -        "anyOf": [
      -          {
      -            "description": "senders not counted as control, keyed by address: {kind: contract|distributor, recipients?}",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "error": {
      -        "anyOf": [
      -          {
      -            "description": "present when ok is false",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "evidence": {
      -        "anyOf": [
      -          {
      -            "description": "how to reproduce this on any archive node",
      -            "properties": {
      -              "at_block": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "decode": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "method": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "note": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "params": {
      -                "anyOf": [
      -                  {
      -                    "items": {},
      -                    "type": "array"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "funders_by_address": {
      -        "anyOf": [
      -          {
      -            "description": "funders keyed by subject address: every sender that is not a contract",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "largest_cluster": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "wallets in the largest group; null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "ok": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "partial": {
      -        "anyOf": [
      -          {
      -            "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "range": {
      -        "anyOf": [
      -          {
      -            "properties": {
      -              "from": {
      -                "anyOf": [
      -                  {
      -                    "anyOf": [
      -                      {
      -                        "type": "number"
      -                      },
      -                      {
      -                        "type": "string"
      -                      }
      -                    ]
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "to": {
      -                "anyOf": [
      -                  {
      -                    "anyOf": [
      -                      {
      -                        "type": "number"
      -                      },
      -                      {
      -                        "type": "string"
      -                      }
      -                    ]
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "reading": {
      -        "anyOf": [
      -          {
      -            "description": "the verdict in a sentence",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "return_paths_by_address": {
      -        "anyOf": [
      -          {
      -            "description": "senders that are contracts, keyed by subject address: a return path, not a funder",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "same_actor": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "boolean"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "true when two or more of the wallets share a funder; largest_cluster says how many do. null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "scanned": {
      -        "anyOf": [
      -          {
      -            "description": "the blocks actually covered so far, newest first",
      -            "properties": {
      -              "from": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "to": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "subjects": {
      -        "anyOf": [
      -          {
      -            "description": "wallets asked about",
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "token": {
      -        "anyOf": [
      -          {
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "unresolved": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "wallets with no funder that counts as control; null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "unresolved_by_address": {
      -        "anyOf": [
      -          {
      -            "description": "why each unresolved subject is unresolved",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "windows": {
      -        "anyOf": [
      -          {
      -            "description": "how far the scan has got",
      -            "properties": {
      -              "about_ms": {
      -                "anyOf": [
      -                  {
      -                    "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "blocks": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "done": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "of": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "accepts"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "receipt"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "about_ms": {
      +        "anyOf": [
      +          {
      +            "description": "ms the rest needs at most; absent when done or untimed",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "caveat": {
      +        "anyOf": [
      +          {
      +            "description": "what the verdict does not cover",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "clusters": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "groups of two or more wallets sharing a funder counted as control; null in the plan, as are the counts below"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "clusters_detail": {
      +        "anyOf": [
      +          {
      +            "description": "one entry per group: members, subjects, funders",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "code": {},
      +      "dead_ends": {
      +        "anyOf": [
      +          {
      +            "description": "senders not counted as control: {kind, recipients?, complete?, subjects, evidence?}; a distributor paid 100+ recipients in the blocks scanned",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "error": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "evidence": {
      +        "anyOf": [
      +          {
      +            "description": "the call to repeat on any archive node: at_block, method, params and a note",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "funders_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "per subject: non-contract senders, distributors included",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "independent_or_unresolved": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "wallets in no group"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "largest_cluster": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "wallets in the largest group"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "likely_ms": {
      +        "anyOf": [
      +          {
      +            "description": "ms the rest likely takes, at recent pace",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "note": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "ok": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "partial": {
      +        "anyOf": [
      +          {
      +            "description": "true until the scan reaches range.from",
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "range": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "reading": {
      +        "anyOf": [
      +          {
      +            "description": "the verdict in words",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "return_paths_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "per subject: contract senders",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "same_actor": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "boolean"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "true when two or more wallets share a funder counted as control"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "scanned": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "the blocks covered so far, newest first; null in the plan"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "status": {},
      +      "subjects": {
      +        "anyOf": [
      +          {
      +            "description": "wallets asked about",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "token": {
      +        "anyOf": [
      +          {
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "unresolved": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "wallets with no funder that counts as control"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "unresolved_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "why each is unresolved",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "windows": {
      +        "anyOf": [
      +          {
      +            "description": "how far the scan has got",
      +            "properties": {
      +              "about_ms": {
      +                "anyOf": [
      +                  {
      +                    "description": "on the plan: for the whole scan",
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "blocks": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "done": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "of": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "accepts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "receipt"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed9 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "addresses": [
      +      "0x000000000000000000000000000000000000dEaD",
      +      "0x0000000000000000000000000000000000000001"
      +    ],
      +    "from_block": 51000000
      +  }
      +]
    • removedInput schema / properties / addresses / maxItems
      Removed value: -400
    • removedInput schema / properties / addresses / minItems
      Removed value: -2
    • changedInput schema / properties / line / description
      Previous value: -"optional — a line credential: the call burns the line's time and carries no payment."New value: +"Optional. A line credential, for a client that cannot send the x-line header or _meta[\"zeam-pass/line\"]: the call runs on that line's time."
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / additionalProperties
      Removed value: -{}
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "properties": {
      +      "about_ms": {
      +        "anyOf": [
      +          {
      +            "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "caveat": {
      +        "anyOf": [
      +          {
      +            "description": "what the verdict does not cover",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "clusters": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "groups of wallets that share a funder; null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "clusters_detail": {
      +        "anyOf": [
      +          {
      +            "description": "one entry per group: members, subjects, funders",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "dead_ends": {
      +        "anyOf": [
      +          {
      +            "description": "senders not counted as control, keyed by address: {kind: contract|distributor, recipients?}",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "error": {
      +        "anyOf": [
      +          {
      +            "description": "present when ok is false",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "evidence": {
      +        "anyOf": [
      +          {
      +            "description": "how to reproduce this on any archive node",
      +            "properties": {
      +              "at_block": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "decode": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "method": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "note": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "params": {
      +                "anyOf": [
      +                  {
      +                    "items": {},
      +                    "type": "array"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "funders_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "funders keyed by subject address: every sender that is not a contract",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "largest_cluster": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "wallets in the largest group; null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "ok": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "partial": {
      +        "anyOf": [
      +          {
      +            "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "range": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "reading": {
      +        "anyOf": [
      +          {
      +            "description": "the verdict in a sentence",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "return_paths_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "senders that are contracts, keyed by subject address: a return path, not a funder",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "same_actor": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "boolean"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "true when two or more of the wallets share a funder; largest_cluster says how many do. null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "scanned": {
      +        "anyOf": [
      +          {
      +            "description": "the blocks actually covered so far, newest first",
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "subjects": {
      +        "anyOf": [
      +          {
      +            "description": "wallets asked about",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "token": {
      +        "anyOf": [
      +          {
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "unresolved": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "wallets with no funder that counts as control; null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "unresolved_by_address": {
      +        "anyOf": [
      +          {
      +            "description": "why each unresolved subject is unresolved",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "windows": {
      +        "anyOf": [
      +          {
      +            "description": "how far the scan has got",
      +            "properties": {
      +              "about_ms": {
      +                "anyOf": [
      +                  {
      +                    "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "blocks": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "done": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "of": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "accepts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "receipt"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties
      Removed value: -{
      -  "about_ms": {
      -    "anyOf": [
      -      {
      -        "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "caveat": {
      -    "anyOf": [
      -      {
      -        "description": "what the verdict does not cover",
      -        "type": "string"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "clusters": {
      -    "anyOf": [
      -      {
      -        "description": "groups of wallets that share a funder",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "clusters_detail": {
      -    "anyOf": [
      -      {
      -        "description": "one entry per group: members, subjects, funders",
      -        "items": {},
      -        "type": "array"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "dead_ends": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "senders not counted as control, keyed by address: {kind: contract|distributor, recipients?}",
      -        "properties": {},
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "error": {
      -    "anyOf": [
      -      {
      -        "description": "present when ok is false",
      -        "type": "string"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "evidence": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "how to reproduce this on any archive node",
      -        "properties": {
      -          "at_block": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "decode": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "method": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "note": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "params": {
      -            "anyOf": [
      -              {
      -                "items": {},
      -                "type": "array"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "funders_by_address": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "funders keyed by subject address",
      -        "properties": {},
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "largest_cluster": {
      -    "anyOf": [
      -      {
      -        "description": "wallets in the largest group",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "ok": {
      -    "type": [
      -      "boolean",
      -      "null"
      -    ]
      -  },
      -  "partial": {
      -    "anyOf": [
      -      {
      -        "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      -        "type": "boolean"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "range": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "properties": {
      -          "from": {
      -            "type": [
      -              "number",
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "to": {
      -            "type": [
      -              "number",
      -              "string",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "reading": {
      -    "anyOf": [
      -      {
      -        "description": "the verdict in a sentence",
      -        "type": "string"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "same_actor": {
      -    "anyOf": [
      -      {
      -        "description": "true when two or more of the wallets share a funder; largest_cluster says how many do. null before anything is scanned",
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "scanned": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "the blocks actually covered so far, newest first",
      -        "properties": {
      -          "from": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "to": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "subjects": {
      -    "anyOf": [
      -      {
      -        "description": "wallets asked about",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "token": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "properties": {},
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "unresolved": {
      -    "anyOf": [
      -      {
      -        "description": "wallets with no funder that counts as control",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "unresolved_by_address": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "why each unresolved subject is unresolved",
      -        "properties": {},
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "windows": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "how far the scan has got",
      -        "properties": {
      -          "about_ms": {
      -            "anyOf": [
      -              {
      -                "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "blocks": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "done": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "of": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  }
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / about_ms
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  4. Changed19 schema fields changed
    • addedInput schema / properties / addresses / items / type
      Added value: +"string"
    • addedInput schema / properties / addresses / maxItems
      Added value: +400
    • addedInput schema / properties / addresses / minItems
      Added value: +2
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block."New value: +"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block set to one below scanned.from."
    • addedInput schema / properties / from_block / minimum
      Added value: +0
    • changedInput schema / properties / from_block / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / to_block / minimum
      Added value: +0
    • changedInput schema / properties / to_block / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / window / minimum
      Added value: +1
    • changedInput schema / properties / window / type
      Previous value: -"number"New value: +"integer"
    • addedOutput schema / properties / caveat
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "what the verdict does not cover",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / clusters
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "groups of wallets that share a funder",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / clusters_detail
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "one entry per group: members, subjects, funders",
      +      "items": {},
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / largest_cluster
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "wallets in the largest group",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / reading
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "the verdict in a sentence",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / same_actor
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "true when two or more of the wallets share a funder; largest_cluster says how many do. null before anything is scanned",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / subjects
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "wallets asked about",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / unresolved
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "wallets with no funder that counts as control",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / windows
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "description": "how far the scan has got",
      +      "properties": {
      +        "about_ms": {
      +          "anyOf": [
      +            {
      +              "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "blocks": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "done": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "of": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  5. Changed3 schema fields changed
    • changedInput schema / properties / addresses / description
      Previous value: -"array — two to a few hundred wallets, 0x form."New value: +"array — 2 to 400 wallets, 0x form."
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — start; default the token's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. 0.65 to 1.6 s per 10,000 blocks here, by the wallet's traffic."New value: +"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block."
    • changedInput schema / properties / token / description
      Previous value: -"optional string — the asset to follow, 0x form; default the chain's stablecoin."New value: +"optional string — the asset to follow, 0x form; default USDC."
  6. Changed1 schema field changed
    • changedInput schema / properties / line / description
      Previous value: -"optional — your /pay credential: served off your line, no payment; without it, x402 payment in params._meta."New value: +"optional — a line credential: the call burns the line's time and carries no payment."
  7. Changed1 schema field changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — start; default the token's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. ~0.65 s per 10,000 blocks here."New value: +"optional int — start; default the token's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. 0.65 to 1.6 s per 10,000 blocks here, by the wallet's traffic."
  8. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "dead_ends": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "senders not counted as control, keyed by address: {kind: contract|distributor, recipients?}",
      +          "properties": {},
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "error": {
      +      "anyOf": [
      +        {
      +          "description": "present when ok is false",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "evidence": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "how to reproduce this on any archive node",
      +          "properties": {
      +            "at_block": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "decode": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "method": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "note": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "params": {
      +              "anyOf": [
      +                {
      +                  "items": {},
      +                  "type": "array"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "funders_by_address": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "funders keyed by subject address",
      +          "properties": {},
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "ok": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "partial": {
      +      "anyOf": [
      +        {
      +          "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "range": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {
      +            "from": {
      +              "type": [
      +                "number",
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "to": {
      +              "type": [
      +                "number",
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "scanned": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "the blocks actually covered so far, newest first",
      +          "properties": {
      +            "from": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "to": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "token": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {},
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "unresolved_by_address": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "why each unresolved subject is unresolved",
      +          "properties": {},
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed6 schema fields changed
    • changedInput schema / properties / addresses / description
      Previous value: -"array — the wallets to test for common control, 0x form. Two to a few hundred."New value: +"array — two to a few hundred wallets, 0x form."
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to the token's deployment — the whole history; the line meters the scan. If the line runs out first you get what was scanned so far, newest blocks first, marked partial with the range covered; call again with to_block below that to continue. Measured 2026-09-17: ~0.65 s per 10,000-block window on this node; the whole history is ~4,900 windows."New value: +"optional int — start; default the token's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. ~0.65 s per 10,000 blocks here."
    • changedInput schema / properties / line / description
      Previous value: -"optional — credential from the /pay socket. With it the call is served off your line and carries no payment. Without it, put x402 payment in params._meta."New value: +"optional — your /pay credential: served off your line, no payment; without it, x402 payment in params._meta."
    • changedInput schema / properties / to_block / description
      Previous value: -"optional int — where to stop. Defaults to the head."New value: +"optional int — stop; default the head."
    • changedInput schema / properties / token / description
      Previous value: -"optional string — the asset to follow, 0x form. Defaults to the chain's main stablecoin."New value: +"optional string — the asset to follow, 0x form; default the chain's stablecoin."
    • changedInput schema / properties / window / description
      Previous value: -"optional int — blocks per snapshot, default 10000 (~0.65 s each on this node). Smaller windows give a short line a first snapshot sooner; the whole scan costs about the same."New value: +"optional int — blocks per snapshot, default 10000; smaller gives a short line its first snapshot sooner."
  10. Changed2 schema fields changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to the token's deployment; the line meters the whole scan."New value: +"optional int — where to start. Defaults to the token's deployment — the whole history; the line meters the scan. If the line runs out first you get what was scanned so far, newest blocks first, marked partial with the range covered; call again with to_block below that to continue. Measured 2026-09-17: ~0.65 s per 10,000-block window on this node; the whole history is ~4,900 windows."
    • addedInput schema / properties / window
      Added value: +{
      +  "description": "optional int — blocks per snapshot, default 10000 (~0.65 s each on this node). Smaller windows give a short line a first snapshot sooner; the whole scan costs about the same.",
      +  "type": "number"
      +}
  11. Changed3 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / addresses / items
      Added value: +{}
  12. Changed1 schema field changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to the token's deployment if known, else 0."New value: +"optional int — where to start. Defaults to the token's deployment; the line meters the whole scan."
  13. First observed

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/idempotent annotations: discloses pricing ($0.000001 per millisecond), that unterminated calls are cut and uncharged, that a distributor only counts as such within the scanned range, and that the first answer reports window count plus likely_ms/about_ms. It also explains what dead_ends contains, which is the kind of nuance annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the prose is dense and occasionally cryptic ('or fails to', 'and the reading names it', 'the time a line should hold'), with payment links and heuristics interleaved. Information is present but not cleanly structured, making it slower to parse than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid, long-running, windowed scan, the definition covers cost, cutoff behaviour, progress reporting, and the meaning of the unresolved bucket, and an output schema exists to carry return shape. What remains thin is the relationship to the other audit tools and the exact contents of the verdict field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: from_block is a block number, defaults to whole history, and Base mints ~43,200 blocks/day, which lets an agent size its request. It also clarifies the range-dependence of the distributor heuristic. token/window/line semantics are only restated from the schema, not extended.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: determining whether a set of wallets on Base is one actor, via shared USDC funders, with a verdict and unresolved wallets. This is concrete enough to distinguish it from attest_* and notes_* siblings, but it never names the closest neighbours (audit_funders, audit_payers), so the boundary is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives operational when-conditions: without a line the call is limited to a small recent block range and is cut, uncharged, if it needs longer; a pass buys the time. However, it offers no guidance on when to choose this over audit_funders or audit_payers, and no explicit exclusions, so the sibling routing is implied at best.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources