A-2 Owner/admin
A-2 Owner/admin
「誰が、何を変更できるのか」――分散化を名乗るなら、ここに正直でなければなりません。この項目では、live V1 の全コントラクトについて所有権の所在を読み出します。結論を先に書きます。変更可能な契約(Ownable)はすべて、ひとつのデプロイヤー鍵が直接握っています。これは mainnet 前の想定された段階であり、ソース自身が multisig 移管/renounce で解消すると宣言している箇所です。閉じたロックの数を誇るのではなく、いま開いている扉を正確に数えます。
「誰が、この仕組みを後から変更できるのか」を確かめる項目です。建物の鍵を思い浮かべてください。私たちは、変更できる扉(Ownable な契約)すべてについて、いま誰が鍵を握っているかを一つずつ読み出しました。
→
Ownable は12個L1/L2/L2b
→
すべて単一の作成者鍵+7個は鍵なし
結果、変更できる扉(12個)の鍵はすべて同じ一人(デプロイヤー)が握っていました。これは「分散化が完了した」状態ではありません。一方で、いくつかの契約はそもそも鍵を持たない(設計上 ownerless)=後から誰も変更できない作りでした。良く見せず、悪く見せず、観測された状態をそのまま書きます。鍵が一本である事実も、その鍵にできない事(後述)も、両方正直に。
1. 主張(検証対象)
live V1 の全コントラクトについて、所有権(owner)が誰にあるかを実際に読み出し、デプロイヤーの EOA が直接変更できる契約はどれか、どの契約が設計上 ownerless かを、ごまかさず正確に記録すること。
2. 検証方法
owner() を全契約から読む
3チェーンの全コントラクトの owner() を読み出し、返り値を「デプロイヤー EOA/放棄(0x0)/別アドレス/owner 関数なし」に分類。
owner() を持たない契約はソースで制御面を特定
owner() が無い契約は、ソースの継承(Ownable の有無)と特権関数を読み、本当に管理面が無いのか、別の制御モデルなのかを確認。
3. 判定
所有権はきれいに二分されました。
| 区分 | 契約(インスタンス数) | owner() |
|---|---|---|
| Ownable(鍵あり) | CawProfile・CawActions・CawProfileL2・CawProfileURI・CawActionsArchive・CawChallengeRelay(計12:L1×4/L2×4/L2b×4) | 単一のデプロイヤー EOA |
| ownerless(設計上 鍵なし) | Marketplace・ClientManager・Minter・Quoter・BuyAndBurn・FontDataA・FontDataB(L1×7) | ―(owner 関数なし) |
その上で、単一鍵に「できる事/できない事」を正直に分けます。
- 残存 単一鍵が全 Ownable を保有。各契約の owner 限定関数(delegate のローテーション等)を呼べる状態です。これは mainnet 前として想定された姿で、隠れた所有者ではありません。
- 不可 配線(peer)の張替は所有者でも不能(B-1・OnlyOnce)。ロジックの差替えも不可(A-3・proxy ではない)。配線系セッターは一度きりで使用済み。
- 設計 7契約は ownerless。Marketplace は支払いトークンを construction で固定(後から増減不可)、ClientManager は識別子・手数料・registry のみ、BuyAndBurn は全パラメータ immutable、FontDataA/B は pure data。いずれも触れる管理面がありません。
正直にまとめると――「生の単一鍵がまだ全 Ownable を握っている」のは事実です。同時に、その鍵ができない事(配線の張替・ロジック差替え)も明確で、隠れた所有者も proxy backdoor もありません。「完成した分散化」ではなく、境界の見えた、mainnet 前の単一鍵――それが観測された状態です。
4. receipt(公開証明)
デプロイヤー EOA と、所有権の読み取り値です。Ownable 12個はすべて同じ EOA を返します。
| 対象 | アドレス |
|---|---|
| デプロイヤー EOA(=全 Ownable の owner) | 0xF71338f3eAa483aA66125598B09BA1988e694a95 |
| Ownable 契約 | チェーン | アドレス |
|---|---|---|
| CawProfile | L1 | 0x9fcbb3d6880cD3293F1a731Fe6c958a6621a74bF |
| CawActions | L1 | 0xD20bE35D2365C0f7DaF563A47b29eB5a165C2007 |
| CawProfileL2(L1 mirror) | L1 | 0xa99936edD087cE11824232ebD83B036C90163688 |
| CawProfileURI | L1 | 0x9CEffADC838a39D10a241d9A473844Ef0cB6274f |
| CawActions | L2 | 0x5674e4658b988Ed9337DD0CAa493C6aA908006af |
| CawProfileL2 | L2 | 0x0c3e245f3939B4D9f30e088988dD9D7C8F86b11d |
| CawActionsArchive | L2 | 0x3b2A9ac4f274eE6E73CbAD198F80f455e70C3C05 |
| CawChallengeRelay | L2 | 0x8195A9a8a97658672d5384e19a763804D6E16639 |
| CawActions | L2b | 0x287b249B58bF65411D4Da89dAdEF0e30496a0D4c |
| CawProfileL2 | L2b | 0xbB9c2A3e8222d13f9E8469BB71cE62c3c2E82941 |
| CawActionsArchive | L2b | 0x5bCbB34f51156D605331f9d6F76a44DEa1d279E5 |
| CawChallengeRelay | L2b | 0x454450aA713A99B06EE4aA05Ede5d80ca1bd3075 |
ownerless(L1・owner 関数なし):ClientManager 0xA5C515…24C7a/Minter 0x8D65D1…290D9/Quoter 0x3100B1…8e79/Marketplace 0x6404d1…67C3/BuyAndBurn 0x5860d1…7F486/FontDataA 0xB7ec88…43B8cf/FontDataB 0x1D084C…98fBf3。
再現は、各アドレスに owner() を読むだけです。Ownable は全件デプロイヤー EOA を返し、ownerless 群は owner() 関数を持ちません。
再現コマンドは、自分のノードと同じ ethers v6(node)/curl 版を、下のツールの「コマンドで確認」にコピー安全な形で用意しています(Ownable は全件 0xF713…4a95 を返します)。
5. なぜ今は単一鍵なのか(mainnet 前の段階)
単一鍵を「中央集権の証拠」と決めつける前に、その鍵にできない事とソース自身の宣言を読みます。ここをごまかさずに書いておきます。
鍵にできない事は、すでに構造で閉じている
所有者であっても、配線済み peer は張り替えられず(B-1・OnlyOnce)、ロジックは差し替えられません(A-3・proxy 不在)。配線系セッター(setL1Peer/setL2Peer/setMinter 等)も一度きりで使用済み。つまり最も危険なレバー(クロスチェーン偽造・コード差替え)は、鍵が生きていても引けません。
移管はソース自身が予定している
残る owner 権限(LZ delegate のローテーション等)について、ソースのコメントは「pre-mainnet チェックリスト(multisig への移管、または renounce)で扱う」と明記しています。今が単一鍵なのは閉じられないからではなく、テストネット段階で固定するのが時期尚早だからです。
つまり「単一鍵=中央集権が確定」ではありません。鍵の力は配線・ロジックに及ばず、移管はソースに明文化済み――能力の不在ではなく、段階の問題です。とはいえ「分散化が完了した」とも言えません。multisig 移管か renounce が実行されるまで、ここは開いた扉として正直に数え続けます。
6. 注記・限界
この項目(A-2)が扱うのは「所有権・管理権の所在」です。コードの同一性は A-1、所有権移転の履歴(txhash)は A-4、proxy 構造は A-3 で別に扱います。所有者の状態は時点のもので、multisig 移管/renounce が実行されればこのページを更新します。
残った権限を隠さず書く。それが検証の誠実さだ。
“Who can change what?” — if you claim decentralization, you must be honest here. This item reads where ownership sits across every live V1 contract. The bottom line, up front: every changeable contract (the Ownable ones) is held directly by a single deployer key. This is the expected pre-mainnet stage, and the exact thing the source itself declares it will resolve via multisig handoff or renounce. We don’t boast about closed locks; we count the doors that are open, accurately.
This item checks “who can change this system after the fact.” Picture the keys to a building. For every door that can be changed (the Ownable contracts), we read, one by one, who currently holds the key.
→
12 OwnableL1/L2/L2b
→
all one creator key+7 with no key
The result: all 12 changeable doors are held by the same single person (the deployer). This is not a “decentralization complete” state. At the same time, several contracts have no key at all (ownerless by design) — no one can change them after the fact. We make it look neither better nor worse than it is. Both facts — that the key is a single one, and what that key cannot do (below) — are written honestly.
1. Claim (what is verified)
To actually read who owns (owner) each contract across all of live V1, and to record honestly which contracts the deployer EOA can change directly and which are ownerless by design.
2. Method
Read owner() on every contract
Read owner() on every contract across the three chains and classify the return as deployer EOA / renounced (0x0) / other address / no owner function.
For contracts without owner(), pin the control surface in source
For contracts with no owner(), read the inheritance (is Ownable present?) and privileged functions to confirm whether there truly is no admin surface, or a different control model.
Bound what that key can and cannot do
Bound the single key’s reach against the neighboring items: peers can’t be re-pointed even by the owner (B-1), and these are not upgradeable proxies (A-3).
3. Verdict
Ownership split cleanly in two.
| Class | Contracts (instances) | owner() |
|---|---|---|
| Ownable (has a key) | CawProfile, CawActions, CawProfileL2, CawProfileURI, CawActionsArchive, CawChallengeRelay (12 total: L1×4 / L2×4 / L2b×4) | a single deployer EOA |
| ownerless (no key, by design) | Marketplace, ClientManager, Minter, Quoter, BuyAndBurn, FontDataA, FontDataB (L1×7) | — (no owner function) |
From there, we split the single key’s “can / cannot” honestly.
- residual A single key holds all Ownable contracts. It can call each contract’s owner-gated functions (e.g. rotating the delegate). This is the expected pre-mainnet posture, not a hidden owner.
- cannot Re-pointing a peer is impossible even for the owner (B-1, OnlyOnce). Swapping logic is impossible too (A-3, not a proxy). The wiring setters are one-shot and already used.
- by design Seven contracts are ownerless. Marketplace fixes its payment-token set at construction (no post-deploy add/remove); ClientManager is just identity/fees/registry; BuyAndBurn has all params immutable; FontDataA/B are pure data. None expose an admin surface.
Honestly summarized: it is a fact that a single raw key still holds every Ownable contract. At the same time, what that key cannot do (re-point peers, swap logic) is clear, and there is no hidden owner and no proxy backdoor. Not “decentralization complete,” but a single pre-mainnet key with visible boundaries — that is the observed state.
4. Receipt (public proof)
The deployer EOA and the ownership reads. All 12 Ownable contracts return the same EOA.
| Item | Address |
|---|---|
| Deployer EOA (= owner of all Ownable) | 0xF71338f3eAa483aA66125598B09BA1988e694a95 |
| Ownable contract | Chain | Address |
|---|---|---|
| CawProfile | L1 | 0x9fcbb3d6880cD3293F1a731Fe6c958a6621a74bF |
| CawActions | L1 | 0xD20bE35D2365C0f7DaF563A47b29eB5a165C2007 |
| CawProfileL2 (L1 mirror) | L1 | 0xa99936edD087cE11824232ebD83B036C90163688 |
| CawProfileURI | L1 | 0x9CEffADC838a39D10a241d9A473844Ef0cB6274f |
| CawActions | L2 | 0x5674e4658b988Ed9337DD0CAa493C6aA908006af |
| CawProfileL2 | L2 | 0x0c3e245f3939B4D9f30e088988dD9D7C8F86b11d |
| CawActionsArchive | L2 | 0x3b2A9ac4f274eE6E73CbAD198F80f455e70C3C05 |
| CawChallengeRelay | L2 | 0x8195A9a8a97658672d5384e19a763804D6E16639 |
| CawActions | L2b | 0x287b249B58bF65411D4Da89dAdEF0e30496a0D4c |
| CawProfileL2 | L2b | 0xbB9c2A3e8222d13f9E8469BB71cE62c3c2E82941 |
| CawActionsArchive | L2b | 0x5bCbB34f51156D605331f9d6F76a44DEa1d279E5 |
| CawChallengeRelay | L2b | 0x454450aA713A99B06EE4aA05Ede5d80ca1bd3075 |
Ownerless (L1, no owner function): ClientManager 0xA5C515…24C7a, Minter 0x8D65D1…290D9, Quoter 0x3100B1…8e79, Marketplace 0x6404d1…67C3, BuyAndBurn 0x5860d1…7F486, FontDataA 0xB7ec88…43B8cf, FontDataB 0x1D084C…98fBf3.
To reproduce, just read owner() on each address. Every Ownable returns the deployer EOA; the ownerless group has no owner() function.
Reproduction commands — the same ethers v6 (node) / curl you would run on your node — are provided copy-safe under “CLI” in the tool below (every Ownable returns 0xF713…4a95).
5. Why a single key for now (the pre-mainnet stage)
Before branding the single key as “proof of centralization,” read what the key cannot do and what the source itself declares. We write this without fudging.
What the key cannot do is already closed by structure
Even as the owner, a wired peer cannot be re-pointed (B-1, OnlyOnce) and logic cannot be swapped (A-3, no proxy). The wiring setters (setL1Peer/setL2Peer/setMinter, etc.) are one-shot and already used. So the most dangerous levers (cross-chain forgery, code swap) cannot be pulled even while the key is live.
The handoff is planned by the source itself
For the remaining owner powers (e.g. rotating the LZ delegate), the source comment states these are “handled by the pre-mainnet checklist (multisig handoff or renounce).” The single key today is not because it can’t be closed, but because fixing it at the testnet stage would be premature.
So “single key = confirmed centralization” does not hold. The key’s power does not reach peers or logic, and the handoff is spelled out in source — a matter of stage, not of missing capability. That said, “decentralization complete” does not hold either. Until the multisig handoff or renounce is executed, we keep counting this honestly as an open door.
6. Notes & limits
What this item (A-2) covers is where ownership/admin sits. Code identity is A-1, the ownership-transfer history (txhash) is A-4, and proxy structure is A-3. The ownership state is point-in-time; we will update this page if a multisig handoff / renounce is executed.
Write down the powers that remain, without hiding them. That is the honesty of verification.






