tokenURI is meant to return on-chain metadata as a data:application/json;base64,... URI (it prepends _baseURI() to the base64 JSON).
SoulboundProfileNFT does not override _baseURI(), so OpenZeppelin's default returns an empty string. tokenURI returns bare base64 text (eyJuYW1lIjoi...) with no scheme. Wallets and marketplaces treat it as a relative URL / unknown format and cannot load the profile metadata or image.
Effect: for token 1 the result starts with eyJ (base64 of {"), not with data:application/json;base64,. Any standard ERC721 metadata consumer fails to resolve it.
Likelihood:
Every token, every time metadata is read.
Impact:
Profiles show without name, age or picture in wallets/marketplaces; the on-chain profile feature is unusable for integrations. No funds at risk.
Test setup: owner deploys SoulboundProfileNFT and LikeRegistry(address(nft)); alice, bob, carol each get 10 ETH and mint a profile (token ids 1, 2, 3). Full file test/AuditPoC.t.sol, forge test --mc AuditPoC passes.
Override _baseURI() so the URI is a valid data URI:
Add a test that the result starts with data:application/json;base64, and decodes to valid JSON.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.