NakedPnL

The public registry of verified investment performance. Every return sourced from SEC filings, exchange APIs, or platform data.

Registry

  • Registry
  • Market Context
  • How It Works
  • Community

Verification

  • Get Verified
  • Connect Exchange

Legal

  • Terms of Service
  • Privacy Policy
  • Refund & Cancellation
  • Support
  • GDPR Rights
  • Cookie Policy
  • Disclaimers
  • Methodology
  • Compliance
Follow

NakedPnL is a publisher of verified performance data. Nothing on this site constitutes investment advice, a recommendation, or a solicitation to buy, sell, or hold any security, commodity, or digital asset. Past performance does not indicate future results. Trading carries a high risk of total capital loss.

© 2026 NakedPnLAll performance data is verified by the NakedPnL teamcontact@nakedpnl.com
NakedPnL
RegistryPricingHow It WorksCommunitySupport
NakedPnL/Guides/How to Independently Verify a Public Trader Track Record
Verification guide

How to Independently Verify a Public Trader Track Record

A 10-minute, code-driven workflow for an allocator, journalist, or regulator to re-verify a NakedPnL trader chain end-to-end using only public data.

By NakedPnL Research·May 7, 2026·14 min read
TL;DR
  • Self-reported PnL is unverifiable. Screenshots are forgeable. Read-only API connections are tamper-vulnerable at the database layer. A cryptographically chained, externally-anchored ledger is the highest level of verification available without a regulator-style on-site audit.
  • NakedPnL's public verifier at /verify/chain/[handle] re-computes every SHA-256 digest in a trader's chain in the browser, with no server-side trust required.
  • An allocator can independently re-verify a 12-month track record end-to-end in ~10 minutes using curl, openssl, and a Bitcoin block-header source — no NakedPnL libraries required.
  • The model proves what NakedPnL has not changed about the published record. Cross-venue reconciliation and on-chain proofs (where applicable) sit on top.
On this page
  1. The four levels of trader verification
  2. Why level 4 needs three independent layers
  3. The 10-minute end-to-end verification workflow
  4. Reading a NakedPnL trader page like a verifier
  5. When a chain is broken
  6. What this workflow is not
  7. Frequently asked questions

Most published trader track records are decorative. A screenshot is a JPEG. A spreadsheet of trades is a spreadsheet. A sentence on a website that says "audited by [name]" is a sentence on a website. None of these can be re-verified by a counterparty without trusting the publisher — which means they cannot survive serious due diligence.

NakedPnL is built on the premise that a trader's track record should be re-verifiable by anyone, using only public data and standard cryptographic tools, in a fixed amount of time. This article walks an allocator, a journalist, or a regulator through that workflow end-to-end. The whole thing takes about 10 minutes for a 12-month chain, no privileged access, no NakedPnL software dependencies.

The four levels of trader verification

Before walking through the verifier, it's useful to fix vocabulary. Verification of a self-published track record falls onto a strict ladder. Each rung makes a fundamentally different trust claim:

LevelMethodWhat it provesHow it fails
1Self-attestation ("I made 84% last year")Nothing. The trader is asserting a fact.Trader can lie or cherry-pick. Zero independent signal.
2Screenshot of a broker statementTrader has access to an account where the screen looked like that, at some point.Forgeable in 30 seconds with browser dev tools. Doesn't tie to time, identity, or contiguous history.
3Read-only API connection to broker, displayed liveAt time of viewing, the trader's account had this balance and these positions.No history before the connection. Database can be retroactively altered. No external anchor.
4Cryptographically chained, append-only ledger anchored to an external trust root (Bitcoin)The full historical record cannot be retroactively modified without breaking SHA-256 or rewriting Bitcoin history.Cannot detect venue-side fraud or off-record accounts. Identity verification is a separate layer.
The four levels of trader verification

NakedPnL targets level 4 by default. Connecting an exchange account is a level 3 operation; what makes it level 4 is the daily SHA-256 chain, the Merkle root anchored to Bitcoin via OpenTimestamps, and the public read API that lets anyone re-verify the chain without trusting NakedPnL's database.

What level 4 still does not prove
Cryptographic verification is silent on whether the underlying venue lied, whether the trader runs offsetting accounts elsewhere, and whether the trader is the human they claim to be. Allocators should treat NakedPnL output as one input to a due-diligence process, not a substitute for one.

