@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.
- package/README.md +52 -0
- package/dist/campaign-8I-L9KNW.js +319 -0
- package/dist/campaign-8I-L9KNW.js.map +1 -0
- package/dist/campaign-D-02mKGw.cjs +2 -0
- package/dist/campaign-D-02mKGw.cjs.map +1 -0
- package/dist/core/client.d.ts +63 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/config.d.ts +57 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/contracts.d.ts +167 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/types.d.ts +89 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/utils/campaign.d.ts +22 -0
- package/dist/core/utils/campaign.d.ts.map +1 -0
- package/dist/core/utils/index.d.ts +3 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/ipfs.d.ts +13 -0
- package/dist/core/utils/ipfs.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/react/components/AdWidget.d.ts +49 -0
- package/dist/react/components/AdWidget.d.ts.map +1 -0
- package/dist/react/components/index.d.ts +3 -0
- package/dist/react/components/index.d.ts.map +1 -0
- package/dist/react/context.d.ts +39 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/hooks/index.d.ts +3 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/useActiveAd.d.ts +41 -0
- package/dist/react/hooks/useActiveAd.d.ts.map +1 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react.cjs +2 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.ts +8 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +167 -0
- package/dist/react.js.map +1 -0
- package/dist/vue/components/AdWidget.vue.d.ts +41 -0
- package/dist/vue/components/AdWidget.vue.d.ts.map +1 -0
- package/dist/vue/components/index.d.ts +2 -0
- package/dist/vue/components/index.d.ts.map +1 -0
- package/dist/vue/composables/index.d.ts +3 -0
- package/dist/vue/composables/index.d.ts.map +1 -0
- package/dist/vue/composables/useActiveAd.d.ts +38 -0
- package/dist/vue/composables/useActiveAd.d.ts.map +1 -0
- package/dist/vue/index.d.ts +6 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/plugin.d.ts +32 -0
- package/dist/vue/plugin.d.ts.map +1 -0
- package/dist/vue.cjs +2 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.ts +7 -0
- package/dist/vue.d.ts.map +1 -0
- package/dist/vue.js +140 -0
- package/dist/vue.js.map +1 -0
- 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":"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"}
|
|
@@ -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
|