pepay-streams-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 (62) hide show
  1. package/README.md +405 -0
  2. package/dist/api/index.d.mts +321 -0
  3. package/dist/api/index.d.ts +321 -0
  4. package/dist/api/index.js +312 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/index.mjs +306 -0
  7. package/dist/api/index.mjs.map +1 -0
  8. package/dist/automation/index.d.mts +140 -0
  9. package/dist/automation/index.d.ts +140 -0
  10. package/dist/automation/index.js +331 -0
  11. package/dist/automation/index.js.map +1 -0
  12. package/dist/automation/index.mjs +326 -0
  13. package/dist/automation/index.mjs.map +1 -0
  14. package/dist/campaigns/index.d.mts +286 -0
  15. package/dist/campaigns/index.d.ts +286 -0
  16. package/dist/campaigns/index.js +652 -0
  17. package/dist/campaigns/index.js.map +1 -0
  18. package/dist/campaigns/index.mjs +645 -0
  19. package/dist/campaigns/index.mjs.map +1 -0
  20. package/dist/claims/index.d.mts +190 -0
  21. package/dist/claims/index.d.ts +190 -0
  22. package/dist/claims/index.js +414 -0
  23. package/dist/claims/index.js.map +1 -0
  24. package/dist/claims/index.mjs +409 -0
  25. package/dist/claims/index.mjs.map +1 -0
  26. package/dist/index-BTG0TRJt.d.mts +555 -0
  27. package/dist/index-BTG0TRJt.d.ts +555 -0
  28. package/dist/index.d.mts +170 -0
  29. package/dist/index.d.ts +170 -0
  30. package/dist/index.js +2926 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.mjs +2888 -0
  33. package/dist/index.mjs.map +1 -0
  34. package/dist/marketplace/index.d.mts +225 -0
  35. package/dist/marketplace/index.d.ts +225 -0
  36. package/dist/marketplace/index.js +529 -0
  37. package/dist/marketplace/index.js.map +1 -0
  38. package/dist/marketplace/index.mjs +524 -0
  39. package/dist/marketplace/index.mjs.map +1 -0
  40. package/dist/react/index.d.mts +185 -0
  41. package/dist/react/index.d.ts +185 -0
  42. package/dist/react/index.js +340 -0
  43. package/dist/react/index.js.map +1 -0
  44. package/dist/react/index.mjs +333 -0
  45. package/dist/react/index.mjs.map +1 -0
  46. package/dist/staking/index.d.mts +158 -0
  47. package/dist/staking/index.d.ts +158 -0
  48. package/dist/staking/index.js +359 -0
  49. package/dist/staking/index.js.map +1 -0
  50. package/dist/staking/index.mjs +354 -0
  51. package/dist/staking/index.mjs.map +1 -0
  52. package/package.json +106 -0
  53. package/src/api/index.ts +577 -0
  54. package/src/automation/index.ts +436 -0
  55. package/src/campaigns/index.ts +835 -0
  56. package/src/claims/index.ts +530 -0
  57. package/src/client.ts +518 -0
  58. package/src/index.ts +101 -0
  59. package/src/marketplace/index.ts +730 -0
  60. package/src/react/index.ts +498 -0
  61. package/src/staking/index.ts +449 -0
  62. package/src/types/index.ts +631 -0
