@rotateprotocol/sdk 1.0.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 +453 -0
- package/dist/catalog.d.ts +112 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +210 -0
- package/dist/catalog.js.map +1 -0
- package/dist/components/CheckoutForm.d.ts +86 -0
- package/dist/components/CheckoutForm.d.ts.map +1 -0
- package/dist/components/CheckoutForm.js +332 -0
- package/dist/components/CheckoutForm.js.map +1 -0
- package/dist/components/HostedCheckout.d.ts +57 -0
- package/dist/components/HostedCheckout.d.ts.map +1 -0
- package/dist/components/HostedCheckout.js +414 -0
- package/dist/components/HostedCheckout.js.map +1 -0
- package/dist/components/PaymentButton.d.ts +80 -0
- package/dist/components/PaymentButton.d.ts.map +1 -0
- package/dist/components/PaymentButton.js +210 -0
- package/dist/components/PaymentButton.js.map +1 -0
- package/dist/components/RotateProvider.d.ts +115 -0
- package/dist/components/RotateProvider.d.ts.map +1 -0
- package/dist/components/RotateProvider.js +264 -0
- package/dist/components/RotateProvider.js.map +1 -0
- package/dist/components/index.d.ts +17 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +27 -0
- package/dist/components/index.js.map +1 -0
- package/dist/embed.d.ts +85 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +313 -0
- package/dist/embed.js.map +1 -0
- package/dist/hooks.d.ts +156 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +280 -0
- package/dist/hooks.js.map +1 -0
- package/dist/idl/rotate_connect.json +2572 -0
- package/dist/index.d.ts +505 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1197 -0
- package/dist/index.js.map +1 -0
- package/dist/marketplace.d.ts +257 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +433 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/platform.d.ts +234 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +268 -0
- package/dist/platform.js.map +1 -0
- package/dist/react.d.ts +140 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +429 -0
- package/dist/react.js.map +1 -0
- package/dist/store.d.ts +213 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +404 -0
- package/dist/store.js.map +1 -0
- package/dist/webhooks.d.ts +149 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +371 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +114 -0
- package/src/catalog.ts +299 -0
- package/src/components/CheckoutForm.tsx +608 -0
- package/src/components/HostedCheckout.tsx +675 -0
- package/src/components/PaymentButton.tsx +348 -0
- package/src/components/RotateProvider.tsx +370 -0
- package/src/components/index.ts +26 -0
- package/src/embed.ts +408 -0
- package/src/hooks.ts +518 -0
- package/src/idl/rotate_connect.json +2572 -0
- package/src/index.ts +1538 -0
- package/src/marketplace.ts +642 -0
- package/src/platform.ts +403 -0
- package/src/react.ts +459 -0
- package/src/store.ts +577 -0
- package/src/webhooks.ts +506 -0
package/dist/store.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Rotate Store — Product Catalog, Cart & Checkout
|
|
4
|
+
*
|
|
5
|
+
* A complete store layer that sits on top of the Rotate Protocol.
|
|
6
|
+
* Products and cart state are managed client-side / in your database;
|
|
7
|
+
* only the final payment touches the blockchain.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const store = new RotateStore(sdk, {
|
|
12
|
+
* merchantId: 1000000,
|
|
13
|
+
* platformId: 1000000,
|
|
14
|
+
* currency: 'USD',
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* store.addProduct({ id: 'tshirt-01', name: 'Logo Tee', price: 29.99, inventory: 100 });
|
|
18
|
+
* store.addProduct({ id: 'hoodie-01', name: 'Zip Hoodie', price: 59.99, inventory: 50 });
|
|
19
|
+
*
|
|
20
|
+
* const cart = store.createCart();
|
|
21
|
+
* cart.addItem('tshirt-01', 2);
|
|
22
|
+
* cart.addItem('hoodie-01', 1);
|
|
23
|
+
*
|
|
24
|
+
* const session = await cart.checkout(); // creates on-chain payment link
|
|
25
|
+
* console.log(session.linkId, session.paymentUrl);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.RotateCart = exports.RotateStore = void 0;
|
|
32
|
+
const index_1 = require("./index");
|
|
33
|
+
const catalog_1 = require("./catalog");
|
|
34
|
+
// ==================== ROTATE STORE ====================
|
|
35
|
+
class RotateStore {
|
|
36
|
+
constructor(sdk, config) {
|
|
37
|
+
this.sdk = sdk;
|
|
38
|
+
this.config = {
|
|
39
|
+
merchantId: config.merchantId,
|
|
40
|
+
platformId: config.platformId,
|
|
41
|
+
currency: config.currency || 'USD',
|
|
42
|
+
allowTips: config.allowTips ?? false,
|
|
43
|
+
defaultExpiresIn: config.defaultExpiresIn ?? 300,
|
|
44
|
+
platformFeeBps: config.platformFeeBps ?? 0,
|
|
45
|
+
};
|
|
46
|
+
this.catalog = new catalog_1.Catalog((input) => {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
return { ...input, active: input.active ?? true, createdAt: now, updatedAt: now };
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// ==================== PRODUCT CATALOG (delegated to Catalog) ====================
|
|
52
|
+
addProduct(input) { return this.catalog.addProduct(input); }
|
|
53
|
+
addProducts(inputs) { return this.catalog.addProducts(inputs); }
|
|
54
|
+
updateProduct(id, updates) { return this.catalog.updateProduct(id, updates); }
|
|
55
|
+
removeProduct(id) { return this.catalog.removeProduct(id); }
|
|
56
|
+
getProduct(id) { return this.catalog.getProduct(id); }
|
|
57
|
+
getProducts(filter) { return this.catalog.getProducts(filter); }
|
|
58
|
+
getCategories() { return this.catalog.getCategories(); }
|
|
59
|
+
get productCount() { return this.catalog.productCount; }
|
|
60
|
+
// ==================== INVENTORY (delegated) ====================
|
|
61
|
+
isInStock(productId, quantity = 1) { return this.catalog.isInStock(productId, quantity); }
|
|
62
|
+
reserveInventory(productId, quantity) { this.catalog.reserveInventory(productId, quantity); }
|
|
63
|
+
releaseInventory(productId, quantity) { this.catalog.releaseInventory(productId, quantity); }
|
|
64
|
+
// ==================== DISCOUNTS (delegated) ====================
|
|
65
|
+
addDiscount(input) { return this.catalog.addDiscount(input); }
|
|
66
|
+
getDiscount(code) { return this.catalog.getDiscount(code); }
|
|
67
|
+
isDiscountValid(code, subtotal) { return this.catalog.isDiscountValid(code, subtotal); }
|
|
68
|
+
useDiscount(code) { this.catalog.useDiscount(code); }
|
|
69
|
+
// ==================== CART ====================
|
|
70
|
+
/** Create a new shopping cart */
|
|
71
|
+
createCart() {
|
|
72
|
+
return new RotateCart(this, this.sdk, this.config);
|
|
73
|
+
}
|
|
74
|
+
// ==================== BATCH LINK CREATION ====================
|
|
75
|
+
/**
|
|
76
|
+
* Create payment links for every active product in the catalog.
|
|
77
|
+
* Useful for generating a "Buy Now" link per product upfront.
|
|
78
|
+
* Processes sequentially to respect Solana transaction ordering.
|
|
79
|
+
*/
|
|
80
|
+
async createLinksForAllProducts(options) {
|
|
81
|
+
const products = options?.productIds
|
|
82
|
+
? options.productIds.map((id) => this.catalog.getProduct(id)).filter(Boolean)
|
|
83
|
+
: this.getProducts({ active: true });
|
|
84
|
+
const results = [];
|
|
85
|
+
const concurrency = options?.concurrency || 1; // sequential by default for Solana
|
|
86
|
+
// Process in batches
|
|
87
|
+
for (let i = 0; i < products.length; i += concurrency) {
|
|
88
|
+
const batch = products.slice(i, i + concurrency);
|
|
89
|
+
const batchResults = await Promise.all(batch.map(async (product) => {
|
|
90
|
+
const amountMicro = BigInt(Math.floor(product.price * 1000000));
|
|
91
|
+
const expiresAt = options?.expiresIn
|
|
92
|
+
? Math.floor(Date.now() / 1000) + options.expiresIn
|
|
93
|
+
: 0;
|
|
94
|
+
const result = await this.sdk.createLinkUsd({
|
|
95
|
+
merchantId: this.config.merchantId,
|
|
96
|
+
platformId: this.config.platformId,
|
|
97
|
+
amount: amountMicro,
|
|
98
|
+
expiresAt,
|
|
99
|
+
allowTips: this.config.allowTips,
|
|
100
|
+
allowPartial: false,
|
|
101
|
+
orderRef: product.id,
|
|
102
|
+
description: product.name,
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
productId: product.id,
|
|
106
|
+
linkId: result.linkId,
|
|
107
|
+
tx: result.tx,
|
|
108
|
+
paymentUrl: this.sdk.getPaymentUrl(result.linkId),
|
|
109
|
+
};
|
|
110
|
+
}));
|
|
111
|
+
results.push(...batchResults);
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
114
|
+
}
|
|
115
|
+
// ==================== SERIALIZATION ====================
|
|
116
|
+
/** Export the full catalog as JSON (for persistence / API) */
|
|
117
|
+
exportCatalog() {
|
|
118
|
+
return {
|
|
119
|
+
products: this.catalog.exportProducts(),
|
|
120
|
+
discounts: this.catalog.exportDiscounts(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Import a catalog from JSON */
|
|
124
|
+
importCatalog(data) {
|
|
125
|
+
this.catalog.importProducts(data.products);
|
|
126
|
+
if (data.discounts) {
|
|
127
|
+
this.catalog.importDiscounts(data.discounts);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.RotateStore = RotateStore;
|
|
132
|
+
// ==================== ROTATE CART ====================
|
|
133
|
+
class RotateCart {
|
|
134
|
+
/** @internal */
|
|
135
|
+
constructor(store, sdk, config) {
|
|
136
|
+
this.items = new Map();
|
|
137
|
+
this.appliedDiscounts = [];
|
|
138
|
+
this._metadata = {};
|
|
139
|
+
this.store = store;
|
|
140
|
+
this.sdk = sdk;
|
|
141
|
+
this.config = config;
|
|
142
|
+
}
|
|
143
|
+
// ==================== LINE ITEMS ====================
|
|
144
|
+
/** Add a product to the cart */
|
|
145
|
+
addItem(productId, quantity = 1) {
|
|
146
|
+
if (quantity <= 0)
|
|
147
|
+
throw new Error('Quantity must be positive');
|
|
148
|
+
const product = this.store.getProduct(productId);
|
|
149
|
+
if (!product)
|
|
150
|
+
throw new Error(`Product '${productId}' not found`);
|
|
151
|
+
if (!product.active)
|
|
152
|
+
throw new Error(`Product '${productId}' is not active`);
|
|
153
|
+
const existing = this.items.get(productId);
|
|
154
|
+
const newQty = (existing?.quantity || 0) + quantity;
|
|
155
|
+
if (!this.store.isInStock(productId, newQty)) {
|
|
156
|
+
throw new Error(`Insufficient stock for '${productId}'`);
|
|
157
|
+
}
|
|
158
|
+
const item = {
|
|
159
|
+
product,
|
|
160
|
+
quantity: newQty,
|
|
161
|
+
unitPrice: product.price,
|
|
162
|
+
};
|
|
163
|
+
this.items.set(productId, item);
|
|
164
|
+
return item;
|
|
165
|
+
}
|
|
166
|
+
/** Set exact quantity for a product */
|
|
167
|
+
setItemQuantity(productId, quantity) {
|
|
168
|
+
if (quantity <= 0) {
|
|
169
|
+
this.removeItem(productId);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const product = this.store.getProduct(productId);
|
|
173
|
+
if (!product)
|
|
174
|
+
throw new Error(`Product '${productId}' not found`);
|
|
175
|
+
if (!this.store.isInStock(productId, quantity)) {
|
|
176
|
+
throw new Error(`Insufficient stock for '${productId}'`);
|
|
177
|
+
}
|
|
178
|
+
const item = {
|
|
179
|
+
product,
|
|
180
|
+
quantity,
|
|
181
|
+
unitPrice: product.price,
|
|
182
|
+
};
|
|
183
|
+
this.items.set(productId, item);
|
|
184
|
+
return item;
|
|
185
|
+
}
|
|
186
|
+
/** Remove a product from the cart entirely */
|
|
187
|
+
removeItem(productId) {
|
|
188
|
+
return this.items.delete(productId);
|
|
189
|
+
}
|
|
190
|
+
/** Clear all items */
|
|
191
|
+
clear() {
|
|
192
|
+
this.items.clear();
|
|
193
|
+
this.appliedDiscounts = [];
|
|
194
|
+
this._metadata = {};
|
|
195
|
+
}
|
|
196
|
+
/** Get all line items */
|
|
197
|
+
getItems() {
|
|
198
|
+
return Array.from(this.items.values());
|
|
199
|
+
}
|
|
200
|
+
/** Check if cart is empty */
|
|
201
|
+
get isEmpty() {
|
|
202
|
+
return this.items.size === 0;
|
|
203
|
+
}
|
|
204
|
+
// ==================== DISCOUNTS ====================
|
|
205
|
+
/** Apply a discount code */
|
|
206
|
+
applyDiscount(code) {
|
|
207
|
+
const upperCode = code.toUpperCase();
|
|
208
|
+
if (this.appliedDiscounts.includes(upperCode))
|
|
209
|
+
return false;
|
|
210
|
+
const subtotal = this.calculateSubtotal();
|
|
211
|
+
if (!this.store.isDiscountValid(upperCode, subtotal))
|
|
212
|
+
return false;
|
|
213
|
+
this.appliedDiscounts.push(upperCode);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
/** Remove a discount code */
|
|
217
|
+
removeDiscount(code) {
|
|
218
|
+
const idx = this.appliedDiscounts.indexOf(code.toUpperCase());
|
|
219
|
+
if (idx === -1)
|
|
220
|
+
return false;
|
|
221
|
+
this.appliedDiscounts.splice(idx, 1);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
// ==================== METADATA ====================
|
|
225
|
+
/** Attach metadata to the order (customer email, shipping address, notes, etc.) */
|
|
226
|
+
setMetadata(key, value) {
|
|
227
|
+
this._metadata[key] = value;
|
|
228
|
+
}
|
|
229
|
+
getMetadata() {
|
|
230
|
+
return { ...this._metadata };
|
|
231
|
+
}
|
|
232
|
+
// ==================== TOTALS ====================
|
|
233
|
+
calculateSubtotal() {
|
|
234
|
+
let subtotal = 0;
|
|
235
|
+
for (const item of this.items.values()) {
|
|
236
|
+
subtotal += item.unitPrice * item.quantity;
|
|
237
|
+
}
|
|
238
|
+
return Math.round(subtotal * 100) / 100; // round to cents
|
|
239
|
+
}
|
|
240
|
+
calculateDiscountAmount(subtotal) {
|
|
241
|
+
let totalDiscount = 0;
|
|
242
|
+
for (const code of this.appliedDiscounts) {
|
|
243
|
+
const d = this.store.getDiscount(code);
|
|
244
|
+
if (!d || !d.active)
|
|
245
|
+
continue;
|
|
246
|
+
if (d.productIds && d.productIds.length > 0) {
|
|
247
|
+
// Product-specific discount
|
|
248
|
+
for (const item of this.items.values()) {
|
|
249
|
+
if (!d.productIds.includes(item.product.id))
|
|
250
|
+
continue;
|
|
251
|
+
const lineTotal = item.unitPrice * item.quantity;
|
|
252
|
+
if (d.type === 'percent') {
|
|
253
|
+
totalDiscount += lineTotal * (d.value / 100);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
totalDiscount += Math.min(d.value, lineTotal);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Cart-wide discount
|
|
262
|
+
if (d.type === 'percent') {
|
|
263
|
+
totalDiscount += subtotal * (d.value / 100);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
totalDiscount += d.value;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return Math.min(Math.round(totalDiscount * 100) / 100, subtotal);
|
|
271
|
+
}
|
|
272
|
+
/** Calculate full cart totals */
|
|
273
|
+
getTotals() {
|
|
274
|
+
const lines = [];
|
|
275
|
+
let subtotal = 0;
|
|
276
|
+
let totalQuantity = 0;
|
|
277
|
+
for (const item of this.items.values()) {
|
|
278
|
+
const lineTotal = Math.round(item.unitPrice * item.quantity * 100) / 100;
|
|
279
|
+
subtotal += lineTotal;
|
|
280
|
+
totalQuantity += item.quantity;
|
|
281
|
+
lines.push({
|
|
282
|
+
productId: item.product.id,
|
|
283
|
+
name: item.product.name,
|
|
284
|
+
quantity: item.quantity,
|
|
285
|
+
unitPrice: item.unitPrice,
|
|
286
|
+
lineTotal,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
subtotal = Math.round(subtotal * 100) / 100;
|
|
290
|
+
const discountAmount = this.calculateDiscountAmount(subtotal);
|
|
291
|
+
let afterDiscount = Math.round((subtotal - discountAmount) * 100) / 100;
|
|
292
|
+
if (afterDiscount < 0)
|
|
293
|
+
afterDiscount = 0;
|
|
294
|
+
// Convert to micro-units for fee calculation
|
|
295
|
+
const amountMicro = Math.floor(afterDiscount * 1000000);
|
|
296
|
+
const feesResult = (0, index_1.calculateFees)(amountMicro, this.config.platformFeeBps);
|
|
297
|
+
// Convert fees back to dollars
|
|
298
|
+
const fees = feesResult.buyerFeeShare / 1000000;
|
|
299
|
+
const total = Math.round((afterDiscount + fees) * 100) / 100;
|
|
300
|
+
const merchantReceives = feesResult.merchantReceives / 1000000;
|
|
301
|
+
return {
|
|
302
|
+
itemCount: this.items.size,
|
|
303
|
+
totalQuantity,
|
|
304
|
+
subtotal,
|
|
305
|
+
discountAmount,
|
|
306
|
+
afterDiscount,
|
|
307
|
+
fees: Math.round(fees * 100) / 100,
|
|
308
|
+
total: Math.round(total * 100) / 100,
|
|
309
|
+
merchantReceives: Math.round(merchantReceives * 100) / 100,
|
|
310
|
+
lines,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
// ==================== CHECKOUT ====================
|
|
314
|
+
/**
|
|
315
|
+
* Finalize the cart and create an on-chain payment link.
|
|
316
|
+
* Returns everything needed to present the payment to the buyer.
|
|
317
|
+
*/
|
|
318
|
+
async checkout(options) {
|
|
319
|
+
if (this.isEmpty)
|
|
320
|
+
throw new Error('Cart is empty');
|
|
321
|
+
const totals = this.getTotals();
|
|
322
|
+
if (totals.afterDiscount <= 0)
|
|
323
|
+
throw new Error('Cart total must be greater than zero');
|
|
324
|
+
// Validate all items are still in stock
|
|
325
|
+
for (const item of this.items.values()) {
|
|
326
|
+
if (!this.store.isInStock(item.product.id, item.quantity)) {
|
|
327
|
+
throw new Error(`'${item.product.name}' is out of stock`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const currency = options?.currency || this.config.currency;
|
|
331
|
+
const orderRef = options?.orderRef || `order_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
|
|
332
|
+
const expiresAt = (options?.expiresIn ?? this.config.defaultExpiresIn) > 0
|
|
333
|
+
? Math.floor(Date.now() / 1000) + (options?.expiresIn ?? this.config.defaultExpiresIn)
|
|
334
|
+
: 0;
|
|
335
|
+
const allowTips = options?.allowTips ?? this.config.allowTips;
|
|
336
|
+
// Auto-generate description from cart items (e.g. "2x Logo Tee, 1x Zip Hoodie")
|
|
337
|
+
const description = options?.description || totals.lines.map(l => `${l.quantity}x ${l.name}`).join(', ');
|
|
338
|
+
// Convert total to micro-units
|
|
339
|
+
const amountMicro = BigInt(Math.floor(totals.afterDiscount * 1000000));
|
|
340
|
+
let result;
|
|
341
|
+
if (currency === 'SOL') {
|
|
342
|
+
// SOL-denominated link (amount is in lamports)
|
|
343
|
+
const solPrice = await this.sdk.getSolPrice();
|
|
344
|
+
const lamports = BigInt(Math.floor((totals.afterDiscount / solPrice) * 1000000000));
|
|
345
|
+
result = await this.sdk.createLinkSol({
|
|
346
|
+
merchantId: this.config.merchantId,
|
|
347
|
+
platformId: this.config.platformId,
|
|
348
|
+
amount: lamports,
|
|
349
|
+
expiresAt,
|
|
350
|
+
allowTips,
|
|
351
|
+
allowPartial: false,
|
|
352
|
+
orderRef,
|
|
353
|
+
description,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
else if (currency === 'USDC' || currency === 'USDT') {
|
|
357
|
+
result = await this.sdk.createLinkToken({
|
|
358
|
+
merchantId: this.config.merchantId,
|
|
359
|
+
platformId: this.config.platformId,
|
|
360
|
+
amount: amountMicro,
|
|
361
|
+
expiresAt,
|
|
362
|
+
allowTips,
|
|
363
|
+
allowPartial: false,
|
|
364
|
+
orderRef,
|
|
365
|
+
currency,
|
|
366
|
+
description,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
// USD-denominated (buyer picks SOL / USDC / USDT at pay time)
|
|
371
|
+
result = await this.sdk.createLinkUsd({
|
|
372
|
+
merchantId: this.config.merchantId,
|
|
373
|
+
platformId: this.config.platformId,
|
|
374
|
+
amount: amountMicro,
|
|
375
|
+
expiresAt,
|
|
376
|
+
allowTips,
|
|
377
|
+
allowPartial: false,
|
|
378
|
+
orderRef,
|
|
379
|
+
description,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
// Reserve inventory
|
|
383
|
+
for (const item of this.items.values()) {
|
|
384
|
+
this.store.reserveInventory(item.product.id, item.quantity);
|
|
385
|
+
}
|
|
386
|
+
// Increment discount usage
|
|
387
|
+
for (const code of this.appliedDiscounts) {
|
|
388
|
+
this.store.useDiscount(code);
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
linkId: result.linkId,
|
|
392
|
+
tx: result.tx,
|
|
393
|
+
paymentUrl: this.sdk.getPaymentUrl(result.linkId),
|
|
394
|
+
qrCodeUrl: this.sdk.getQRCodeUrl(result.linkId),
|
|
395
|
+
totals,
|
|
396
|
+
orderRef,
|
|
397
|
+
createdAt: Date.now(),
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
exports.RotateCart = RotateCart;
|
|
402
|
+
// ==================== EXPORTS ====================
|
|
403
|
+
exports.default = RotateStore;
|
|
404
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rotate Protocol Webhooks
|
|
3
|
+
*
|
|
4
|
+
* Listen to on-chain payment events and receive notifications.
|
|
5
|
+
* This does NOT change the P2P nature - webhooks are notifications only.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { Network } from './index';
|
|
10
|
+
export type WebhookEventType = 'protocol.initialized' | 'protocol.updated' | 'platform.created' | 'platform.updated' | 'merchant.created' | 'merchant.updated' | 'payment.completed' | 'payment.pending' | 'link.created' | 'link.created.usd' | 'link.paid' | 'link.paid.usd' | 'link.cancelled' | 'link.closed' | 'link.expired';
|
|
11
|
+
export interface WebhookEvent {
|
|
12
|
+
/** Unique event ID */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Event type */
|
|
15
|
+
type: WebhookEventType;
|
|
16
|
+
/** Timestamp */
|
|
17
|
+
timestamp: number;
|
|
18
|
+
/** Transaction signature */
|
|
19
|
+
transactionSignature: string;
|
|
20
|
+
/** Event data */
|
|
21
|
+
data: WebhookEventData;
|
|
22
|
+
}
|
|
23
|
+
export interface WebhookEventData {
|
|
24
|
+
linkId?: number;
|
|
25
|
+
merchantId?: number;
|
|
26
|
+
platformId?: number;
|
|
27
|
+
payerWallet?: string;
|
|
28
|
+
merchantWallet?: string;
|
|
29
|
+
platformWallet?: string;
|
|
30
|
+
treasuryWallet?: string;
|
|
31
|
+
amountUsd?: number;
|
|
32
|
+
amountLamports?: number;
|
|
33
|
+
amountTokens?: number;
|
|
34
|
+
protocolFee?: number;
|
|
35
|
+
platformFee?: number;
|
|
36
|
+
tipAmount?: number;
|
|
37
|
+
currency?: 'SOL' | 'USDC' | 'USDT' | 'USD';
|
|
38
|
+
tokenType?: string;
|
|
39
|
+
orderRef?: string;
|
|
40
|
+
status?: string;
|
|
41
|
+
active?: boolean;
|
|
42
|
+
feeBps?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface WebhookConfig {
|
|
45
|
+
/** Webhook endpoint URL */
|
|
46
|
+
url: string;
|
|
47
|
+
/** Events to subscribe to */
|
|
48
|
+
events: WebhookEventType[];
|
|
49
|
+
/** Filter by merchant ID (optional) */
|
|
50
|
+
merchantId?: number;
|
|
51
|
+
/** Filter by platform ID (optional) */
|
|
52
|
+
platformId?: number;
|
|
53
|
+
/** Secret for HMAC signature verification */
|
|
54
|
+
secret: string;
|
|
55
|
+
}
|
|
56
|
+
export type EventHandler = (event: WebhookEvent) => void | Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Verify webhook signature (for webhook receivers)
|
|
59
|
+
*/
|
|
60
|
+
export declare function verifyWebhookSignature(payload: string, signature: string, secret: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* Create webhook signature (for webhook senders)
|
|
63
|
+
*/
|
|
64
|
+
export declare function createWebhookSignature(payload: string, secret: string): Promise<string>;
|
|
65
|
+
export interface EventListenerOptions {
|
|
66
|
+
/** Solana network */
|
|
67
|
+
network: Network;
|
|
68
|
+
/** Custom RPC endpoint */
|
|
69
|
+
rpcEndpoint?: string;
|
|
70
|
+
/** Poll interval in ms (default: 5000) */
|
|
71
|
+
pollIntervalMs?: number;
|
|
72
|
+
/** Filter by merchant ID */
|
|
73
|
+
merchantId?: number;
|
|
74
|
+
/** Filter by platform ID */
|
|
75
|
+
platformId?: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* On-chain event listener
|
|
79
|
+
* Polls the blockchain for new transactions and emits events
|
|
80
|
+
*/
|
|
81
|
+
export declare class EventListener {
|
|
82
|
+
private connection;
|
|
83
|
+
private programId;
|
|
84
|
+
private options;
|
|
85
|
+
private handlers;
|
|
86
|
+
private lastSignature;
|
|
87
|
+
private isRunning;
|
|
88
|
+
private pollInterval;
|
|
89
|
+
private coder;
|
|
90
|
+
constructor(options: EventListenerOptions);
|
|
91
|
+
/**
|
|
92
|
+
* Subscribe to an event type
|
|
93
|
+
*/
|
|
94
|
+
on(eventType: WebhookEventType, handler: EventHandler): void;
|
|
95
|
+
/**
|
|
96
|
+
* Unsubscribe from an event type
|
|
97
|
+
*/
|
|
98
|
+
off(eventType: WebhookEventType, handler: EventHandler): void;
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to all events
|
|
101
|
+
*/
|
|
102
|
+
onAny(handler: EventHandler): void;
|
|
103
|
+
/**
|
|
104
|
+
* Start listening for events
|
|
105
|
+
*/
|
|
106
|
+
start(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Stop listening for events
|
|
109
|
+
*/
|
|
110
|
+
stop(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Poll for new transactions
|
|
113
|
+
*/
|
|
114
|
+
private poll;
|
|
115
|
+
/**
|
|
116
|
+
* Process a transaction and emit decoded events
|
|
117
|
+
*/
|
|
118
|
+
private processTransaction;
|
|
119
|
+
/** Map Anchor event name to webhook event type */
|
|
120
|
+
private anchorEventToWebhookType;
|
|
121
|
+
/** Map decoded Anchor event data to WebhookEventData */
|
|
122
|
+
private mapEventData;
|
|
123
|
+
/**
|
|
124
|
+
* Emit event to handlers
|
|
125
|
+
*/
|
|
126
|
+
private emit;
|
|
127
|
+
}
|
|
128
|
+
export interface WebhookSenderOptions {
|
|
129
|
+
/** Retry failed webhooks */
|
|
130
|
+
retryCount?: number;
|
|
131
|
+
/** Retry delay in ms */
|
|
132
|
+
retryDelayMs?: number;
|
|
133
|
+
/** Timeout in ms */
|
|
134
|
+
timeoutMs?: number;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Send webhooks to registered endpoints
|
|
138
|
+
*/
|
|
139
|
+
export declare class WebhookSender {
|
|
140
|
+
private options;
|
|
141
|
+
constructor(options?: WebhookSenderOptions);
|
|
142
|
+
/**
|
|
143
|
+
* Send webhook to endpoint
|
|
144
|
+
*/
|
|
145
|
+
send(config: WebhookConfig, event: WebhookEvent): Promise<boolean>;
|
|
146
|
+
private delay;
|
|
147
|
+
}
|
|
148
|
+
export default EventListener;
|
|
149
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|