Why level 4 needs three independent layers

The verification stack at level 4 is composable. Each layer is independently checkable, with strictly different trust assumptions:

  1. Per-trader hash chain (lib/calculation/audit-hash.ts): every NavSnapshot stores contentHash = SHA-256(canonicalize(rawResponse)) and chainHash = SHA-256(previousChainHash + contentHash). Detects in-place modification, deletion, or reordering of any record. Verifiable in any browser.
  2. Daily Merkle root (lib/ots/merkle.ts): a deterministic binary Merkle tree built from every active entity's chain head, sorted by entityId + chainType. Compresses the entire registry into one 32-byte digest each day.
  3. OpenTimestamps Bitcoin anchor (lib/ots/anchor.ts): the daily Merkle root is submitted to four independent OTS calendar servers, which batch and commit to a Bitcoin transaction. Once confirmed, no actor can rewrite the historical commitment without rewriting Bitcoin's proof-of-work history.

The point of layering is that a verifier can stop wherever their trust budget runs out. Casual readers can re-verify the chain in their browser at /verify/chain/[handle] without thinking about Bitcoin. A serious allocator can verify the Bitcoin anchor against their own node. A regulator running a forensic timeline can do both — and additionally cross-reference timing against published Merkle roots and trader profile snapshots from external archives (Wayback Machine, search engine caches).

The 10-minute end-to-end verification workflow

What follows is the actual procedure. Pick any verified trader on NakedPnL. Replace alice with the @handle from their public profile URL.

Step 1 — Fetch the chain

The public read API exposes every chained NavSnapshot for a given handle. Each row contains the snapshotDate, the canonical raw response (the bytes the venue actually returned), the contentHash, the chainHash, and the previousChainHash. This is the entire input the verifier needs.

# Replace alice with the actual handle.
curl -s https://nakedpnl.com/api/chain/alice > chain.json

# Sanity check: how many snapshots, and what is the chain head?
jq '.snapshots | length' chain.json
jq '.chainHead' chain.json
# 365
# "00ff11ee2233...c4d5e6f7"
Fetch the chain — typical 12-month chain is ~1 MB JSON

Step 2 — Replay the hash chain locally

Walk the snapshots forward from the genesis seed. For every row, recompute contentHash from the canonical raw response, then recompute chainHash by combining the prior chainHash with the current contentHash. The first index where the recomputed chainHash diverges from the stored chainHash is where the chain breaks. If it never diverges, the chain is intact.

async function sha256Hex(input) {
  const bytes = new TextEncoder().encode(input);
  const digest = await crypto.subtle.digest("SHA-256", bytes);
  return Array.from(new Uint8Array(digest))
    .map((b) => b.toString(16).padStart(2, "0"))
    .join("");
}

function canonicalize(value) {
  return JSON.stringify(value, (_k, v) => {
    if (v && typeof v === "object" && !Array.isArray(v)) {
      const sorted = {};
      for (const k of Object.keys(v).sort()) sorted[k] = v[k];
      return sorted;
    }
    return v;
  });
}

const data = await fetch("/api/chain/alice").then((r) => r.json());
let prev = "genesis";
for (let i = 0; i < data.snapshots.length; i++) {
  const row = data.snapshots[i];
  const ch = await sha256Hex(canonicalize(row.rawResponse));
  if (ch !== row.contentHash) throw new Error(`contentHash mismatch at ${i}`);
  const linked = await sha256Hex(prev + ch);
  if (linked !== row.chainHash) throw new Error(`chainHash mismatch at ${i}`);
  prev = row.chainHash;
}
console.log("Chain valid. Head:", prev);
Browser-side replay using Web Crypto API

This is exactly what /verify/chain/[handle] does behind the scenes. The page only emits a green check after every snapshot validates and the final prev value matches the chainHead reported on the trader profile. Run it in the browser console with no third-party JavaScript dependencies — the Web Crypto API ships with every modern browser.

Step 3 — Verify the daily Merkle anchor

The chain replay establishes that the snapshots have not been retroactively altered, but only relative to whatever chain head you are currently observing. To upgrade that to an absolute claim — that the snapshots existed at a specific moment in the past — you need the OpenTimestamps anchor.

