@adland/data 0.14.3 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.cjs +62 -67
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -30
- package/dist/index.d.ts +30 -30
- package/dist/index.js +62 -67
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -60,64 +60,59 @@ async function safeProcessAd(ad, input) {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// src/services/adland.api.ts
|
|
63
|
-
var
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
63
|
+
var baseUrl = `${adlandApiUrl}/adland`;
|
|
64
|
+
async function post(url, body) {
|
|
65
|
+
return fetch(url, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
body: JSON.stringify(body)
|
|
68
|
+
}).then((res) => res.json());
|
|
69
|
+
}
|
|
70
|
+
async function get(url) {
|
|
71
|
+
return fetch(url).then((res) => res.json());
|
|
72
|
+
}
|
|
73
|
+
var adlandAPI = {
|
|
74
|
+
verify: {
|
|
75
|
+
cast({ hash }) {
|
|
76
|
+
return post(`${baseUrl}/verify/cast`, { hash });
|
|
77
|
+
},
|
|
78
|
+
miniapp({ domain }) {
|
|
79
|
+
return post(`${baseUrl}/verify/miniapp`, {
|
|
80
|
+
domain
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
profile({ fid }) {
|
|
84
|
+
return post(`${baseUrl}/verify/profile`, { fid });
|
|
85
|
+
},
|
|
86
|
+
token({ address, chainId }) {
|
|
87
|
+
return post(`${baseUrl}/verify/token`, {
|
|
88
|
+
address,
|
|
89
|
+
chainId
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
metadata: {
|
|
94
|
+
cast({ hash }) {
|
|
95
|
+
return get(`${baseUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
96
|
+
},
|
|
97
|
+
miniapp({ url }) {
|
|
98
|
+
return get(`${baseUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);
|
|
99
|
+
},
|
|
100
|
+
link({ url }) {
|
|
101
|
+
return get(`${baseUrl}/metadata/link?url=${encodeURIComponent(url)}`);
|
|
102
|
+
},
|
|
103
|
+
profile({ fid }) {
|
|
104
|
+
return get(`${baseUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);
|
|
105
|
+
},
|
|
106
|
+
token({
|
|
98
107
|
address,
|
|
99
108
|
chainId
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}) {
|
|
106
|
-
return this.get(
|
|
107
|
-
`${adlandApiUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
async post(url, body) {
|
|
111
|
-
return fetch(url, {
|
|
112
|
-
method: "POST",
|
|
113
|
-
body: JSON.stringify(body)
|
|
114
|
-
}).then((res) => res.json());
|
|
115
|
-
}
|
|
116
|
-
async get(url) {
|
|
117
|
-
return fetch(url).then((res) => res.json());
|
|
109
|
+
}) {
|
|
110
|
+
return get(
|
|
111
|
+
`${baseUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
118
114
|
}
|
|
119
115
|
};
|
|
120
|
-
var adlandAPI = new AdlandAPI();
|
|
121
116
|
|
|
122
117
|
// src/ads/cast.ts
|
|
123
118
|
var castAd = defineAd({
|
|
@@ -128,23 +123,23 @@ var castAd = defineAd({
|
|
|
128
123
|
metadata: zod.z.object({
|
|
129
124
|
username: zod.z.string().optional(),
|
|
130
125
|
pfpUrl: zod.z.string().optional(),
|
|
131
|
-
text: zod.z.string()
|
|
132
|
-
timestamp: zod.z.
|
|
126
|
+
text: zod.z.string(),
|
|
127
|
+
timestamp: zod.z.string()
|
|
133
128
|
}),
|
|
134
129
|
async verify({ hash }) {
|
|
135
130
|
if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {
|
|
136
131
|
throw new Error("Invalid Farcaster cast hash");
|
|
137
132
|
}
|
|
138
|
-
const res = await adlandAPI.
|
|
133
|
+
const res = await adlandAPI.verify.cast({ hash });
|
|
139
134
|
if (!res.verified) {
|
|
140
135
|
throw new Error("Cast hash verification failed");
|
|
141
136
|
}
|
|
142
137
|
},
|
|
143
138
|
async getMetadata({ hash }) {
|
|
144
|
-
const cast = await adlandAPI.
|
|
139
|
+
const { cast } = await adlandAPI.metadata.cast({ hash });
|
|
145
140
|
return {
|
|
146
|
-
username: cast.username,
|
|
147
|
-
pfpUrl: cast.
|
|
141
|
+
username: cast.author.username,
|
|
142
|
+
pfpUrl: cast.author.pfp_url,
|
|
148
143
|
text: cast.text,
|
|
149
144
|
timestamp: cast.timestamp
|
|
150
145
|
};
|
|
@@ -167,7 +162,7 @@ var linkAd = defineAd({
|
|
|
167
162
|
}
|
|
168
163
|
},
|
|
169
164
|
async getMetadata({ url }) {
|
|
170
|
-
const metadata = await adlandAPI.
|
|
165
|
+
const metadata = await adlandAPI.metadata.link({ url });
|
|
171
166
|
return {
|
|
172
167
|
title: metadata.title,
|
|
173
168
|
description: metadata.description,
|
|
@@ -194,14 +189,14 @@ var miniappAd = defineAd({
|
|
|
194
189
|
if (!domain) {
|
|
195
190
|
throw new Error(errorMessage);
|
|
196
191
|
}
|
|
197
|
-
const res = await adlandAPI.
|
|
192
|
+
const res = await adlandAPI.verify.miniapp({ domain });
|
|
198
193
|
console.log("verifyMiniapp:res", res);
|
|
199
194
|
if (!res.verified) {
|
|
200
195
|
throw new Error(errorMessage);
|
|
201
196
|
}
|
|
202
197
|
},
|
|
203
198
|
async getMetadata({ url }) {
|
|
204
|
-
const res = await adlandAPI.
|
|
199
|
+
const res = await adlandAPI.metadata.miniapp({ url });
|
|
205
200
|
console.log("getMetadata:res", res);
|
|
206
201
|
return {
|
|
207
202
|
icon: res.icon,
|
|
@@ -227,13 +222,13 @@ var tokenAd = defineAd({
|
|
|
227
222
|
logoURI: zod.z.string().optional()
|
|
228
223
|
}),
|
|
229
224
|
async verify({ address, chainId }) {
|
|
230
|
-
const res = await adlandAPI.
|
|
225
|
+
const res = await adlandAPI.verify.token({ address, chainId });
|
|
231
226
|
if (!res.verified) {
|
|
232
227
|
throw new Error("Token verification failed");
|
|
233
228
|
}
|
|
234
229
|
},
|
|
235
230
|
async getMetadata({ address, chainId }) {
|
|
236
|
-
const token = await adlandAPI.
|
|
231
|
+
const token = await adlandAPI.metadata.token({ address, chainId });
|
|
237
232
|
return {
|
|
238
233
|
name: token.name,
|
|
239
234
|
symbol: token.symbol,
|
|
@@ -257,13 +252,13 @@ var farcasterProfileAd = defineAd({
|
|
|
257
252
|
pro: zod.z.boolean().optional()
|
|
258
253
|
}),
|
|
259
254
|
async verify({ fid }) {
|
|
260
|
-
const res = await adlandAPI.
|
|
255
|
+
const res = await adlandAPI.verify.profile({ fid });
|
|
261
256
|
if (!res.verified) {
|
|
262
257
|
throw new Error("Farcaster profile verification failed");
|
|
263
258
|
}
|
|
264
259
|
},
|
|
265
260
|
async getMetadata({ fid }) {
|
|
266
|
-
const res = await adlandAPI.
|
|
261
|
+
const res = await adlandAPI.metadata.profile({ fid });
|
|
267
262
|
return {
|
|
268
263
|
pfpUrl: res.pfpUrl,
|
|
269
264
|
bio: res.bio,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/ads/token.ts","../src/ads/profile.ts","../src/farcaster.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.0xslots.org\";\n\nexport const debug = true;\n","import type { z } from \"zod\";\nimport { debug } from \"../constants\";\n\nexport type FieldChoice<T> = { label: string; value: T };\n\n/**\n * Attach a list of allowed choices to any Zod schema as metadata.\n * The underlying schema and its validation are unchanged — this only\n * annotates the field so that form builders can render a <select>.\n */\nexport function withChoices<T extends z.ZodTypeAny>(\n schema: T,\n choices: ReadonlyArray<FieldChoice<z.infer<T>>>,\n): T & { choices: ReadonlyArray<FieldChoice<z.infer<T>>> } {\n return Object.assign(schema, { choices });\n}\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({ url }: { url: string }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({ url }: { url: string }): Promise<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }> {\n return this.get<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }>(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n async verifyFarcasterProfile({ fid }: { fid: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/profile`, {\n fid,\n });\n }\n\n async getFarcasterProfile({ fid }: { fid: string }): Promise<{\n pfpUrl: string;\n bio: string;\n username: string;\n displayName?: string;\n followers: number;\n following: number;\n pro: boolean;\n }> {\n return this.get<{\n pfpUrl: string;\n bio: string;\n username: string;\n displayName?: string;\n followers: number;\n following: number;\n pro: boolean;\n }>(`${adlandApiUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);\n }\n\n async verifyToken({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/token`, {\n address,\n chainId,\n });\n }\n\n async getTokenMetadata({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }): Promise<{\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n }> {\n return this.get<{\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n }>(\n `${adlandApiUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`,\n );\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd, withChoices } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const tokenAd = defineAd({\n type: \"token\",\n data: z.object({\n address: z.string().nonempty(\"Address is required\"),\n chainId: withChoices(\n z\n .number()\n .int()\n .positive(\"Chain ID is required\")\n .refine((chainId) => [8453].includes(chainId), \"Invalid chain ID\"),\n [{ label: \"Base (8453)\", value: 8453 }],\n ),\n }),\n metadata: z.object({\n name: z.string().optional(),\n symbol: z.string().optional(),\n decimals: z.number().optional(),\n logoURI: z.string().optional(),\n }),\n async verify({ address, chainId }) {\n const res = await adlandAPI.verifyToken({ address, chainId });\n if (!res.verified) {\n throw new Error(\"Token verification failed\");\n }\n },\n async getMetadata({ address, chainId }) {\n const token = await adlandAPI.getTokenMetadata({ address, chainId });\n return {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n };\n },\n});\n\nexport type TokenAdData = z.infer<typeof tokenAd.data>;\nexport type TokenAdMetadata = z.infer<NonNullable<typeof tokenAd.metadata>>;\nexport type TokenAd = {\n type: \"token\";\n data: TokenAdData;\n metadata: TokenAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const farcasterProfileAd = defineAd({\n type: \"farcasterProfile\",\n data: z.object({\n fid: z.string().nonempty(\"Fid is required\"),\n }),\n metadata: z.object({\n pfpUrl: z.string().optional(),\n bio: z.string().optional(),\n username: z.string().optional(),\n displayName: z.string().optional(),\n followers: z.number().optional(),\n following: z.number().optional(),\n pro: z.boolean().optional(),\n }),\n async verify({ fid }) {\n const res = await adlandAPI.verifyFarcasterProfile({ fid });\n if (!res.verified) {\n throw new Error(\"Farcaster profile verification failed\");\n }\n },\n async getMetadata({ fid }) {\n const res = await adlandAPI.getFarcasterProfile({ fid });\n return {\n pfpUrl: res.pfpUrl,\n bio: res.bio,\n username: res.username,\n displayName: res.displayName,\n followers: res.followers,\n following: res.following,\n pro: res.pro,\n };\n },\n});\n\nexport type FarcasterProfileAdData = z.infer<typeof farcasterProfileAd.data>;\nexport type FarcasterProfileAdMetadata = z.infer<\n NonNullable<typeof farcasterProfileAd.metadata>\n>;\nexport type FarcasterProfileAd = {\n type: \"farcasterProfile\";\n data: FarcasterProfileAdData;\n metadata: FarcasterProfileAdMetadata;\n};\n","import { Manifest } from \"@farcaster/miniapp-sdk\";\n\n/**\n * Utility functions to parse accountAssociation from Mini App manifest\n *\n * The accountAssociation is a JSON Farcaster Signature (JFS) that contains:\n * - header: base64url encoded JSON with FID, type, and key (address)\n * - payload: base64url encoded JSON with domain\n * - signature: base64url encoded signature\n */\n\ninterface AccountAssociationHeader {\n fid: number;\n type: \"custody\" | \"auth\";\n key: string; // The address (e.g., \"0x...\")\n}\n\ninterface AccountAssociationPayload {\n domain: string;\n}\n\ninterface AccountAssociation {\n header: string; // base64url encoded\n payload: string; // base64url encoded\n signature: string; // base64url encoded\n}\n\nexport interface ParsedAccountAssociation {\n fid: number;\n address: string; // Ethereum address (0x...)\n type: \"custody\" | \"auth\";\n domain: string;\n}\n\n/**\n * Decode base64url encoded string to JSON object\n */\nfunction decodeBase64Url<T>(encoded: string): T {\n // Replace URL-safe characters with standard base64 characters\n let base64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n // Node.js environment\n const decoded = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded) as T;\n}\n\n/**\n * Parse accountAssociation to extract FID and address\n *\n * @param accountAssociation - The accountAssociation object from manifest\n * @returns Parsed object with FID, address, type, and domain\n */\nexport function parseAccountAssociation(\n accountAssociation: AccountAssociation,\n): ParsedAccountAssociation {\n try {\n // Decode the header to get FID, type, and key (address)\n const header: AccountAssociationHeader = decodeBase64Url(\n accountAssociation.header,\n );\n\n // Decode the payload to get domain\n const payload: AccountAssociationPayload = decodeBase64Url(\n accountAssociation.payload,\n );\n\n return {\n fid: header.fid,\n address: header.key, // The key is the Ethereum address\n type: header.type,\n domain: payload.domain,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Fetch and parse accountAssociation from a manifest URL\n *\n * @param manifestUrl - URL to the manifest (e.g., \"https://example.com/.well-known/farcaster.json\")\n * @returns Parsed accountAssociation\n */\nexport async function fetchAndParseAccountAssociation(\n manifestUrl: string,\n): Promise<ParsedAccountAssociation> {\n try {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch manifest: ${response.status} ${response.statusText}`,\n );\n }\n\n const manifest = (await response.json()) as any;\n\n if (!manifest.accountAssociation) {\n throw new Error(\"Manifest does not contain accountAssociation\");\n }\n\n return parseAccountAssociation(manifest.accountAssociation);\n } catch (error) {\n throw new Error(\n `Failed to fetch and parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport class FarcasterAPI {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async getDomainManifest(domain: string) {\n const response = await fetch(\n `https://client.farcaster.xyz/v1/domain-manifest?domain=${domain}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch domain manifest: ${response.status} ${response.statusText}`,\n );\n }\n const data = (await response.json()) as {\n result: {\n state: {\n verified: boolean;\n updatedAt: number; // timestamp\n manifest: string;\n };\n };\n };\n\n console.log(\"FarcasterAPI:data\", data);\n\n return {\n ...data.result.state,\n manifest: JSON.parse(data.result.state.manifest) as Manifest.Manifest,\n };\n }\n}\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\nimport type { TokenAd } from \"./ads/token\";\nimport type { FarcasterProfileAd } from \"./ads/profile\";\nimport { tokenAd } from \"./ads/token\";\nimport { farcasterProfileAd } from \"./ads/profile\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd | TokenAd | FarcasterProfileAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n token: tokenAd,\n farcasterProfile: farcasterProfileAd,\n} as const;\n\nexport const adTypes = [\n \"link\",\n \"cast\",\n \"miniapp\",\n \"token\",\n \"farcasterProfile\",\n] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Export constants\nexport { adlandApiUrl } from \"./constants\";\n\n// Export Farcaster utilities\nexport * from \"./farcaster\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/ads/token.ts","../src/ads/profile.ts","../src/farcaster.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.0xslots.org\";\n\nexport const debug = true;\n","import type { z } from \"zod\";\nimport { debug } from \"../constants\";\n\nexport type FieldChoice<T> = { label: string; value: T };\n\n/**\n * Attach a list of allowed choices to any Zod schema as metadata.\n * The underlying schema and its validation are unchanged — this only\n * annotates the field so that form builders can render a <select>.\n */\nexport function withChoices<T extends z.ZodTypeAny>(\n schema: T,\n choices: ReadonlyArray<FieldChoice<z.infer<T>>>,\n): T & { choices: ReadonlyArray<FieldChoice<z.infer<T>>> } {\n return Object.assign(schema, { choices });\n}\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\nimport type {\n CastMetadata,\n LinkMetadata,\n MiniappMetadata,\n ProfileMetadata,\n TokenMetadata,\n} from \"../types\";\n\nconst baseUrl = `${adlandApiUrl}/adland`;\n\nasync function post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n}\n\nasync function get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n}\n\nexport const adlandAPI = {\n verify: {\n cast({ hash }: { hash: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/cast`, { hash });\n },\n\n miniapp({ domain }: { domain: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/miniapp`, {\n domain,\n });\n },\n\n profile({ fid }: { fid: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/profile`, { fid });\n },\n\n token({ address, chainId }: { address: string; chainId: number }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/token`, {\n address,\n chainId,\n });\n },\n },\n\n metadata: {\n cast({ hash }: { hash: string }): Promise<CastMetadata> {\n return get(`${baseUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n },\n\n miniapp({ url }: { url: string }): Promise<MiniappMetadata> {\n return get(`${baseUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n },\n\n link({ url }: { url: string }): Promise<LinkMetadata> {\n return get(`${baseUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n },\n\n profile({ fid }: { fid: string }): Promise<ProfileMetadata> {\n return get(`${baseUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);\n },\n\n token({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }): Promise<TokenMetadata> {\n return get(\n `${baseUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`,\n );\n },\n },\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string(),\n timestamp: z.string(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verify.cast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const { cast } = await adlandAPI.metadata.cast({ hash });\n return {\n username: cast.author.username,\n pfpUrl: cast.author.pfp_url,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.metadata.link({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verify.miniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.metadata.miniapp({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd, withChoices } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const tokenAd = defineAd({\n type: \"token\",\n data: z.object({\n address: z.string().nonempty(\"Address is required\"),\n chainId: withChoices(\n z\n .number()\n .int()\n .positive(\"Chain ID is required\")\n .refine((chainId) => [8453].includes(chainId), \"Invalid chain ID\"),\n [{ label: \"Base (8453)\", value: 8453 }],\n ),\n }),\n metadata: z.object({\n name: z.string().optional(),\n symbol: z.string().optional(),\n decimals: z.number().optional(),\n logoURI: z.string().optional(),\n }),\n async verify({ address, chainId }) {\n const res = await adlandAPI.verify.token({ address, chainId });\n if (!res.verified) {\n throw new Error(\"Token verification failed\");\n }\n },\n async getMetadata({ address, chainId }) {\n const token = await adlandAPI.metadata.token({ address, chainId });\n return {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n };\n },\n});\n\nexport type TokenAdData = z.infer<typeof tokenAd.data>;\nexport type TokenAdMetadata = z.infer<NonNullable<typeof tokenAd.metadata>>;\nexport type TokenAd = {\n type: \"token\";\n data: TokenAdData;\n metadata: TokenAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const farcasterProfileAd = defineAd({\n type: \"farcasterProfile\",\n data: z.object({\n fid: z.string().nonempty(\"Fid is required\"),\n }),\n metadata: z.object({\n pfpUrl: z.string().optional(),\n bio: z.string().optional(),\n username: z.string().optional(),\n displayName: z.string().optional(),\n followers: z.number().optional(),\n following: z.number().optional(),\n pro: z.boolean().optional(),\n }),\n async verify({ fid }) {\n const res = await adlandAPI.verify.profile({ fid });\n if (!res.verified) {\n throw new Error(\"Farcaster profile verification failed\");\n }\n },\n async getMetadata({ fid }) {\n const res = await adlandAPI.metadata.profile({ fid });\n return {\n pfpUrl: res.pfpUrl,\n bio: res.bio,\n username: res.username,\n displayName: res.displayName,\n followers: res.followers,\n following: res.following,\n pro: res.pro,\n };\n },\n});\n\nexport type FarcasterProfileAdData = z.infer<typeof farcasterProfileAd.data>;\nexport type FarcasterProfileAdMetadata = z.infer<\n NonNullable<typeof farcasterProfileAd.metadata>\n>;\nexport type FarcasterProfileAd = {\n type: \"farcasterProfile\";\n data: FarcasterProfileAdData;\n metadata: FarcasterProfileAdMetadata;\n};\n","import { Manifest } from \"@farcaster/miniapp-sdk\";\n\n/**\n * Utility functions to parse accountAssociation from Mini App manifest\n *\n * The accountAssociation is a JSON Farcaster Signature (JFS) that contains:\n * - header: base64url encoded JSON with FID, type, and key (address)\n * - payload: base64url encoded JSON with domain\n * - signature: base64url encoded signature\n */\n\ninterface AccountAssociationHeader {\n fid: number;\n type: \"custody\" | \"auth\";\n key: string; // The address (e.g., \"0x...\")\n}\n\ninterface AccountAssociationPayload {\n domain: string;\n}\n\ninterface AccountAssociation {\n header: string; // base64url encoded\n payload: string; // base64url encoded\n signature: string; // base64url encoded\n}\n\nexport interface ParsedAccountAssociation {\n fid: number;\n address: string; // Ethereum address (0x...)\n type: \"custody\" | \"auth\";\n domain: string;\n}\n\n/**\n * Decode base64url encoded string to JSON object\n */\nfunction decodeBase64Url<T>(encoded: string): T {\n // Replace URL-safe characters with standard base64 characters\n let base64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n // Node.js environment\n const decoded = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded) as T;\n}\n\n/**\n * Parse accountAssociation to extract FID and address\n *\n * @param accountAssociation - The accountAssociation object from manifest\n * @returns Parsed object with FID, address, type, and domain\n */\nexport function parseAccountAssociation(\n accountAssociation: AccountAssociation,\n): ParsedAccountAssociation {\n try {\n // Decode the header to get FID, type, and key (address)\n const header: AccountAssociationHeader = decodeBase64Url(\n accountAssociation.header,\n );\n\n // Decode the payload to get domain\n const payload: AccountAssociationPayload = decodeBase64Url(\n accountAssociation.payload,\n );\n\n return {\n fid: header.fid,\n address: header.key, // The key is the Ethereum address\n type: header.type,\n domain: payload.domain,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Fetch and parse accountAssociation from a manifest URL\n *\n * @param manifestUrl - URL to the manifest (e.g., \"https://example.com/.well-known/farcaster.json\")\n * @returns Parsed accountAssociation\n */\nexport async function fetchAndParseAccountAssociation(\n manifestUrl: string,\n): Promise<ParsedAccountAssociation> {\n try {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch manifest: ${response.status} ${response.statusText}`,\n );\n }\n\n const manifest = (await response.json()) as any;\n\n if (!manifest.accountAssociation) {\n throw new Error(\"Manifest does not contain accountAssociation\");\n }\n\n return parseAccountAssociation(manifest.accountAssociation);\n } catch (error) {\n throw new Error(\n `Failed to fetch and parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport class FarcasterAPI {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async getDomainManifest(domain: string) {\n const response = await fetch(\n `https://client.farcaster.xyz/v1/domain-manifest?domain=${domain}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch domain manifest: ${response.status} ${response.statusText}`,\n );\n }\n const data = (await response.json()) as {\n result: {\n state: {\n verified: boolean;\n updatedAt: number; // timestamp\n manifest: string;\n };\n };\n };\n\n console.log(\"FarcasterAPI:data\", data);\n\n return {\n ...data.result.state,\n manifest: JSON.parse(data.result.state.manifest) as Manifest.Manifest,\n };\n }\n}\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport { tokenAd } from \"./ads/token\";\nimport { farcasterProfileAd } from \"./ads/profile\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\nimport type { TokenAd } from \"./ads/token\";\nimport type { FarcasterProfileAd } from \"./ads/profile\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd | TokenAd | FarcasterProfileAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n token: tokenAd,\n farcasterProfile: farcasterProfileAd,\n} as const;\n\nexport const adTypes = [\n \"link\",\n \"cast\",\n \"miniapp\",\n \"token\",\n \"farcasterProfile\",\n] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Export constants\nexport { adlandApiUrl } from \"./constants\";\n\n// Export Farcaster utilities\nexport * from \"./farcaster\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -10,8 +10,8 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
10
10
|
}, z.core.$strip>, z.ZodObject<{
|
|
11
11
|
username: z.ZodOptional<z.ZodString>;
|
|
12
12
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
13
|
-
text: z.
|
|
14
|
-
timestamp: z.
|
|
13
|
+
text: z.ZodString;
|
|
14
|
+
timestamp: z.ZodString;
|
|
15
15
|
}, z.core.$strip>> & {
|
|
16
16
|
process: (input: {
|
|
17
17
|
hash: string;
|
|
@@ -20,10 +20,10 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
20
20
|
hash: string;
|
|
21
21
|
};
|
|
22
22
|
metadata: {
|
|
23
|
+
text: string;
|
|
24
|
+
timestamp: string;
|
|
23
25
|
username?: string | undefined;
|
|
24
26
|
pfpUrl?: string | undefined;
|
|
25
|
-
text?: string | undefined;
|
|
26
|
-
timestamp?: number | undefined;
|
|
27
27
|
} | undefined;
|
|
28
28
|
}>;
|
|
29
29
|
safeProcess: (input: {
|
|
@@ -34,10 +34,10 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
34
34
|
hash: string;
|
|
35
35
|
} | undefined;
|
|
36
36
|
metadata?: {
|
|
37
|
+
text: string;
|
|
38
|
+
timestamp: string;
|
|
37
39
|
username?: string | undefined;
|
|
38
40
|
pfpUrl?: string | undefined;
|
|
39
|
-
text?: string | undefined;
|
|
40
|
-
timestamp?: number | undefined;
|
|
41
41
|
} | undefined;
|
|
42
42
|
error?: z.ZodError | string;
|
|
43
43
|
}>;
|
|
@@ -452,8 +452,8 @@ declare const ads: {
|
|
|
452
452
|
}, z.core.$strip>, z.ZodObject<{
|
|
453
453
|
username: z.ZodOptional<z.ZodString>;
|
|
454
454
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
455
|
-
text: z.
|
|
456
|
-
timestamp: z.
|
|
455
|
+
text: z.ZodString;
|
|
456
|
+
timestamp: z.ZodString;
|
|
457
457
|
}, z.core.$strip>> & {
|
|
458
458
|
process: (input: {
|
|
459
459
|
hash: string;
|
|
@@ -462,10 +462,10 @@ declare const ads: {
|
|
|
462
462
|
hash: string;
|
|
463
463
|
};
|
|
464
464
|
metadata: {
|
|
465
|
+
text: string;
|
|
466
|
+
timestamp: string;
|
|
465
467
|
username?: string | undefined;
|
|
466
468
|
pfpUrl?: string | undefined;
|
|
467
|
-
text?: string | undefined;
|
|
468
|
-
timestamp?: number | undefined;
|
|
469
469
|
} | undefined;
|
|
470
470
|
}>;
|
|
471
471
|
safeProcess: (input: {
|
|
@@ -476,10 +476,10 @@ declare const ads: {
|
|
|
476
476
|
hash: string;
|
|
477
477
|
} | undefined;
|
|
478
478
|
metadata?: {
|
|
479
|
+
text: string;
|
|
480
|
+
timestamp: string;
|
|
479
481
|
username?: string | undefined;
|
|
480
482
|
pfpUrl?: string | undefined;
|
|
481
|
-
text?: string | undefined;
|
|
482
|
-
timestamp?: number | undefined;
|
|
483
483
|
} | undefined;
|
|
484
484
|
error?: z.ZodError | string;
|
|
485
485
|
}>;
|
|
@@ -661,8 +661,8 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
661
661
|
}, z.core.$strip>, z.ZodObject<{
|
|
662
662
|
username: z.ZodOptional<z.ZodString>;
|
|
663
663
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
664
|
-
text: z.
|
|
665
|
-
timestamp: z.
|
|
664
|
+
text: z.ZodString;
|
|
665
|
+
timestamp: z.ZodString;
|
|
666
666
|
}, z.core.$strip>> & {
|
|
667
667
|
process: (input: {
|
|
668
668
|
hash: string;
|
|
@@ -671,10 +671,10 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
671
671
|
hash: string;
|
|
672
672
|
};
|
|
673
673
|
metadata: {
|
|
674
|
+
text: string;
|
|
675
|
+
timestamp: string;
|
|
674
676
|
username?: string | undefined;
|
|
675
677
|
pfpUrl?: string | undefined;
|
|
676
|
-
text?: string | undefined;
|
|
677
|
-
timestamp?: number | undefined;
|
|
678
678
|
} | undefined;
|
|
679
679
|
}>;
|
|
680
680
|
safeProcess: (input: {
|
|
@@ -685,10 +685,10 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
685
685
|
hash: string;
|
|
686
686
|
} | undefined;
|
|
687
687
|
metadata?: {
|
|
688
|
+
text: string;
|
|
689
|
+
timestamp: string;
|
|
688
690
|
username?: string | undefined;
|
|
689
691
|
pfpUrl?: string | undefined;
|
|
690
|
-
text?: string | undefined;
|
|
691
|
-
timestamp?: number | undefined;
|
|
692
692
|
} | undefined;
|
|
693
693
|
error?: z.ZodError | string;
|
|
694
694
|
}>;
|
|
@@ -872,8 +872,8 @@ declare const adDefinitions: {
|
|
|
872
872
|
}, z.core.$strip>, z.ZodObject<{
|
|
873
873
|
username: z.ZodOptional<z.ZodString>;
|
|
874
874
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
875
|
-
text: z.
|
|
876
|
-
timestamp: z.
|
|
875
|
+
text: z.ZodString;
|
|
876
|
+
timestamp: z.ZodString;
|
|
877
877
|
}, z.core.$strip>> & {
|
|
878
878
|
process: (input: {
|
|
879
879
|
hash: string;
|
|
@@ -882,10 +882,10 @@ declare const adDefinitions: {
|
|
|
882
882
|
hash: string;
|
|
883
883
|
};
|
|
884
884
|
metadata: {
|
|
885
|
+
text: string;
|
|
886
|
+
timestamp: string;
|
|
885
887
|
username?: string | undefined;
|
|
886
888
|
pfpUrl?: string | undefined;
|
|
887
|
-
text?: string | undefined;
|
|
888
|
-
timestamp?: number | undefined;
|
|
889
889
|
} | undefined;
|
|
890
890
|
}>;
|
|
891
891
|
safeProcess: (input: {
|
|
@@ -896,10 +896,10 @@ declare const adDefinitions: {
|
|
|
896
896
|
hash: string;
|
|
897
897
|
} | undefined;
|
|
898
898
|
metadata?: {
|
|
899
|
+
text: string;
|
|
900
|
+
timestamp: string;
|
|
899
901
|
username?: string | undefined;
|
|
900
902
|
pfpUrl?: string | undefined;
|
|
901
|
-
text?: string | undefined;
|
|
902
|
-
timestamp?: number | undefined;
|
|
903
903
|
} | undefined;
|
|
904
904
|
error?: z.ZodError | string;
|
|
905
905
|
}>;
|
|
@@ -1075,8 +1075,8 @@ declare const adModels: {
|
|
|
1075
1075
|
}, z.core.$strip>, z.ZodObject<{
|
|
1076
1076
|
username: z.ZodOptional<z.ZodString>;
|
|
1077
1077
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
1078
|
-
text: z.
|
|
1079
|
-
timestamp: z.
|
|
1078
|
+
text: z.ZodString;
|
|
1079
|
+
timestamp: z.ZodString;
|
|
1080
1080
|
}, z.core.$strip>> & {
|
|
1081
1081
|
process: (input: {
|
|
1082
1082
|
hash: string;
|
|
@@ -1085,10 +1085,10 @@ declare const adModels: {
|
|
|
1085
1085
|
hash: string;
|
|
1086
1086
|
};
|
|
1087
1087
|
metadata: {
|
|
1088
|
+
text: string;
|
|
1089
|
+
timestamp: string;
|
|
1088
1090
|
username?: string | undefined;
|
|
1089
1091
|
pfpUrl?: string | undefined;
|
|
1090
|
-
text?: string | undefined;
|
|
1091
|
-
timestamp?: number | undefined;
|
|
1092
1092
|
} | undefined;
|
|
1093
1093
|
}>;
|
|
1094
1094
|
safeProcess: (input: {
|
|
@@ -1099,10 +1099,10 @@ declare const adModels: {
|
|
|
1099
1099
|
hash: string;
|
|
1100
1100
|
} | undefined;
|
|
1101
1101
|
metadata?: {
|
|
1102
|
+
text: string;
|
|
1103
|
+
timestamp: string;
|
|
1102
1104
|
username?: string | undefined;
|
|
1103
1105
|
pfpUrl?: string | undefined;
|
|
1104
|
-
text?: string | undefined;
|
|
1105
|
-
timestamp?: number | undefined;
|
|
1106
1106
|
} | undefined;
|
|
1107
1107
|
error?: z.ZodError | string;
|
|
1108
1108
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
10
10
|
}, z.core.$strip>, z.ZodObject<{
|
|
11
11
|
username: z.ZodOptional<z.ZodString>;
|
|
12
12
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
13
|
-
text: z.
|
|
14
|
-
timestamp: z.
|
|
13
|
+
text: z.ZodString;
|
|
14
|
+
timestamp: z.ZodString;
|
|
15
15
|
}, z.core.$strip>> & {
|
|
16
16
|
process: (input: {
|
|
17
17
|
hash: string;
|
|
@@ -20,10 +20,10 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
20
20
|
hash: string;
|
|
21
21
|
};
|
|
22
22
|
metadata: {
|
|
23
|
+
text: string;
|
|
24
|
+
timestamp: string;
|
|
23
25
|
username?: string | undefined;
|
|
24
26
|
pfpUrl?: string | undefined;
|
|
25
|
-
text?: string | undefined;
|
|
26
|
-
timestamp?: number | undefined;
|
|
27
27
|
} | undefined;
|
|
28
28
|
}>;
|
|
29
29
|
safeProcess: (input: {
|
|
@@ -34,10 +34,10 @@ declare const castAd: AdDefinition<z.ZodObject<{
|
|
|
34
34
|
hash: string;
|
|
35
35
|
} | undefined;
|
|
36
36
|
metadata?: {
|
|
37
|
+
text: string;
|
|
38
|
+
timestamp: string;
|
|
37
39
|
username?: string | undefined;
|
|
38
40
|
pfpUrl?: string | undefined;
|
|
39
|
-
text?: string | undefined;
|
|
40
|
-
timestamp?: number | undefined;
|
|
41
41
|
} | undefined;
|
|
42
42
|
error?: z.ZodError | string;
|
|
43
43
|
}>;
|
|
@@ -452,8 +452,8 @@ declare const ads: {
|
|
|
452
452
|
}, z.core.$strip>, z.ZodObject<{
|
|
453
453
|
username: z.ZodOptional<z.ZodString>;
|
|
454
454
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
455
|
-
text: z.
|
|
456
|
-
timestamp: z.
|
|
455
|
+
text: z.ZodString;
|
|
456
|
+
timestamp: z.ZodString;
|
|
457
457
|
}, z.core.$strip>> & {
|
|
458
458
|
process: (input: {
|
|
459
459
|
hash: string;
|
|
@@ -462,10 +462,10 @@ declare const ads: {
|
|
|
462
462
|
hash: string;
|
|
463
463
|
};
|
|
464
464
|
metadata: {
|
|
465
|
+
text: string;
|
|
466
|
+
timestamp: string;
|
|
465
467
|
username?: string | undefined;
|
|
466
468
|
pfpUrl?: string | undefined;
|
|
467
|
-
text?: string | undefined;
|
|
468
|
-
timestamp?: number | undefined;
|
|
469
469
|
} | undefined;
|
|
470
470
|
}>;
|
|
471
471
|
safeProcess: (input: {
|
|
@@ -476,10 +476,10 @@ declare const ads: {
|
|
|
476
476
|
hash: string;
|
|
477
477
|
} | undefined;
|
|
478
478
|
metadata?: {
|
|
479
|
+
text: string;
|
|
480
|
+
timestamp: string;
|
|
479
481
|
username?: string | undefined;
|
|
480
482
|
pfpUrl?: string | undefined;
|
|
481
|
-
text?: string | undefined;
|
|
482
|
-
timestamp?: number | undefined;
|
|
483
483
|
} | undefined;
|
|
484
484
|
error?: z.ZodError | string;
|
|
485
485
|
}>;
|
|
@@ -661,8 +661,8 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
661
661
|
}, z.core.$strip>, z.ZodObject<{
|
|
662
662
|
username: z.ZodOptional<z.ZodString>;
|
|
663
663
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
664
|
-
text: z.
|
|
665
|
-
timestamp: z.
|
|
664
|
+
text: z.ZodString;
|
|
665
|
+
timestamp: z.ZodString;
|
|
666
666
|
}, z.core.$strip>> & {
|
|
667
667
|
process: (input: {
|
|
668
668
|
hash: string;
|
|
@@ -671,10 +671,10 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
671
671
|
hash: string;
|
|
672
672
|
};
|
|
673
673
|
metadata: {
|
|
674
|
+
text: string;
|
|
675
|
+
timestamp: string;
|
|
674
676
|
username?: string | undefined;
|
|
675
677
|
pfpUrl?: string | undefined;
|
|
676
|
-
text?: string | undefined;
|
|
677
|
-
timestamp?: number | undefined;
|
|
678
678
|
} | undefined;
|
|
679
679
|
}>;
|
|
680
680
|
safeProcess: (input: {
|
|
@@ -685,10 +685,10 @@ declare function getAd(type: AdType): (AdDefinition<z.ZodObject<{
|
|
|
685
685
|
hash: string;
|
|
686
686
|
} | undefined;
|
|
687
687
|
metadata?: {
|
|
688
|
+
text: string;
|
|
689
|
+
timestamp: string;
|
|
688
690
|
username?: string | undefined;
|
|
689
691
|
pfpUrl?: string | undefined;
|
|
690
|
-
text?: string | undefined;
|
|
691
|
-
timestamp?: number | undefined;
|
|
692
692
|
} | undefined;
|
|
693
693
|
error?: z.ZodError | string;
|
|
694
694
|
}>;
|
|
@@ -872,8 +872,8 @@ declare const adDefinitions: {
|
|
|
872
872
|
}, z.core.$strip>, z.ZodObject<{
|
|
873
873
|
username: z.ZodOptional<z.ZodString>;
|
|
874
874
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
875
|
-
text: z.
|
|
876
|
-
timestamp: z.
|
|
875
|
+
text: z.ZodString;
|
|
876
|
+
timestamp: z.ZodString;
|
|
877
877
|
}, z.core.$strip>> & {
|
|
878
878
|
process: (input: {
|
|
879
879
|
hash: string;
|
|
@@ -882,10 +882,10 @@ declare const adDefinitions: {
|
|
|
882
882
|
hash: string;
|
|
883
883
|
};
|
|
884
884
|
metadata: {
|
|
885
|
+
text: string;
|
|
886
|
+
timestamp: string;
|
|
885
887
|
username?: string | undefined;
|
|
886
888
|
pfpUrl?: string | undefined;
|
|
887
|
-
text?: string | undefined;
|
|
888
|
-
timestamp?: number | undefined;
|
|
889
889
|
} | undefined;
|
|
890
890
|
}>;
|
|
891
891
|
safeProcess: (input: {
|
|
@@ -896,10 +896,10 @@ declare const adDefinitions: {
|
|
|
896
896
|
hash: string;
|
|
897
897
|
} | undefined;
|
|
898
898
|
metadata?: {
|
|
899
|
+
text: string;
|
|
900
|
+
timestamp: string;
|
|
899
901
|
username?: string | undefined;
|
|
900
902
|
pfpUrl?: string | undefined;
|
|
901
|
-
text?: string | undefined;
|
|
902
|
-
timestamp?: number | undefined;
|
|
903
903
|
} | undefined;
|
|
904
904
|
error?: z.ZodError | string;
|
|
905
905
|
}>;
|
|
@@ -1075,8 +1075,8 @@ declare const adModels: {
|
|
|
1075
1075
|
}, z.core.$strip>, z.ZodObject<{
|
|
1076
1076
|
username: z.ZodOptional<z.ZodString>;
|
|
1077
1077
|
pfpUrl: z.ZodOptional<z.ZodString>;
|
|
1078
|
-
text: z.
|
|
1079
|
-
timestamp: z.
|
|
1078
|
+
text: z.ZodString;
|
|
1079
|
+
timestamp: z.ZodString;
|
|
1080
1080
|
}, z.core.$strip>> & {
|
|
1081
1081
|
process: (input: {
|
|
1082
1082
|
hash: string;
|
|
@@ -1085,10 +1085,10 @@ declare const adModels: {
|
|
|
1085
1085
|
hash: string;
|
|
1086
1086
|
};
|
|
1087
1087
|
metadata: {
|
|
1088
|
+
text: string;
|
|
1089
|
+
timestamp: string;
|
|
1088
1090
|
username?: string | undefined;
|
|
1089
1091
|
pfpUrl?: string | undefined;
|
|
1090
|
-
text?: string | undefined;
|
|
1091
|
-
timestamp?: number | undefined;
|
|
1092
1092
|
} | undefined;
|
|
1093
1093
|
}>;
|
|
1094
1094
|
safeProcess: (input: {
|
|
@@ -1099,10 +1099,10 @@ declare const adModels: {
|
|
|
1099
1099
|
hash: string;
|
|
1100
1100
|
} | undefined;
|
|
1101
1101
|
metadata?: {
|
|
1102
|
+
text: string;
|
|
1103
|
+
timestamp: string;
|
|
1102
1104
|
username?: string | undefined;
|
|
1103
1105
|
pfpUrl?: string | undefined;
|
|
1104
|
-
text?: string | undefined;
|
|
1105
|
-
timestamp?: number | undefined;
|
|
1106
1106
|
} | undefined;
|
|
1107
1107
|
error?: z.ZodError | string;
|
|
1108
1108
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -58,64 +58,59 @@ async function safeProcessAd(ad, input) {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// src/services/adland.api.ts
|
|
61
|
-
var
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
61
|
+
var baseUrl = `${adlandApiUrl}/adland`;
|
|
62
|
+
async function post(url, body) {
|
|
63
|
+
return fetch(url, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
body: JSON.stringify(body)
|
|
66
|
+
}).then((res) => res.json());
|
|
67
|
+
}
|
|
68
|
+
async function get(url) {
|
|
69
|
+
return fetch(url).then((res) => res.json());
|
|
70
|
+
}
|
|
71
|
+
var adlandAPI = {
|
|
72
|
+
verify: {
|
|
73
|
+
cast({ hash }) {
|
|
74
|
+
return post(`${baseUrl}/verify/cast`, { hash });
|
|
75
|
+
},
|
|
76
|
+
miniapp({ domain }) {
|
|
77
|
+
return post(`${baseUrl}/verify/miniapp`, {
|
|
78
|
+
domain
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
profile({ fid }) {
|
|
82
|
+
return post(`${baseUrl}/verify/profile`, { fid });
|
|
83
|
+
},
|
|
84
|
+
token({ address, chainId }) {
|
|
85
|
+
return post(`${baseUrl}/verify/token`, {
|
|
86
|
+
address,
|
|
87
|
+
chainId
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
metadata: {
|
|
92
|
+
cast({ hash }) {
|
|
93
|
+
return get(`${baseUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);
|
|
94
|
+
},
|
|
95
|
+
miniapp({ url }) {
|
|
96
|
+
return get(`${baseUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);
|
|
97
|
+
},
|
|
98
|
+
link({ url }) {
|
|
99
|
+
return get(`${baseUrl}/metadata/link?url=${encodeURIComponent(url)}`);
|
|
100
|
+
},
|
|
101
|
+
profile({ fid }) {
|
|
102
|
+
return get(`${baseUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);
|
|
103
|
+
},
|
|
104
|
+
token({
|
|
96
105
|
address,
|
|
97
106
|
chainId
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}) {
|
|
104
|
-
return this.get(
|
|
105
|
-
`${adlandApiUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
async post(url, body) {
|
|
109
|
-
return fetch(url, {
|
|
110
|
-
method: "POST",
|
|
111
|
-
body: JSON.stringify(body)
|
|
112
|
-
}).then((res) => res.json());
|
|
113
|
-
}
|
|
114
|
-
async get(url) {
|
|
115
|
-
return fetch(url).then((res) => res.json());
|
|
107
|
+
}) {
|
|
108
|
+
return get(
|
|
109
|
+
`${baseUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
116
112
|
}
|
|
117
113
|
};
|
|
118
|
-
var adlandAPI = new AdlandAPI();
|
|
119
114
|
|
|
120
115
|
// src/ads/cast.ts
|
|
121
116
|
var castAd = defineAd({
|
|
@@ -126,23 +121,23 @@ var castAd = defineAd({
|
|
|
126
121
|
metadata: z.object({
|
|
127
122
|
username: z.string().optional(),
|
|
128
123
|
pfpUrl: z.string().optional(),
|
|
129
|
-
text: z.string()
|
|
130
|
-
timestamp: z.
|
|
124
|
+
text: z.string(),
|
|
125
|
+
timestamp: z.string()
|
|
131
126
|
}),
|
|
132
127
|
async verify({ hash }) {
|
|
133
128
|
if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {
|
|
134
129
|
throw new Error("Invalid Farcaster cast hash");
|
|
135
130
|
}
|
|
136
|
-
const res = await adlandAPI.
|
|
131
|
+
const res = await adlandAPI.verify.cast({ hash });
|
|
137
132
|
if (!res.verified) {
|
|
138
133
|
throw new Error("Cast hash verification failed");
|
|
139
134
|
}
|
|
140
135
|
},
|
|
141
136
|
async getMetadata({ hash }) {
|
|
142
|
-
const cast = await adlandAPI.
|
|
137
|
+
const { cast } = await adlandAPI.metadata.cast({ hash });
|
|
143
138
|
return {
|
|
144
|
-
username: cast.username,
|
|
145
|
-
pfpUrl: cast.
|
|
139
|
+
username: cast.author.username,
|
|
140
|
+
pfpUrl: cast.author.pfp_url,
|
|
146
141
|
text: cast.text,
|
|
147
142
|
timestamp: cast.timestamp
|
|
148
143
|
};
|
|
@@ -165,7 +160,7 @@ var linkAd = defineAd({
|
|
|
165
160
|
}
|
|
166
161
|
},
|
|
167
162
|
async getMetadata({ url }) {
|
|
168
|
-
const metadata = await adlandAPI.
|
|
163
|
+
const metadata = await adlandAPI.metadata.link({ url });
|
|
169
164
|
return {
|
|
170
165
|
title: metadata.title,
|
|
171
166
|
description: metadata.description,
|
|
@@ -192,14 +187,14 @@ var miniappAd = defineAd({
|
|
|
192
187
|
if (!domain) {
|
|
193
188
|
throw new Error(errorMessage);
|
|
194
189
|
}
|
|
195
|
-
const res = await adlandAPI.
|
|
190
|
+
const res = await adlandAPI.verify.miniapp({ domain });
|
|
196
191
|
console.log("verifyMiniapp:res", res);
|
|
197
192
|
if (!res.verified) {
|
|
198
193
|
throw new Error(errorMessage);
|
|
199
194
|
}
|
|
200
195
|
},
|
|
201
196
|
async getMetadata({ url }) {
|
|
202
|
-
const res = await adlandAPI.
|
|
197
|
+
const res = await adlandAPI.metadata.miniapp({ url });
|
|
203
198
|
console.log("getMetadata:res", res);
|
|
204
199
|
return {
|
|
205
200
|
icon: res.icon,
|
|
@@ -225,13 +220,13 @@ var tokenAd = defineAd({
|
|
|
225
220
|
logoURI: z.string().optional()
|
|
226
221
|
}),
|
|
227
222
|
async verify({ address, chainId }) {
|
|
228
|
-
const res = await adlandAPI.
|
|
223
|
+
const res = await adlandAPI.verify.token({ address, chainId });
|
|
229
224
|
if (!res.verified) {
|
|
230
225
|
throw new Error("Token verification failed");
|
|
231
226
|
}
|
|
232
227
|
},
|
|
233
228
|
async getMetadata({ address, chainId }) {
|
|
234
|
-
const token = await adlandAPI.
|
|
229
|
+
const token = await adlandAPI.metadata.token({ address, chainId });
|
|
235
230
|
return {
|
|
236
231
|
name: token.name,
|
|
237
232
|
symbol: token.symbol,
|
|
@@ -255,13 +250,13 @@ var farcasterProfileAd = defineAd({
|
|
|
255
250
|
pro: z.boolean().optional()
|
|
256
251
|
}),
|
|
257
252
|
async verify({ fid }) {
|
|
258
|
-
const res = await adlandAPI.
|
|
253
|
+
const res = await adlandAPI.verify.profile({ fid });
|
|
259
254
|
if (!res.verified) {
|
|
260
255
|
throw new Error("Farcaster profile verification failed");
|
|
261
256
|
}
|
|
262
257
|
},
|
|
263
258
|
async getMetadata({ fid }) {
|
|
264
|
-
const res = await adlandAPI.
|
|
259
|
+
const res = await adlandAPI.metadata.profile({ fid });
|
|
265
260
|
return {
|
|
266
261
|
pfpUrl: res.pfpUrl,
|
|
267
262
|
bio: res.bio,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/ads/token.ts","../src/ads/profile.ts","../src/farcaster.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.0xslots.org\";\n\nexport const debug = true;\n","import type { z } from \"zod\";\nimport { debug } from \"../constants\";\n\nexport type FieldChoice<T> = { label: string; value: T };\n\n/**\n * Attach a list of allowed choices to any Zod schema as metadata.\n * The underlying schema and its validation are unchanged — this only\n * annotates the field so that form builders can render a <select>.\n */\nexport function withChoices<T extends z.ZodTypeAny>(\n schema: T,\n choices: ReadonlyArray<FieldChoice<z.infer<T>>>,\n): T & { choices: ReadonlyArray<FieldChoice<z.infer<T>>> } {\n return Object.assign(schema, { choices });\n}\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\n\nclass AdlandAPI {\n constructor() {}\n\n async verifyCast({ hash }: { hash: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/cast`, {\n hash,\n });\n }\n\n async verifyMiniapp({ domain }: { domain: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/miniapp`, {\n domain,\n });\n }\n\n async getMiniappMetadata({ url }: { url: string }): Promise<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }> {\n return this.get<{\n title: string;\n icon: string;\n description: string;\n imageUrl: string;\n }>(`${adlandApiUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n }\n\n async getLinkMetadata({ url }: { url: string }): Promise<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }> {\n return this.get<{\n title: string;\n description: string;\n image: string;\n icon: string;\n }>(`${adlandApiUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n }\n\n async getCastMetadata({ hash }: { hash: string }): Promise<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }> {\n return this.get<{\n username: string;\n pfpUrl: string;\n text: string;\n timestamp: number;\n }>(`${adlandApiUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n }\n\n async verifyFarcasterProfile({ fid }: { fid: string }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/profile`, {\n fid,\n });\n }\n\n async getFarcasterProfile({ fid }: { fid: string }): Promise<{\n pfpUrl: string;\n bio: string;\n username: string;\n displayName?: string;\n followers: number;\n following: number;\n pro: boolean;\n }> {\n return this.get<{\n pfpUrl: string;\n bio: string;\n username: string;\n displayName?: string;\n followers: number;\n following: number;\n pro: boolean;\n }>(`${adlandApiUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);\n }\n\n async verifyToken({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }) {\n return this.post<{ verified: boolean }>(`${adlandApiUrl}/verify/token`, {\n address,\n chainId,\n });\n }\n\n async getTokenMetadata({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }): Promise<{\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n }> {\n return this.get<{\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n }>(\n `${adlandApiUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`,\n );\n }\n\n private async post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n }\n\n private async get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n }\n}\n\nexport const adlandAPI = new AdlandAPI();\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string().optional(),\n timestamp: z.number().optional(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verifyCast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const cast = await adlandAPI.getCastMetadata({ hash });\n return {\n username: cast.username,\n pfpUrl: cast.pfpUrl,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.getLinkMetadata({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verifyMiniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.getMiniappMetadata({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd, withChoices } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const tokenAd = defineAd({\n type: \"token\",\n data: z.object({\n address: z.string().nonempty(\"Address is required\"),\n chainId: withChoices(\n z\n .number()\n .int()\n .positive(\"Chain ID is required\")\n .refine((chainId) => [8453].includes(chainId), \"Invalid chain ID\"),\n [{ label: \"Base (8453)\", value: 8453 }],\n ),\n }),\n metadata: z.object({\n name: z.string().optional(),\n symbol: z.string().optional(),\n decimals: z.number().optional(),\n logoURI: z.string().optional(),\n }),\n async verify({ address, chainId }) {\n const res = await adlandAPI.verifyToken({ address, chainId });\n if (!res.verified) {\n throw new Error(\"Token verification failed\");\n }\n },\n async getMetadata({ address, chainId }) {\n const token = await adlandAPI.getTokenMetadata({ address, chainId });\n return {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n };\n },\n});\n\nexport type TokenAdData = z.infer<typeof tokenAd.data>;\nexport type TokenAdMetadata = z.infer<NonNullable<typeof tokenAd.metadata>>;\nexport type TokenAd = {\n type: \"token\";\n data: TokenAdData;\n metadata: TokenAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const farcasterProfileAd = defineAd({\n type: \"farcasterProfile\",\n data: z.object({\n fid: z.string().nonempty(\"Fid is required\"),\n }),\n metadata: z.object({\n pfpUrl: z.string().optional(),\n bio: z.string().optional(),\n username: z.string().optional(),\n displayName: z.string().optional(),\n followers: z.number().optional(),\n following: z.number().optional(),\n pro: z.boolean().optional(),\n }),\n async verify({ fid }) {\n const res = await adlandAPI.verifyFarcasterProfile({ fid });\n if (!res.verified) {\n throw new Error(\"Farcaster profile verification failed\");\n }\n },\n async getMetadata({ fid }) {\n const res = await adlandAPI.getFarcasterProfile({ fid });\n return {\n pfpUrl: res.pfpUrl,\n bio: res.bio,\n username: res.username,\n displayName: res.displayName,\n followers: res.followers,\n following: res.following,\n pro: res.pro,\n };\n },\n});\n\nexport type FarcasterProfileAdData = z.infer<typeof farcasterProfileAd.data>;\nexport type FarcasterProfileAdMetadata = z.infer<\n NonNullable<typeof farcasterProfileAd.metadata>\n>;\nexport type FarcasterProfileAd = {\n type: \"farcasterProfile\";\n data: FarcasterProfileAdData;\n metadata: FarcasterProfileAdMetadata;\n};\n","import { Manifest } from \"@farcaster/miniapp-sdk\";\n\n/**\n * Utility functions to parse accountAssociation from Mini App manifest\n *\n * The accountAssociation is a JSON Farcaster Signature (JFS) that contains:\n * - header: base64url encoded JSON with FID, type, and key (address)\n * - payload: base64url encoded JSON with domain\n * - signature: base64url encoded signature\n */\n\ninterface AccountAssociationHeader {\n fid: number;\n type: \"custody\" | \"auth\";\n key: string; // The address (e.g., \"0x...\")\n}\n\ninterface AccountAssociationPayload {\n domain: string;\n}\n\ninterface AccountAssociation {\n header: string; // base64url encoded\n payload: string; // base64url encoded\n signature: string; // base64url encoded\n}\n\nexport interface ParsedAccountAssociation {\n fid: number;\n address: string; // Ethereum address (0x...)\n type: \"custody\" | \"auth\";\n domain: string;\n}\n\n/**\n * Decode base64url encoded string to JSON object\n */\nfunction decodeBase64Url<T>(encoded: string): T {\n // Replace URL-safe characters with standard base64 characters\n let base64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n // Node.js environment\n const decoded = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded) as T;\n}\n\n/**\n * Parse accountAssociation to extract FID and address\n *\n * @param accountAssociation - The accountAssociation object from manifest\n * @returns Parsed object with FID, address, type, and domain\n */\nexport function parseAccountAssociation(\n accountAssociation: AccountAssociation,\n): ParsedAccountAssociation {\n try {\n // Decode the header to get FID, type, and key (address)\n const header: AccountAssociationHeader = decodeBase64Url(\n accountAssociation.header,\n );\n\n // Decode the payload to get domain\n const payload: AccountAssociationPayload = decodeBase64Url(\n accountAssociation.payload,\n );\n\n return {\n fid: header.fid,\n address: header.key, // The key is the Ethereum address\n type: header.type,\n domain: payload.domain,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Fetch and parse accountAssociation from a manifest URL\n *\n * @param manifestUrl - URL to the manifest (e.g., \"https://example.com/.well-known/farcaster.json\")\n * @returns Parsed accountAssociation\n */\nexport async function fetchAndParseAccountAssociation(\n manifestUrl: string,\n): Promise<ParsedAccountAssociation> {\n try {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch manifest: ${response.status} ${response.statusText}`,\n );\n }\n\n const manifest = (await response.json()) as any;\n\n if (!manifest.accountAssociation) {\n throw new Error(\"Manifest does not contain accountAssociation\");\n }\n\n return parseAccountAssociation(manifest.accountAssociation);\n } catch (error) {\n throw new Error(\n `Failed to fetch and parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport class FarcasterAPI {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async getDomainManifest(domain: string) {\n const response = await fetch(\n `https://client.farcaster.xyz/v1/domain-manifest?domain=${domain}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch domain manifest: ${response.status} ${response.statusText}`,\n );\n }\n const data = (await response.json()) as {\n result: {\n state: {\n verified: boolean;\n updatedAt: number; // timestamp\n manifest: string;\n };\n };\n };\n\n console.log(\"FarcasterAPI:data\", data);\n\n return {\n ...data.result.state,\n manifest: JSON.parse(data.result.state.manifest) as Manifest.Manifest,\n };\n }\n}\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\nimport type { TokenAd } from \"./ads/token\";\nimport type { FarcasterProfileAd } from \"./ads/profile\";\nimport { tokenAd } from \"./ads/token\";\nimport { farcasterProfileAd } from \"./ads/profile\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd | TokenAd | FarcasterProfileAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n token: tokenAd,\n farcasterProfile: farcasterProfileAd,\n} as const;\n\nexport const adTypes = [\n \"link\",\n \"cast\",\n \"miniapp\",\n \"token\",\n \"farcasterProfile\",\n] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Export constants\nexport { adlandApiUrl } from \"./constants\";\n\n// Export Farcaster utilities\nexport * from \"./farcaster\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/core/ad-definition.ts","../src/services/adland.api.ts","../src/ads/cast.ts","../src/ads/link.ts","../src/ads/miniapp.ts","../src/ads/token.ts","../src/ads/profile.ts","../src/farcaster.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["export const adlandApiUrl =\n process.env.NODE_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://api.0xslots.org\";\n\nexport const debug = true;\n","import type { z } from \"zod\";\nimport { debug } from \"../constants\";\n\nexport type FieldChoice<T> = { label: string; value: T };\n\n/**\n * Attach a list of allowed choices to any Zod schema as metadata.\n * The underlying schema and its validation are unchanged — this only\n * annotates the field so that form builders can render a <select>.\n */\nexport function withChoices<T extends z.ZodTypeAny>(\n schema: T,\n choices: ReadonlyArray<FieldChoice<z.infer<T>>>,\n): T & { choices: ReadonlyArray<FieldChoice<z.infer<T>>> } {\n return Object.assign(schema, { choices });\n}\n\n/**\n * Ad Definition type\n * Represents a data contract + behavior for an ad type\n */\nexport type AdDefinition<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined = undefined,\n> = {\n /**\n * The literal type string for this ad (e.g., \"cast\", \"link\")\n */\n type: string;\n\n /**\n * The Zod schema for the ad's data field\n */\n data: TData;\n\n /**\n * Optional Zod schema for the ad's metadata field\n */\n metadata?: TMetadata;\n\n /**\n * Optional verification function that runs after parsing\n * Receives already-validated data\n */\n verify?: (data: z.infer<TData>) => Promise<void>;\n\n /**\n * Optional metadata enrichment function\n * Only available if metadata schema is defined\n */\n getMetadata?: (\n data: z.infer<TData>,\n ) => Promise<TMetadata extends z.ZodTypeAny ? z.infer<TMetadata> : never>;\n};\n\n/**\n * Typed helper to define an ad\n * Locks type inference and prevents widening\n * Adds a `process` method for convenience\n * @param def - Ad definition object\n * @returns The same definition with proper types and a process method\n */\nexport function defineAd<\n const TData extends z.ZodTypeAny,\n const TMetadata extends z.ZodTypeAny | undefined,\n>(\n def: AdDefinition<TData, TMetadata>,\n): AdDefinition<TData, TMetadata> & {\n /**\n * Process this ad through the full pipeline: parse → verify → getMetadata\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\n process: (input: z.infer<TData>) => Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n }>;\n /**\n * Safe version of process that returns a result object\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\n safeProcess: (input: z.infer<TData>) => Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n }>;\n} {\n return {\n ...def,\n process: (input: z.infer<TData>) => processAd(def, input),\n safeProcess: (input: z.infer<TData>) => safeProcessAd(def, input),\n };\n}\n\n/**\n * Process an ad through the full pipeline: parse → verify → getMetadata\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Processed data and optional metadata\n */\nexport async function processAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: z.infer<TData>,\n): Promise<{\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n}> {\n if (debug) {\n console.log(\"processAd:input\", input);\n }\n // Parse and validate\n const data: z.infer<TData> = ad.data.parse(input);\n\n if (debug) {\n console.log(\"processAd:data\", data);\n }\n\n // Verify if function is provided\n if (ad.verify) {\n await ad.verify(input);\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return { data, metadata, type: ad.type } as {\n type: string;\n data: z.infer<TData>;\n metadata: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n };\n}\n\n/**\n * Safe version of processAd that returns a result object\n * @param ad - Ad definition\n * @param input - Raw input data to process\n * @returns Result object with success flag and data or error\n */\nexport async function safeProcessAd<\n TData extends z.ZodTypeAny,\n TMetadata extends z.ZodTypeAny | undefined,\n>(\n ad: AdDefinition<TData, TMetadata>,\n input: unknown,\n): Promise<{\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n}> {\n // Safe parse\n const parseResult = ad.data.safeParse(input);\n if (!parseResult.success) {\n return {\n success: false,\n error: parseResult.error,\n };\n }\n\n const data: z.infer<TData> = parseResult.data;\n\n // Verify if function is provided\n if (ad.verify) {\n try {\n await ad.verify(data);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Verification failed\",\n };\n }\n }\n\n // Get metadata if function and schema are provided\n const metadata =\n ad.getMetadata && ad.metadata ? await ad.getMetadata(data) : undefined;\n\n return {\n success: true,\n data,\n metadata,\n } as {\n success: boolean;\n data?: z.infer<TData>;\n metadata?: TMetadata extends z.ZodTypeAny\n ? TMetadata extends undefined\n ? undefined\n : z.infer<TMetadata> | undefined\n : undefined;\n error?: z.ZodError | string;\n };\n}\n","import { adlandApiUrl } from \"../constants\";\nimport type {\n CastMetadata,\n LinkMetadata,\n MiniappMetadata,\n ProfileMetadata,\n TokenMetadata,\n} from \"../types\";\n\nconst baseUrl = `${adlandApiUrl}/adland`;\n\nasync function post<T>(url: string, body: object): Promise<T> {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n }).then((res) => res.json()) as T;\n}\n\nasync function get<T>(url: string): Promise<T> {\n return fetch(url).then((res) => res.json()) as T;\n}\n\nexport const adlandAPI = {\n verify: {\n cast({ hash }: { hash: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/cast`, { hash });\n },\n\n miniapp({ domain }: { domain: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/miniapp`, {\n domain,\n });\n },\n\n profile({ fid }: { fid: string }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/profile`, { fid });\n },\n\n token({ address, chainId }: { address: string; chainId: number }) {\n return post<{ verified: boolean }>(`${baseUrl}/verify/token`, {\n address,\n chainId,\n });\n },\n },\n\n metadata: {\n cast({ hash }: { hash: string }): Promise<CastMetadata> {\n return get(`${baseUrl}/metadata/cast?hash=${encodeURIComponent(hash)}`);\n },\n\n miniapp({ url }: { url: string }): Promise<MiniappMetadata> {\n return get(`${baseUrl}/metadata/miniapp?url=${encodeURIComponent(url)}`);\n },\n\n link({ url }: { url: string }): Promise<LinkMetadata> {\n return get(`${baseUrl}/metadata/link?url=${encodeURIComponent(url)}`);\n },\n\n profile({ fid }: { fid: string }): Promise<ProfileMetadata> {\n return get(`${baseUrl}/metadata/profile?fid=${encodeURIComponent(fid)}`);\n },\n\n token({\n address,\n chainId,\n }: {\n address: string;\n chainId: number;\n }): Promise<TokenMetadata> {\n return get(\n `${baseUrl}/metadata/token?address=${encodeURIComponent(address)}&chainId=${chainId}`,\n );\n },\n },\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Cast Ad Definition\n * Represents a Farcaster cast ad with validation and verification\n */\nexport const castAd = defineAd({\n type: \"cast\",\n data: z.object({\n hash: z.string().nonempty(\"Hash is required\"),\n }),\n metadata: z.object({\n username: z.string().optional(),\n pfpUrl: z.string().optional(),\n text: z.string(),\n timestamp: z.string(),\n }),\n async verify({ hash }) {\n if (!/^0x[0-9a-fA-F]{40}$/.test(hash)) {\n throw new Error(\"Invalid Farcaster cast hash\");\n }\n\n const res = await adlandAPI.verify.cast({ hash });\n if (!res.verified) {\n throw new Error(\"Cast hash verification failed\");\n }\n },\n async getMetadata({ hash }) {\n const { cast } = await adlandAPI.metadata.cast({ hash });\n return {\n username: cast.author.username,\n pfpUrl: cast.author.pfp_url,\n text: cast.text,\n timestamp: cast.timestamp,\n };\n },\n});\n\n/**\n * Type inference for CastAd data\n */\nexport type CastAdData = z.infer<typeof castAd.data>;\n\n/**\n * Type inference for CastAd metadata\n */\nexport type CastAdMetadata = z.infer<NonNullable<typeof castAd.metadata>>;\n\nexport type CastAd = {\n type: \"cast\";\n data: CastAdData;\n metadata: CastAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * Link Ad Definition\n * Represents a basic link ad with validation and verification\n */\nexport const linkAd = defineAd({\n type: \"link\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n image: z.string().optional(),\n icon: z.string().optional(),\n }),\n async verify({ url }) {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"Invalid link\");\n }\n },\n async getMetadata({ url }) {\n const metadata = await adlandAPI.metadata.link({ url });\n return {\n title: metadata.title,\n description: metadata.description,\n image: metadata.image,\n icon: metadata.icon,\n };\n },\n});\n\n/**\n * Type inference for LinkAd data\n */\nexport type LinkAdData = z.infer<typeof linkAd.data>;\n\n/**\n * Type inference for LinkAd metadata\n */\nexport type LinkAdMetadata = z.infer<NonNullable<typeof linkAd.metadata>>;\n\nexport type LinkAd = {\n type: \"link\";\n data: LinkAdData;\n metadata: LinkAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\n/**\n * MiniApp Ad Definition\n * Represents a Farcaster mini app ad with validation and verification\n */\nexport const miniappAd = defineAd({\n type: \"miniapp\",\n\n data: z.object({\n url: z.string().nonempty(\"URL is required\"),\n }),\n\n metadata: z.object({\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n imageUrl: z.string().optional(),\n }),\n\n async verify({ url }) {\n const errorMessage = \"Miniapp domain verification failed\";\n const domain = url.split(\"//\")[1];\n console.log(\"verifyMiniapp:domain\", domain);\n if (!domain) {\n throw new Error(errorMessage);\n }\n const res = await adlandAPI.verify.miniapp({ domain });\n console.log(\"verifyMiniapp:res\", res);\n if (!res.verified) {\n throw new Error(errorMessage);\n }\n },\n async getMetadata({ url }) {\n const res = await adlandAPI.metadata.miniapp({ url });\n console.log(\"getMetadata:res\", res);\n return {\n icon: res.icon,\n title: res.title,\n description: res.description,\n imageUrl: res.imageUrl,\n };\n },\n});\n\n/**\n * Type inference for MiniAppAd data\n */\nexport type MiniAppAdData = z.infer<typeof miniappAd.data>;\n\n/**\n * Type inference for MiniAppAd metadata\n */\nexport type MiniAppAdMetadata = z.infer<NonNullable<typeof miniappAd.metadata>>;\n\nexport type MiniAppAd = {\n type: \"miniapp\";\n data: MiniAppAdData;\n metadata: MiniAppAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd, withChoices } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const tokenAd = defineAd({\n type: \"token\",\n data: z.object({\n address: z.string().nonempty(\"Address is required\"),\n chainId: withChoices(\n z\n .number()\n .int()\n .positive(\"Chain ID is required\")\n .refine((chainId) => [8453].includes(chainId), \"Invalid chain ID\"),\n [{ label: \"Base (8453)\", value: 8453 }],\n ),\n }),\n metadata: z.object({\n name: z.string().optional(),\n symbol: z.string().optional(),\n decimals: z.number().optional(),\n logoURI: z.string().optional(),\n }),\n async verify({ address, chainId }) {\n const res = await adlandAPI.verify.token({ address, chainId });\n if (!res.verified) {\n throw new Error(\"Token verification failed\");\n }\n },\n async getMetadata({ address, chainId }) {\n const token = await adlandAPI.metadata.token({ address, chainId });\n return {\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n logoURI: token.logoURI,\n };\n },\n});\n\nexport type TokenAdData = z.infer<typeof tokenAd.data>;\nexport type TokenAdMetadata = z.infer<NonNullable<typeof tokenAd.metadata>>;\nexport type TokenAd = {\n type: \"token\";\n data: TokenAdData;\n metadata: TokenAdMetadata;\n};\n","import { z } from \"zod\";\nimport { defineAd } from \"../core/ad-definition\";\nimport { adlandAPI } from \"../services/adland.api\";\n\nexport const farcasterProfileAd = defineAd({\n type: \"farcasterProfile\",\n data: z.object({\n fid: z.string().nonempty(\"Fid is required\"),\n }),\n metadata: z.object({\n pfpUrl: z.string().optional(),\n bio: z.string().optional(),\n username: z.string().optional(),\n displayName: z.string().optional(),\n followers: z.number().optional(),\n following: z.number().optional(),\n pro: z.boolean().optional(),\n }),\n async verify({ fid }) {\n const res = await adlandAPI.verify.profile({ fid });\n if (!res.verified) {\n throw new Error(\"Farcaster profile verification failed\");\n }\n },\n async getMetadata({ fid }) {\n const res = await adlandAPI.metadata.profile({ fid });\n return {\n pfpUrl: res.pfpUrl,\n bio: res.bio,\n username: res.username,\n displayName: res.displayName,\n followers: res.followers,\n following: res.following,\n pro: res.pro,\n };\n },\n});\n\nexport type FarcasterProfileAdData = z.infer<typeof farcasterProfileAd.data>;\nexport type FarcasterProfileAdMetadata = z.infer<\n NonNullable<typeof farcasterProfileAd.metadata>\n>;\nexport type FarcasterProfileAd = {\n type: \"farcasterProfile\";\n data: FarcasterProfileAdData;\n metadata: FarcasterProfileAdMetadata;\n};\n","import { Manifest } from \"@farcaster/miniapp-sdk\";\n\n/**\n * Utility functions to parse accountAssociation from Mini App manifest\n *\n * The accountAssociation is a JSON Farcaster Signature (JFS) that contains:\n * - header: base64url encoded JSON with FID, type, and key (address)\n * - payload: base64url encoded JSON with domain\n * - signature: base64url encoded signature\n */\n\ninterface AccountAssociationHeader {\n fid: number;\n type: \"custody\" | \"auth\";\n key: string; // The address (e.g., \"0x...\")\n}\n\ninterface AccountAssociationPayload {\n domain: string;\n}\n\ninterface AccountAssociation {\n header: string; // base64url encoded\n payload: string; // base64url encoded\n signature: string; // base64url encoded\n}\n\nexport interface ParsedAccountAssociation {\n fid: number;\n address: string; // Ethereum address (0x...)\n type: \"custody\" | \"auth\";\n domain: string;\n}\n\n/**\n * Decode base64url encoded string to JSON object\n */\nfunction decodeBase64Url<T>(encoded: string): T {\n // Replace URL-safe characters with standard base64 characters\n let base64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n // Node.js environment\n const decoded = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded) as T;\n}\n\n/**\n * Parse accountAssociation to extract FID and address\n *\n * @param accountAssociation - The accountAssociation object from manifest\n * @returns Parsed object with FID, address, type, and domain\n */\nexport function parseAccountAssociation(\n accountAssociation: AccountAssociation,\n): ParsedAccountAssociation {\n try {\n // Decode the header to get FID, type, and key (address)\n const header: AccountAssociationHeader = decodeBase64Url(\n accountAssociation.header,\n );\n\n // Decode the payload to get domain\n const payload: AccountAssociationPayload = decodeBase64Url(\n accountAssociation.payload,\n );\n\n return {\n fid: header.fid,\n address: header.key, // The key is the Ethereum address\n type: header.type,\n domain: payload.domain,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Fetch and parse accountAssociation from a manifest URL\n *\n * @param manifestUrl - URL to the manifest (e.g., \"https://example.com/.well-known/farcaster.json\")\n * @returns Parsed accountAssociation\n */\nexport async function fetchAndParseAccountAssociation(\n manifestUrl: string,\n): Promise<ParsedAccountAssociation> {\n try {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch manifest: ${response.status} ${response.statusText}`,\n );\n }\n\n const manifest = (await response.json()) as any;\n\n if (!manifest.accountAssociation) {\n throw new Error(\"Manifest does not contain accountAssociation\");\n }\n\n return parseAccountAssociation(manifest.accountAssociation);\n } catch (error) {\n throw new Error(\n `Failed to fetch and parse accountAssociation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport class FarcasterAPI {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async getDomainManifest(domain: string) {\n const response = await fetch(\n `https://client.farcaster.xyz/v1/domain-manifest?domain=${domain}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch domain manifest: ${response.status} ${response.statusText}`,\n );\n }\n const data = (await response.json()) as {\n result: {\n state: {\n verified: boolean;\n updatedAt: number; // timestamp\n manifest: string;\n };\n };\n };\n\n console.log(\"FarcasterAPI:data\", data);\n\n return {\n ...data.result.state,\n manifest: JSON.parse(data.result.state.manifest) as Manifest.Manifest,\n };\n }\n}\n","import { z } from \"zod\";\nimport { castAd } from \"./ads/cast\";\nimport { linkAd } from \"./ads/link\";\nimport { miniappAd } from \"./ads/miniapp\";\nimport { tokenAd } from \"./ads/token\";\nimport { farcasterProfileAd } from \"./ads/profile\";\nimport type { CastAd } from \"./ads/cast\";\nimport type { LinkAd } from \"./ads/link\";\nimport type { MiniAppAd } from \"./ads/miniapp\";\nimport type { TokenAd } from \"./ads/token\";\nimport type { FarcasterProfileAd } from \"./ads/profile\";\n\n/**\n * Union type for all complete ad structures with type, data, and optional metadata\n */\nexport type AdData = CastAd | LinkAd | MiniAppAd | TokenAd | FarcasterProfileAd;\n\n/**\n * Registry of all ad definitions\n * Each entry is an AdDefinition object\n */\nexport const ads = {\n link: linkAd,\n cast: castAd,\n miniapp: miniappAd,\n token: tokenAd,\n farcasterProfile: farcasterProfileAd,\n} as const;\n\nexport const adTypes = [\n \"link\",\n \"cast\",\n \"miniapp\",\n \"token\",\n \"farcasterProfile\",\n] as const;\n\n/**\n * Type for ad definition keys\n */\nexport type AdType = keyof typeof ads;\n\n/**\n * Get ad definition by type\n */\nexport function getAd(type: AdType) {\n return ads[type];\n}\n/**\n * Validate ad data against any ad definition\n */\nexport function validateAdData(data: any): {\n success: boolean;\n data?: {\n type: AdType;\n data: unknown;\n };\n error?: z.ZodError | string;\n} {\n const dataType = data.type;\n if (!dataType || !adTypes.includes(dataType)) {\n return {\n success: false,\n error: \"Data does not match any known ad type\",\n };\n }\n const ad = getAd(data.type);\n\n const result = ad.data.safeParse(data.data);\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n };\n }\n\n return {\n success: true,\n data: {\n type: dataType,\n data: result.data,\n },\n };\n}\n\n// Export all ad definitions\nexport * from \"./ads\";\n\n// Export core utilities\nexport * from \"./core/ad-definition\";\n\n// Export constants\nexport { adlandApiUrl } from \"./constants\";\n\n// Export Farcaster utilities\nexport * from \"./farcaster\";\n\n// Backward compatibility aliases\nexport const adDefinitions = ads;\nexport const adModels = ads;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adland/data",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"CHANGELOG.md"
|
|
24
24
|
],
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"
|
|
26
|
+
"@farcaster/miniapp-sdk": "latest",
|
|
27
27
|
"tsup": "^8.0.1",
|
|
28
|
-
"
|
|
28
|
+
"zod": "4.1.12"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^20",
|