diff --git a/packages/ensjs/src/utils/hexEncodedName.test.ts b/packages/ensjs/src/utils/hexEncodedName.test.ts new file mode 100644 index 000000000..f12d9ec52 --- /dev/null +++ b/packages/ensjs/src/utils/hexEncodedName.test.ts @@ -0,0 +1,14 @@ +import { hexToBytes } from 'viem' +import { describe, expect, it } from 'vitest' +import { bytesToPacket } from './hexEncodedName.js' + +describe('bytesToPacket', () => { + it('should decode 08383433362E6574680365746800 to 8436.eth', () => { + const bytes = hexToBytes('0x08383433362E6574680365746800') + expect(bytesToPacket(bytes)).toBe('8436.eth') + }) + it('should not append .eth if already present', () => { + const bytes = hexToBytes('0x04746573740365746800') // test.eth + expect(bytesToPacket(bytes)).toBe('test.eth') + }) +}) diff --git a/packages/ensjs/src/utils/hexEncodedName.ts b/packages/ensjs/src/utils/hexEncodedName.ts index 609d41dcb..942b86afd 100644 --- a/packages/ensjs/src/utils/hexEncodedName.ts +++ b/packages/ensjs/src/utils/hexEncodedName.ts @@ -32,7 +32,7 @@ export function packetToBytes(packet: string): ByteArray { export function bytesToPacket(bytes: ByteArray): string { let offset = 0 - let result = '' + const labels: string[] = [] while (offset < bytes.length) { const len = bytes[offset] @@ -40,10 +40,18 @@ export function bytesToPacket(bytes: ByteArray): string { offset += 1 break } - - result += `${bytesToString(bytes.subarray(offset + 1, offset + len + 1))}.` + labels.push(bytesToString(bytes.subarray(offset + 1, offset + len + 1))) offset += len + 1 } - return result.replace(/\.$/, '') + // If the last label is 'eth' and the previous label ends with '.eth', remove the last 'eth' + if ( + labels.length > 1 && + labels[labels.length - 1] === 'eth' && + labels[labels.length - 2].endsWith('.eth') + ) { + labels.pop() + } + + return labels.join('.') }