Pick a date during the trader's history. Fetch the AnchorRecord for that date. The response includes the daily Merkle root, the calendar URL, the OTS proof bytes, and (if the proof is UPGRADED) the Bitcoin block height and transaction ID.

# 1. Fetch the anchor record for a specific historical date.
curl -s https://nakedpnl.com/api/verify/2026-05-06 > anchor.json

# 2. Confirm the proof is UPGRADED (i.e. confirmed on Bitcoin).
jq -r .status anchor.json
# UPGRADED

# 3. Extract the Merkle root and the proof bytes.
jq -r .merkleRoot anchor.json | xxd -r -p > root.bin
jq -r .proofBase64 anchor.json | base64 -d > anchor.ots

# 4. Verify against your own Bitcoin node (or a trusted block-header source).
ots --bitcoin-node http://user:pass@127.0.0.1:8332 verify anchor.ots root.bin
# Got 1 attestation(s) from https://a.pool.opentimestamps.org
# Success! Bitcoin block 901234 attests existence as of 2026-05-06 00:08:13 UTC
Verify a Bitcoin-anchored Merkle root with the OpenTimestamps CLI

The output proves the Merkle root existed at the time the referenced Bitcoin block was mined. That fact, combined with the deterministic Merkle tree construction, means every chain head committed in the tree existed at or before that block time — including the chain head of the trader you are verifying.

Step 4 — Prove the trader's chain head was in the tree

The final step ties the per-trader chain replay (step 2) to the Bitcoin-anchored Merkle root (step 3). Request a Merkle inclusion proof from the public API: given the trader's handle and the anchor date, NakedPnL returns the path of sibling hashes from their leaf to the root. Verify the proof locally — no NakedPnL trust required at this stage.

# 1. Fetch the inclusion proof for alice on the anchor date.
curl -s "https://nakedpnl.com/api/verify/2026-05-06/proof?handle=alice" > proof.json

# 2. Reconstruct alice's leaf hash.
node -e '
  const c = require("crypto");
  const p = require("./proof.json");
  const leafInput = `${p.entityId}|${p.chainType}|${p.chainHash}`;
  const leaf = c.createHash("sha256").update(leafInput).digest("hex");
  let cur = leaf;
  for (const step of p.path) {
    const concat = step.position === "left" ? step.hash + cur : cur + step.hash;
    cur = c.createHash("sha256").update(concat).digest("hex");
  }
  console.log(cur === p.expectedRoot ? "INCLUDED" : "NOT INCLUDED");
'
# INCLUDED
Request and verify a Merkle inclusion proof

If the script prints INCLUDED, you have completed the four-step end-to-end verification: alice's chain replays cleanly, alice's chain head was a leaf in the daily Merkle tree, the Merkle root was committed to a Bitcoin transaction at a specific block, and the Bitcoin transaction is buried under the rest of the chain.

End-to-end verification — what you've established
Alice's NavSnapshot history existed in its current form at or before the time of Bitcoin block 901234. Any claim that the data was retroactively edited is mathematically refutable: it would require breaking SHA-256 or rewriting Bitcoin's proof-of-work history.

Reading a NakedPnL trader page like a verifier

Every public trader profile and badge surfaces the chain head and the latest Bitcoin-anchored Merkle root publicly. The /docs/verification page on the site provides language-specific code snippets (Python and JavaScript) that mirror the workflow above. A few practical notes when reading a profile through a verifier's lens:

  • Chain length and continuity matter. A clean chain that started 14 days ago is not a 14-month track record. Look at the snapshot count and the date range, not just the chain head.
  • Chain breaks are visible. If the public verifier reports a mismatch at index k, the trader profile flags the chain as broken and surfaces the date. NakedPnL does not silently re-anchor.
  • Multi-venue traders have multiple chains. A trader who has connected Binance and Bybit will have two independent chains, each with its own chain head. Both should be re-verified separately.
  • On-chain reconciliation is available where applicable. For Polymarket positions, NakedPnL cross-references the venue REST API against the Polymarket subgraph (lib/venues/polymarket/reconcile.ts). Discrepancies surface on the on-chain tab of the trader profile.

When a chain is broken

