diff --git a/.changeset/ens-no-resolver-null.md b/.changeset/ens-no-resolver-null.md new file mode 100644 index 00000000000..260d1cedb7e --- /dev/null +++ b/.changeset/ens-no-resolver-null.md @@ -0,0 +1,5 @@ +--- +"thirdweb": patch +--- + +resolveText and resolveAvatar return null for names without a resolver diff --git a/packages/thirdweb/src/extensions/ens/resolve-text-errors.test.ts b/packages/thirdweb/src/extensions/ens/resolve-text-errors.test.ts new file mode 100644 index 00000000000..3bdf5fb57cd --- /dev/null +++ b/packages/thirdweb/src/extensions/ens/resolve-text-errors.test.ts @@ -0,0 +1,47 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { TEST_CLIENT } from "../../../test/src/test-clients.js"; +import { resolve } from "./__generated__/UniversalResolver/read/resolve.js"; +import { resolveText } from "./resolve-text.js"; + +vi.mock("./__generated__/UniversalResolver/read/resolve.js", () => ({ + resolve: vi.fn(), +})); + +describe("resolveText errors", () => { + beforeEach(() => { + vi.mocked(resolve).mockReset(); + }); + + it("returns null when the name has no resolver", async () => { + vi.mocked(resolve).mockRejectedValue({ + code: 3, + data: "0x77209fe800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + message: "execution reverted", + }); + + await expect( + resolveText({ + client: TEST_CLIENT, + key: "avatar", + name: "no-resolver-test-1.eth", + }), + ).resolves.toBeNull(); + }); + + it("rethrows other errors", async () => { + const error = { + code: 3, + data: "0x12345678", + message: "execution reverted", + }; + vi.mocked(resolve).mockRejectedValue(error); + + await expect( + resolveText({ + client: TEST_CLIENT, + key: "avatar", + name: "no-resolver-test-2.eth", + }), + ).rejects.toBe(error); + }); +}); diff --git a/packages/thirdweb/src/extensions/ens/resolve-text.ts b/packages/thirdweb/src/extensions/ens/resolve-text.ts index 5ca88c667f9..9db441c536d 100644 --- a/packages/thirdweb/src/extensions/ens/resolve-text.ts +++ b/packages/thirdweb/src/extensions/ens/resolve-text.ts @@ -55,6 +55,17 @@ export async function resolveText(options: ResolveTextOptions) { contract, data, name: toHex(packetToBytes(name)), + }).catch((e) => { + if ( + typeof e === "object" && + e !== null && + "data" in e && + typeof e.data === "string" && + e.data.startsWith("0x77209fe8") + ) { + return ["0x"] as const; + } + throw e; }); if (result[0] === "0x") {