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