Skip to main content
Glama

Trace who funded a wallet

audit_funders
Read-onlyIdempotent

Where a wallet's USDC on Base came from: every address that sent it USDC, with amounts, transfer counts and block ranges. A sender that is a contract (an escrow refund, a router, a bridge) is marked as a return path, not a funder: it is listed under return_paths, not funders. 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: {"address":"0x000000000000000000000000000000000000dEaD","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.
addressYesstring — the wallet, 0x form.
to_blockNooptional int — stop; default the head.
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"
      -          }
      -        ]
      -      },
      -      "address": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "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": {
      -        "anyOf": [
      -          {
      -            "description": "inbound senders that are accounts (eth_getCode empty): amount in raw token units, amount_scaled divided by the token's decimals",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "note": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "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"
      -          }
      -        ]
      -      },
      -      "return_paths": {
      -        "anyOf": [
      -          {
      -            "description": "inbound senders that are contracts (an escrow refund, a router, a bridge), in the same form: a return path, not a funder",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "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"
      -          }
      -        ]
      -      },
      -      "token": {
      -        "anyOf": [
      -          {
      -            "description": "token metadata, decimals read from the contract",
      -            "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"
      +          }
      +        ]
      +      },
      +      "address": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "code": {},
      +      "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": {
      +        "anyOf": [
      +          {
      +            "description": "inbound senders that are accounts (eth_getCode empty): amount in raw token units, amount_scaled divided by the token's decimals",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "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"
      +          }
      +        ]
      +      },
      +      "return_paths": {
      +        "anyOf": [
      +          {
      +            "description": "inbound senders that are contracts (an escrow refund, a router, a bridge), in the same form: a return path, not a funder",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "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": {},
      +      "token": {
      +        "anyOf": [
      +          {
      +            "description": "token metadata, decimals read from the contract",
      +            "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. Changed7 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "address": "0x000000000000000000000000000000000000dEaD",
      +    "from_block": 51000000
      +  }
      +]
    • 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"
      +          }
      +        ]
      +      },
      +      "address": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "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": {
      +        "anyOf": [
      +          {
      +            "description": "inbound senders that are accounts (eth_getCode empty): amount in raw token units, amount_scaled divided by the token's decimals",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "note": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "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"
      +          }
      +        ]
      +      },
      +      "return_paths": {
      +        "anyOf": [
      +          {
      +            "description": "inbound senders that are contracts (an escrow refund, a router, a bridge), in the same form: a return path, not a funder",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "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"
      +          }
      +        ]
      +      },
      +      "token": {
      +        "anyOf": [
      +          {
      +            "description": "token metadata, decimals read from the contract",
      +            "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"
      -      }
      -    ]
      -  },
      -  "address": {
      -    "type": [
      -      "string",
      -      "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": {
      -    "anyOf": [
      -      {
      -        "description": "inbound senders, raw token units; kind is contract or account from eth_getCode",
      -        "items": {},
      -        "type": "array"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "note": {
      -    "type": [
      -      "string",
      -      "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": {},
      -        "description": "token metadata, decimals read from the contract",
      -        "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. Changed8 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."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 / 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. Changed2 schema fields 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 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": {
      +    "address": {
      +      "type": [
      +        "string",
      +        "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": {
      +      "anyOf": [
      +        {
      +          "description": "inbound senders, raw token units; kind is contract or account from eth_getCode",
      +          "items": {},
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "note": {
      +      "type": [
      +        "string",
      +        "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": {},
      +          "description": "token metadata, decimals read from the contract",
      +          "properties": {},
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed6 schema fields changed
    • changedInput schema / properties / address / description
      Previous value: -"string — the wallet to trace, 0x form."New value: +"string — the wallet, 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. Changed2 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
  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?

Beyond the read-only/idempotent annotations, it discloses the contract-sender reclassification (listed under `return_paths`, not `funders`), that line-less calls are cut and uncharged, the pricing rate of $0.000001 per millisecond, and the pass/line credential path. It also explains the incremental response protocol (`likely_ms`, `about_ms`, windows completed), which is exactly the behavior an agent cannot get from structured fields.

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 purpose is correctly front-loaded and every sentence carries real information, but the phrasing is strained ('has only a moment, enough for a small range of recent blocks, and is cut, uncharged, when it needs longer') and the paragraph mixes paging, timing, and billing. The trailing example JSON restates the schema example, which is dead weight.

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, windowed, incrementally-answered scan this is unusually complete, and an output schema exists so return shape need not be spelled out. The remaining gap is the undefined 'line' concept — how a client with a wallet code acquires one, as opposed to buying a Pass, is never made explicit.

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 genuinely adds meaning: `from_block` defaults to whole history, Base produces ~43,200 blocks/day, and continuation requires keeping `from_block` while setting `to_block` one below the scanned range. It also confirms the `token` default is USDC and that a smaller `window` lands the first snapshot sooner.

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?

The opening sentence gives a specific verb and resource ('where a wallet's USDC on Base came from') plus the exact payload: senders, amounts, transfer counts, block ranges. It even defines the funder/return-path boundary, which is a real conceptual distinction. It does not name or contrast with the likely-sibling `audit_payers`, so an agent must infer the direction of the money flow.

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?

Usage context is implied rather than stated: the description explains what happens without a line (truncated, uncharged) and how to continue a partial answer via `from_block`/`to_block`. There is no explicit 'use this instead of X' guidance against `audit_payers`, `audit_cluster`, or `call_rpc`, leaving the sibling choice to inference.

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