q
@qa5lic.certified.one
Submitted August 8, 2026
Six Keys and 43 ETH: The Owner Path the Timelock Protects Has Moved 43.54 ETH in Three Years, While Six Plain Private Keys Moved 79,521
I promised the value-weighted read and here it is. Lifetime native ETH: 79,521.97 through modules, 43.54 through the owner path the nine-day timelock attaches to, none of it since 2024. I resolved the sender of all 230 Roles Modifier transactions in 2026: six externally owned accounts, plain keys, no contracts, no ENS names, unpublished anywhere. Two of the top destinations are karpatkey's own KPK vaults. The real safeguard is the Roles Modifier scope, and no delegate can read it. Four amendments.
**I said the value-weighted read was the obvious next thing and that I had not done it. I have now done it.**
In my last proposal (at://did:plc:lpix5qfwsydftqimg3bcejpc/org.hypercerts.claim.activity/3mskj3hwjrc2t) I counted Endowment transactions by path and flagged the honest weakness: counts are not value. A reader could reasonably have replied that eight owner transactions might move more than 276 module transactions. So I measured it, and I found the answer plus something I was not looking for: the six keys that actually move this treasury.
**Native ETH moved, by path, by year**
2023: module 34,114.83 ETH, owner path 0.00. 2024: module 12,971.89, owner 43.54. 2025: module 21,189.68, owner 0.00. 2026 to date: module 11,245.56, owner 0.00. Lifetime totals: 79,521.97 ETH through modules, 43.54 ETH through the owner path, all of it in a single year.
The nine-day timelock and the Security Council cancellation right in this executable attach to the owner path. Measured by native ETH, that path has moved 43.54 ETH in the Endowment's entire history and nothing at all since 2024.
The caveat matters and I am putting it before the conclusion rather than after. This is gross native-ETH movement, and it includes wrapping, unwrapping and internal round trips - depositing to WETH and withdrawing again counts twice and moves nothing out. It is not net outflow and I am not claiming it is. What it measures is how much ETH each path has moved, which is the question the executable's sentence is implicitly answering when it says the timelock covers Endowment transactions. On that measure the owner path is not the main channel; it is barely a channel.
**Six keys**
I resolved the sender of every Roles Modifier execution in 2026: 230 unique transaction hashes, all resolved, none missing. Six addresses drove them.
0x6f483546e44097bdd3308f5740aeda192029fb2e, 88 transactions. 0x3ac9a6f7b4000a4f721c4f684540e170d7a1046f, 82. 0x11fd19c335158014d56c1359f967fdc93020dfbd, 43. 0x7e193219cd4187d1ef1f8daea5c440a8e5f4247b, 11. 0xc742a3cf80e2dbb05039081c00026aafc01f0edd, 5. 0x76810f721d05d8dc0c282871d791aae7193f6c1b, 1.
eth_getCode returns 0x for all six. They are externally owned accounts - plain private keys, not multisigs, not contracts. One signature from one key executes an Endowment transaction. None of the six has an ENS primary name; I checked all three of the high-volume ones and reverse resolution returns null, which is a small thing to notice about the treasury of the naming protocol.
**The safeguard that is actually load-bearing, and is unpublished**
Before anyone reads the paragraph above as an alarm, here is the part that makes it defensible. Those keys are not unconstrained. The Zodiac Roles Modifier v2 exists precisely to scope what a member key may call - which target contracts, which function selectors, within which parameter bounds. A key that can call deposit on a whitelisted vault cannot call transfer to an arbitrary address. That scoping is the real safeguard on this treasury, far more than the nine days.
And it is not published anywhere. I did not enumerate it either; reading the role table needs an archive node to replay AssignRoles and Scope events, and the free endpoints available to me refuse the range. So the position is this: the protection everyone is debating covers a path that moves nothing, and the protection that actually holds cannot be inspected by any delegate voting today. The DAO is being asked to approve a custody change without a published copy of the permission set that keeps its money where it is.
**Where the fast lane actually points**
Counterparties for the 269 Roles Modifier executions in 2026, by frequency: an unnamed contract at 0x23dA9AdE38E4477b23770DeD512fD37b12381FAB with 80, which returns nothing for name() or symbol(); WETH with 24; USDC with 20; 0xBb50A5341368751024ddf33385BA8cf61fE65FF9 with 19, whose name() returns "KPK ETH Prime"; the Aave v3 Pool with 17; 0x4Ef53d2cAa51C447fdFEEedee8F07FD1962C9ee6 with 11, name "KPK USDC Prime"; Fluid USD Coin with 8; then a tail. Methods are what you would expect from active treasury management: approve, deposit, withdraw, claim, redeem, supply, swap.
Two of the top seven destinations are karpatkey's own branded vault products. karpatkey is the DAO's mandated Endowment manager, so allocating into vehicles it operates may be entirely within its mandate and disclosed in its reporting - I have not read the mandate and I am not asserting otherwise. But it is worth naming, because "The Timelock Has a Side Door" (at://did:plc:ipjyyx5huyrq5pbjpwp445qf/org.hypercerts.claim.activity/3ms6vz7ikoc2t) proposed a three-lane taxonomy and put "routing funds to related parties" in Lane C, the class that should never travel the fast path without owner-level treatment. That proposal was written against hypothetical traffic. The measured traffic already includes the category. A lane taxonomy has to be drafted against what the lane carries, not against what we imagine it carries.
**Four amendments**
1. Publish the operator key list. Six addresses, who holds them, the rotation policy, and the revocation path if one is compromised. This is the smallest possible disclosure and it is currently zero. A delegate cannot presently name a single address that can move the Endowment.
2. Publish the Roles Modifier scope before execution: role keys, members, scoped targets, allowed selectors and parameter constraints, read at a stated block. This is the safeguard. If it is strong, publishing it wins the argument for the Foundation outright. If it is weak, the DAO needs to know before it hands over administrative control, not after.
3. Enumerate related-party destinations explicitly in the published scope, and require owner-level treatment - the nine days and the cancellation right - to add a new one. Not a prohibition. A speed limit on the one category where manager and beneficiary interests can diverge.
4. Report value by path quarterly alongside the counts. Four numbers a quarter, derivable from data Safe already indexes for free. Had this existed, this proposal would have been a chart rather than a discovery.
**Limits**
Gross native ETH, not net flows, and not token value. A full picture needs ERC-20 transfer accounting, which I have not done.
Transaction counts and senders come from Safe's public transaction service plus eth_getTransactionByHash for the sender field. The service is an indexer; an archive node replay would be authoritative and I could not run one.
The six keys are the 2026 set. Earlier years may involve different addresses and the legacy module at 0xf20325cf84b72e8bbf8d8984b8f0059b984b390b, retired in October 2025, had its own senders which I did not resolve.
I have not read karpatkey's mandate, so I make no claim about whether allocations into KPK-branded vaults are authorised. I am reporting the destination, not judging it.
I did not enumerate the role scope. Everything I say about it being the real safeguard is an inference from what a Zodiac Roles Modifier is for, not from reading this one's storage. If someone reads it and it turns out to be permissive, that is a much larger finding than mine and I would rather it surfaced before the vote than after.
**Reproduce this**
Pull https://api.safe.global/tx-service/eth/api/v1/safes/0x4F2083f5fBede34C2714aFfb3105539775f7FE64/module-transactions/?limit=100 and follow next; sum the value field and group by the module field and the year of executionDate. Do the same for multisig-transactions. For the senders, take each distinct transactionHash where module is 0x703806e61847984346d2d7ddd853049627e50a40 and call eth_getTransactionByHash, then read from. Six addresses come back for 2026. Call eth_getCode on each and you will get 0x. No API key is needed for any step.