Chain breaks are rare and operationally significant. There are exactly three legitimate causes, and the trader page surfaces which one applies:

  • API key rotation: a trader rotated their venue API key without re-binding the connection. The new key produces snapshots that cannot be linked to the prior chain. NakedPnL flags the prior chain as historic and starts a new chain from genesis. Both chains remain independently verifiable.
  • Venue API schema change: an exchange materially changed the response shape (rare). Pre-change and post-change canonical responses no longer match. Same flagging behaviour as a key rotation.
  • Database incident: a row was lost or corrupted. This has happened zero times on NakedPnL since launch, and an incident report would be published on the public ops page if it ever did.
What a chain break does not look like
A break never looks like a small visual blip. The verifier either reports a clean chain end-to-end, or it reports the exact index where divergence began. There is no "close enough" — SHA-256 doesn't have a close-enough. Treat any chain break warning on a trader page as material.

What this workflow is not

It is worth being explicit about scope. This workflow proves that NakedPnL has not retroactively modified the published record. It does not prove:

  • That the venue itself reported true balances. If Binance, Bybit, OKX, or IBKR fabricated an API response, the chain faithfully fingerprints a fabrication.
  • That the trader does not run other accounts elsewhere with offsetting losses. The chain is per-account, not per-person.
  • That the trader's identity has been verified. NakedPnL offers optional identity attestation as a separate layer; it is independent from the chain.
  • That past performance predicts future returns. Verification answers "did this happen?". It does not answer "what is this trader good for?".

An allocator should treat the verified chain as one of several due-diligence inputs alongside venue cross-checks, identity attestation, capacity analysis, strategy interview, and capital-account verification. The chain raises the floor of what is provable. It does not replace the rest of the diligence stack.

Frequently asked questions

What if the trader rotated their API key mid-history?
API key rotation produces a new chain rather than an in-place modification. The pre-rotation chain remains intact and independently re-verifiable; the post-rotation chain starts from a new genesis. Both are visible on the trader profile, and both can be replayed with the workflow above. NakedPnL does not bridge them silently — the discontinuity is surfaced as a chain restart event.
What if the exchange itself faked the API responses?
Cryptographic verification is silent on venue-side fraud. The chain only proves that NakedPnL faithfully recorded what the venue returned. The mitigations layered on top: (1) for venues with on-chain settlement (Polymarket), NakedPnL reconciles REST balances against the Graph Protocol subgraph; (2) for centralised venues, the raw responses themselves are stored and exposed, so any party with their own API access to the same account can re-fetch and compare; (3) cross-venue diligence (does the trader claim balances across multiple venues that exceed their realistic external capital?) is a manual but available check.
Do I need to install NakedPnL software to run the verification?
No. The workflow uses curl, jq, openssl/sha256sum, and the standard ots-cli — all of which are open-source tools with widely available builds. The only NakedPnL-specific endpoints are the public read API at /api/chain/[handle], the anchor endpoint at /api/verify/[date], and the inclusion-proof endpoint. Everything you fetch from those endpoints is verifiable against external trust roots (Bitcoin block headers, your own SHA-256 implementation), so NakedPnL is not in the trust path during verification.
How long does verification take in practice?
For a 12-month chain (~365 snapshots): ~5 seconds for chain replay in the browser, ~10 seconds for the OTS Bitcoin proof verification (dominated by your Bitcoin node's response time), and a few seconds for the Merkle inclusion proof. Allow 10 minutes total including the time to set up the Bitcoin node connection and read through the data the first time. Once familiar, it's a 60-second operation.
Can I script this as a continuous monitor?
Yes — and several allocators do. The pattern: pin the current chain head and Bitcoin-anchored Merkle root for each trader you care about; on a daily schedule, replay the new tail of the chain and verify the latest anchor proof. Any deviation from the expected forward extension is alertable. Because everything is keyed off cryptographic digests, false positives are excluded by construction.

References

  • GIPS Standards — Investment Performance Verification Overview
  • MDN — Web Crypto API
  • OpenTimestamps Command-Line Client
  • NIST SP 800-92 — Guide to Computer Security Log Management
NakedPnL is a publisher of verified investment performance data. We are not an investment adviser, broker, dealer, or asset manager, and nothing on this page constitutes investment advice or a recommendation. See the compliance page for our full regulatory posture.