A-6 username NFT
A-6 username NFT
CAW のユーザー名は、ひとつの NFT です。誰が発行でき、名前はどこに保存され、その「見た目(メタデータ・画像)」は何に依存しているのか――ここが運営のサーバーや IPFS に依存していれば、「オンチェーンのアイデンティティ」という主張は静かに崩れます。この項目では、ユーザー名 NFT 契約 CawProfile を、標準・保存場所・発行経路・メタデータ生成の4点で確かめます。
CAW のユーザー名は、譲渡できる NFT(標準の ERC-721)です。確かめたのは「名前そのものと、その表示が、本当にチェーンの中だけで完結しているか」。結果は――名前はチェーン上に保存され、表示(画像・メタデータ)もチェーン上で描画(IPFS もサーバーも不要)、発行はCAW を持つ人なら誰でも(先着・未使用の名前のみ)でした。
ひとつだけ混同しないでほしい点:ここで「完全オンチェーン」なのはユーザー名 NFTです。プロフィールのアバター画像や投稿画像はオフチェーンで、それは別項目(C-1)で正直に扱います。
CawProfile 契約そのものの健全性(コード一致・所有権・非プロキシ・来歴・配線)は A-1〜A-5 で検証済みで、A-6 はそれを「ユーザー名 NFT」という観点で要約・補強します。
1. 主張(検証対象)
ユーザー名 NFT 契約 CawProfile が、(1) 標準の ERC-721(譲渡可能な NFT)であり、(2) ユーザー名をオンチェーンに保存し、(3) 発行がパーミッションレス(運営の許可不要)で、(4) メタデータ・画像をオンチェーンで生成し外部(IPFS・サーバー)に依存しないこと。
2. 検証方法
標準と保存場所をソースで確認
継承(ERC721Enumerable・OApp・Ownable)と、ユーザー名の保存先(string[] public usernames、tokenId→username)を読む。
発行経路を確認
mint が誰から呼べるか(CawProfileMinter 経由)、その minter が誰でも使えるか、minter の差し替えが封じられているか(setMinter の onlyOnce)。
メタデータ生成を確認
tokenURI が何を返すか。CawProfileURI がオンチェーンのフォントデータ(FontDataA/FontDataB)から data:application/json;base64,… を生成しているか、IPFS/http 参照が無いか。
3. 判定
CawProfileURI がオンチェーンのフォントから描画し、IPFS・サーバーに依存しません。- 標準
CawProfile is ERC721Enumerable, Ownable, OApp。ユーザー名は譲渡可能な標準 NFTです。 - オンチェーン ユーザー名は
string[] public usernamesに保存(tokenId→username)。誰でもチェーンから読めます。 - パーミッションレス 発行は
CawProfileMinter.mintから誰でも可能(onlyOwnerなし)。未使用かつ有効(小文字英数1〜255字)な名前を先着で。minter はonlyOnceで一度きり設定・以後不変。 - オンチェーン描画
tokenURIはCawProfileURI.generateが返すdata:application/json;base64,…。オンチェーンのフォント(FontDataA/FontDataB)から SVG を描画し、IPFS・http・サーバーへの参照はありません。uriGeneratorもonlyOnceで固定。
つまり、ユーザー名というアイデンティティは、名前・所有・表示のすべてがチェーンの中だけで完結しています。運営のサーバーや IPFS が消えても、ユーザー名 NFT は読み出せ、表示でき、譲渡できます。
4. 正直な但し書き ── 「ユーザー名」と「画像」は別
ここで「完全オンチェーン」と言えるのは ユーザー名 NFT(名前+その名前を描いた SVG)です。一方、プロフィールのアバター画像や投稿に添える画像はオフチェーン(ローカルディスク/Filebase=IPFS 前段)に保存されます。「コンテンツは消せない」はテキストとユーザー名には当てはまりますが、画像には当てはまりません。この区別はノードの独立性(C-1)で正直に扱います。
また、発行には CAW(トークン)の支払いが要ります(costOfName)。これは「許可制」ではなく「対価制」で、許可者は存在しません。経済フロー(ステーキング・手数料)の妥当性は別項目(E-1)で扱います。
5. receipt(公開証明)
誰でも再現できます。ユーザー名・メタデータ・発行経路を、それぞれ直接読み出すだけです(対象は L1 の CawProfile)。
PROFILE=0x9fcbb3d6880cD3293F1a731Fe6c958a6621a74bF # ユーザー名はオンチェーン(tokenId=1 → usernames[0]) cast call $PROFILE "usernames(uint256)(string)" 0 --rpc-url <Sepolia RPC> # メタデータはオンチェーン生成(data:application/json;base64,… が返る) cast call $PROFILE "tokenURI(uint256)(string)" 1 --rpc-url <Sepolia RPC> # 発行経路(minter)と描画器(uriGenerator)。いずれも onlyOnce で固定 cast call $PROFILE "minter()(address)" --rpc-url <Sepolia RPC> cast call $PROFILE "uriGenerator()(address)" --rpc-url <Sepolia RPC> # 期待:usernames が文字列/tokenURI が data:application/json;base64,…(IPFS/http 無し) PASS(名前=オンチェーン/メタデータ=オンチェーン生成/発行=パーミッションレス)
minter は CawProfileMinter(0x8D65…90D9)、uriGenerator は CawProfileURI(0x9CEf…274f)で、後者は FontDataA(0xB7ec…B8cf)/FontDataB(0x1D08…fBf3)からフォントを読みます。発行の入口 CawProfileMinter.mint は public payable で onlyOwner 修飾子はありません(=パーミッションレス)。
6. 注記・限界
この項目(A-6)は「ユーザー名 NFT という観点での確認」です。CawProfile 契約そのものの健全性――コード一致(A-1)、所有権(A-2)、非プロキシ(A-3)、来歴(A-4)、配線(A-5)――は各項目で検証済みで、A-6 はそれを前提にしています。画像のオフチェーン性は C-1、経済フローは E-1 で扱います。
「オンチェーンのアイデンティティ」を、名乗りではなく読み出しで確かめる。
A CAW username is an NFT. Who can issue it, where the name is stored, and what its “look” (metadata / image) depends on — if any of that depends on the operator’s server or IPFS, the claim of “on-chain identity” quietly collapses. This item checks the username NFT contract CawProfile on four points: standard, storage, mint path, and metadata generation.
A CAW username is a transferable NFT (a standard ERC-721). We checked whether the name itself and its display truly live entirely on-chain. The result: the name is stored on-chain, the display (image / metadata) is rendered on-chain too (no IPFS, no server), and minting is open to anyone holding CAW (first-come, for an unused name).
One thing not to conflate: what is “fully on-chain” here is the username NFT. Profile avatar images and post images are off-chain, and we handle that honestly in a separate item (C-1).
CawProfile contract itself (code match, ownership, non-proxy, provenance, wiring) is verified in A-1–A-5; A-6 summarizes and reinforces it from the “username NFT” angle.
1. Claim (what is verified)
That the username NFT contract CawProfile is (1) a standard ERC-721 (a transferable NFT), (2) stores usernames on-chain, (3) has permissionless minting (no operator permission), and (4) generates metadata/image on-chain with no external (IPFS / server) dependency.
2. Method
Confirm standard & storage in source
Read the inheritance (ERC721Enumerable, OApp, Ownable) and where usernames are stored (string[] public usernames, tokenId→username).
Confirm the mint path
Who can call mint (via CawProfileMinter), whether that minter is open to anyone, and whether swapping the minter is sealed (setMinter is onlyOnce).
Confirm metadata generation
What tokenURI returns. Whether CawProfileURI builds a data:application/json;base64,… from on-chain font data (FontDataA/FontDataB), with no IPFS/http reference.
3. Verdict
CawProfileURI from on-chain fonts, with no IPFS/server dependency.- standard
CawProfile is ERC721Enumerable, Ownable, OApp. The username is a standard, transferable NFT. - on-chain Usernames are stored in
string[] public usernames(tokenId→username). Anyone can read them from the chain. - permissionless Minting is open via
CawProfileMinter.mint(noonlyOwner). An unused & valid name (1–255 lowercase alphanumeric) on a first-come basis. The minter is set once and immutable thereafter (onlyOnce). - on-chain render
tokenURIreturns thedata:application/json;base64,…fromCawProfileURI.generate. It renders the SVG from on-chain fonts (FontDataA/FontDataB), with no IPFS/http/server reference.uriGeneratoris also fixed viaonlyOnce.
So the username identity is self-contained on-chain — name, ownership, and display all within the chain. Even if the operator’s server or IPFS disappeared, the username NFT can still be read, displayed, and transferred.
4. An honest caveat — “username” vs “image”
What is “fully on-chain” here is the username NFT (the name plus the SVG that draws it). Profile avatar images and post images are off-chain (local disk / Filebase = IPFS front). “Content can’t be deleted” holds for text and usernames, but not for images. We handle this distinction honestly in node independence (C-1).
Also, minting requires payment in CAW (costOfName). This is a “price,” not a “permission” — there is no gatekeeper. The validity of the economic flow (staking / fees) is handled in a separate item (E-1).
5. Receipt (public proof)
Anyone can reproduce it. Just read the username, the metadata, and the mint path directly (target: CawProfile on L1).
PROFILE=0x9fcbb3d6880cD3293F1a731Fe6c958a6621a74bF # username is on-chain (tokenId=1 → usernames[0]) cast call $PROFILE "usernames(uint256)(string)" 0 --rpc-url <Sepolia RPC> # metadata is generated on-chain (returns data:application/json;base64,…) cast call $PROFILE "tokenURI(uint256)(string)" 1 --rpc-url <Sepolia RPC> # mint path (minter) and renderer (uriGenerator). Both fixed via onlyOnce cast call $PROFILE "minter()(address)" --rpc-url <Sepolia RPC> cast call $PROFILE "uriGenerator()(address)" --rpc-url <Sepolia RPC> # expected: usernames is a string; tokenURI is data:application/json;base64,… (no IPFS/http) PASS (name = on-chain / metadata = on-chain render / mint = permissionless)
The minter is CawProfileMinter (0x8D65…90D9); the uriGenerator is CawProfileURI (0x9CEf…274f), which reads fonts from FontDataA (0xB7ec…B8cf)/FontDataB (0x1D08…fBf3). The entry point CawProfileMinter.mint is public payable with no onlyOwner modifier (= permissionless).
6. Notes & limits
This item (A-6) is “verification from the username-NFT angle.” The integrity of the CawProfile contract itself — code match (A-1), ownership (A-2), non-proxy (A-3), provenance (A-4), wiring (A-5) — is verified in those items and assumed here. The off-chain nature of images is handled in C-1, the economic flow in E-1.
We confirm “on-chain identity” by reading it out, not by being told.