@@ -0,0 +1,524 @@
1
+ import { zeroAddress } from 'viem';
2
+ import { DIAMOND_ABI } from '@pepay-streams/abi/diamond';
3
+
4
+ // src/marketplace/index.ts
5
+ var MarketplaceModule = class {
6
+ constructor(publicClient, walletClient, diamondAddress) {
7
+ this.publicClient = publicClient;
8
+ this.walletClient = walletClient;
9
+ this.diamondAddress = diamondAddress;
10
+ }
11
+ // ============================================================================
12
+ // Order Creation
13
+ // ============================================================================
14
+ /**
15
+ * Create an INSTANT order
16
+ *
17
+ * Seller deposits tokens upfront, buyer pays and receives immediately.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Approve first
22
+ * await sdk.approve(sellToken, amount);
23
+ *
24
+ * const result = await sdk.marketplace.createInstantOrder({
25
+ * sellToken: '0x...',
26
+ * sellAmount: parseEther('1000'),
27
+ * payToken: zeroAddress, // Native ETH
28
+ * pricePerToken: parseEther('0.001'), // 0.001 ETH per token
29
+ * expiryTTL: 7 * 24 * 60 * 60, // 7 days
30
+ * });
31
+ * ```
32
+ */
33
+ async createInstantOrder(params) {
34
+ const wallet = this.requireWallet();
35
+ const visibility = params.privateBuyers && params.privateBuyers.length > 0 ? 1 /* PRIVATE */ : 0 /* PUBLIC */;
36
+ const expiry = BigInt(
37
+ Math.floor(Date.now() / 1e3) + (params.expiryTTL ?? 7 * 24 * 60 * 60)
38
+ );
39
+ const args = {
40
+ payToken: params.payToken,
41
+ price: params.pricePerToken,
42
+ sellToken: params.sellToken,
43
+ sellAmount: params.sellAmount,
44
+ visibility,
45
+ allowedBuyers: params.privateBuyers ?? [],
46
+ expiry
47
+ };
48
+ const hash = await wallet.writeContract({
49
+ chain: wallet.chain,
50
+ account: wallet.account,
51
+ address: this.diamondAddress,
52
+ abi: DIAMOND_ABI,
53
+ functionName: "createOrderInstant",
54
+ args: [args]
55
+ });
56
+ return this.createTransactionResult(hash);
57
+ }
58
+ /**
59
+ * Create a VESTED order
60
+ *
61
+ * Seller deposits tokens that vest over time for the buyer.
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const result = await sdk.marketplace.createVestedOrder({
66
+ * sellToken: '0x...',
67
+ * sellAmount: parseEther('10000'),
68
+ * payToken: '0x...', // USDC
69
+ * pricePerToken: 1000000n, // 1 USDC (6 decimals)
70
+ * vestingDuration: 365 * 24 * 60 * 60, // 1 year
71
+ * cliffDuration: 30 * 24 * 60 * 60, // 30 day cliff
72
+ * startMode: 'upon_fill', // Vesting starts when order is filled
73
+ * });
74
+ * ```
75
+ */
76
+ async createVestedOrder(params) {
77
+ const wallet = this.requireWallet();
78
+ const visibility = params.privateBuyers && params.privateBuyers.length > 0 ? 1 /* PRIVATE */ : 0 /* PUBLIC */;
79
+ const expiry = BigInt(
80
+ Math.floor(Date.now() / 1e3) + (params.expiryTTL ?? 7 * 24 * 60 * 60)
81
+ );
82
+ const cliffBps = params.cliffDuration && params.vestingDuration ? Math.floor(params.cliffDuration / params.vestingDuration * 1e4) : 0;
83
+ const args = {
84
+ payToken: params.payToken,
85
+ price: params.pricePerToken,
86
+ sellToken: params.sellToken,
87
+ sellAmount: params.sellAmount,
88
+ visibility,
89
+ allowedBuyers: params.privateBuyers ?? [],
90
+ expiry,
91
+ vest: {
92
+ startMode: params.startMode === "fixed_timestamp" ? 1 /* FIXED_TIMESTAMP */ : 0 /* UPON_FILL */,
93
+ startAt: BigInt(params.fixedStartTime ?? 0),
94
+ durationSec: params.vestingDuration,
95
+ stepSec: 0,
96
+ // Linear vesting
97
+ cliffBps
98
+ }
99
+ };
100
+ const hash = await wallet.writeContract({
101
+ chain: wallet.chain,
102
+ account: wallet.account,
103
+ address: this.diamondAddress,
104
+ abi: DIAMOND_ABI,
105
+ functionName: "createOrderVested",
106
+ args: [args]
107
+ });
108
+ return this.createTransactionResult(hash);
109
+ }
110
+ /**
111
+ * Create a TRADABLE order
112
+ *
113
+ * List an unvested campaign position for sale. No upfront deposit -
114
+ * the position is transferred when the order is filled.
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * // Must have a position in a VestedAirdrop campaign with trading enabled
119
+ * const result = await sdk.marketplace.createTradableOrder({
120
+ * campaignId: 10n,
121
+ * pricePerToken: parseEther('0.05'), // 0.05 ETH per token
122
+ * payToken: zeroAddress, // Native ETH
123
+ * expiryTTL: 30 * 24 * 60 * 60, // 30 days
124
+ * });
125
+ * console.log('Order created, tx:', result.hash);
126
+ * ```
127
+ */
128
+ async createTradableOrder(params) {
129
+ const wallet = this.requireWallet();
130
+ const visibility = params.privateBuyers && params.privateBuyers.length > 0 ? 1 /* PRIVATE */ : 0 /* PUBLIC */;
131
+ const expiry = BigInt(
132
+ Math.floor(Date.now() / 1e3) + (params.expiryTTL ?? 30 * 24 * 60 * 60)
133
+ );
134
+ const args = {
135
+ payToken: params.payToken,
136
+ price: params.pricePerToken,
137
+ campaignId: params.campaignId,
138
+ visibility,
139
+ allowedBuyers: params.privateBuyers ?? [],
140
+ expiry,
141
+ escrowRouting: zeroAddress
142
+ // Default to no escrow routing
143
+ };
144
+ const hash = await wallet.writeContract({
145
+ chain: wallet.chain,
146
+ account: wallet.account,
147
+ address: this.diamondAddress,
148
+ abi: DIAMOND_ABI,
149
+ functionName: "createOrderTradable",
150
+ args: [args]
151
+ });
152
+ return this.createTransactionResult(hash);
153
+ }
154
+ // ============================================================================
155
+ // Order Settlement
156
+ // ============================================================================
157
+ /**
158
+ * Fill an order (buy)
159
+ *
160
+ * For native payment orders, send ETH as value.
161
+ * For token payment orders, approve the Diamond first.
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * // Get quote first
166
+ * const quote = await sdk.marketplace.getQuote(orderId);
167
+ *
168
+ * // Fill with native ETH
169
+ * const result = await sdk.marketplace.fillOrder(orderId, {
170
+ * value: quote.totalPrice,
171
+ * });
172
+ *
173
+ * // Or fill with ERC20 (approve first)
174
+ * await sdk.approve(payToken, quote.totalPrice);
175
+ * await sdk.marketplace.fillOrder(orderId);
176
+ * ```
177
+ */
178
+ async fillOrder(orderId, options) {
179
+ const wallet = this.requireWallet();
180
+ const hash = await wallet.writeContract({
181
+ chain: wallet.chain,
182
+ account: wallet.account,
183
+ address: this.diamondAddress,
184
+ abi: DIAMOND_ABI,
185
+ functionName: "fillOrder",
186
+ args: [orderId],
187
+ value: options?.value
188
+ });
189
+ return this.createTransactionResult(hash);
190
+ }
191
+ /**
192
+ * Fill an order using Permit2 (gasless token approval)
193
+ */
194
+ async fillOrderWithPermit(params) {
195
+ const wallet = this.requireWallet();
196
+ const hash = await wallet.writeContract({
197
+ chain: wallet.chain,
198
+ account: wallet.account,
199
+ address: this.diamondAddress,
200
+ abi: DIAMOND_ABI,
201
+ functionName: "fillOrderWithPermit",
202
+ args: [params.orderId, params.permit2Payload]
203
+ });
204
+ return this.createTransactionResult(hash);
205
+ }
206
+ /**
207
+ * Cancel an order (seller only)
208
+ *
209
+ * Returns deposited tokens to seller.
210
+ *
211
+ * @example
212
+ * ```typescript
213
+ * const result = await sdk.marketplace.cancelOrder(orderId);
214
+ * ```
215
+ */
216
+ async cancelOrder(orderId) {
217
+ const wallet = this.requireWallet();
218
+ const hash = await wallet.writeContract({
219
+ chain: wallet.chain,
220
+ account: wallet.account,
221
+ address: this.diamondAddress,
222
+ abi: DIAMOND_ABI,
223
+ functionName: "cancelOrder",
224
+ args: [orderId]
225
+ });
226
+ return this.createTransactionResult(hash);
227
+ }
228
+ /**
229
+ * Expire an order (anyone can call after expiry)
230
+ *
231
+ * Returns deposited tokens to seller.
232
+ */
233
+ async expireOrder(orderId) {
234
+ const wallet = this.requireWallet();
235
+ const hash = await wallet.writeContract({
236
+ chain: wallet.chain,
237
+ account: wallet.account,
238
+ address: this.diamondAddress,
239
+ abi: DIAMOND_ABI,
240
+ functionName: "expireOrder",
241
+ args: [orderId]
242
+ });
243
+ return this.createTransactionResult(hash);
244
+ }
245
+ // ============================================================================
246
+ // Order Queries
247
+ // ============================================================================
248
+ /**
249
+ * Get order information by ID
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * const order = await sdk.marketplace.getOrder(1n);
254
+ * console.log('Seller:', order.seller);
255
+ * console.log('Price:', formatEther(order.totalPrice));
256
+ * console.log('Status:', order.status);
257
+ * ```
258
+ */
259
+ async getOrder(orderId) {
260
+ const result = await this.publicClient.readContract({
261
+ address: this.diamondAddress,
262
+ abi: DIAMOND_ABI,
263
+ functionName: "getOrder",
264
+ args: [orderId]
265
+ });
266
+ return this.parseOrderInfo(result);
267
+ }
268
+ /**
269
+ * Get order quote (price breakdown)
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * const quote = await sdk.marketplace.getQuote(orderId);
274
+ * console.log('Total price:', formatEther(quote.totalPrice));
275
+ * console.log('Protocol fee:', formatEther(quote.protocolFee));
276
+ * ```
277
+ */
278
+ async getQuote(orderId) {
279
+ const result = await this.publicClient.readContract({
280
+ address: this.diamondAddress,
281
+ abi: DIAMOND_ABI,
282
+ functionName: "quote",
283
+ args: [orderId]
284
+ });
285
+ const order = await this.getOrder(orderId);
286
+ return {
287
+ orderId,
288
+ totalPrice: result.price,
289
+ protocolFee: result.feeAmount,
290
+ buyerReceives: order.sellAmount,
291
+ sellerReceives: result.proceeds,
292
+ isValid: order.status === "open" && order.expiresAt > Math.floor(Date.now() / 1e3),
293
+ expiresAt: order.expiresAt
294
+ };
295
+ }
296
+ /**
297
+ * Get detailed quote for filling an order
298
+ */
299
+ async getQuoteFill(orderId) {
300
+ const result = await this.publicClient.readContract({
301
+ address: this.diamondAddress,
302
+ abi: DIAMOND_ABI,
303
+ functionName: "quoteFill",
304
+ args: [orderId]
305
+ });
306
+ return result;
307
+ }
308
+ /**
309
+ * Get next order ID (also indicates total orders created)
310
+ */
311
+ async getNextOrderId() {
312
+ const result = await this.publicClient.readContract({
313
+ address: this.diamondAddress,
314
+ abi: DIAMOND_ABI,
315
+ functionName: "nextOrderId",
316
+ args: []
317
+ });
318
+ return result;
319
+ }
320
+ /**
321
+ * Get orders by seller with pagination
322
+ */
323
+ async getOrdersBySeller(seller, offset = 0, limit = 100) {
324
+ const result = await this.publicClient.readContract({
325
+ address: this.diamondAddress,
326
+ abi: DIAMOND_ABI,
327
+ functionName: "ordersOf",
328
+ args: [seller, BigInt(offset), BigInt(limit)]
329
+ });
330
+ return result.map((order) => this.parseOrderInfo(order));
331
+ }
332
+ /**
333
+ * Get orders for a campaign
334
+ */
335
+ async getOrdersForCampaign(campaignId) {
336
+ const result = await this.publicClient.readContract({
337
+ address: this.diamondAddress,
338
+ abi: DIAMOND_ABI,
339
+ functionName: "ordersByCampaign",
340
+ args: [campaignId]
341
+ });
342
+ return result;
343
+ }
344
+ /**
345
+ * Get active order for a campaign
346
+ */
347
+ async getActiveOrderForCampaign(campaignId) {
348
+ const result = await this.publicClient.readContract({
349
+ address: this.diamondAddress,
350
+ abi: DIAMOND_ABI,
351
+ functionName: "getActiveOrderForCampaign",
352
+ args: [campaignId]
353
+ });
354
+ return result;
355
+ }
356
+ /**
357
+ * Preview available amount to sell for a campaign
358
+ */
359
+ async previewAvailableToSell(campaignId) {
360
+ const result = await this.publicClient.readContract({
361
+ address: this.diamondAddress,
362
+ abi: DIAMOND_ABI,
363
+ functionName: "previewAvailableToSell",
364
+ args: [campaignId]
365
+ });
366
+ return {
367
+ futureUnlockable: result.futureUnlockable,
368
+ claimableNow: result.claimableNow,
369
+ asOf: Number(result.asOf)
370
+ };
371
+ }
372
+ /**
373
+ * Get all open orders
374
+ */
375
+ async getOpenOrders(limit = 100) {
376
+ const nextId = await this.getNextOrderId();
377
+ const orders = [];
378
+ for (let i = 0n; i < nextId && orders.length < limit; i++) {
379
+ try {
380
+ const order = await this.getOrder(i);
381
+ if (order.status === "open") {
382
+ orders.push(order);
383
+ }
384
+ } catch {
385
+ }
386
+ }
387
+ return orders;
388
+ }
389
+ // ============================================================================
390
+ // Validation
391
+ // ============================================================================
392
+ /**
393
+ * Check if trading is allowed for a campaign
394
+ */
395
+ async isTradingEnabled(campaignId) {
396
+ const result = await this.publicClient.readContract({
397
+ address: this.diamondAddress,
398
+ abi: DIAMOND_ABI,
399
+ functionName: "isTradeLocked",
400
+ args: [campaignId]
401
+ });
402
+ return !result;
403
+ }
404
+ // ============================================================================
405
+ // Trade Policy (Creator Functions)
406
+ // ============================================================================
407
+ /**
408
+ * Lock trading for a campaign (creator only)
409
+ *
410
+ * Prevents new orders from being created for this campaign.
411
+ */
412
+ async lockTrading(campaignId) {
413
+ const wallet = this.requireWallet();
414
+ const hash = await wallet.writeContract({
415
+ chain: wallet.chain,
416
+ account: wallet.account,
417
+ address: this.diamondAddress,
418
+ abi: DIAMOND_ABI,
419
+ functionName: "setTradeLocked",
420
+ args: [campaignId, true]
421
+ });
422
+ return this.createTransactionResult(hash);
423
+ }
424
+ /**
425
+ * Unlock trading for a campaign (creator only)
426
+ */
427
+ async unlockTrading(campaignId) {
428
+ const wallet = this.requireWallet();
429
+ const hash = await wallet.writeContract({
430
+ chain: wallet.chain,
431
+ account: wallet.account,
432
+ address: this.diamondAddress,
433
+ abi: DIAMOND_ABI,
434
+ functionName: "setTradeLocked",
435
+ args: [campaignId, false]
436
+ });
437
+ return this.createTransactionResult(hash);
438
+ }
439
+ // ============================================================================
440
+ // Utility Functions
441
+ // ============================================================================
442
+ /**
443
+ * Calculate total price for a given amount at price per token
444
+ */
445
+ calculateTotalPrice(amount, pricePerToken) {
446
+ return amount * pricePerToken / BigInt(1e18);
447
+ }
448
+ /**
449
+ * Check if payment is in native token (ETH/BNB/etc)
450
+ */
451
+ isNativePayment(payToken) {
452
+ return payToken === zeroAddress;
453
+ }
454
+ // ============================================================================
455
+ // Helpers
456
+ // ============================================================================
457
+ requireWallet() {
458
+ if (!this.walletClient) {
459
+ throw new Error(
460
+ "Wallet client required for write operations. Initialize SDK with a signer."
461
+ );
462
+ }
463
+ return this.walletClient;
464
+ }
465
+ parseOrderInfo(order) {
466
+ const orderTypeMap = {
467
+ 0: "instant",
468
+ 1: "vested",
469
+ 2: "tradable"
470
+ };
471
+ const statusMap = {
472
+ 0: "open",
473
+ 1: "filled",
474
+ 2: "canceled",
475
+ 3: "expired"
476
+ };
477
+ const result = {
478
+ id: order.id,
479
+ orderType: orderTypeMap[order.kind] ?? "instant",
480
+ seller: order.seller,
481
+ sellToken: order.sellToken,
482
+ sellAmount: order.sellAmount,
483
+ payToken: order.payToken,
484
+ totalPrice: order.price,
485
+ pricePerToken: order.sellAmount > 0n ? order.price * BigInt(1e18) / order.sellAmount : 0n,
486
+ status: statusMap[order.status] ?? "open",
487
+ createdAt: 0,
488
+ // Not stored in Order struct
489
+ expiresAt: Number(order.expiry)
490
+ };
491
+ if (order.campaignId > 0n) {
492
+ result.campaignId = order.campaignId;
493
+ }
494
+ if (order.vest.durationSec > 0) {
495
+ result.vestingDuration = order.vest.durationSec;
496
+ }
497
+ if (order.vest.cliffBps > 0) {
498
+ result.cliffDuration = Math.floor(order.vest.durationSec * order.vest.cliffBps / 1e4);
499
+ }
500
+ return result;
501
+ }
502
+ createTransactionResult(hash) {
503
+ return {
504
+ hash,
505
+ wait: async () => {
506
+ const receipt = await this.publicClient.waitForTransactionReceipt({
507
+ hash
508
+ });
509
+ return {
510
+ blockNumber: receipt.blockNumber,
511
+ transactionHash: receipt.transactionHash,
512
+ gasUsed: receipt.gasUsed,
513
+ status: receipt.status,
514
+ logs: receipt.logs
515
+ };
516
+ }
517
+ };
518
+ }
519
+ };
520
+ var marketplace_default = MarketplaceModule;
521
+
522
+ export { MarketplaceModule, marketplace_default as default };
523
+ //# sourceMappingURL=index.mjs.map
524
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Marketplace Module\r\n *\r\n * Provides methods for P2P vesting marketplace:\r\n * - Create orders (INSTANT, VESTED, TRADABLE)\r\n * - Fill orders\r\n * - Cancel orders\r\n * - Order queries\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n type Hex,\r\n zeroAddress,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n CreateInstantOrderParams,\r\n CreateVestedOrderParams,\r\n CreateTradableOrderParams,\r\n OrderInfo,\r\n OrderQuote,\r\n TransactionResult,\r\n OrderType,\r\n} from '../types';\r\n\r\n/**\r\n * Visibility enum matching contract\r\n */\r\nenum Visibility {\r\n PUBLIC = 0,\r\n PRIVATE = 1,\r\n}\r\n\r\n/**\r\n * StartMode enum matching contract\r\n */\r\nenum StartMode {\r\n UPON_FILL = 0,\r\n FIXED_TIMESTAMP = 1,\r\n}\r\n\r\n/**\r\n * Marketplace module for P2P trading of token positions\r\n */\r\nexport class MarketplaceModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Order Creation\r\n // ============================================================================\r\n\r\n /**\r\n * Create an INSTANT order\r\n *\r\n * Seller deposits tokens upfront, buyer pays and receives immediately.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Approve first\r\n * await sdk.approve(sellToken, amount);\r\n *\r\n * const result = await sdk.marketplace.createInstantOrder({\r\n * sellToken: '0x...',\r\n * sellAmount: parseEther('1000'),\r\n * payToken: zeroAddress, // Native ETH\r\n * pricePerToken: parseEther('0.001'), // 0.001 ETH per token\r\n * expiryTTL: 7 * 24 * 60 * 60, // 7 days\r\n * });\r\n * ```\r\n */\r\n async createInstantOrder(\r\n params: CreateInstantOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 7 * 24 * 60 * 60)\r\n );\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n sellToken: params.sellToken,\r\n sellAmount: params.sellAmount,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderInstant',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a VESTED order\r\n *\r\n * Seller deposits tokens that vest over time for the buyer.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.marketplace.createVestedOrder({\r\n * sellToken: '0x...',\r\n * sellAmount: parseEther('10000'),\r\n * payToken: '0x...', // USDC\r\n * pricePerToken: 1000000n, // 1 USDC (6 decimals)\r\n * vestingDuration: 365 * 24 * 60 * 60, // 1 year\r\n * cliffDuration: 30 * 24 * 60 * 60, // 30 day cliff\r\n * startMode: 'upon_fill', // Vesting starts when order is filled\r\n * });\r\n * ```\r\n */\r\n async createVestedOrder(\r\n params: CreateVestedOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 7 * 24 * 60 * 60)\r\n );\r\n\r\n // Convert cliff duration to basis points (percentage of total duration)\r\n const cliffBps =\r\n params.cliffDuration && params.vestingDuration\r\n ? Math.floor((params.cliffDuration / params.vestingDuration) * 10000)\r\n : 0;\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n sellToken: params.sellToken,\r\n sellAmount: params.sellAmount,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n vest: {\r\n startMode:\r\n params.startMode === 'fixed_timestamp'\r\n ? StartMode.FIXED_TIMESTAMP\r\n : StartMode.UPON_FILL,\r\n startAt: BigInt(params.fixedStartTime ?? 0),\r\n durationSec: params.vestingDuration,\r\n stepSec: 0, // Linear vesting\r\n cliffBps,\r\n },\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderVested',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a TRADABLE order\r\n *\r\n * List an unvested campaign position for sale. No upfront deposit -\r\n * the position is transferred when the order is filled.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Must have a position in a VestedAirdrop campaign with trading enabled\r\n * const result = await sdk.marketplace.createTradableOrder({\r\n * campaignId: 10n,\r\n * pricePerToken: parseEther('0.05'), // 0.05 ETH per token\r\n * payToken: zeroAddress, // Native ETH\r\n * expiryTTL: 30 * 24 * 60 * 60, // 30 days\r\n * });\r\n * console.log('Order created, tx:', result.hash);\r\n * ```\r\n */\r\n async createTradableOrder(\r\n params: CreateTradableOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 30 * 24 * 60 * 60)\r\n );\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n campaignId: params.campaignId,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n escrowRouting: zeroAddress, // Default to no escrow routing\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderTradable',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Order Settlement\r\n // ============================================================================\r\n\r\n /**\r\n * Fill an order (buy)\r\n *\r\n * For native payment orders, send ETH as value.\r\n * For token payment orders, approve the Diamond first.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get quote first\r\n * const quote = await sdk.marketplace.getQuote(orderId);\r\n *\r\n * // Fill with native ETH\r\n * const result = await sdk.marketplace.fillOrder(orderId, {\r\n * value: quote.totalPrice,\r\n * });\r\n *\r\n * // Or fill with ERC20 (approve first)\r\n * await sdk.approve(payToken, quote.totalPrice);\r\n * await sdk.marketplace.fillOrder(orderId);\r\n * ```\r\n */\r\n async fillOrder(\r\n orderId: bigint,\r\n options?: { value?: bigint }\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fillOrder',\r\n args: [orderId],\r\n value: options?.value,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Fill an order using Permit2 (gasless token approval)\r\n */\r\n async fillOrderWithPermit(params: {\r\n orderId: bigint;\r\n permit2Payload: Hex;\r\n }): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fillOrderWithPermit',\r\n args: [params.orderId, params.permit2Payload],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Cancel an order (seller only)\r\n *\r\n * Returns deposited tokens to seller.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.marketplace.cancelOrder(orderId);\r\n * ```\r\n */\r\n async cancelOrder(orderId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'cancelOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Expire an order (anyone can call after expiry)\r\n *\r\n * Returns deposited tokens to seller.\r\n */\r\n async expireOrder(orderId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'expireOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Order Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get order information by ID\r\n *\r\n * @example\r\n * ```typescript\r\n * const order = await sdk.marketplace.getOrder(1n);\r\n * console.log('Seller:', order.seller);\r\n * console.log('Price:', formatEther(order.totalPrice));\r\n * console.log('Status:', order.status);\r\n * ```\r\n */\r\n async getOrder(orderId: bigint): Promise<OrderInfo> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.parseOrderInfo(result as unknown as OrderStruct);\r\n }\r\n\r\n /**\r\n * Get order quote (price breakdown)\r\n *\r\n * @example\r\n * ```typescript\r\n * const quote = await sdk.marketplace.getQuote(orderId);\r\n * console.log('Total price:', formatEther(quote.totalPrice));\r\n * console.log('Protocol fee:', formatEther(quote.protocolFee));\r\n * ```\r\n */\r\n async getQuote(orderId: bigint): Promise<OrderQuote> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'quote',\r\n args: [orderId],\r\n }) as { payToken: Address; feeBps: number; price: bigint; feeAmount: bigint; proceeds: bigint };\r\n\r\n // Also get the order to know if it's still valid\r\n const order = await this.getOrder(orderId);\r\n\r\n return {\r\n orderId,\r\n totalPrice: result.price,\r\n protocolFee: result.feeAmount,\r\n buyerReceives: order.sellAmount,\r\n sellerReceives: result.proceeds,\r\n isValid: order.status === 'open' && order.expiresAt > Math.floor(Date.now() / 1000),\r\n expiresAt: order.expiresAt,\r\n };\r\n }\r\n\r\n /**\r\n * Get detailed quote for filling an order\r\n */\r\n async getQuoteFill(orderId: bigint): Promise<{\r\n payToken: Address;\r\n price: bigint;\r\n feeBps: number;\r\n feeAmount: bigint;\r\n feeReceiver: Address;\r\n proceeds: bigint;\r\n seller: Address;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n deliveryKind: number;\r\n escrowFlushedToRouting: boolean;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'quoteFill',\r\n args: [orderId],\r\n }) as {\r\n payToken: Address;\r\n price: bigint;\r\n feeBps: number;\r\n feeAmount: bigint;\r\n feeReceiver: Address;\r\n proceeds: bigint;\r\n seller: Address;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n deliveryKind: number;\r\n escrowFlushedToRouting: boolean;\r\n };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get next order ID (also indicates total orders created)\r\n */\r\n async getNextOrderId(): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'nextOrderId',\r\n args: [],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get orders by seller with pagination\r\n */\r\n async getOrdersBySeller(\r\n seller: Address,\r\n offset = 0,\r\n limit = 100\r\n ): Promise<OrderInfo[]> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'ordersOf',\r\n args: [seller, BigInt(offset), BigInt(limit)],\r\n }) as unknown as OrderStruct[];\r\n\r\n return result.map((order) => this.parseOrderInfo(order));\r\n }\r\n\r\n /**\r\n * Get orders for a campaign\r\n */\r\n async getOrdersForCampaign(campaignId: bigint): Promise<{\r\n activeOrderId: bigint;\r\n historicalOrderIds: bigint[];\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'ordersByCampaign',\r\n args: [campaignId],\r\n }) as { activeOrderId: bigint; historicalOrderIds: bigint[] };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get active order for a campaign\r\n */\r\n async getActiveOrderForCampaign(campaignId: bigint): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getActiveOrderForCampaign',\r\n args: [campaignId],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Preview available amount to sell for a campaign\r\n */\r\n async previewAvailableToSell(campaignId: bigint): Promise<{\r\n futureUnlockable: bigint;\r\n claimableNow: bigint;\r\n asOf: number;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'previewAvailableToSell',\r\n args: [campaignId],\r\n }) as { futureUnlockable: bigint; claimableNow: bigint; asOf: bigint };\r\n\r\n return {\r\n futureUnlockable: result.futureUnlockable,\r\n claimableNow: result.claimableNow,\r\n asOf: Number(result.asOf),\r\n };\r\n }\r\n\r\n /**\r\n * Get all open orders\r\n */\r\n async getOpenOrders(limit = 100): Promise<OrderInfo[]> {\r\n const nextId = await this.getNextOrderId();\r\n const orders: OrderInfo[] = [];\r\n\r\n for (let i = 0n; i < nextId && orders.length < limit; i++) {\r\n try {\r\n const order = await this.getOrder(i);\r\n if (order.status === 'open') {\r\n orders.push(order);\r\n }\r\n } catch {\r\n // Order may not exist, skip\r\n }\r\n }\r\n\r\n return orders;\r\n }\r\n\r\n // ============================================================================\r\n // Validation\r\n // ============================================================================\r\n\r\n /**\r\n * Check if trading is allowed for a campaign\r\n */\r\n async isTradingEnabled(campaignId: bigint): Promise<boolean> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'isTradeLocked',\r\n args: [campaignId],\r\n });\r\n return !(result as boolean);\r\n }\r\n\r\n // ============================================================================\r\n // Trade Policy (Creator Functions)\r\n // ============================================================================\r\n\r\n /**\r\n * Lock trading for a campaign (creator only)\r\n *\r\n * Prevents new orders from being created for this campaign.\r\n */\r\n async lockTrading(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'setTradeLocked',\r\n args: [campaignId, true],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Unlock trading for a campaign (creator only)\r\n */\r\n async unlockTrading(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'setTradeLocked',\r\n args: [campaignId, false],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Utility Functions\r\n // ============================================================================\r\n\r\n /**\r\n * Calculate total price for a given amount at price per token\r\n */\r\n calculateTotalPrice(amount: bigint, pricePerToken: bigint): bigint {\r\n return (amount * pricePerToken) / BigInt(1e18);\r\n }\r\n\r\n /**\r\n * Check if payment is in native token (ETH/BNB/etc)\r\n */\r\n isNativePayment(payToken: Address): boolean {\r\n return payToken === zeroAddress;\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private parseOrderInfo(order: OrderStruct): OrderInfo {\r\n const orderTypeMap: Record<number, OrderType> = {\r\n 0: 'instant',\r\n 1: 'vested',\r\n 2: 'tradable',\r\n };\r\n\r\n const statusMap: Record<number, OrderInfo['status']> = {\r\n 0: 'open',\r\n 1: 'filled',\r\n 2: 'canceled',\r\n 3: 'expired',\r\n };\r\n\r\n const result: OrderInfo = {\r\n id: order.id,\r\n orderType: orderTypeMap[order.kind] ?? 'instant',\r\n seller: order.seller,\r\n sellToken: order.sellToken,\r\n sellAmount: order.sellAmount,\r\n payToken: order.payToken,\r\n totalPrice: order.price,\r\n pricePerToken: order.sellAmount > 0n\r\n ? (order.price * BigInt(1e18)) / order.sellAmount\r\n : 0n,\r\n status: statusMap[order.status] ?? 'open',\r\n createdAt: 0, // Not stored in Order struct\r\n expiresAt: Number(order.expiry),\r\n };\r\n\r\n // Add optional fields only if they have values\r\n if (order.campaignId > 0n) {\r\n result.campaignId = order.campaignId;\r\n }\r\n if (order.vest.durationSec > 0) {\r\n result.vestingDuration = order.vest.durationSec;\r\n }\r\n if (order.vest.cliffBps > 0) {\r\n result.cliffDuration = Math.floor((order.vest.durationSec * order.vest.cliffBps) / 10000);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Order struct matching contract\r\n */\r\ninterface OrderStruct {\r\n id: bigint;\r\n seller: Address;\r\n payToken: Address;\r\n price: bigint;\r\n kind: number;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n campaignId: bigint;\r\n visibility: number;\r\n allowedBuyers: readonly Address[];\r\n expiry: bigint;\r\n status: number;\r\n vest: {\r\n startMode: number;\r\n startAt: bigint;\r\n durationSec: number;\r\n stepSec: number;\r\n cliffBps: number;\r\n };\r\n listedBehaviour: number;\r\n escrowRouting: Address;\r\n}\r\n\r\nexport default MarketplaceModule;\r\n"]}