Deterministic portfolio performance attribution vs BTC, ETH, stETH or any benchm
Deterministic portfolio performance attribution vs BTC, ETH, stETH or any benchmark. Returns Modified Dietz and money-weighted (XIRR) returns, per-position contribution and alpha, per-input source status and per-position data status with the reason, and a hashed (optionally EIP-191 signed) record of the calculation. No LLM.
Answeringour last check, 2026-10-10
1 of 1checks answered this week
251 msmedian answer time
$0.01listed price per call
$0.01price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://www.u2a.com.au/api/mcp/portfolio-attribution
| Category | Everything else |
|---|---|
| Provider host | www.u2a.com.au |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 5 from 3 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-10 | valid payment request | 402 | $0.01 | 251 ms |
Example input (from the provider)
{
"body": {
"benchmarks": [
{
"end_price": 112000,
"id": "BTC",
"start_price": 94000
},
{
"end_price": 3900,
"id": "stETH",
"income_return": {
"status": "estimated",
"value": 0.022
},
"start_price": 3300
}
],
"currency": "USD",
"period": {
"end": "2026-09-30",
"start": "2026-01-01"
},
"positions": [
{
"end_value": {
"source": "coingecko close 2026-09-30",
"status": "verified",
"value": 12600
},
"flows": [
{
"amount": 2000,
"date": "2026-04-01",
"source": "tx 0xdef\u2026",
"status": "verified"
}
],
"id": "ETH",
"start_value": {
"source": "wallet 0xabc\u2026, block 21500000",
"status": "verified",
"value": 10000
}
},
{
"end_value": 4200,
"flows": [
{
"amount": -1000,
"date": "2026-06-15",
"source": "article",
"status": "estimated"
}
],
"id": "SOL",
"start_value": 5000
}
]
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"properties": {
"benchmarks": {
"description": "Benchmarks to compare against (1-5), e.g. BTC, ETH, or stETH with staking yield.",
"items": {
"properties": {
"end_price": {
"description": "Benchmark price at period end. Number, or object shaped like start_value.",
"type": [
"number",
"object"
]
},
"id": {
"description": "Benchmark name, e.g. BTC, ETH, stETH.",
"type": "string"
},
"income_return": {
"description": "Extra period return from yield, e.g. 0.022. Default 0. Number, or object shaped like start_value.",
"type": [
"number",
"object"
]
},
"start_price": {
"description": "Benchmark price at period start. Number, or object shaped like start_value.",
"type": [
"number",
"object"
]
}
},
"required": [
"id",
"start_price",
"end_price"
],
"type": "object"
},
"maxItems": 5,
"minItems": 1,
"type": "array"
},
"currency": {
"default": "USD",
"description": "Currency label for all values; no conversion is done.",
"type": "string"
},
"period": {
"description": "The measurement period.",
"properties": {
"end": {
"description": "Last day of the measurement period (YYYY-MM-DD).",
"format": "date",
"type": "string"
},
"start": {
"description": "First day of the measurement period (YYYY-MM-DD).",
"format": "date",
"type": "string"
}
},
"required": [
"start",
"end"
],
"type": "object"
},
"positions": {
"description": "Holdings to analyse (max 500), each with start/end value and any money moved in or out.",
"items": {
"properties": {
"end_value": {
"description": "Market value at period end. Number, or object shaped like start_value.",
"type": [
"number",
"object"
]
},
"flows": {
"description": "Capital moved into (+) or out of (\u2212) the position during the period. At most 1000 flows in total across all positions.",
"items": {
"properties": {
"amount": {
"description": "Positive = bought / added capital; negative = sold / withdrew.",
"type": "number"
},
"date": {
"description": "Date the money moved (inside the period).",
"format": "date",
"type": "string"
},
"source": {
"description": "Where the flow came from, e.g. a tx hash or statement.",
"type": "string"
},
"status": {
"description": "How reliable this flow is. Default \"provided\".",
"enum": [
"verified",
"derived",
"provided",
"estimated",
"assumed"
],
"type": "string"
}
},
"required": [
"date",
"amount"
],
"type": "object"
},
"maxItems": 1000,
"type": "array"
},
"id": {
"description": "Ticker, token symbol, contract address, or internal id.",
"type": "string"
},
"income": {
"description": "Cash income taken out (staking, dividends). Default 0. Number, or object shaped like start_value.",
"type": [
"number",
"object"
]
},
"start_value": {
"description": "Market value at period start. A number, or {value, status, source, observed_at}.",
"oneOf": [
{
"minimum": 0,
"type": "number"
},
{
"properties": {
"observed_at": {
"description": "When observed (ISO).",
"format": "date-time",
"type": "string"
},
"source": {
"description": "URL, tx hash, block, file or API.",
"ma