@adspacedotfun/sdk 0.1.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.
Files changed (64) hide show
  1. package/README.md +52 -0
  2. package/dist/campaign-8I-L9KNW.js +319 -0
  3. package/dist/campaign-8I-L9KNW.js.map +1 -0
  4. package/dist/campaign-D-02mKGw.cjs +2 -0
  5. package/dist/campaign-D-02mKGw.cjs.map +1 -0
  6. package/dist/core/client.d.ts +63 -0
  7. package/dist/core/client.d.ts.map +1 -0
  8. package/dist/core/config.d.ts +57 -0
  9. package/dist/core/config.d.ts.map +1 -0
  10. package/dist/core/contracts.d.ts +167 -0
  11. package/dist/core/contracts.d.ts.map +1 -0
  12. package/dist/core/index.d.ts +8 -0
  13. package/dist/core/index.d.ts.map +1 -0
  14. package/dist/core/types.d.ts +89 -0
  15. package/dist/core/types.d.ts.map +1 -0
  16. package/dist/core/utils/campaign.d.ts +22 -0
  17. package/dist/core/utils/campaign.d.ts.map +1 -0
  18. package/dist/core/utils/index.d.ts +3 -0
  19. package/dist/core/utils/index.d.ts.map +1 -0
  20. package/dist/core/utils/ipfs.d.ts +13 -0
  21. package/dist/core/utils/ipfs.d.ts.map +1 -0
  22. package/dist/index.cjs +2 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +18 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/react/components/AdWidget.d.ts +49 -0
  29. package/dist/react/components/AdWidget.d.ts.map +1 -0
  30. package/dist/react/components/index.d.ts +3 -0
  31. package/dist/react/components/index.d.ts.map +1 -0
  32. package/dist/react/context.d.ts +39 -0
  33. package/dist/react/context.d.ts.map +1 -0
  34. package/dist/react/hooks/index.d.ts +3 -0
  35. package/dist/react/hooks/index.d.ts.map +1 -0
  36. package/dist/react/hooks/useActiveAd.d.ts +41 -0
  37. package/dist/react/hooks/useActiveAd.d.ts.map +1 -0
  38. package/dist/react/index.d.ts +7 -0
  39. package/dist/react/index.d.ts.map +1 -0
  40. package/dist/react.cjs +2 -0
  41. package/dist/react.cjs.map +1 -0
  42. package/dist/react.d.ts +8 -0
  43. package/dist/react.d.ts.map +1 -0
  44. package/dist/react.js +167 -0
  45. package/dist/react.js.map +1 -0
  46. package/dist/vue/components/AdWidget.vue.d.ts +41 -0
  47. package/dist/vue/components/AdWidget.vue.d.ts.map +1 -0
  48. package/dist/vue/components/index.d.ts +2 -0
  49. package/dist/vue/components/index.d.ts.map +1 -0
  50. package/dist/vue/composables/index.d.ts +3 -0
  51. package/dist/vue/composables/index.d.ts.map +1 -0
  52. package/dist/vue/composables/useActiveAd.d.ts +38 -0
  53. package/dist/vue/composables/useActiveAd.d.ts.map +1 -0
  54. package/dist/vue/index.d.ts +6 -0
  55. package/dist/vue/index.d.ts.map +1 -0
  56. package/dist/vue/plugin.d.ts +32 -0
  57. package/dist/vue/plugin.d.ts.map +1 -0
  58. package/dist/vue.cjs +2 -0
  59. package/dist/vue.cjs.map +1 -0
  60. package/dist/vue.d.ts +7 -0
  61. package/dist/vue.d.ts.map +1 -0
  62. package/dist/vue.js +140 -0
  63. package/dist/vue.js.map +1 -0
  64. package/package.json +102 -0
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @adspacedotfun/sdk
2
+
3
+ Official SDK for embedding AdSpace.fun blockchain-powered advertisements.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ src/
9
+ ├── index.ts # Main entry (vanilla JS)
10
+ ├── react.ts # React entry
11
+ ├── vue.ts # Vue entry
12
+
13
+ ├── core/ # Framework-agnostic core
14
+ │ ├── client.ts # AdSpaceClient - main SDK class
15
+ │ ├── config.ts # Configuration types & defaults
16
+ │ ├── contracts.ts # Contract ABIs
17
+ │ ├── types.ts # TypeScript interfaces
18
+ │ └── utils/ # IPFS & campaign helpers
19
+
20
+ ├── react/ # React integration
21
+ │ ├── context.tsx # AdSpaceProvider
22
+ │ ├── hooks/ # useActiveAd hook
23
+ │ └── components/ # AdWidget component
24
+
25
+ └── vue/ # Vue integration
26
+ ├── plugin.ts # Vue plugin
27
+ ├── composables/ # useActiveAd composable
28
+ └── components/ # AdWidget component
29
+ ```
30
+
31
+ ## How It Works
32
+
33
+ 1. **AdSpaceClient** connects to the blockchain via JSON-RPC
34
+ 2. Calls `getActiveAdImage(spaceId)` on the AdSpaceManager contract
35
+ 3. Returns active campaign image (or default ad if none active)
36
+ 4. IPFS URLs are resolved to HTTP gateway URLs
37
+ 5. Framework integrations provide auto-refresh polling
38
+
39
+ ## Build
40
+
41
+ ```bash
42
+ npm install
43
+ npm run build
44
+ ```
45
+
46
+ Outputs ESM, CJS, and TypeScript declarations to `dist/`.
47
+
48
+ ## Publish
49
+
50
+ ```bash
51
+ npm publish --access public
52
+ ```
@@ -0,0 +1,319 @@
1
+ import { JsonRpcProvider as d, Contract as u } from "ethers";
2
+ const o = {
3
+ network: {
4
+ chainId: 11155111,
5
+ name: "Sepolia",
6
+ rpcUrl: "https://eth-sepolia.g.alchemy.com/v2/demo",
7
+ explorerUrl: "https://sepolia.etherscan.io"
8
+ },
9
+ contracts: {
10
+ adSpaceManager: "0x40FF408E7cDd96a500463425f72b0829FEd9614c",
11
+ adSpaceNFT: "0x720B7C2B1848dDEAac5702Dd8f52b1405bAFBaC6",
12
+ campaignNFT: "0xb7E3DB342ec0863b2E52242123A10228c9CDB857"
13
+ },
14
+ ipfs: {
15
+ gateway: "https://gateway.pinata.cloud/ipfs/",
16
+ fallbackGateways: [
17
+ "https://ipfs.io/ipfs/",
18
+ "https://cloudflare-ipfs.com/ipfs/",
19
+ "https://dweb.link/ipfs/"
20
+ ]
21
+ },
22
+ refreshInterval: 30,
23
+ debug: !1
24
+ };
25
+ function l(t) {
26
+ var n, e;
27
+ return {
28
+ ...o,
29
+ ...t,
30
+ network: {
31
+ ...o.network,
32
+ ...t.network
33
+ },
34
+ contracts: {
35
+ ...o.contracts,
36
+ ...t.contracts
37
+ },
38
+ ipfs: {
39
+ gateway: ((n = t.ipfs) == null ? void 0 : n.gateway) ?? o.ipfs.gateway,
40
+ fallbackGateways: ((e = t.ipfs) == null ? void 0 : e.fallbackGateways) ?? o.ipfs.fallbackGateways
41
+ }
42
+ };
43
+ }
44
+ const m = [
45
+ {
46
+ inputs: [{ internalType: "uint256", name: "spaceId", type: "uint256" }],
47
+ name: "getActiveAdImage",
48
+ outputs: [
49
+ { internalType: "string", name: "imageLink", type: "string" },
50
+ { internalType: "string", name: "advertiserSiteLink", type: "string" },
51
+ { internalType: "uint256", name: "campaignId", type: "uint256" }
52
+ ],
53
+ stateMutability: "view",
54
+ type: "function"
55
+ },
56
+ {
57
+ inputs: [{ internalType: "uint256", name: "spaceId", type: "uint256" }],
58
+ name: "getAdSpace",
59
+ outputs: [
60
+ {
61
+ components: [
62
+ { internalType: "uint256", name: "id", type: "uint256" },
63
+ { internalType: "uint256", name: "tokenId", type: "uint256" },
64
+ { internalType: "string", name: "dimensions", type: "string" },
65
+ { internalType: "uint256", name: "pricePerHour", type: "uint256" },
66
+ { internalType: "string", name: "siteLink", type: "string" },
67
+ { internalType: "uint256", name: "instalments", type: "uint256" },
68
+ { internalType: "string", name: "defaultAdLink", type: "string" },
69
+ { internalType: "string", name: "adSpaceName", type: "string" },
70
+ { internalType: "address", name: "publisher", type: "address" },
71
+ { internalType: "bool", name: "isActive", type: "bool" }
72
+ ],
73
+ internalType: "struct AdSpaceManager.AdSpace",
74
+ name: "",
75
+ type: "tuple"
76
+ }
77
+ ],
78
+ stateMutability: "view",
79
+ type: "function"
80
+ },
81
+ {
82
+ inputs: [{ internalType: "uint256", name: "campaignId", type: "uint256" }],
83
+ name: "getCampaign",
84
+ outputs: [
85
+ {
86
+ components: [
87
+ { internalType: "uint256", name: "id", type: "uint256" },
88
+ { internalType: "uint256", name: "tokenId", type: "uint256" },
89
+ { internalType: "uint256", name: "spaceId", type: "uint256" },
90
+ { internalType: "uint256", name: "spaceTokenId", type: "uint256" },
91
+ { internalType: "string", name: "imageLink", type: "string" },
92
+ { internalType: "string", name: "advertiserSiteLink", type: "string" },
93
+ { internalType: "string", name: "metadataURI", type: "string" },
94
+ { internalType: "uint256", name: "startTime", type: "uint256" },
95
+ { internalType: "uint256", name: "endTime", type: "uint256" },
96
+ { internalType: "address", name: "tokenAddress", type: "address" },
97
+ { internalType: "uint256", name: "totalAmount", type: "uint256" },
98
+ { internalType: "uint256", name: "amountSettled", type: "uint256" },
99
+ { internalType: "address", name: "advertiser", type: "address" },
100
+ { internalType: "enum AdSpaceManager.CampaignStatus", name: "status", type: "uint8" }
101
+ ],
102
+ internalType: "struct AdSpaceManager.Campaign",
103
+ name: "",
104
+ type: "tuple"
105
+ }
106
+ ],
107
+ stateMutability: "view",
108
+ type: "function"
109
+ },
110
+ {
111
+ inputs: [{ internalType: "uint256", name: "spaceId", type: "uint256" }],
112
+ name: "getSpaceCampaigns",
113
+ outputs: [{ internalType: "uint256[]", name: "", type: "uint256[]" }],
114
+ stateMutability: "view",
115
+ type: "function"
116
+ }
117
+ ], g = "https://gateway.pinata.cloud/ipfs/";
118
+ function y(t, n = g) {
119
+ if (!t || t === "")
120
+ return "";
121
+ if (t.startsWith("http://") || t.startsWith("https://") || t.startsWith("blob:"))
122
+ return t;
123
+ const e = n.endsWith("/") ? n : `${n}/`;
124
+ if (t.startsWith("ipfs://")) {
125
+ const a = t.replace("ipfs://", "");
126
+ return `${e}${a}`;
127
+ }
128
+ return `${e}${t}`;
129
+ }
130
+ function A(t) {
131
+ if (!t) return "";
132
+ if (t.startsWith("ipfs://"))
133
+ return t.replace("ipfs://", "");
134
+ const n = [
135
+ /\/ipfs\/([a-zA-Z0-9]+)/,
136
+ /\.ipfs\.[^/]+\/([a-zA-Z0-9]+)/
137
+ ];
138
+ for (const e of n) {
139
+ const a = t.match(e);
140
+ if (a) return a[1];
141
+ }
142
+ return t;
143
+ }
144
+ function S(t) {
145
+ return t ? t.startsWith("ipfs://") || t.startsWith("Qm") || t.startsWith("bafy") || t.includes("/ipfs/") || t.includes(".ipfs.") : !1;
146
+ }
147
+ class f {
148
+ constructor(n = {}) {
149
+ this.config = l(n), this.provider = new d(this.config.network.rpcUrl), this.managerContract = new u(
150
+ this.config.contracts.adSpaceManager,
151
+ m,
152
+ this.provider
153
+ ), this.config.debug && console.log("[AdSpace SDK] Initialized with config:", this.config);
154
+ }
155
+ /**
156
+ * Get the current configuration
157
+ */
158
+ getConfig() {
159
+ return { ...this.config };
160
+ }
161
+ /**
162
+ * Get the ethers provider instance
163
+ */
164
+ getProvider() {
165
+ return this.provider;
166
+ }
167
+ /**
168
+ * Get the AdSpaceManager contract instance
169
+ */
170
+ getManagerContract() {
171
+ return this.managerContract;
172
+ }
173
+ /**
174
+ * Fetch the active ad for a given space ID
175
+ */
176
+ async getActiveAd(n) {
177
+ var e;
178
+ try {
179
+ this.config.debug && console.log("[AdSpace SDK] Fetching active ad for space:", n);
180
+ const [a, i, s] = await this.managerContract.getActiveAdImage(n);
181
+ if (!a || a === "")
182
+ return this.config.debug && console.log("[AdSpace SDK] No active ad found"), null;
183
+ const c = y(a, (e = this.config.ipfs) == null ? void 0 : e.gateway), p = s.toString();
184
+ return {
185
+ imageLink: a,
186
+ imageUrl: c,
187
+ advertiserSiteLink: i,
188
+ campaignId: p,
189
+ isDefault: p === "0"
190
+ };
191
+ } catch (a) {
192
+ throw this.config.debug && console.error("[AdSpace SDK] Error fetching active ad:", a), a;
193
+ }
194
+ }
195
+ /**
196
+ * Get ad space details by ID
197
+ */
198
+ async getAdSpace(n) {
199
+ try {
200
+ const e = await this.managerContract.getAdSpace(n);
201
+ return !e || !e.id || Number(e.id) === 0 ? null : {
202
+ id: e.id.toString(),
203
+ tokenId: e.tokenId.toString(),
204
+ dimensions: e.dimensions,
205
+ pricePerHour: e.pricePerHour,
206
+ siteLink: e.siteLink,
207
+ instalments: Number(e.instalments),
208
+ defaultAdLink: e.defaultAdLink,
209
+ adSpaceName: e.adSpaceName,
210
+ publisher: e.publisher,
211
+ isActive: e.isActive
212
+ };
213
+ } catch (e) {
214
+ throw this.config.debug && console.error("[AdSpace SDK] Error fetching ad space:", e), e;
215
+ }
216
+ }
217
+ /**
218
+ * Get campaign details by ID
219
+ */
220
+ async getCampaign(n) {
221
+ try {
222
+ const e = await this.managerContract.getCampaign(n);
223
+ return !e || !e.id || Number(e.id) === 0 ? null : {
224
+ id: e.id.toString(),
225
+ tokenId: e.tokenId.toString(),
226
+ spaceId: e.spaceId.toString(),
227
+ spaceTokenId: e.spaceTokenId.toString(),
228
+ imageLink: e.imageLink,
229
+ advertiserSiteLink: e.advertiserSiteLink,
230
+ metadataURI: e.metadataURI,
231
+ startTime: Number(e.startTime),
232
+ endTime: Number(e.endTime),
233
+ tokenAddress: e.tokenAddress,
234
+ totalAmount: e.totalAmount,
235
+ amountSettled: e.amountSettled,
236
+ advertiser: e.advertiser,
237
+ status: Number(e.status)
238
+ };
239
+ } catch (e) {
240
+ throw this.config.debug && console.error("[AdSpace SDK] Error fetching campaign:", e), e;
241
+ }
242
+ }
243
+ /**
244
+ * Get all active ad spaces
245
+ */
246
+ async getAllActiveAdSpaces() {
247
+ const n = [];
248
+ let e = 1, a = 0;
249
+ const i = 10, s = 1e3;
250
+ for (; e <= s && a < i; ) {
251
+ try {
252
+ const c = await this.getAdSpace(e);
253
+ c ? (a = 0, c.isActive && n.push(c)) : a++;
254
+ } catch {
255
+ a++;
256
+ }
257
+ e++;
258
+ }
259
+ return n.sort((c, p) => Number(p.id) - Number(c.id));
260
+ }
261
+ /**
262
+ * Get campaigns for a specific ad space
263
+ */
264
+ async getSpaceCampaigns(n) {
265
+ try {
266
+ return (await this.managerContract.getSpaceCampaigns(n)).map((a) => a.toString());
267
+ } catch (e) {
268
+ throw this.config.debug && console.error("[AdSpace SDK] Error fetching space campaigns:", e), e;
269
+ }
270
+ }
271
+ }
272
+ function T(t) {
273
+ return new f(t);
274
+ }
275
+ var r = /* @__PURE__ */ ((t) => (t[t.Pending = 0] = "Pending", t[t.Approved = 1] = "Approved", t[t.Active = 2] = "Active", t[t.Completed = 3] = "Completed", t[t.Rejected = 4] = "Rejected", t[t.Cancelled = 5] = "Cancelled", t))(r || {});
276
+ function b(t, n, e, a) {
277
+ const i = a || Math.floor(Date.now() / 1e3);
278
+ return t === r.Approved && i >= n && i < e;
279
+ }
280
+ function v(t, n, e, a) {
281
+ const i = a || Math.floor(Date.now() / 1e3);
282
+ return t === r.Approved && i >= n && i < e ? r.Active : t === r.Approved && i >= e ? r.Completed : t;
283
+ }
284
+ function w(t) {
285
+ return {
286
+ [r.Pending]: "Pending",
287
+ [r.Approved]: "Approved",
288
+ [r.Active]: "Active",
289
+ [r.Completed]: "Completed",
290
+ [r.Rejected]: "Rejected",
291
+ [r.Cancelled]: "Cancelled"
292
+ }[t] || "Unknown";
293
+ }
294
+ function k(t, n) {
295
+ const e = n || Math.floor(Date.now() / 1e3);
296
+ return Math.max(0, t - e);
297
+ }
298
+ function I(t) {
299
+ if (t <= 0) return "0s";
300
+ const n = Math.floor(t / 86400), e = Math.floor(t % 86400 / 3600), a = Math.floor(t % 3600 / 60), i = t % 60, s = [];
301
+ return n > 0 && s.push(`${n}d`), e > 0 && s.push(`${e}h`), a > 0 && s.push(`${a}m`), i > 0 && n === 0 && s.push(`${i}s`), s.join(" ") || "0s";
302
+ }
303
+ export {
304
+ m as A,
305
+ r as C,
306
+ o as D,
307
+ f as a,
308
+ l as b,
309
+ T as c,
310
+ k as d,
311
+ A as e,
312
+ I as f,
313
+ w as g,
314
+ v as h,
315
+ b as i,
316
+ S as j,
317
+ y as r
318
+ };
319
+ //# sourceMappingURL=campaign-8I-L9KNW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign-8I-L9KNW.js","sources":["../src/core/config.ts","../src/core/contracts.ts","../src/core/utils/ipfs.ts","../src/core/client.ts","../src/core/types.ts","../src/core/utils/campaign.ts"],"sourcesContent":["/**\n * Network configuration for AdSpace contracts\n */\nexport interface NetworkConfig {\n /** Chain ID (e.g., 11155111 for Sepolia) */\n chainId: number;\n /** Human-readable network name */\n name: string;\n /** RPC endpoint URL */\n rpcUrl: string;\n /** Block explorer URL (optional) */\n explorerUrl?: string;\n}\n\n/**\n * Contract addresses configuration\n */\nexport interface ContractAddresses {\n /** AdSpaceManager contract address */\n adSpaceManager: string;\n /** AdSpaceNFT contract address (optional) */\n adSpaceNFT?: string;\n /** CampaignNFT contract address (optional) */\n campaignNFT?: string;\n}\n\n/**\n * IPFS gateway configuration\n */\nexport interface IPFSConfig {\n /** Primary IPFS gateway URL */\n gateway: string;\n /** Fallback gateways */\n fallbackGateways?: string[];\n}\n\n/**\n * Main SDK configuration\n */\nexport interface AdSpaceConfig {\n /** Network configuration */\n network: NetworkConfig;\n /** Contract addresses */\n contracts: ContractAddresses;\n /** IPFS configuration */\n ipfs?: IPFSConfig;\n /** Auto-refresh interval for ads (in seconds, 0 to disable) */\n refreshInterval?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Default configuration for Sepolia testnet\n */\nexport const DEFAULT_CONFIG: AdSpaceConfig = {\n network: {\n chainId: 11155111,\n name: 'Sepolia',\n rpcUrl: 'https://eth-sepolia.g.alchemy.com/v2/demo',\n explorerUrl: 'https://sepolia.etherscan.io',\n },\n contracts: {\n adSpaceManager: '0x40FF408E7cDd96a500463425f72b0829FEd9614c',\n adSpaceNFT: '0x720B7C2B1848dDEAac5702Dd8f52b1405bAFBaC6',\n campaignNFT: '0xb7E3DB342ec0863b2E52242123A10228c9CDB857',\n },\n ipfs: {\n gateway: 'https://gateway.pinata.cloud/ipfs/',\n fallbackGateways: [\n 'https://ipfs.io/ipfs/',\n 'https://cloudflare-ipfs.com/ipfs/',\n 'https://dweb.link/ipfs/',\n ],\n },\n refreshInterval: 30,\n debug: false,\n};\n\n/**\n * Merges user config with defaults\n */\nexport function createConfig(userConfig: Partial<AdSpaceConfig>): AdSpaceConfig {\n return {\n ...DEFAULT_CONFIG,\n ...userConfig,\n network: {\n ...DEFAULT_CONFIG.network,\n ...userConfig.network,\n },\n contracts: {\n ...DEFAULT_CONFIG.contracts,\n ...userConfig.contracts,\n },\n ipfs: {\n gateway: userConfig.ipfs?.gateway ?? DEFAULT_CONFIG.ipfs!.gateway,\n fallbackGateways: userConfig.ipfs?.fallbackGateways ?? DEFAULT_CONFIG.ipfs!.fallbackGateways,\n },\n };\n}\n","/**\n * ABI for AdSpaceManager contract - only the functions needed for the SDK\n */\nexport const AD_SPACE_MANAGER_ABI = [\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getActiveAdImage',\n outputs: [\n { internalType: 'string', name: 'imageLink', type: 'string' },\n { internalType: 'string', name: 'advertiserSiteLink', type: 'string' },\n { internalType: 'uint256', name: 'campaignId', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getAdSpace',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'id', type: 'uint256' },\n { internalType: 'uint256', name: 'tokenId', type: 'uint256' },\n { internalType: 'string', name: 'dimensions', type: 'string' },\n { internalType: 'uint256', name: 'pricePerHour', type: 'uint256' },\n { internalType: 'string', name: 'siteLink', type: 'string' },\n { internalType: 'uint256', name: 'instalments', type: 'uint256' },\n { internalType: 'string', name: 'defaultAdLink', type: 'string' },\n { internalType: 'string', name: 'adSpaceName', type: 'string' },\n { internalType: 'address', name: 'publisher', type: 'address' },\n { internalType: 'bool', name: 'isActive', type: 'bool' },\n ],\n internalType: 'struct AdSpaceManager.AdSpace',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'campaignId', type: 'uint256' }],\n name: 'getCampaign',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'id', type: 'uint256' },\n { internalType: 'uint256', name: 'tokenId', type: 'uint256' },\n { internalType: 'uint256', name: 'spaceId', type: 'uint256' },\n { internalType: 'uint256', name: 'spaceTokenId', type: 'uint256' },\n { internalType: 'string', name: 'imageLink', type: 'string' },\n { internalType: 'string', name: 'advertiserSiteLink', type: 'string' },\n { internalType: 'string', name: 'metadataURI', type: 'string' },\n { internalType: 'uint256', name: 'startTime', type: 'uint256' },\n { internalType: 'uint256', name: 'endTime', type: 'uint256' },\n { internalType: 'address', name: 'tokenAddress', type: 'address' },\n { internalType: 'uint256', name: 'totalAmount', type: 'uint256' },\n { internalType: 'uint256', name: 'amountSettled', type: 'uint256' },\n { internalType: 'address', name: 'advertiser', type: 'address' },\n { internalType: 'enum AdSpaceManager.CampaignStatus', name: 'status', type: 'uint8' },\n ],\n internalType: 'struct AdSpaceManager.Campaign',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getSpaceCampaigns',\n outputs: [{ internalType: 'uint256[]', name: '', type: 'uint256[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","/**\n * Default IPFS gateway\n */\nconst DEFAULT_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';\n\n/**\n * Resolves an IPFS URI to an HTTP URL\n */\nexport function resolveIPFSUrl(\n ipfsUri: string,\n gateway: string = DEFAULT_GATEWAY\n): string {\n if (!ipfsUri || ipfsUri === '') {\n return '';\n }\n\n // Already an HTTP URL\n if (ipfsUri.startsWith('http://') || ipfsUri.startsWith('https://')) {\n return ipfsUri;\n }\n\n // Blob URL (for local previews)\n if (ipfsUri.startsWith('blob:')) {\n return ipfsUri;\n }\n\n // Ensure gateway ends with /\n const normalizedGateway = gateway.endsWith('/') ? gateway : `${gateway}/`;\n\n // IPFS protocol URL\n if (ipfsUri.startsWith('ipfs://')) {\n const cid = ipfsUri.replace('ipfs://', '');\n return `${normalizedGateway}${cid}`;\n }\n\n // Assume raw CID\n return `${normalizedGateway}${ipfsUri}`;\n}\n\n/**\n * Extracts CID from an IPFS URI or URL\n */\nexport function extractCID(ipfsUri: string): string {\n if (!ipfsUri) return '';\n\n // Remove ipfs:// prefix\n if (ipfsUri.startsWith('ipfs://')) {\n return ipfsUri.replace('ipfs://', '');\n }\n\n // Extract from gateway URL\n const patterns = [\n /\\/ipfs\\/([a-zA-Z0-9]+)/,\n /\\.ipfs\\.[^/]+\\/([a-zA-Z0-9]+)/,\n ];\n\n for (const pattern of patterns) {\n const match = ipfsUri.match(pattern);\n if (match) return match[1];\n }\n\n // Assume it's already a CID\n return ipfsUri;\n}\n\n/**\n * Checks if a string is a valid IPFS reference\n */\nexport function isIPFSReference(value: string): boolean {\n if (!value) return false;\n\n return (\n value.startsWith('ipfs://') ||\n value.startsWith('Qm') ||\n value.startsWith('bafy') ||\n value.includes('/ipfs/') ||\n value.includes('.ipfs.')\n );\n}\n","import { JsonRpcProvider, Contract } from 'ethers';\nimport { AdSpaceConfig, createConfig } from './config';\nimport { AD_SPACE_MANAGER_ABI } from './contracts';\nimport { ActiveAd, AdSpace, Campaign } from './types';\nimport { resolveIPFSUrl } from './utils/ipfs';\n\n/**\n * AdSpace SDK Client\n *\n * Framework-agnostic client for interacting with AdSpace contracts.\n * Use this directly for vanilla JS or as the foundation for framework integrations.\n *\n * @example\n * ```typescript\n * const client = new AdSpaceClient({\n * network: { rpcUrl: 'https://...' },\n * contracts: { adSpaceManager: '0x...' }\n * });\n *\n * const ad = await client.getActiveAd(1);\n * console.log(ad.imageUrl);\n * ```\n */\nexport class AdSpaceClient {\n private config: AdSpaceConfig;\n private provider: JsonRpcProvider;\n private managerContract: Contract;\n\n constructor(config: Partial<AdSpaceConfig> = {}) {\n this.config = createConfig(config);\n this.provider = new JsonRpcProvider(this.config.network.rpcUrl);\n this.managerContract = new Contract(\n this.config.contracts.adSpaceManager,\n AD_SPACE_MANAGER_ABI,\n this.provider\n );\n\n if (this.config.debug) {\n console.log('[AdSpace SDK] Initialized with config:', this.config);\n }\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): AdSpaceConfig {\n return { ...this.config };\n }\n\n /**\n * Get the ethers provider instance\n */\n getProvider(): JsonRpcProvider {\n return this.provider;\n }\n\n /**\n * Get the AdSpaceManager contract instance\n */\n getManagerContract(): Contract {\n return this.managerContract;\n }\n\n /**\n * Fetch the active ad for a given space ID\n */\n async getActiveAd(spaceId: number): Promise<ActiveAd | null> {\n try {\n if (this.config.debug) {\n console.log('[AdSpace SDK] Fetching active ad for space:', spaceId);\n }\n\n const [imageLink, advertiserSiteLink, campaignId] =\n await this.managerContract.getActiveAdImage(spaceId);\n\n if (!imageLink || imageLink === '') {\n if (this.config.debug) {\n console.log('[AdSpace SDK] No active ad found');\n }\n return null;\n }\n\n const imageUrl = resolveIPFSUrl(imageLink, this.config.ipfs?.gateway);\n const campaignIdStr = campaignId.toString();\n\n return {\n imageLink,\n imageUrl,\n advertiserSiteLink,\n campaignId: campaignIdStr,\n isDefault: campaignIdStr === '0',\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching active ad:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get ad space details by ID\n */\n async getAdSpace(spaceId: number): Promise<AdSpace | null> {\n try {\n const result = await this.managerContract.getAdSpace(spaceId);\n\n if (!result || !result.id || Number(result.id) === 0) {\n return null;\n }\n\n return {\n id: result.id.toString(),\n tokenId: result.tokenId.toString(),\n dimensions: result.dimensions,\n pricePerHour: result.pricePerHour,\n siteLink: result.siteLink,\n instalments: Number(result.instalments),\n defaultAdLink: result.defaultAdLink,\n adSpaceName: result.adSpaceName,\n publisher: result.publisher,\n isActive: result.isActive,\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching ad space:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get campaign details by ID\n */\n async getCampaign(campaignId: number): Promise<Campaign | null> {\n try {\n const result = await this.managerContract.getCampaign(campaignId);\n\n if (!result || !result.id || Number(result.id) === 0) {\n return null;\n }\n\n return {\n id: result.id.toString(),\n tokenId: result.tokenId.toString(),\n spaceId: result.spaceId.toString(),\n spaceTokenId: result.spaceTokenId.toString(),\n imageLink: result.imageLink,\n advertiserSiteLink: result.advertiserSiteLink,\n metadataURI: result.metadataURI,\n startTime: Number(result.startTime),\n endTime: Number(result.endTime),\n tokenAddress: result.tokenAddress,\n totalAmount: result.totalAmount,\n amountSettled: result.amountSettled,\n advertiser: result.advertiser,\n status: Number(result.status),\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching campaign:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get all active ad spaces\n */\n async getAllActiveAdSpaces(): Promise<AdSpace[]> {\n const adSpaces: AdSpace[] = [];\n let spaceId = 1;\n let consecutiveEmpty = 0;\n const MAX_CONSECUTIVE_EMPTY = 10;\n const MAX_SPACES = 1000;\n\n while (spaceId <= MAX_SPACES && consecutiveEmpty < MAX_CONSECUTIVE_EMPTY) {\n try {\n const adSpace = await this.getAdSpace(spaceId);\n\n if (!adSpace) {\n consecutiveEmpty++;\n } else {\n consecutiveEmpty = 0;\n if (adSpace.isActive) {\n adSpaces.push(adSpace);\n }\n }\n } catch {\n consecutiveEmpty++;\n }\n spaceId++;\n }\n\n return adSpaces.sort((a, b) => Number(b.id) - Number(a.id));\n }\n\n /**\n * Get campaigns for a specific ad space\n */\n async getSpaceCampaigns(spaceId: number): Promise<string[]> {\n try {\n const campaignIds = await this.managerContract.getSpaceCampaigns(spaceId);\n return campaignIds.map((id: bigint) => id.toString());\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching space campaigns:', error);\n }\n throw error;\n }\n }\n}\n\n/**\n * Create a new AdSpace client instance\n */\nexport function createAdSpaceClient(config?: Partial<AdSpaceConfig>): AdSpaceClient {\n return new AdSpaceClient(config);\n}\n","/**\n * Campaign status enum (matches on-chain enum)\n */\nexport enum CampaignStatus {\n Pending = 0,\n Approved = 1,\n Active = 2,\n Completed = 3,\n Rejected = 4,\n Cancelled = 5,\n}\n\n/**\n * Ad space data structure\n */\nexport interface AdSpace {\n id: string;\n tokenId: string;\n dimensions: string;\n pricePerHour: bigint;\n siteLink: string;\n instalments: number;\n defaultAdLink: string;\n adSpaceName: string;\n publisher: string;\n isActive: boolean;\n}\n\n/**\n * Campaign data structure\n */\nexport interface Campaign {\n id: string;\n tokenId: string;\n spaceId: string;\n spaceTokenId: string;\n imageLink: string;\n advertiserSiteLink: string;\n metadataURI: string;\n startTime: number;\n endTime: number;\n tokenAddress: string;\n totalAmount: bigint;\n amountSettled: bigint;\n advertiser: string;\n status: CampaignStatus;\n}\n\n/**\n * Active ad data returned from getActiveAdImage\n */\nexport interface ActiveAd {\n /** Raw IPFS link */\n imageLink: string;\n /** Resolved HTTP URL */\n imageUrl: string;\n /** Advertiser's website link */\n advertiserSiteLink: string;\n /** Campaign ID (0 if default ad) */\n campaignId: string;\n /** True if showing default ad (no active campaign) */\n isDefault: boolean;\n}\n\n/**\n * Options for fetching active ad\n */\nexport interface FetchActiveAdOptions {\n /** Space ID to fetch ad for */\n spaceId: number;\n /** Custom IPFS gateway (optional) */\n ipfsGateway?: string;\n}\n\n/**\n * Ad widget display options\n */\nexport interface AdWidgetOptions {\n /** Space ID to display */\n spaceId: number;\n /** Container width */\n width?: string;\n /** Container height */\n height?: string;\n /** Auto-refresh interval (seconds, 0 to disable) */\n refreshInterval?: number;\n /** Callback when ad loads */\n onLoad?: (ad: ActiveAd) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback on ad click */\n onClick?: (ad: ActiveAd) => void;\n}\n","import { CampaignStatus } from '../types';\n\n/**\n * Checks if a campaign should be considered active based on timestamps\n */\nexport function isCampaignActive(\n status: CampaignStatus,\n startTime: number,\n endTime: number,\n currentTimestamp?: number\n): boolean {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n\n return (\n status === CampaignStatus.Approved &&\n now >= startTime &&\n now < endTime\n );\n}\n\n/**\n * Gets the effective display status for a campaign\n */\nexport function getEffectiveCampaignStatus(\n status: CampaignStatus,\n startTime: number,\n endTime: number,\n currentTimestamp?: number\n): CampaignStatus {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n\n // If approved and within time range, show as Active\n if (status === CampaignStatus.Approved && now >= startTime && now < endTime) {\n return CampaignStatus.Active;\n }\n\n // If time has passed, show as Completed\n if (status === CampaignStatus.Approved && now >= endTime) {\n return CampaignStatus.Completed;\n }\n\n return status;\n}\n\n/**\n * Gets human-readable status label\n */\nexport function getCampaignStatusLabel(status: CampaignStatus): string {\n const labels: Record<CampaignStatus, string> = {\n [CampaignStatus.Pending]: 'Pending',\n [CampaignStatus.Approved]: 'Approved',\n [CampaignStatus.Active]: 'Active',\n [CampaignStatus.Completed]: 'Completed',\n [CampaignStatus.Rejected]: 'Rejected',\n [CampaignStatus.Cancelled]: 'Cancelled',\n };\n return labels[status] || 'Unknown';\n}\n\n/**\n * Calculates remaining time for a campaign\n */\nexport function getCampaignTimeRemaining(\n endTime: number,\n currentTimestamp?: number\n): number {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n return Math.max(0, endTime - now);\n}\n\n/**\n * Formats duration in seconds to human-readable string\n */\nexport function formatDuration(seconds: number): string {\n if (seconds <= 0) return '0s';\n\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 && days === 0) parts.push(`${secs}s`);\n\n return parts.join(' ') || '0s';\n}\n"],"names":["DEFAULT_CONFIG","createConfig","userConfig","_a","_b","AD_SPACE_MANAGER_ABI","DEFAULT_GATEWAY","resolveIPFSUrl","ipfsUri","gateway","normalizedGateway","cid","extractCID","patterns","pattern","match","isIPFSReference","value","AdSpaceClient","config","JsonRpcProvider","Contract","spaceId","imageLink","advertiserSiteLink","campaignId","imageUrl","campaignIdStr","error","result","adSpaces","consecutiveEmpty","MAX_CONSECUTIVE_EMPTY","MAX_SPACES","adSpace","a","b","id","createAdSpaceClient","CampaignStatus","isCampaignActive","status","startTime","endTime","currentTimestamp","now","getEffectiveCampaignStatus","getCampaignStatusLabel","getCampaignTimeRemaining","formatDuration","seconds","days","hours","minutes","secs","parts"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const d=require("ethers"),o={network:{chainId:11155111,name:"Sepolia",rpcUrl:"https://eth-sepolia.g.alchemy.com/v2/demo",explorerUrl:"https://sepolia.etherscan.io"},contracts:{adSpaceManager:"0x40FF408E7cDd96a500463425f72b0829FEd9614c",adSpaceNFT:"0x720B7C2B1848dDEAac5702Dd8f52b1405bAFBaC6",campaignNFT:"0xb7E3DB342ec0863b2E52242123A10228c9CDB857"},ipfs:{gateway:"https://gateway.pinata.cloud/ipfs/",fallbackGateways:["https://ipfs.io/ipfs/","https://cloudflare-ipfs.com/ipfs/","https://dweb.link/ipfs/"]},refreshInterval:30,debug:!1};function u(t){var n,e;return{...o,...t,network:{...o.network,...t.network},contracts:{...o.contracts,...t.contracts},ipfs:{gateway:((n=t.ipfs)==null?void 0:n.gateway)??o.ipfs.gateway,fallbackGateways:((e=t.ipfs)==null?void 0:e.fallbackGateways)??o.ipfs.fallbackGateways}}}const l=[{inputs:[{internalType:"uint256",name:"spaceId",type:"uint256"}],name:"getActiveAdImage",outputs:[{internalType:"string",name:"imageLink",type:"string"},{internalType:"string",name:"advertiserSiteLink",type:"string"},{internalType:"uint256",name:"campaignId",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"spaceId",type:"uint256"}],name:"getAdSpace",outputs:[{components:[{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"tokenId",type:"uint256"},{internalType:"string",name:"dimensions",type:"string"},{internalType:"uint256",name:"pricePerHour",type:"uint256"},{internalType:"string",name:"siteLink",type:"string"},{internalType:"uint256",name:"instalments",type:"uint256"},{internalType:"string",name:"defaultAdLink",type:"string"},{internalType:"string",name:"adSpaceName",type:"string"},{internalType:"address",name:"publisher",type:"address"},{internalType:"bool",name:"isActive",type:"bool"}],internalType:"struct AdSpaceManager.AdSpace",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"campaignId",type:"uint256"}],name:"getCampaign",outputs:[{components:[{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"tokenId",type:"uint256"},{internalType:"uint256",name:"spaceId",type:"uint256"},{internalType:"uint256",name:"spaceTokenId",type:"uint256"},{internalType:"string",name:"imageLink",type:"string"},{internalType:"string",name:"advertiserSiteLink",type:"string"},{internalType:"string",name:"metadataURI",type:"string"},{internalType:"uint256",name:"startTime",type:"uint256"},{internalType:"uint256",name:"endTime",type:"uint256"},{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"uint256",name:"totalAmount",type:"uint256"},{internalType:"uint256",name:"amountSettled",type:"uint256"},{internalType:"address",name:"advertiser",type:"address"},{internalType:"enum AdSpaceManager.CampaignStatus",name:"status",type:"uint8"}],internalType:"struct AdSpaceManager.Campaign",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"spaceId",type:"uint256"}],name:"getSpaceCampaigns",outputs:[{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"}],f="https://gateway.pinata.cloud/ipfs/";function m(t,n=f){if(!t||t==="")return"";if(t.startsWith("http://")||t.startsWith("https://")||t.startsWith("blob:"))return t;const e=n.endsWith("/")?n:`${n}/`;if(t.startsWith("ipfs://")){const a=t.replace("ipfs://","");return`${e}${a}`}return`${e}${t}`}function y(t){if(!t)return"";if(t.startsWith("ipfs://"))return t.replace("ipfs://","");const n=[/\/ipfs\/([a-zA-Z0-9]+)/,/\.ipfs\.[^/]+\/([a-zA-Z0-9]+)/];for(const e of n){const a=t.match(e);if(a)return a[1]}return t}function h(t){return t?t.startsWith("ipfs://")||t.startsWith("Qm")||t.startsWith("bafy")||t.includes("/ipfs/")||t.includes(".ipfs."):!1}class g{constructor(n={}){this.config=u(n),this.provider=new d.JsonRpcProvider(this.config.network.rpcUrl),this.managerContract=new d.Contract(this.config.contracts.adSpaceManager,l,this.provider),this.config.debug&&console.log("[AdSpace SDK] Initialized with config:",this.config)}getConfig(){return{...this.config}}getProvider(){return this.provider}getManagerContract(){return this.managerContract}async getActiveAd(n){var e;try{this.config.debug&&console.log("[AdSpace SDK] Fetching active ad for space:",n);const[a,i,s]=await this.managerContract.getActiveAdImage(n);if(!a||a==="")return this.config.debug&&console.log("[AdSpace SDK] No active ad found"),null;const c=m(a,(e=this.config.ipfs)==null?void 0:e.gateway),p=s.toString();return{imageLink:a,imageUrl:c,advertiserSiteLink:i,campaignId:p,isDefault:p==="0"}}catch(a){throw this.config.debug&&console.error("[AdSpace SDK] Error fetching active ad:",a),a}}async getAdSpace(n){try{const e=await this.managerContract.getAdSpace(n);return!e||!e.id||Number(e.id)===0?null:{id:e.id.toString(),tokenId:e.tokenId.toString(),dimensions:e.dimensions,pricePerHour:e.pricePerHour,siteLink:e.siteLink,instalments:Number(e.instalments),defaultAdLink:e.defaultAdLink,adSpaceName:e.adSpaceName,publisher:e.publisher,isActive:e.isActive}}catch(e){throw this.config.debug&&console.error("[AdSpace SDK] Error fetching ad space:",e),e}}async getCampaign(n){try{const e=await this.managerContract.getCampaign(n);return!e||!e.id||Number(e.id)===0?null:{id:e.id.toString(),tokenId:e.tokenId.toString(),spaceId:e.spaceId.toString(),spaceTokenId:e.spaceTokenId.toString(),imageLink:e.imageLink,advertiserSiteLink:e.advertiserSiteLink,metadataURI:e.metadataURI,startTime:Number(e.startTime),endTime:Number(e.endTime),tokenAddress:e.tokenAddress,totalAmount:e.totalAmount,amountSettled:e.amountSettled,advertiser:e.advertiser,status:Number(e.status)}}catch(e){throw this.config.debug&&console.error("[AdSpace SDK] Error fetching campaign:",e),e}}async getAllActiveAdSpaces(){const n=[];let e=1,a=0;const i=10,s=1e3;for(;e<=s&&a<i;){try{const c=await this.getAdSpace(e);c?(a=0,c.isActive&&n.push(c)):a++}catch{a++}e++}return n.sort((c,p)=>Number(p.id)-Number(c.id))}async getSpaceCampaigns(n){try{return(await this.managerContract.getSpaceCampaigns(n)).map(a=>a.toString())}catch(e){throw this.config.debug&&console.error("[AdSpace SDK] Error fetching space campaigns:",e),e}}}function A(t){return new g(t)}var r=(t=>(t[t.Pending=0]="Pending",t[t.Approved=1]="Approved",t[t.Active=2]="Active",t[t.Completed=3]="Completed",t[t.Rejected=4]="Rejected",t[t.Cancelled=5]="Cancelled",t))(r||{});function S(t,n,e,a){const i=a||Math.floor(Date.now()/1e3);return t===r.Approved&&i>=n&&i<e}function T(t,n,e,a){const i=a||Math.floor(Date.now()/1e3);return t===r.Approved&&i>=n&&i<e?r.Active:t===r.Approved&&i>=e?r.Completed:t}function v(t){return{[r.Pending]:"Pending",[r.Approved]:"Approved",[r.Active]:"Active",[r.Completed]:"Completed",[r.Rejected]:"Rejected",[r.Cancelled]:"Cancelled"}[t]||"Unknown"}function b(t,n){const e=n||Math.floor(Date.now()/1e3);return Math.max(0,t-e)}function w(t){if(t<=0)return"0s";const n=Math.floor(t/86400),e=Math.floor(t%86400/3600),a=Math.floor(t%3600/60),i=t%60,s=[];return n>0&&s.push(`${n}d`),e>0&&s.push(`${e}h`),a>0&&s.push(`${a}m`),i>0&&n===0&&s.push(`${i}s`),s.join(" ")||"0s"}exports.AD_SPACE_MANAGER_ABI=l;exports.AdSpaceClient=g;exports.CampaignStatus=r;exports.DEFAULT_CONFIG=o;exports.createAdSpaceClient=A;exports.createConfig=u;exports.extractCID=y;exports.formatDuration=w;exports.getCampaignStatusLabel=v;exports.getCampaignTimeRemaining=b;exports.getEffectiveCampaignStatus=T;exports.isCampaignActive=S;exports.isIPFSReference=h;exports.resolveIPFSUrl=m;
2
+ //# sourceMappingURL=campaign-D-02mKGw.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign-D-02mKGw.cjs","sources":["../src/core/config.ts","../src/core/contracts.ts","../src/core/utils/ipfs.ts","../src/core/client.ts","../src/core/types.ts","../src/core/utils/campaign.ts"],"sourcesContent":["/**\n * Network configuration for AdSpace contracts\n */\nexport interface NetworkConfig {\n /** Chain ID (e.g., 11155111 for Sepolia) */\n chainId: number;\n /** Human-readable network name */\n name: string;\n /** RPC endpoint URL */\n rpcUrl: string;\n /** Block explorer URL (optional) */\n explorerUrl?: string;\n}\n\n/**\n * Contract addresses configuration\n */\nexport interface ContractAddresses {\n /** AdSpaceManager contract address */\n adSpaceManager: string;\n /** AdSpaceNFT contract address (optional) */\n adSpaceNFT?: string;\n /** CampaignNFT contract address (optional) */\n campaignNFT?: string;\n}\n\n/**\n * IPFS gateway configuration\n */\nexport interface IPFSConfig {\n /** Primary IPFS gateway URL */\n gateway: string;\n /** Fallback gateways */\n fallbackGateways?: string[];\n}\n\n/**\n * Main SDK configuration\n */\nexport interface AdSpaceConfig {\n /** Network configuration */\n network: NetworkConfig;\n /** Contract addresses */\n contracts: ContractAddresses;\n /** IPFS configuration */\n ipfs?: IPFSConfig;\n /** Auto-refresh interval for ads (in seconds, 0 to disable) */\n refreshInterval?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Default configuration for Sepolia testnet\n */\nexport const DEFAULT_CONFIG: AdSpaceConfig = {\n network: {\n chainId: 11155111,\n name: 'Sepolia',\n rpcUrl: 'https://eth-sepolia.g.alchemy.com/v2/demo',\n explorerUrl: 'https://sepolia.etherscan.io',\n },\n contracts: {\n adSpaceManager: '0x40FF408E7cDd96a500463425f72b0829FEd9614c',\n adSpaceNFT: '0x720B7C2B1848dDEAac5702Dd8f52b1405bAFBaC6',\n campaignNFT: '0xb7E3DB342ec0863b2E52242123A10228c9CDB857',\n },\n ipfs: {\n gateway: 'https://gateway.pinata.cloud/ipfs/',\n fallbackGateways: [\n 'https://ipfs.io/ipfs/',\n 'https://cloudflare-ipfs.com/ipfs/',\n 'https://dweb.link/ipfs/',\n ],\n },\n refreshInterval: 30,\n debug: false,\n};\n\n/**\n * Merges user config with defaults\n */\nexport function createConfig(userConfig: Partial<AdSpaceConfig>): AdSpaceConfig {\n return {\n ...DEFAULT_CONFIG,\n ...userConfig,\n network: {\n ...DEFAULT_CONFIG.network,\n ...userConfig.network,\n },\n contracts: {\n ...DEFAULT_CONFIG.contracts,\n ...userConfig.contracts,\n },\n ipfs: {\n gateway: userConfig.ipfs?.gateway ?? DEFAULT_CONFIG.ipfs!.gateway,\n fallbackGateways: userConfig.ipfs?.fallbackGateways ?? DEFAULT_CONFIG.ipfs!.fallbackGateways,\n },\n };\n}\n","/**\n * ABI for AdSpaceManager contract - only the functions needed for the SDK\n */\nexport const AD_SPACE_MANAGER_ABI = [\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getActiveAdImage',\n outputs: [\n { internalType: 'string', name: 'imageLink', type: 'string' },\n { internalType: 'string', name: 'advertiserSiteLink', type: 'string' },\n { internalType: 'uint256', name: 'campaignId', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getAdSpace',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'id', type: 'uint256' },\n { internalType: 'uint256', name: 'tokenId', type: 'uint256' },\n { internalType: 'string', name: 'dimensions', type: 'string' },\n { internalType: 'uint256', name: 'pricePerHour', type: 'uint256' },\n { internalType: 'string', name: 'siteLink', type: 'string' },\n { internalType: 'uint256', name: 'instalments', type: 'uint256' },\n { internalType: 'string', name: 'defaultAdLink', type: 'string' },\n { internalType: 'string', name: 'adSpaceName', type: 'string' },\n { internalType: 'address', name: 'publisher', type: 'address' },\n { internalType: 'bool', name: 'isActive', type: 'bool' },\n ],\n internalType: 'struct AdSpaceManager.AdSpace',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'campaignId', type: 'uint256' }],\n name: 'getCampaign',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'id', type: 'uint256' },\n { internalType: 'uint256', name: 'tokenId', type: 'uint256' },\n { internalType: 'uint256', name: 'spaceId', type: 'uint256' },\n { internalType: 'uint256', name: 'spaceTokenId', type: 'uint256' },\n { internalType: 'string', name: 'imageLink', type: 'string' },\n { internalType: 'string', name: 'advertiserSiteLink', type: 'string' },\n { internalType: 'string', name: 'metadataURI', type: 'string' },\n { internalType: 'uint256', name: 'startTime', type: 'uint256' },\n { internalType: 'uint256', name: 'endTime', type: 'uint256' },\n { internalType: 'address', name: 'tokenAddress', type: 'address' },\n { internalType: 'uint256', name: 'totalAmount', type: 'uint256' },\n { internalType: 'uint256', name: 'amountSettled', type: 'uint256' },\n { internalType: 'address', name: 'advertiser', type: 'address' },\n { internalType: 'enum AdSpaceManager.CampaignStatus', name: 'status', type: 'uint8' },\n ],\n internalType: 'struct AdSpaceManager.Campaign',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'spaceId', type: 'uint256' }],\n name: 'getSpaceCampaigns',\n outputs: [{ internalType: 'uint256[]', name: '', type: 'uint256[]' }],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","/**\n * Default IPFS gateway\n */\nconst DEFAULT_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';\n\n/**\n * Resolves an IPFS URI to an HTTP URL\n */\nexport function resolveIPFSUrl(\n ipfsUri: string,\n gateway: string = DEFAULT_GATEWAY\n): string {\n if (!ipfsUri || ipfsUri === '') {\n return '';\n }\n\n // Already an HTTP URL\n if (ipfsUri.startsWith('http://') || ipfsUri.startsWith('https://')) {\n return ipfsUri;\n }\n\n // Blob URL (for local previews)\n if (ipfsUri.startsWith('blob:')) {\n return ipfsUri;\n }\n\n // Ensure gateway ends with /\n const normalizedGateway = gateway.endsWith('/') ? gateway : `${gateway}/`;\n\n // IPFS protocol URL\n if (ipfsUri.startsWith('ipfs://')) {\n const cid = ipfsUri.replace('ipfs://', '');\n return `${normalizedGateway}${cid}`;\n }\n\n // Assume raw CID\n return `${normalizedGateway}${ipfsUri}`;\n}\n\n/**\n * Extracts CID from an IPFS URI or URL\n */\nexport function extractCID(ipfsUri: string): string {\n if (!ipfsUri) return '';\n\n // Remove ipfs:// prefix\n if (ipfsUri.startsWith('ipfs://')) {\n return ipfsUri.replace('ipfs://', '');\n }\n\n // Extract from gateway URL\n const patterns = [\n /\\/ipfs\\/([a-zA-Z0-9]+)/,\n /\\.ipfs\\.[^/]+\\/([a-zA-Z0-9]+)/,\n ];\n\n for (const pattern of patterns) {\n const match = ipfsUri.match(pattern);\n if (match) return match[1];\n }\n\n // Assume it's already a CID\n return ipfsUri;\n}\n\n/**\n * Checks if a string is a valid IPFS reference\n */\nexport function isIPFSReference(value: string): boolean {\n if (!value) return false;\n\n return (\n value.startsWith('ipfs://') ||\n value.startsWith('Qm') ||\n value.startsWith('bafy') ||\n value.includes('/ipfs/') ||\n value.includes('.ipfs.')\n );\n}\n","import { JsonRpcProvider, Contract } from 'ethers';\nimport { AdSpaceConfig, createConfig } from './config';\nimport { AD_SPACE_MANAGER_ABI } from './contracts';\nimport { ActiveAd, AdSpace, Campaign } from './types';\nimport { resolveIPFSUrl } from './utils/ipfs';\n\n/**\n * AdSpace SDK Client\n *\n * Framework-agnostic client for interacting with AdSpace contracts.\n * Use this directly for vanilla JS or as the foundation for framework integrations.\n *\n * @example\n * ```typescript\n * const client = new AdSpaceClient({\n * network: { rpcUrl: 'https://...' },\n * contracts: { adSpaceManager: '0x...' }\n * });\n *\n * const ad = await client.getActiveAd(1);\n * console.log(ad.imageUrl);\n * ```\n */\nexport class AdSpaceClient {\n private config: AdSpaceConfig;\n private provider: JsonRpcProvider;\n private managerContract: Contract;\n\n constructor(config: Partial<AdSpaceConfig> = {}) {\n this.config = createConfig(config);\n this.provider = new JsonRpcProvider(this.config.network.rpcUrl);\n this.managerContract = new Contract(\n this.config.contracts.adSpaceManager,\n AD_SPACE_MANAGER_ABI,\n this.provider\n );\n\n if (this.config.debug) {\n console.log('[AdSpace SDK] Initialized with config:', this.config);\n }\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): AdSpaceConfig {\n return { ...this.config };\n }\n\n /**\n * Get the ethers provider instance\n */\n getProvider(): JsonRpcProvider {\n return this.provider;\n }\n\n /**\n * Get the AdSpaceManager contract instance\n */\n getManagerContract(): Contract {\n return this.managerContract;\n }\n\n /**\n * Fetch the active ad for a given space ID\n */\n async getActiveAd(spaceId: number): Promise<ActiveAd | null> {\n try {\n if (this.config.debug) {\n console.log('[AdSpace SDK] Fetching active ad for space:', spaceId);\n }\n\n const [imageLink, advertiserSiteLink, campaignId] =\n await this.managerContract.getActiveAdImage(spaceId);\n\n if (!imageLink || imageLink === '') {\n if (this.config.debug) {\n console.log('[AdSpace SDK] No active ad found');\n }\n return null;\n }\n\n const imageUrl = resolveIPFSUrl(imageLink, this.config.ipfs?.gateway);\n const campaignIdStr = campaignId.toString();\n\n return {\n imageLink,\n imageUrl,\n advertiserSiteLink,\n campaignId: campaignIdStr,\n isDefault: campaignIdStr === '0',\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching active ad:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get ad space details by ID\n */\n async getAdSpace(spaceId: number): Promise<AdSpace | null> {\n try {\n const result = await this.managerContract.getAdSpace(spaceId);\n\n if (!result || !result.id || Number(result.id) === 0) {\n return null;\n }\n\n return {\n id: result.id.toString(),\n tokenId: result.tokenId.toString(),\n dimensions: result.dimensions,\n pricePerHour: result.pricePerHour,\n siteLink: result.siteLink,\n instalments: Number(result.instalments),\n defaultAdLink: result.defaultAdLink,\n adSpaceName: result.adSpaceName,\n publisher: result.publisher,\n isActive: result.isActive,\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching ad space:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get campaign details by ID\n */\n async getCampaign(campaignId: number): Promise<Campaign | null> {\n try {\n const result = await this.managerContract.getCampaign(campaignId);\n\n if (!result || !result.id || Number(result.id) === 0) {\n return null;\n }\n\n return {\n id: result.id.toString(),\n tokenId: result.tokenId.toString(),\n spaceId: result.spaceId.toString(),\n spaceTokenId: result.spaceTokenId.toString(),\n imageLink: result.imageLink,\n advertiserSiteLink: result.advertiserSiteLink,\n metadataURI: result.metadataURI,\n startTime: Number(result.startTime),\n endTime: Number(result.endTime),\n tokenAddress: result.tokenAddress,\n totalAmount: result.totalAmount,\n amountSettled: result.amountSettled,\n advertiser: result.advertiser,\n status: Number(result.status),\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching campaign:', error);\n }\n throw error;\n }\n }\n\n /**\n * Get all active ad spaces\n */\n async getAllActiveAdSpaces(): Promise<AdSpace[]> {\n const adSpaces: AdSpace[] = [];\n let spaceId = 1;\n let consecutiveEmpty = 0;\n const MAX_CONSECUTIVE_EMPTY = 10;\n const MAX_SPACES = 1000;\n\n while (spaceId <= MAX_SPACES && consecutiveEmpty < MAX_CONSECUTIVE_EMPTY) {\n try {\n const adSpace = await this.getAdSpace(spaceId);\n\n if (!adSpace) {\n consecutiveEmpty++;\n } else {\n consecutiveEmpty = 0;\n if (adSpace.isActive) {\n adSpaces.push(adSpace);\n }\n }\n } catch {\n consecutiveEmpty++;\n }\n spaceId++;\n }\n\n return adSpaces.sort((a, b) => Number(b.id) - Number(a.id));\n }\n\n /**\n * Get campaigns for a specific ad space\n */\n async getSpaceCampaigns(spaceId: number): Promise<string[]> {\n try {\n const campaignIds = await this.managerContract.getSpaceCampaigns(spaceId);\n return campaignIds.map((id: bigint) => id.toString());\n } catch (error) {\n if (this.config.debug) {\n console.error('[AdSpace SDK] Error fetching space campaigns:', error);\n }\n throw error;\n }\n }\n}\n\n/**\n * Create a new AdSpace client instance\n */\nexport function createAdSpaceClient(config?: Partial<AdSpaceConfig>): AdSpaceClient {\n return new AdSpaceClient(config);\n}\n","/**\n * Campaign status enum (matches on-chain enum)\n */\nexport enum CampaignStatus {\n Pending = 0,\n Approved = 1,\n Active = 2,\n Completed = 3,\n Rejected = 4,\n Cancelled = 5,\n}\n\n/**\n * Ad space data structure\n */\nexport interface AdSpace {\n id: string;\n tokenId: string;\n dimensions: string;\n pricePerHour: bigint;\n siteLink: string;\n instalments: number;\n defaultAdLink: string;\n adSpaceName: string;\n publisher: string;\n isActive: boolean;\n}\n\n/**\n * Campaign data structure\n */\nexport interface Campaign {\n id: string;\n tokenId: string;\n spaceId: string;\n spaceTokenId: string;\n imageLink: string;\n advertiserSiteLink: string;\n metadataURI: string;\n startTime: number;\n endTime: number;\n tokenAddress: string;\n totalAmount: bigint;\n amountSettled: bigint;\n advertiser: string;\n status: CampaignStatus;\n}\n\n/**\n * Active ad data returned from getActiveAdImage\n */\nexport interface ActiveAd {\n /** Raw IPFS link */\n imageLink: string;\n /** Resolved HTTP URL */\n imageUrl: string;\n /** Advertiser's website link */\n advertiserSiteLink: string;\n /** Campaign ID (0 if default ad) */\n campaignId: string;\n /** True if showing default ad (no active campaign) */\n isDefault: boolean;\n}\n\n/**\n * Options for fetching active ad\n */\nexport interface FetchActiveAdOptions {\n /** Space ID to fetch ad for */\n spaceId: number;\n /** Custom IPFS gateway (optional) */\n ipfsGateway?: string;\n}\n\n/**\n * Ad widget display options\n */\nexport interface AdWidgetOptions {\n /** Space ID to display */\n spaceId: number;\n /** Container width */\n width?: string;\n /** Container height */\n height?: string;\n /** Auto-refresh interval (seconds, 0 to disable) */\n refreshInterval?: number;\n /** Callback when ad loads */\n onLoad?: (ad: ActiveAd) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback on ad click */\n onClick?: (ad: ActiveAd) => void;\n}\n","import { CampaignStatus } from '../types';\n\n/**\n * Checks if a campaign should be considered active based on timestamps\n */\nexport function isCampaignActive(\n status: CampaignStatus,\n startTime: number,\n endTime: number,\n currentTimestamp?: number\n): boolean {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n\n return (\n status === CampaignStatus.Approved &&\n now >= startTime &&\n now < endTime\n );\n}\n\n/**\n * Gets the effective display status for a campaign\n */\nexport function getEffectiveCampaignStatus(\n status: CampaignStatus,\n startTime: number,\n endTime: number,\n currentTimestamp?: number\n): CampaignStatus {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n\n // If approved and within time range, show as Active\n if (status === CampaignStatus.Approved && now >= startTime && now < endTime) {\n return CampaignStatus.Active;\n }\n\n // If time has passed, show as Completed\n if (status === CampaignStatus.Approved && now >= endTime) {\n return CampaignStatus.Completed;\n }\n\n return status;\n}\n\n/**\n * Gets human-readable status label\n */\nexport function getCampaignStatusLabel(status: CampaignStatus): string {\n const labels: Record<CampaignStatus, string> = {\n [CampaignStatus.Pending]: 'Pending',\n [CampaignStatus.Approved]: 'Approved',\n [CampaignStatus.Active]: 'Active',\n [CampaignStatus.Completed]: 'Completed',\n [CampaignStatus.Rejected]: 'Rejected',\n [CampaignStatus.Cancelled]: 'Cancelled',\n };\n return labels[status] || 'Unknown';\n}\n\n/**\n * Calculates remaining time for a campaign\n */\nexport function getCampaignTimeRemaining(\n endTime: number,\n currentTimestamp?: number\n): number {\n const now = currentTimestamp || Math.floor(Date.now() / 1000);\n return Math.max(0, endTime - now);\n}\n\n/**\n * Formats duration in seconds to human-readable string\n */\nexport function formatDuration(seconds: number): string {\n if (seconds <= 0) return '0s';\n\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 && days === 0) parts.push(`${secs}s`);\n\n return parts.join(' ') || '0s';\n}\n"],"names":["DEFAULT_CONFIG","createConfig","userConfig","_a","_b","AD_SPACE_MANAGER_ABI","DEFAULT_GATEWAY","resolveIPFSUrl","ipfsUri","gateway","normalizedGateway","cid","extractCID","patterns","pattern","match","isIPFSReference","value","AdSpaceClient","config","JsonRpcProvider","Contract","spaceId","imageLink","advertiserSiteLink","campaignId","imageUrl","campaignIdStr","error","result","adSpaces","consecutiveEmpty","MAX_CONSECUTIVE_EMPTY","MAX_SPACES","adSpace","a","b","id","createAdSpaceClient","CampaignStatus","isCampaignActive","status","startTime","endTime","currentTimestamp","now","getEffectiveCampaignStatus","getCampaignStatusLabel","getCampaignTimeRemaining","formatDuration","seconds","days","hours","minutes","secs","parts"],"mappings":"uCAuDaA,EAAgC,CAC3C,QAAS,CACP,QAAS,SACT,KAAM,UACN,OAAQ,4CACR,YAAa,8BAAA,EAEf,UAAW,CACT,eAAgB,6CAChB,WAAY,6CACZ,YAAa,4CAAA,EAEf,KAAM,CACJ,QAAS,qCACT,iBAAkB,CAChB,wBACA,oCACA,yBAAA,CACF,EAEF,gBAAiB,GACjB,MAAO,EACT,EAKO,SAASC,EAAaC,EAAmD,SAC9E,MAAO,CACL,GAAGF,EACH,GAAGE,EACH,QAAS,CACP,GAAGF,EAAe,QAClB,GAAGE,EAAW,OAAA,EAEhB,UAAW,CACT,GAAGF,EAAe,UAClB,GAAGE,EAAW,SAAA,EAEhB,KAAM,CACJ,UAASC,EAAAD,EAAW,OAAX,YAAAC,EAAiB,UAAWH,EAAe,KAAM,QAC1D,mBAAkBI,EAAAF,EAAW,OAAX,YAAAE,EAAiB,mBAAoBJ,EAAe,KAAM,gBAAA,CAC9E,CAEJ,CChGO,MAAMK,EAAuB,CAClC,CACE,OAAQ,CAAC,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,UAAW,EACtE,KAAM,mBACN,QAAS,CACP,CAAE,aAAc,SAAU,KAAM,YAAa,KAAM,QAAA,EACnD,CAAE,aAAc,SAAU,KAAM,qBAAsB,KAAM,QAAA,EAC5D,CAAE,aAAc,UAAW,KAAM,aAAc,KAAM,SAAA,CAAU,EAEjE,gBAAiB,OACjB,KAAM,UAAA,EAER,CACE,OAAQ,CAAC,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,UAAW,EACtE,KAAM,aACN,QAAS,CACP,CACE,WAAY,CACV,CAAE,aAAc,UAAW,KAAM,KAAM,KAAM,SAAA,EAC7C,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,SAAA,EAClD,CAAE,aAAc,SAAU,KAAM,aAAc,KAAM,QAAA,EACpD,CAAE,aAAc,UAAW,KAAM,eAAgB,KAAM,SAAA,EACvD,CAAE,aAAc,SAAU,KAAM,WAAY,KAAM,QAAA,EAClD,CAAE,aAAc,UAAW,KAAM,cAAe,KAAM,SAAA,EACtD,CAAE,aAAc,SAAU,KAAM,gBAAiB,KAAM,QAAA,EACvD,CAAE,aAAc,SAAU,KAAM,cAAe,KAAM,QAAA,EACrD,CAAE,aAAc,UAAW,KAAM,YAAa,KAAM,SAAA,EACpD,CAAE,aAAc,OAAQ,KAAM,WAAY,KAAM,MAAA,CAAO,EAEzD,aAAc,gCACd,KAAM,GACN,KAAM,OAAA,CACR,EAEF,gBAAiB,OACjB,KAAM,UAAA,EAER,CACE,OAAQ,CAAC,CAAE,aAAc,UAAW,KAAM,aAAc,KAAM,UAAW,EACzE,KAAM,cACN,QAAS,CACP,CACE,WAAY,CACV,CAAE,aAAc,UAAW,KAAM,KAAM,KAAM,SAAA,EAC7C,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,SAAA,EAClD,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,SAAA,EAClD,CAAE,aAAc,UAAW,KAAM,eAAgB,KAAM,SAAA,EACvD,CAAE,aAAc,SAAU,KAAM,YAAa,KAAM,QAAA,EACnD,CAAE,aAAc,SAAU,KAAM,qBAAsB,KAAM,QAAA,EAC5D,CAAE,aAAc,SAAU,KAAM,cAAe,KAAM,QAAA,EACrD,CAAE,aAAc,UAAW,KAAM,YAAa,KAAM,SAAA,EACpD,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,SAAA,EAClD,CAAE,aAAc,UAAW,KAAM,eAAgB,KAAM,SAAA,EACvD,CAAE,aAAc,UAAW,KAAM,cAAe,KAAM,SAAA,EACtD,CAAE,aAAc,UAAW,KAAM,gBAAiB,KAAM,SAAA,EACxD,CAAE,aAAc,UAAW,KAAM,aAAc,KAAM,SAAA,EACrD,CAAE,aAAc,qCAAsC,KAAM,SAAU,KAAM,OAAA,CAAQ,EAEtF,aAAc,iCACd,KAAM,GACN,KAAM,OAAA,CACR,EAEF,gBAAiB,OACjB,KAAM,UAAA,EAER,CACE,OAAQ,CAAC,CAAE,aAAc,UAAW,KAAM,UAAW,KAAM,UAAW,EACtE,KAAM,oBACN,QAAS,CAAC,CAAE,aAAc,YAAa,KAAM,GAAI,KAAM,YAAa,EACpE,gBAAiB,OACjB,KAAM,UAAA,CAEV,ECzEMC,EAAkB,qCAKjB,SAASC,EACdC,EACAC,EAAkBH,EACV,CACR,GAAI,CAACE,GAAWA,IAAY,GAC1B,MAAO,GAST,GALIA,EAAQ,WAAW,SAAS,GAAKA,EAAQ,WAAW,UAAU,GAK9DA,EAAQ,WAAW,OAAO,EAC5B,OAAOA,EAIT,MAAME,EAAoBD,EAAQ,SAAS,GAAG,EAAIA,EAAU,GAAGA,CAAO,IAGtE,GAAID,EAAQ,WAAW,SAAS,EAAG,CACjC,MAAMG,EAAMH,EAAQ,QAAQ,UAAW,EAAE,EACzC,MAAO,GAAGE,CAAiB,GAAGC,CAAG,EACnC,CAGA,MAAO,GAAGD,CAAiB,GAAGF,CAAO,EACvC,CAKO,SAASI,EAAWJ,EAAyB,CAClD,GAAI,CAACA,EAAS,MAAO,GAGrB,GAAIA,EAAQ,WAAW,SAAS,EAC9B,OAAOA,EAAQ,QAAQ,UAAW,EAAE,EAItC,MAAMK,EAAW,CACf,yBACA,+BAAA,EAGF,UAAWC,KAAWD,EAAU,CAC9B,MAAME,EAAQP,EAAQ,MAAMM,CAAO,EACnC,GAAIC,EAAO,OAAOA,EAAM,CAAC,CAC3B,CAGA,OAAOP,CACT,CAKO,SAASQ,EAAgBC,EAAwB,CACtD,OAAKA,EAGHA,EAAM,WAAW,SAAS,GAC1BA,EAAM,WAAW,IAAI,GACrBA,EAAM,WAAW,MAAM,GACvBA,EAAM,SAAS,QAAQ,GACvBA,EAAM,SAAS,QAAQ,EAPN,EASrB,CCvDO,MAAMC,CAAc,CAKzB,YAAYC,EAAiC,GAAI,CAC/C,KAAK,OAASlB,EAAakB,CAAM,EACjC,KAAK,SAAW,IAAIC,EAAAA,gBAAgB,KAAK,OAAO,QAAQ,MAAM,EAC9D,KAAK,gBAAkB,IAAIC,EAAAA,SACzB,KAAK,OAAO,UAAU,eACtBhB,EACA,KAAK,QAAA,EAGH,KAAK,OAAO,OACd,QAAQ,IAAI,yCAA0C,KAAK,MAAM,CAErE,CAKA,WAA2B,CACzB,MAAO,CAAE,GAAG,KAAK,MAAA,CACnB,CAKA,aAA+B,CAC7B,OAAO,KAAK,QACd,CAKA,oBAA+B,CAC7B,OAAO,KAAK,eACd,CAKA,MAAM,YAAYiB,EAA2C,OAC3D,GAAI,CACE,KAAK,OAAO,OACd,QAAQ,IAAI,8CAA+CA,CAAO,EAGpE,KAAM,CAACC,EAAWC,EAAoBC,CAAU,EAC9C,MAAM,KAAK,gBAAgB,iBAAiBH,CAAO,EAErD,GAAI,CAACC,GAAaA,IAAc,GAC9B,OAAI,KAAK,OAAO,OACd,QAAQ,IAAI,kCAAkC,EAEzC,KAGT,MAAMG,EAAWnB,EAAegB,GAAWpB,EAAA,KAAK,OAAO,OAAZ,YAAAA,EAAkB,OAAO,EAC9DwB,EAAgBF,EAAW,SAAA,EAEjC,MAAO,CACL,UAAAF,EACA,SAAAG,EACA,mBAAAF,EACA,WAAYG,EACZ,UAAWA,IAAkB,GAAA,CAEjC,OAASC,EAAO,CACd,MAAI,KAAK,OAAO,OACd,QAAQ,MAAM,0CAA2CA,CAAK,EAE1DA,CACR,CACF,CAKA,MAAM,WAAWN,EAA0C,CACzD,GAAI,CACF,MAAMO,EAAS,MAAM,KAAK,gBAAgB,WAAWP,CAAO,EAE5D,MAAI,CAACO,GAAU,CAACA,EAAO,IAAM,OAAOA,EAAO,EAAE,IAAM,EAC1C,KAGF,CACL,GAAIA,EAAO,GAAG,SAAA,EACd,QAASA,EAAO,QAAQ,SAAA,EACxB,WAAYA,EAAO,WACnB,aAAcA,EAAO,aACrB,SAAUA,EAAO,SACjB,YAAa,OAAOA,EAAO,WAAW,EACtC,cAAeA,EAAO,cACtB,YAAaA,EAAO,YACpB,UAAWA,EAAO,UAClB,SAAUA,EAAO,QAAA,CAErB,OAASD,EAAO,CACd,MAAI,KAAK,OAAO,OACd,QAAQ,MAAM,yCAA0CA,CAAK,EAEzDA,CACR,CACF,CAKA,MAAM,YAAYH,EAA8C,CAC9D,GAAI,CACF,MAAMI,EAAS,MAAM,KAAK,gBAAgB,YAAYJ,CAAU,EAEhE,MAAI,CAACI,GAAU,CAACA,EAAO,IAAM,OAAOA,EAAO,EAAE,IAAM,EAC1C,KAGF,CACL,GAAIA,EAAO,GAAG,SAAA,EACd,QAASA,EAAO,QAAQ,SAAA,EACxB,QAASA,EAAO,QAAQ,SAAA,EACxB,aAAcA,EAAO,aAAa,SAAA,EAClC,UAAWA,EAAO,UAClB,mBAAoBA,EAAO,mBAC3B,YAAaA,EAAO,YACpB,UAAW,OAAOA,EAAO,SAAS,EAClC,QAAS,OAAOA,EAAO,OAAO,EAC9B,aAAcA,EAAO,aACrB,YAAaA,EAAO,YACpB,cAAeA,EAAO,cACtB,WAAYA,EAAO,WACnB,OAAQ,OAAOA,EAAO,MAAM,CAAA,CAEhC,OAASD,EAAO,CACd,MAAI,KAAK,OAAO,OACd,QAAQ,MAAM,yCAA0CA,CAAK,EAEzDA,CACR,CACF,CAKA,MAAM,sBAA2C,CAC/C,MAAME,EAAsB,CAAA,EAC5B,IAAIR,EAAU,EACVS,EAAmB,EACvB,MAAMC,EAAwB,GACxBC,EAAa,IAEnB,KAAOX,GAAWW,GAAcF,EAAmBC,GAAuB,CACxE,GAAI,CACF,MAAME,EAAU,MAAM,KAAK,WAAWZ,CAAO,EAExCY,GAGHH,EAAmB,EACfG,EAAQ,UACVJ,EAAS,KAAKI,CAAO,GAJvBH,GAOJ,MAAQ,CACNA,GACF,CACAT,GACF,CAEA,OAAOQ,EAAS,KAAK,CAACK,EAAGC,IAAM,OAAOA,EAAE,EAAE,EAAI,OAAOD,EAAE,EAAE,CAAC,CAC5D,CAKA,MAAM,kBAAkBb,EAAoC,CAC1D,GAAI,CAEF,OADoB,MAAM,KAAK,gBAAgB,kBAAkBA,CAAO,GACrD,IAAKe,GAAeA,EAAG,UAAU,CACtD,OAAST,EAAO,CACd,MAAI,KAAK,OAAO,OACd,QAAQ,MAAM,gDAAiDA,CAAK,EAEhEA,CACR,CACF,CACF,CAKO,SAASU,EAAoBnB,EAAgD,CAClF,OAAO,IAAID,EAAcC,CAAM,CACjC,CCvNO,IAAKoB,GAAAA,IACVA,EAAAA,EAAA,QAAU,CAAA,EAAV,UACAA,EAAAA,EAAA,SAAW,CAAA,EAAX,WACAA,EAAAA,EAAA,OAAS,CAAA,EAAT,SACAA,EAAAA,EAAA,UAAY,CAAA,EAAZ,YACAA,EAAAA,EAAA,SAAW,CAAA,EAAX,WACAA,EAAAA,EAAA,UAAY,CAAA,EAAZ,YANUA,IAAAA,GAAA,CAAA,CAAA,ECEL,SAASC,EACdC,EACAC,EACAC,EACAC,EACS,CACT,MAAMC,EAAMD,GAAoB,KAAK,MAAM,KAAK,IAAA,EAAQ,GAAI,EAE5D,OACEH,IAAWF,EAAe,UAC1BM,GAAOH,GACPG,EAAMF,CAEV,CAKO,SAASG,EACdL,EACAC,EACAC,EACAC,EACgB,CAChB,MAAMC,EAAMD,GAAoB,KAAK,MAAM,KAAK,IAAA,EAAQ,GAAI,EAG5D,OAAIH,IAAWF,EAAe,UAAYM,GAAOH,GAAaG,EAAMF,EAC3DJ,EAAe,OAIpBE,IAAWF,EAAe,UAAYM,GAAOF,EACxCJ,EAAe,UAGjBE,CACT,CAKO,SAASM,EAAuBN,EAAgC,CASrE,MAR+C,CAC7C,CAACF,EAAe,OAAO,EAAG,UAC1B,CAACA,EAAe,QAAQ,EAAG,WAC3B,CAACA,EAAe,MAAM,EAAG,SACzB,CAACA,EAAe,SAAS,EAAG,YAC5B,CAACA,EAAe,QAAQ,EAAG,WAC3B,CAACA,EAAe,SAAS,EAAG,WAAA,EAEhBE,CAAM,GAAK,SAC3B,CAKO,SAASO,EACdL,EACAC,EACQ,CACR,MAAMC,EAAMD,GAAoB,KAAK,MAAM,KAAK,IAAA,EAAQ,GAAI,EAC5D,OAAO,KAAK,IAAI,EAAGD,EAAUE,CAAG,CAClC,CAKO,SAASI,EAAeC,EAAyB,CACtD,GAAIA,GAAW,EAAG,MAAO,KAEzB,MAAMC,EAAO,KAAK,MAAMD,EAAU,KAAK,EACjCE,EAAQ,KAAK,MAAOF,EAAU,MAAS,IAAI,EAC3CG,EAAU,KAAK,MAAOH,EAAU,KAAQ,EAAE,EAC1CI,EAAOJ,EAAU,GAEjBK,EAAkB,CAAA,EACxB,OAAIJ,EAAO,GAAGI,EAAM,KAAK,GAAGJ,CAAI,GAAG,EAC/BC,EAAQ,GAAGG,EAAM,KAAK,GAAGH,CAAK,GAAG,EACjCC,EAAU,GAAGE,EAAM,KAAK,GAAGF,CAAO,GAAG,EACrCC,EAAO,GAAKH,IAAS,KAAS,KAAK,GAAGG,CAAI,GAAG,EAE1CC,EAAM,KAAK,GAAG,GAAK,IAC5B"}
@@ -0,0 +1,63 @@
1
+ import { JsonRpcProvider, Contract } from 'ethers';
2
+ import { AdSpaceConfig } from './config';
3
+ import { ActiveAd, AdSpace, Campaign } from './types';
4
+ /**
5
+ * AdSpace SDK Client
6
+ *
7
+ * Framework-agnostic client for interacting with AdSpace contracts.
8
+ * Use this directly for vanilla JS or as the foundation for framework integrations.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const client = new AdSpaceClient({
13
+ * network: { rpcUrl: 'https://...' },
14
+ * contracts: { adSpaceManager: '0x...' }
15
+ * });
16
+ *
17
+ * const ad = await client.getActiveAd(1);
18
+ * console.log(ad.imageUrl);
19
+ * ```
20
+ */
21
+ export declare class AdSpaceClient {
22
+ private config;
23
+ private provider;
24
+ private managerContract;
25
+ constructor(config?: Partial<AdSpaceConfig>);
26
+ /**
27
+ * Get the current configuration
28
+ */
29
+ getConfig(): AdSpaceConfig;
30
+ /**
31
+ * Get the ethers provider instance
32
+ */
33
+ getProvider(): JsonRpcProvider;
34
+ /**
35
+ * Get the AdSpaceManager contract instance
36
+ */
37
+ getManagerContract(): Contract;
38
+ /**
39
+ * Fetch the active ad for a given space ID
40
+ */
41
+ getActiveAd(spaceId: number): Promise<ActiveAd | null>;
42
+ /**
43
+ * Get ad space details by ID
44
+ */
45
+ getAdSpace(spaceId: number): Promise<AdSpace | null>;
46
+ /**
47
+ * Get campaign details by ID
48
+ */
49
+ getCampaign(campaignId: number): Promise<Campaign | null>;
50
+ /**
51
+ * Get all active ad spaces
52
+ */
53
+ getAllActiveAdSpaces(): Promise<AdSpace[]>;
54
+ /**
55
+ * Get campaigns for a specific ad space
56
+ */
57
+ getSpaceCampaigns(spaceId: number): Promise<string[]>;
58
+ }
59
+ /**
60
+ * Create a new AdSpace client instance
61
+ */
62
+ export declare function createAdSpaceClient(config?: Partial<AdSpaceConfig>): AdSpaceClient;
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGtD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,eAAe,CAAW;gBAEtB,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAc/C;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,WAAW,IAAI,eAAe;IAI9B;;OAEG;IACH,kBAAkB,IAAI,QAAQ;IAI9B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAkC5D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA4B1D;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgC/D;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA4BhD;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAW5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAElF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Network configuration for AdSpace contracts
3
+ */
4
+ export interface NetworkConfig {
5
+ /** Chain ID (e.g., 11155111 for Sepolia) */
6
+ chainId: number;
7
+ /** Human-readable network name */
8
+ name: string;
9
+ /** RPC endpoint URL */
10
+ rpcUrl: string;
11
+ /** Block explorer URL (optional) */
12
+ explorerUrl?: string;
13
+ }
14
+ /**
15
+ * Contract addresses configuration
16
+ */
17
+ export interface ContractAddresses {
18
+ /** AdSpaceManager contract address */
19
+ adSpaceManager: string;
20
+ /** AdSpaceNFT contract address (optional) */
21
+ adSpaceNFT?: string;
22
+ /** CampaignNFT contract address (optional) */
23
+ campaignNFT?: string;
24
+ }
25
+ /**
26
+ * IPFS gateway configuration
27
+ */
28
+ export interface IPFSConfig {
29
+ /** Primary IPFS gateway URL */
30
+ gateway: string;
31
+ /** Fallback gateways */
32
+ fallbackGateways?: string[];
33
+ }
34
+ /**
35
+ * Main SDK configuration
36
+ */
37
+ export interface AdSpaceConfig {
38
+ /** Network configuration */
39
+ network: NetworkConfig;
40
+ /** Contract addresses */
41
+ contracts: ContractAddresses;
42
+ /** IPFS configuration */
43
+ ipfs?: IPFSConfig;
44
+ /** Auto-refresh interval for ads (in seconds, 0 to disable) */
45
+ refreshInterval?: number;
46
+ /** Enable debug logging */
47
+ debug?: boolean;
48
+ }
49
+ /**
50
+ * Default configuration for Sepolia testnet
51
+ */
52
+ export declare const DEFAULT_CONFIG: AdSpaceConfig;
53
+ /**
54
+ * Merges user config with defaults
55
+ */
56
+ export declare function createConfig(userConfig: Partial<AdSpaceConfig>): AdSpaceConfig;
57
+ //# sourceMappingURL=config.d.ts.map