Skip to content
16 changes: 10 additions & 6 deletions packages/frames.js/src/getAddressForFid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,20 @@ export async function getAddressForFid<
const {
fallbackToCustodyAddress = true,
hubHttpUrl = DEFAULT_HUB_API_URL,
hubRequestOptions = {
headers: {

@vercel vercel Bot Sep 2, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Default public hub api_key is applied unconditionally and (in three of four files) overwrites a caller's own api_key, breaking authentication against custom/private hubs.

Fix on Vercel

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()
Expand Down
16 changes: 10 additions & 6 deletions packages/frames.js/src/getAddressesForFid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,19 @@ export async function getAddressesForFid({
}): Promise<AddressWithType[]> {
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),
]);

Expand Down
4 changes: 3 additions & 1 deletion packages/frames.js/src/getFrameMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,14 @@ export async function getFrameMessage<T extends GetFrameMessageOptions>(
}: T = {} as T
): Promise<FrameMessageReturnType<T>> {
let requestOptions: HubHttpUrlOptions["hubRequestOptions"] =
hubRequestOptions || {};
hubRequestOptions ? { ...hubRequestOptions } : {};

if (hubHttpUrl === DEFAULT_HUB_API_URL) {
// use public api key only if default hub url is used
requestOptions = {
...requestOptions,
headers: {
...(requestOptions.headers ?? {}),
api_key: DEFAULT_HUB_API_KEY,
},
};
Expand Down
8 changes: 7 additions & 1 deletion packages/frames.js/src/getTokenFromUrl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@ export function getTokenFromUrl(url: string): ParsedToken {
throw new Error("Invalid token URL");
}

const parsedChainId = parseInt(chainId);

if (Number.isNaN(parsedChainId)) {
throw new Error("Invalid token URL: chainId is not a valid number");
}

return {
namespace,
chainId: parseInt(chainId),
chainId: parsedChainId,
address,
tokenId: tokenId || undefined,
};
Expand Down
22 changes: 13 additions & 9 deletions packages/frames.js/src/getUserDataForFid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@ export async function getUserDataForFid<
}): Promise<UserDataReturnType> {
const {
hubHttpUrl = DEFAULT_HUB_API_URL,
hubRequestOptions = {
headers: {
api_key: DEFAULT_HUB_API_KEY,
},
},
hubRequestOptions = {},
} = options;

const requestHeaders = {
api_key: DEFAULT_HUB_API_KEY,
...(hubRequestOptions.headers ?? {}),
};

const requestOptions = {
...hubRequestOptions,
headers: requestHeaders,
};

const userDataResponse = await fetch(
`${hubHttpUrl}/v1/userDataByFid?fid=${fid}`,
hubRequestOptions
requestOptions
);

const { messages } = (await userDataResponse
Expand Down Expand Up @@ -59,9 +65,7 @@ export async function getUserDataForFid<
const { type, value } = message.data.userDataBody;
const foundValue = acc[type];

if (foundValue && foundValue.timestamp < timestamp) {
acc[type] = { value, timestamp };
} else {
if (!foundValue || foundValue.timestamp < timestamp) {
acc[type] = { value, timestamp };
}
} catch (error) {
Expand Down
7 changes: 2 additions & 5 deletions packages/frames.js/src/validateFrameMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand Down