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.
- package/README.md +405 -0
- package/dist/api/index.d.mts +321 -0
- package/dist/api/index.d.ts +321 -0
- package/dist/api/index.js +312 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +306 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/automation/index.d.mts +140 -0
- package/dist/automation/index.d.ts +140 -0
- package/dist/automation/index.js +331 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/index.mjs +326 -0
- package/dist/automation/index.mjs.map +1 -0
- package/dist/campaigns/index.d.mts +286 -0
- package/dist/campaigns/index.d.ts +286 -0
- package/dist/campaigns/index.js +652 -0
- package/dist/campaigns/index.js.map +1 -0
- package/dist/campaigns/index.mjs +645 -0
- package/dist/campaigns/index.mjs.map +1 -0
- package/dist/claims/index.d.mts +190 -0
- package/dist/claims/index.d.ts +190 -0
- package/dist/claims/index.js +414 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/claims/index.mjs +409 -0
- package/dist/claims/index.mjs.map +1 -0
- package/dist/index-BTG0TRJt.d.mts +555 -0
- package/dist/index-BTG0TRJt.d.ts +555 -0
- package/dist/index.d.mts +170 -0
- package/dist/index.d.ts +170 -0
- package/dist/index.js +2926 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2888 -0
- package/dist/index.mjs.map +1 -0
- package/dist/marketplace/index.d.mts +225 -0
- package/dist/marketplace/index.d.ts +225 -0
- package/dist/marketplace/index.js +529 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/index.mjs +524 -0
- package/dist/marketplace/index.mjs.map +1 -0
- package/dist/react/index.d.mts +185 -0
- package/dist/react/index.d.ts +185 -0
- package/dist/react/index.js +340 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +333 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/staking/index.d.mts +158 -0
- package/dist/staking/index.d.ts +158 -0
- package/dist/staking/index.js +359 -0
- package/dist/staking/index.js.map +1 -0
- package/dist/staking/index.mjs +354 -0
- package/dist/staking/index.mjs.map +1 -0
- package/package.json +106 -0
- package/src/api/index.ts +577 -0
- package/src/automation/index.ts +436 -0
- package/src/campaigns/index.ts +835 -0
- package/src/claims/index.ts +530 -0
- package/src/client.ts +518 -0
- package/src/index.ts +101 -0
- package/src/marketplace/index.ts +730 -0
- package/src/react/index.ts +498 -0
- package/src/staking/index.ts +449 -0
- 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"]}
|