Deterministic, no-LLM portfolio performance attribution
Deterministic, no-LLM portfolio performance attribution. Send position start/end values, dated cash flows and a period; receive Modified Dietz and money-weighted XIRR returns against BTC, ETH, stETH or any benchmark you supply prices for, plus per-position co…
by www.u2a.com.au · discovered, not yet claimed by its owner · updated 2026-10-12
Mirrored from Coinbase's public x402 Bazaar. The description is the provider's own text and has not been reviewed here; the payment requirements are copied as published.
What it does
Deterministic, no-LLM portfolio performance attribution. Send position start/end values, dated cash flows and a period; receive Modified Dietz and money-weighted XIRR returns against BTC, ETH, stETH or any benchmark you supply prices for, plus per-position contribution and alpha. Every input and output carries a caller-asserted data-quality status with reasons. Each result comes with a calculation hash, optionally EIP-191 signed, for audit and verification.
Tags: finance · portfolio-attribution · performance-attribution · crypto-portfolio · alpha · bazaar · u2a
Call contract
- Method
- POST
- Input
- json
- Output
- json
- Last paid call
- 2026-10-12
{
"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 0x9c1e4b7a2d5f8e3c6b0a9d2f5e8c1b4a7d0e3f6c9b2a5d8e1f4c7b0a3d6e9f2c",
"status": "verified"
}
],
"id": "ETH",
"start_value": {
"source": "wallet 0xabc0000000000000000000000000000000000123, 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
}
]
}{
"jsonrpc": "2.0",
"result": {
"benchmarks": [
{
"data_status": "estimated",
"data_status_inputs": [
"portfolio.data_status_inputs"
],
"excess_return": -0.14131643,
"id": "BTC",
"return": 0.19148936,
"top_alpha_detractors": [
{
"active_contribution": -0.09853659,
"id": "ETH"
}
]
}
],
"portfolio": {
"data_status": "estimated",
"data_status_inputs": [
"positions[1].flows[0].amount"
],
"data_status_reason": "Weakest input: SOL flow on 2026-06-15 (positions[1].flows[0].amount) is \"estimated\" (source: article).",
"money_weighted_return_period": 0.05018879,
"pnl": 800,
"return": 0.05017293
},
"positions": [
{
"active_contribution": {
"BTC": -0.09853659
},
"contribution": 0.0376297,
"data_status": "verified",
"id": "ETH",
"weight": 0.71109062
}
],
"provenance": {
"attests": "calculation",
"result_hash": "0x4a7d1e8b3c6f9a2d5e0b7c4f1a8d3e6b9c2f5a0d7e4b1c8f3a6d9e2b5c0f7a4d"
},
"reconciliation": {
"portfolio_return": 0.05017293,
"sum_of_contributions": 0.05017293
}
}
}Use with an agent
- Discover. Agents find this listing with
GET https://bazaar.saylorinnovations.com/discovery/search?query=…, the MCP toolsearch_resources, or/discovery/resources. - Inspect. Fetch
/resources/34859.jsonfor the price and payment options. - Pay. Call
GET https://www.u2a.com.au/api/mcp/portfolio-attribution. The provider answers402with its payment requirements. An x402 client signs one of the options below and retries withPAYMENT-SIGNATURE. - Execute. The provider returns
200with the data. Agent Bazaar is not in the request path and never sees your payment.
For humans
You don't need an account or an API key; you need a wallet holding a small amount of USDC on Base, and an x402-capable client (see the examples below). Call the endpoint unpaid first to see exactly what it asks for.
Pricing & payment
- Price
- $0.03 / request
- Protocol
- x402 v2
- Auth
- No account or API key. Pay per request.
- Networks
- Base
- Demand
- 8 calls · 3 unique payers in 30d (public x402 Bazaar data)
x402 payment requirements
| Scheme | Network | Asset | Amount | Pay to | Timeout |
|---|---|---|---|---|---|
| exact | Base eip155:8453 | USDC | $0.03 | 0x886e7a8d46E239A9d54F48da163B04bb002B14a0 | 600s |
accepts[] (raw JSON)
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x886e7a8d46E239A9d54F48da163B04bb002B14a0",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "30000",
"amountUsd": 0.03,
"maxTimeoutSeconds": 600
}
]Schemas
Output schema (JSON Schema)
{
"properties": {
"example": {
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}Example shape — generated from the schema, not a captured live response
{
"example": {},
"type": "string"
}Examples
curl "https://www.u2a.com.au/api/mcp/portfolio-attribution"
# -> 402 Payment Required, accepts[] lists how to pay
# retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paidconst res = await fetch("https://www.u2a.com.au/api/mcp/portfolio-attribution");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}import httpx
res = httpx.get("https://www.u2a.com.au/api/mcp/portfolio-attribution")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerDetails
- Provider
- www.u2a.com.au
- Endpoint
- https://www.u2a.com.au/api/mcp/portfolio-attribution
- Machine-readable
/resources/34859.json