diff --git a/packages/onchainkit/src/minikit/utils/manifestUtils.test.ts b/packages/onchainkit/src/minikit/utils/manifestUtils.test.ts index 1c1d3d681b..880b80c848 100644 --- a/packages/onchainkit/src/minikit/utils/manifestUtils.test.ts +++ b/packages/onchainkit/src/minikit/utils/manifestUtils.test.ts @@ -460,6 +460,98 @@ describe('withValidManifest', () => { }); }); + describe('baseBuilder handling', () => { + it('should omit baseBuilder when ownerAddress is missing', () => { + const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + const manifest: MiniAppManifest = { + miniapp: validMiniappBase, + baseBuilder: { + ownerAddress: undefined as unknown as string, + }, + }; + + const result = withValidManifest(manifest); + expect(result.baseBuilder).toBeUndefined(); + expect(consoleSpy).toHaveBeenCalledWith( + 'Invalid manifest baseBuilder. Omitting from manifest.', + ); + + consoleSpy.mockRestore(); + }); + + it('should omit baseBuilder when ownerAddress is empty string', () => { + const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + const manifest: MiniAppManifest = { + miniapp: validMiniappBase, + baseBuilder: { + ownerAddress: '', + }, + }; + + const result = withValidManifest(manifest); + expect(result.baseBuilder).toBeUndefined(); + expect(consoleSpy).toHaveBeenCalledWith( + 'Invalid manifest baseBuilder. Omitting from manifest.', + ); + + consoleSpy.mockRestore(); + }); + + it('should not warn when baseBuilder is not provided', () => { + const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + const manifest: MiniAppManifest = { + miniapp: validMiniappBase, + }; + + const result = withValidManifest(manifest); + expect(result.baseBuilder).toBeUndefined(); + expect(consoleSpy).not.toHaveBeenCalled(); + + consoleSpy.mockRestore(); + }); + + it('should include baseBuilder when ownerAddress is present', () => { + const manifest: MiniAppManifest = { + miniapp: validMiniappBase, + baseBuilder: { + ownerAddress: '0x1234567890abcdef1234567890abcdef12345678', + }, + }; + + const result = withValidManifest(manifest); + expect(result.baseBuilder).toEqual({ + ownerAddress: '0x1234567890abcdef1234567890abcdef12345678', + }); + }); + + it('should include baseBuilder alongside accountAssociation', () => { + const manifest: MiniAppManifest = { + miniapp: validMiniappBase, + accountAssociation: { + header: 'test-header', + payload: 'test-payload', + signature: 'test-signature', + }, + baseBuilder: { + ownerAddress: '0x1234567890abcdef1234567890abcdef12345678', + }, + }; + + const result = withValidManifest(manifest); + expect(result.accountAssociation).toEqual({ + header: 'test-header', + payload: 'test-payload', + signature: 'test-signature', + }); + expect(result.baseBuilder).toEqual({ + ownerAddress: '0x1234567890abcdef1234567890abcdef12345678', + }); + }); + }); + describe('edge cases', () => { it('should handle all primaryCategory values', () => { const categories = [ diff --git a/packages/onchainkit/src/minikit/utils/manifestUtils.ts b/packages/onchainkit/src/minikit/utils/manifestUtils.ts index 4884ce2513..f417dbf841 100644 --- a/packages/onchainkit/src/minikit/utils/manifestUtils.ts +++ b/packages/onchainkit/src/minikit/utils/manifestUtils.ts @@ -7,7 +7,7 @@ import type { export function withValidManifest< T extends MiniAppManifest | LegacyMiniAppManifest, >(manifest: T): T { - const { accountAssociation, miniapp, frame, ...rest } = manifest; + const { accountAssociation, miniapp, frame, baseBuilder, ...rest } = manifest as MiniAppManifest & LegacyMiniAppManifest; const miniappObject = ('miniapp' in manifest && miniapp) || ('frame' in manifest && frame); @@ -63,11 +63,20 @@ export function withValidManifest< ); } + const hasValidBaseBuilder = baseBuilder && baseBuilder.ownerAddress; + + if (baseBuilder && !hasValidBaseBuilder) { + console.warn('Invalid manifest baseBuilder. Omitting from manifest.'); + } + return { ...(hasValidAccountAssociation && { accountAssociation: manifest.accountAssociation, }), miniapp: cleanedMiniapp, + ...(hasValidBaseBuilder && { + baseBuilder: (manifest as MiniAppManifest).baseBuilder, + }), ...rest, } as T; } diff --git a/packages/onchainkit/src/minikit/utils/types.ts b/packages/onchainkit/src/minikit/utils/types.ts index d1f8077951..95862b3d15 100644 --- a/packages/onchainkit/src/minikit/utils/types.ts +++ b/packages/onchainkit/src/minikit/utils/types.ts @@ -48,9 +48,14 @@ export type MiniAppFields = { buttonTitle?: string; }; +export type BaseBuilderFields = { + ownerAddress: string; +} + export type MiniAppManifest = { accountAssociation?: AccountAssociationFields; miniapp: MiniAppFields; + baseBuilder?: BaseBuilderFields; frame?: never; };