From cf472b71183143c727fd5b0fd2c57844b8ae19ed Mon Sep 17 00:00:00 2001 From: "shuwen.wu" Date: Wed, 2 Sep 2026 18:04:25 +0800 Subject: [PATCH 1/6] fix: resolve logic bug and mutable default argument in getUserDataForFid - Remove redundant else branch that was overwriting acc[type] with the same value - Fix mutable default argument by creating requestOptions object fresh each time - Properly merge user-provided hubRequestOptions with default api_key header --- packages/frames.js/src/getUserDataForFid.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/frames.js/src/getUserDataForFid.ts b/packages/frames.js/src/getUserDataForFid.ts index 9d0af3b4..993791c4 100644 --- a/packages/frames.js/src/getUserDataForFid.ts +++ b/packages/frames.js/src/getUserDataForFid.ts @@ -16,16 +16,22 @@ export async function getUserDataForFid< }): Promise { const { hubHttpUrl = DEFAULT_HUB_API_URL, - hubRequestOptions = { - headers: { - api_key: DEFAULT_HUB_API_KEY, - }, - }, + hubRequestOptions = {}, } = options; + const requestHeaders = { + ...(hubRequestOptions.headers ?? {}), + api_key: DEFAULT_HUB_API_KEY, + }; + + const requestOptions = { + ...hubRequestOptions, + headers: requestHeaders, + }; + const userDataResponse = await fetch( `${hubHttpUrl}/v1/userDataByFid?fid=${fid}`, - hubRequestOptions + requestOptions ); const { messages } = (await userDataResponse @@ -61,8 +67,6 @@ export async function getUserDataForFid< if (foundValue && foundValue.timestamp < timestamp) { acc[type] = { value, timestamp }; - } else { - acc[type] = { value, timestamp }; } } catch (error) { // eslint-disable-next-line no-console -- provide feedback to user From 2bfc9ddc70125f21d5c65f6e0a5b19ea1fb88f08 Mon Sep 17 00:00:00 2001 From: "shuwen.wu" Date: Wed, 2 Sep 2026 18:05:06 +0800 Subject: [PATCH 2/6] fix: resolve mutable default argument in getAddressForFid Create fresh requestOptions object each time to avoid shared mutable default. Properly merge user-provided hubRequestOptions with default api_key header. --- packages/frames.js/src/getAddressForFid.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/frames.js/src/getAddressForFid.ts b/packages/frames.js/src/getAddressForFid.ts index 8360e89e..117dd372 100644 --- a/packages/frames.js/src/getAddressForFid.ts +++ b/packages/frames.js/src/getAddressForFid.ts @@ -21,16 +21,20 @@ export async function getAddressForFid< const { fallbackToCustodyAddress = true, hubHttpUrl = DEFAULT_HUB_API_URL, - hubRequestOptions = { - headers: { - api_key: DEFAULT_HUB_API_KEY, - }, - }, + hubRequestOptions = {}, } = options; + const requestOptions = { + ...hubRequestOptions, + headers: { + ...(hubRequestOptions.headers ?? {}), + api_key: DEFAULT_HUB_API_KEY, + }, + }; + const response = await fetch( `${hubHttpUrl}/v1/verificationsByFid?fid=${fid}`, - hubRequestOptions + requestOptions ); const { messages } = (await response .clone() From dac0c6dc65e803f2b0700564d4107d5e0f055a14 Mon Sep 17 00:00:00 2001 From: "shuwen.wu" Date: Wed, 2 Sep 2026 18:05:39 +0800 Subject: [PATCH 3/6] fix: resolve mutable default argument in getAddressesForFid Create fresh requestOptions object each time to avoid shared mutable default. Properly merge user-provided hubRequestOptions with default api_key header. --- packages/frames.js/src/getAddressesForFid.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/frames.js/src/getAddressesForFid.ts b/packages/frames.js/src/getAddressesForFid.ts index 80918533..740f0a6c 100644 --- a/packages/frames.js/src/getAddressesForFid.ts +++ b/packages/frames.js/src/getAddressesForFid.ts @@ -31,15 +31,19 @@ export async function getAddressesForFid({ }): Promise { const { hubHttpUrl = DEFAULT_HUB_API_URL, - hubRequestOptions = { - headers: { - api_key: DEFAULT_HUB_API_KEY, - }, - }, + hubRequestOptions = {}, } = options; + const requestOptions = { + ...hubRequestOptions, + headers: { + ...(hubRequestOptions.headers ?? {}), + api_key: DEFAULT_HUB_API_KEY, + }, + }; + const [verificationsResponse, custodyAddress] = await Promise.all([ - fetch(`${hubHttpUrl}/v1/verificationsByFid?fid=${fid}`, hubRequestOptions), + fetch(`${hubHttpUrl}/v1/verificationsByFid?fid=${fid}`, requestOptions), getCustodyAddressForFid(fid), ]); From 0f70607686c59c2d97919b8893b9c9953302c0a8 Mon Sep 17 00:00:00 2001 From: "shuwen.wu" Date: Wed, 2 Sep 2026 18:06:19 +0800 Subject: [PATCH 4/6] fix: resolve mutable default argument in validateFrameMessage - Fix mutable default argument by using empty object as default - Add missing api_key header when using default hub URL --- packages/frames.js/src/validateFrameMessage.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/frames.js/src/validateFrameMessage.ts b/packages/frames.js/src/validateFrameMessage.ts index b715f8e4..d3331992 100644 --- a/packages/frames.js/src/validateFrameMessage.ts +++ b/packages/frames.js/src/validateFrameMessage.ts @@ -30,11 +30,7 @@ export async function validateFrameMessage( body: FrameActionPayload, { hubHttpUrl = DEFAULT_HUB_API_URL, - hubRequestOptions = { - headers: { - api_key: DEFAULT_HUB_API_KEY, - }, - }, + hubRequestOptions = {}, }: HubHttpUrlOptions = {} ): Promise<{ isValid: boolean; @@ -55,6 +51,7 @@ export async function validateFrameMessage( headers: { "Content-Type": "application/octet-stream", ...headers, + api_key: DEFAULT_HUB_API_KEY, }, body: hexStringToUint8Array(body.trustedData.messageBytes), ...rest, From 5df91dd432fac1d32a848c88f548713d584e52ce Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Fri, 4 Sep 2026 14:07:02 +0800 Subject: [PATCH 5/6] fix: retain first user data value --- packages/frames.js/src/getUserDataForFid.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frames.js/src/getUserDataForFid.ts b/packages/frames.js/src/getUserDataForFid.ts index 993791c4..4d7b8f7d 100644 --- a/packages/frames.js/src/getUserDataForFid.ts +++ b/packages/frames.js/src/getUserDataForFid.ts @@ -65,7 +65,7 @@ export async function getUserDataForFid< const { type, value } = message.data.userDataBody; const foundValue = acc[type]; - if (foundValue && foundValue.timestamp < timestamp) { + if (!foundValue || foundValue.timestamp < timestamp) { acc[type] = { value, timestamp }; } } catch (error) { From f2fc2b509794fc05ed97f9d671dcd31de0529b71 Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Fri, 4 Sep 2026 14:37:21 +0800 Subject: [PATCH 6/6] fix: preserve custom hub API keys --- packages/frames.js/src/getUserDataForFid.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frames.js/src/getUserDataForFid.ts b/packages/frames.js/src/getUserDataForFid.ts index 4d7b8f7d..943aba37 100644 --- a/packages/frames.js/src/getUserDataForFid.ts +++ b/packages/frames.js/src/getUserDataForFid.ts @@ -20,8 +20,8 @@ export async function getUserDataForFid< } = options; const requestHeaders = { - ...(hubRequestOptions.headers ?? {}), api_key: DEFAULT_HUB_API_KEY, + ...(hubRequestOptions.headers ?? {}), }; const requestOptions = {