moltspay 0.2.1 → 0.2.3
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/dist/chains/index.d.mts +6 -6
- package/dist/chains/index.d.ts +6 -6
- package/dist/chains/index.js +2 -2
- package/dist/chains/index.js.map +1 -1
- package/dist/chains/index.mjs +2 -2
- package/dist/chains/index.mjs.map +1 -1
- package/dist/cli.js +42 -39
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +42 -39
- package/dist/cli.mjs.map +1 -1
- package/dist/{index-CZzgdtin.d.mts → index-CyFg9s2m.d.mts} +1 -1
- package/dist/{index-CZzgdtin.d.ts → index-CyFg9s2m.d.ts} +1 -1
- package/dist/index.d.mts +91 -27
- package/dist/index.d.ts +91 -27
- package/dist/index.js +255 -78
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +253 -78
- package/dist/index.mjs.map +1 -1
- package/dist/orders/index.d.mts +13 -13
- package/dist/orders/index.d.ts +13 -13
- package/dist/orders/index.js +10 -10
- package/dist/orders/index.js.map +1 -1
- package/dist/orders/index.mjs +10 -10
- package/dist/orders/index.mjs.map +1 -1
- package/dist/permit/index.d.mts +11 -11
- package/dist/permit/index.d.ts +11 -11
- package/dist/permit/index.js +14 -14
- package/dist/permit/index.js.map +1 -1
- package/dist/permit/index.mjs +14 -14
- package/dist/permit/index.mjs.map +1 -1
- package/dist/verify/index.d.mts +4 -4
- package/dist/verify/index.d.ts +4 -4
- package/dist/verify/index.js +13 -13
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/index.mjs +13 -13
- package/dist/verify/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +93 -23
- package/dist/wallet/index.d.ts +93 -23
- package/dist/wallet/index.js +102 -30
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +100 -30
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/orders/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Order Management Module
|
|
3
3
|
*/
|
|
4
4
|
interface Order {
|
|
5
5
|
orderId: string;
|
|
@@ -31,7 +31,7 @@ interface OrderStore {
|
|
|
31
31
|
list(limit?: number): Promise<Order[]>;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* In-memory order store (default implementation)
|
|
35
35
|
*/
|
|
36
36
|
declare class MemoryOrderStore implements OrderStore {
|
|
37
37
|
private orders;
|
|
@@ -41,7 +41,7 @@ declare class MemoryOrderStore implements OrderStore {
|
|
|
41
41
|
list(limit?: number): Promise<Order[]>;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Order Manager
|
|
45
45
|
*/
|
|
46
46
|
declare class OrderManager {
|
|
47
47
|
private store;
|
|
@@ -53,43 +53,43 @@ declare class OrderManager {
|
|
|
53
53
|
defaultChain?: string;
|
|
54
54
|
});
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
56
|
+
* Generate order ID
|
|
57
57
|
*/
|
|
58
58
|
private generateOrderId;
|
|
59
59
|
/**
|
|
60
|
-
*
|
|
60
|
+
* Create order
|
|
61
61
|
*/
|
|
62
62
|
createOrder(params: CreateOrderParams): Promise<Order>;
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* Get order
|
|
65
65
|
*/
|
|
66
66
|
getOrder(orderId: string): Promise<Order | null>;
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* Update order
|
|
69
69
|
*/
|
|
70
70
|
updateOrder(orderId: string, updates: Partial<Order>): Promise<Order | null>;
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* Find user pending orders
|
|
73
73
|
*/
|
|
74
74
|
findPendingOrder(userId: string): Promise<Order | null>;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* Mark order as paid
|
|
77
77
|
*/
|
|
78
78
|
markAsPaid(orderId: string, txHash: string, payerAddress?: string): Promise<Order | null>;
|
|
79
79
|
/**
|
|
80
|
-
*
|
|
80
|
+
* Mark order as generating
|
|
81
81
|
*/
|
|
82
82
|
markAsGenerating(orderId: string): Promise<Order | null>;
|
|
83
83
|
/**
|
|
84
|
-
*
|
|
84
|
+
* Mark order as completed
|
|
85
85
|
*/
|
|
86
86
|
markAsCompleted(orderId: string, videoPath: string): Promise<Order | null>;
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
88
|
+
* Mark order as failed
|
|
89
89
|
*/
|
|
90
90
|
markAsFailed(orderId: string, error: string): Promise<Order | null>;
|
|
91
91
|
/**
|
|
92
|
-
*
|
|
92
|
+
* Cancel order
|
|
93
93
|
*/
|
|
94
94
|
cancelOrder(orderId: string): Promise<Order | null>;
|
|
95
95
|
}
|
package/dist/orders/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Order Management Module
|
|
3
3
|
*/
|
|
4
4
|
interface Order {
|
|
5
5
|
orderId: string;
|
|
@@ -31,7 +31,7 @@ interface OrderStore {
|
|
|
31
31
|
list(limit?: number): Promise<Order[]>;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* In-memory order store (default implementation)
|
|
35
35
|
*/
|
|
36
36
|
declare class MemoryOrderStore implements OrderStore {
|
|
37
37
|
private orders;
|
|
@@ -41,7 +41,7 @@ declare class MemoryOrderStore implements OrderStore {
|
|
|
41
41
|
list(limit?: number): Promise<Order[]>;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Order Manager
|
|
45
45
|
*/
|
|
46
46
|
declare class OrderManager {
|
|
47
47
|
private store;
|
|
@@ -53,43 +53,43 @@ declare class OrderManager {
|
|
|
53
53
|
defaultChain?: string;
|
|
54
54
|
});
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
56
|
+
* Generate order ID
|
|
57
57
|
*/
|
|
58
58
|
private generateOrderId;
|
|
59
59
|
/**
|
|
60
|
-
*
|
|
60
|
+
* Create order
|
|
61
61
|
*/
|
|
62
62
|
createOrder(params: CreateOrderParams): Promise<Order>;
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* Get order
|
|
65
65
|
*/
|
|
66
66
|
getOrder(orderId: string): Promise<Order | null>;
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* Update order
|
|
69
69
|
*/
|
|
70
70
|
updateOrder(orderId: string, updates: Partial<Order>): Promise<Order | null>;
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* Find user pending orders
|
|
73
73
|
*/
|
|
74
74
|
findPendingOrder(userId: string): Promise<Order | null>;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* Mark order as paid
|
|
77
77
|
*/
|
|
78
78
|
markAsPaid(orderId: string, txHash: string, payerAddress?: string): Promise<Order | null>;
|
|
79
79
|
/**
|
|
80
|
-
*
|
|
80
|
+
* Mark order as generating
|
|
81
81
|
*/
|
|
82
82
|
markAsGenerating(orderId: string): Promise<Order | null>;
|
|
83
83
|
/**
|
|
84
|
-
*
|
|
84
|
+
* Mark order as completed
|
|
85
85
|
*/
|
|
86
86
|
markAsCompleted(orderId: string, videoPath: string): Promise<Order | null>;
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
88
|
+
* Mark order as failed
|
|
89
89
|
*/
|
|
90
90
|
markAsFailed(orderId: string, error: string): Promise<Order | null>;
|
|
91
91
|
/**
|
|
92
|
-
*
|
|
92
|
+
* Cancel order
|
|
93
93
|
*/
|
|
94
94
|
cancelOrder(orderId: string): Promise<Order | null>;
|
|
95
95
|
}
|
package/dist/orders/index.js
CHANGED
|
@@ -60,13 +60,13 @@ var OrderManager = class {
|
|
|
60
60
|
this.defaultChain = options.defaultChain || "base";
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
|
-
*
|
|
63
|
+
* Generate order ID
|
|
64
64
|
*/
|
|
65
65
|
generateOrderId() {
|
|
66
66
|
return "vo_" + (0, import_crypto.randomBytes)(4).toString("hex");
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Create order
|
|
70
70
|
*/
|
|
71
71
|
async createOrder(params) {
|
|
72
72
|
const order = {
|
|
@@ -83,13 +83,13 @@ var OrderManager = class {
|
|
|
83
83
|
return order;
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
86
|
+
* Get order
|
|
87
87
|
*/
|
|
88
88
|
async getOrder(orderId) {
|
|
89
89
|
return this.store.get(orderId);
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
|
-
*
|
|
92
|
+
* Update order
|
|
93
93
|
*/
|
|
94
94
|
async updateOrder(orderId, updates) {
|
|
95
95
|
const order = await this.store.get(orderId);
|
|
@@ -99,7 +99,7 @@ var OrderManager = class {
|
|
|
99
99
|
return updated;
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
*
|
|
102
|
+
* Find user pending orders
|
|
103
103
|
*/
|
|
104
104
|
async findPendingOrder(userId) {
|
|
105
105
|
const orders = await this.store.findByUser(userId, "pending");
|
|
@@ -113,7 +113,7 @@ var OrderManager = class {
|
|
|
113
113
|
return null;
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
|
-
*
|
|
116
|
+
* Mark order as paid
|
|
117
117
|
*/
|
|
118
118
|
async markAsPaid(orderId, txHash, payerAddress) {
|
|
119
119
|
return this.updateOrder(orderId, {
|
|
@@ -124,13 +124,13 @@ var OrderManager = class {
|
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
|
-
*
|
|
127
|
+
* Mark order as generating
|
|
128
128
|
*/
|
|
129
129
|
async markAsGenerating(orderId) {
|
|
130
130
|
return this.updateOrder(orderId, { status: "generating" });
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
|
-
*
|
|
133
|
+
* Mark order as completed
|
|
134
134
|
*/
|
|
135
135
|
async markAsCompleted(orderId, videoPath) {
|
|
136
136
|
return this.updateOrder(orderId, {
|
|
@@ -139,7 +139,7 @@ var OrderManager = class {
|
|
|
139
139
|
});
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
142
|
-
*
|
|
142
|
+
* Mark order as failed
|
|
143
143
|
*/
|
|
144
144
|
async markAsFailed(orderId, error) {
|
|
145
145
|
return this.updateOrder(orderId, {
|
|
@@ -148,7 +148,7 @@ var OrderManager = class {
|
|
|
148
148
|
});
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
151
|
-
*
|
|
151
|
+
* Cancel order
|
|
152
152
|
*/
|
|
153
153
|
async cancelOrder(orderId) {
|
|
154
154
|
return this.updateOrder(orderId, { status: "cancelled" });
|
package/dist/orders/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/orders/index.ts"],"sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"sources":["../../src/orders/index.ts"],"sourcesContent":["/**\n * Order Management Module\n */\n\nimport { randomBytes } from 'crypto';\n\nexport interface Order {\n orderId: string;\n prompt: string;\n imageUrl?: string;\n userId: string;\n price: number;\n chain: string;\n status: OrderStatus;\n createdAt: string;\n paidAt?: string;\n txHash?: string;\n payerAddress?: string;\n videoPath?: string;\n error?: string;\n}\n\nexport type OrderStatus = \n | 'pending' // Pending payment\n | 'paid' // Paid\n | 'generating' // Generating\n | 'completed' // Completed\n | 'failed' // Failed\n | 'cancelled'; // Cancelled\n\nexport interface CreateOrderParams {\n prompt: string;\n userId: string;\n price?: number;\n chain?: string;\n imageUrl?: string;\n}\n\nexport interface OrderStore {\n get(orderId: string): Promise<Order | null>;\n set(order: Order): Promise<void>;\n findByUser(userId: string, status?: OrderStatus): Promise<Order[]>;\n list(limit?: number): Promise<Order[]>;\n}\n\n/**\n * In-memory order store (default implementation)\n */\nexport class MemoryOrderStore implements OrderStore {\n private orders: Map<string, Order> = new Map();\n\n async get(orderId: string): Promise<Order | null> {\n return this.orders.get(orderId) || null;\n }\n\n async set(order: Order): Promise<void> {\n this.orders.set(order.orderId, order);\n }\n\n async findByUser(userId: string, status?: OrderStatus): Promise<Order[]> {\n const results: Order[] = [];\n for (const order of this.orders.values()) {\n if (order.userId === userId) {\n if (!status || order.status === status) {\n results.push(order);\n }\n }\n }\n return results.sort((a, b) => \n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n }\n\n async list(limit = 100): Promise<Order[]> {\n return Array.from(this.orders.values())\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, limit);\n }\n}\n\n/**\n * Order Manager\n */\nexport class OrderManager {\n private store: OrderStore;\n private defaultPrice: number;\n private defaultChain: string;\n\n constructor(options: {\n store?: OrderStore;\n defaultPrice?: number;\n defaultChain?: string;\n } = {}) {\n this.store = options.store || new MemoryOrderStore();\n this.defaultPrice = options.defaultPrice || 2.0;\n this.defaultChain = options.defaultChain || 'base';\n }\n\n /**\n * Generate order ID\n */\n private generateOrderId(): string {\n return 'vo_' + randomBytes(4).toString('hex');\n }\n\n /**\n * Create order\n */\n async createOrder(params: CreateOrderParams): Promise<Order> {\n const order: Order = {\n orderId: this.generateOrderId(),\n prompt: params.prompt,\n imageUrl: params.imageUrl,\n userId: params.userId,\n price: params.price || this.defaultPrice,\n chain: params.chain || this.defaultChain,\n status: 'pending',\n createdAt: new Date().toISOString(),\n };\n\n await this.store.set(order);\n return order;\n }\n\n /**\n * Get order\n */\n async getOrder(orderId: string): Promise<Order | null> {\n return this.store.get(orderId);\n }\n\n /**\n * Update order\n */\n async updateOrder(orderId: string, updates: Partial<Order>): Promise<Order | null> {\n const order = await this.store.get(orderId);\n if (!order) return null;\n\n const updated = { ...order, ...updates };\n await this.store.set(updated);\n return updated;\n }\n\n /**\n * Find user pending orders\n */\n async findPendingOrder(userId: string): Promise<Order | null> {\n const orders = await this.store.findByUser(userId, 'pending');\n \n // Return pending orders within 24 hours\n const now = Date.now();\n for (const order of orders) {\n const age = now - new Date(order.createdAt).getTime();\n if (age < 24 * 60 * 60 * 1000) {\n return order;\n }\n }\n return null;\n }\n\n /**\n * Mark order as paid\n */\n async markAsPaid(orderId: string, txHash: string, payerAddress?: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'paid',\n paidAt: new Date().toISOString(),\n txHash,\n payerAddress,\n });\n }\n\n /**\n * Mark order as generating\n */\n async markAsGenerating(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'generating' });\n }\n\n /**\n * Mark order as completed\n */\n async markAsCompleted(orderId: string, videoPath: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'completed',\n videoPath,\n });\n }\n\n /**\n * Mark order as failed\n */\n async markAsFailed(orderId: string, error: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'failed',\n error,\n });\n }\n\n /**\n * Cancel order\n */\n async cancelOrder(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'cancelled' });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/orders/index.mjs
CHANGED
|
@@ -35,13 +35,13 @@ var OrderManager = class {
|
|
|
35
35
|
this.defaultChain = options.defaultChain || "base";
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Generate order ID
|
|
39
39
|
*/
|
|
40
40
|
generateOrderId() {
|
|
41
41
|
return "vo_" + randomBytes(4).toString("hex");
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Create order
|
|
45
45
|
*/
|
|
46
46
|
async createOrder(params) {
|
|
47
47
|
const order = {
|
|
@@ -58,13 +58,13 @@ var OrderManager = class {
|
|
|
58
58
|
return order;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* Get order
|
|
62
62
|
*/
|
|
63
63
|
async getOrder(orderId) {
|
|
64
64
|
return this.store.get(orderId);
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
|
-
*
|
|
67
|
+
* Update order
|
|
68
68
|
*/
|
|
69
69
|
async updateOrder(orderId, updates) {
|
|
70
70
|
const order = await this.store.get(orderId);
|
|
@@ -74,7 +74,7 @@ var OrderManager = class {
|
|
|
74
74
|
return updated;
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
|
-
*
|
|
77
|
+
* Find user pending orders
|
|
78
78
|
*/
|
|
79
79
|
async findPendingOrder(userId) {
|
|
80
80
|
const orders = await this.store.findByUser(userId, "pending");
|
|
@@ -88,7 +88,7 @@ var OrderManager = class {
|
|
|
88
88
|
return null;
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
|
-
*
|
|
91
|
+
* Mark order as paid
|
|
92
92
|
*/
|
|
93
93
|
async markAsPaid(orderId, txHash, payerAddress) {
|
|
94
94
|
return this.updateOrder(orderId, {
|
|
@@ -99,13 +99,13 @@ var OrderManager = class {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
*
|
|
102
|
+
* Mark order as generating
|
|
103
103
|
*/
|
|
104
104
|
async markAsGenerating(orderId) {
|
|
105
105
|
return this.updateOrder(orderId, { status: "generating" });
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
|
-
*
|
|
108
|
+
* Mark order as completed
|
|
109
109
|
*/
|
|
110
110
|
async markAsCompleted(orderId, videoPath) {
|
|
111
111
|
return this.updateOrder(orderId, {
|
|
@@ -114,7 +114,7 @@ var OrderManager = class {
|
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
|
-
*
|
|
117
|
+
* Mark order as failed
|
|
118
118
|
*/
|
|
119
119
|
async markAsFailed(orderId, error) {
|
|
120
120
|
return this.updateOrder(orderId, {
|
|
@@ -123,7 +123,7 @@ var OrderManager = class {
|
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
126
|
-
*
|
|
126
|
+
* Cancel order
|
|
127
127
|
*/
|
|
128
128
|
async cancelOrder(orderId) {
|
|
129
129
|
return this.updateOrder(orderId, { status: "cancelled" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/orders/index.ts"],"sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"sources":["../../src/orders/index.ts"],"sourcesContent":["/**\n * Order Management Module\n */\n\nimport { randomBytes } from 'crypto';\n\nexport interface Order {\n orderId: string;\n prompt: string;\n imageUrl?: string;\n userId: string;\n price: number;\n chain: string;\n status: OrderStatus;\n createdAt: string;\n paidAt?: string;\n txHash?: string;\n payerAddress?: string;\n videoPath?: string;\n error?: string;\n}\n\nexport type OrderStatus = \n | 'pending' // Pending payment\n | 'paid' // Paid\n | 'generating' // Generating\n | 'completed' // Completed\n | 'failed' // Failed\n | 'cancelled'; // Cancelled\n\nexport interface CreateOrderParams {\n prompt: string;\n userId: string;\n price?: number;\n chain?: string;\n imageUrl?: string;\n}\n\nexport interface OrderStore {\n get(orderId: string): Promise<Order | null>;\n set(order: Order): Promise<void>;\n findByUser(userId: string, status?: OrderStatus): Promise<Order[]>;\n list(limit?: number): Promise<Order[]>;\n}\n\n/**\n * In-memory order store (default implementation)\n */\nexport class MemoryOrderStore implements OrderStore {\n private orders: Map<string, Order> = new Map();\n\n async get(orderId: string): Promise<Order | null> {\n return this.orders.get(orderId) || null;\n }\n\n async set(order: Order): Promise<void> {\n this.orders.set(order.orderId, order);\n }\n\n async findByUser(userId: string, status?: OrderStatus): Promise<Order[]> {\n const results: Order[] = [];\n for (const order of this.orders.values()) {\n if (order.userId === userId) {\n if (!status || order.status === status) {\n results.push(order);\n }\n }\n }\n return results.sort((a, b) => \n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n }\n\n async list(limit = 100): Promise<Order[]> {\n return Array.from(this.orders.values())\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, limit);\n }\n}\n\n/**\n * Order Manager\n */\nexport class OrderManager {\n private store: OrderStore;\n private defaultPrice: number;\n private defaultChain: string;\n\n constructor(options: {\n store?: OrderStore;\n defaultPrice?: number;\n defaultChain?: string;\n } = {}) {\n this.store = options.store || new MemoryOrderStore();\n this.defaultPrice = options.defaultPrice || 2.0;\n this.defaultChain = options.defaultChain || 'base';\n }\n\n /**\n * Generate order ID\n */\n private generateOrderId(): string {\n return 'vo_' + randomBytes(4).toString('hex');\n }\n\n /**\n * Create order\n */\n async createOrder(params: CreateOrderParams): Promise<Order> {\n const order: Order = {\n orderId: this.generateOrderId(),\n prompt: params.prompt,\n imageUrl: params.imageUrl,\n userId: params.userId,\n price: params.price || this.defaultPrice,\n chain: params.chain || this.defaultChain,\n status: 'pending',\n createdAt: new Date().toISOString(),\n };\n\n await this.store.set(order);\n return order;\n }\n\n /**\n * Get order\n */\n async getOrder(orderId: string): Promise<Order | null> {\n return this.store.get(orderId);\n }\n\n /**\n * Update order\n */\n async updateOrder(orderId: string, updates: Partial<Order>): Promise<Order | null> {\n const order = await this.store.get(orderId);\n if (!order) return null;\n\n const updated = { ...order, ...updates };\n await this.store.set(updated);\n return updated;\n }\n\n /**\n * Find user pending orders\n */\n async findPendingOrder(userId: string): Promise<Order | null> {\n const orders = await this.store.findByUser(userId, 'pending');\n \n // Return pending orders within 24 hours\n const now = Date.now();\n for (const order of orders) {\n const age = now - new Date(order.createdAt).getTime();\n if (age < 24 * 60 * 60 * 1000) {\n return order;\n }\n }\n return null;\n }\n\n /**\n * Mark order as paid\n */\n async markAsPaid(orderId: string, txHash: string, payerAddress?: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'paid',\n paidAt: new Date().toISOString(),\n txHash,\n payerAddress,\n });\n }\n\n /**\n * Mark order as generating\n */\n async markAsGenerating(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'generating' });\n }\n\n /**\n * Mark order as completed\n */\n async markAsCompleted(orderId: string, videoPath: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'completed',\n videoPath,\n });\n }\n\n /**\n * Mark order as failed\n */\n async markAsFailed(orderId: string, error: string): Promise<Order | null> {\n return this.updateOrder(orderId, {\n status: 'failed',\n error,\n });\n }\n\n /**\n * Cancel order\n */\n async cancelOrder(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'cancelled' });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/permit/index.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-
|
|
1
|
+
import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-CyFg9s2m.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* PermitPayment - EIP-2612
|
|
4
|
+
* PermitPayment - EIP-2612 Gasless Pre-authorization
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* User signs authorization, service provider pays gas to execute transferFrom
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
interface PermitConfig {
|
|
@@ -21,27 +21,27 @@ declare class PermitPayment {
|
|
|
21
21
|
private usdcContract;
|
|
22
22
|
constructor(config?: PermitConfig);
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* Get user current nonce
|
|
25
25
|
*/
|
|
26
26
|
getNonce(owner: string): Promise<number>;
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Generate EIP-712 signing request (for frontend/user wallet)
|
|
29
29
|
*/
|
|
30
30
|
createPermitRequest(owner: string, amount: number, orderId: string, deadlineMinutes?: number): Promise<PermitRequest>;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Execute permit + transferFrom
|
|
33
33
|
*
|
|
34
|
-
* @param owner
|
|
35
|
-
* @param amount
|
|
36
|
-
* @param signature
|
|
34
|
+
* @param owner User address
|
|
35
|
+
* @param amount Amount
|
|
36
|
+
* @param signature User signature {v, r, s, deadline}
|
|
37
37
|
*/
|
|
38
38
|
executePermitAndTransfer(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* Execute permit only (no transfer)
|
|
41
41
|
*/
|
|
42
42
|
executePermit(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Format Permit request as user message
|
|
45
45
|
*/
|
|
46
46
|
formatPermitMessage(request: PermitRequest): string;
|
|
47
47
|
}
|
package/dist/permit/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-
|
|
1
|
+
import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-CyFg9s2m.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* PermitPayment - EIP-2612
|
|
4
|
+
* PermitPayment - EIP-2612 Gasless Pre-authorization
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* User signs authorization, service provider pays gas to execute transferFrom
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
interface PermitConfig {
|
|
@@ -21,27 +21,27 @@ declare class PermitPayment {
|
|
|
21
21
|
private usdcContract;
|
|
22
22
|
constructor(config?: PermitConfig);
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* Get user current nonce
|
|
25
25
|
*/
|
|
26
26
|
getNonce(owner: string): Promise<number>;
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Generate EIP-712 signing request (for frontend/user wallet)
|
|
29
29
|
*/
|
|
30
30
|
createPermitRequest(owner: string, amount: number, orderId: string, deadlineMinutes?: number): Promise<PermitRequest>;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Execute permit + transferFrom
|
|
33
33
|
*
|
|
34
|
-
* @param owner
|
|
35
|
-
* @param amount
|
|
36
|
-
* @param signature
|
|
34
|
+
* @param owner User address
|
|
35
|
+
* @param amount Amount
|
|
36
|
+
* @param signature User signature {v, r, s, deadline}
|
|
37
37
|
*/
|
|
38
38
|
executePermitAndTransfer(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* Execute permit only (no transfer)
|
|
41
41
|
*/
|
|
42
42
|
executePermit(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Format Permit request as user message
|
|
45
45
|
*/
|
|
46
46
|
formatPermitMessage(request: PermitRequest): string;
|
|
47
47
|
}
|
package/dist/permit/index.js
CHANGED
|
@@ -29,7 +29,7 @@ var import_ethers = require("ethers");
|
|
|
29
29
|
|
|
30
30
|
// src/chains/index.ts
|
|
31
31
|
var CHAINS = {
|
|
32
|
-
// ============
|
|
32
|
+
// ============ Mainnet ============
|
|
33
33
|
base: {
|
|
34
34
|
name: "Base",
|
|
35
35
|
chainId: 8453,
|
|
@@ -57,7 +57,7 @@ var CHAINS = {
|
|
|
57
57
|
explorerTx: "https://etherscan.io/tx/",
|
|
58
58
|
avgBlockTime: 12
|
|
59
59
|
},
|
|
60
|
-
// ============
|
|
60
|
+
// ============ Testnet ============
|
|
61
61
|
base_sepolia: {
|
|
62
62
|
name: "Base Sepolia",
|
|
63
63
|
chainId: 84532,
|
|
@@ -124,13 +124,13 @@ var PermitPayment = class {
|
|
|
124
124
|
);
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
|
-
*
|
|
127
|
+
* Get user current nonce
|
|
128
128
|
*/
|
|
129
129
|
async getNonce(owner) {
|
|
130
130
|
return Number(await this.usdcContract.nonces(owner));
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
|
-
*
|
|
133
|
+
* Generate EIP-712 signing request (for frontend/user wallet)
|
|
134
134
|
*/
|
|
135
135
|
async createPermitRequest(owner, amount, orderId, deadlineMinutes = 30) {
|
|
136
136
|
const nonce = await this.getNonce(owner);
|
|
@@ -178,11 +178,11 @@ var PermitPayment = class {
|
|
|
178
178
|
};
|
|
179
179
|
}
|
|
180
180
|
/**
|
|
181
|
-
*
|
|
181
|
+
* Execute permit + transferFrom
|
|
182
182
|
*
|
|
183
|
-
* @param owner
|
|
184
|
-
* @param amount
|
|
185
|
-
* @param signature
|
|
183
|
+
* @param owner User address
|
|
184
|
+
* @param amount Amount
|
|
185
|
+
* @param signature User signature {v, r, s, deadline}
|
|
186
186
|
*/
|
|
187
187
|
async executePermitAndTransfer(owner, amount, signature) {
|
|
188
188
|
if (!this.wallet) {
|
|
@@ -214,7 +214,7 @@ var PermitPayment = class {
|
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
/**
|
|
217
|
-
*
|
|
217
|
+
* Execute permit only (no transfer)
|
|
218
218
|
*/
|
|
219
219
|
async executePermit(owner, amount, signature) {
|
|
220
220
|
if (!this.wallet) {
|
|
@@ -244,22 +244,22 @@ var PermitPayment = class {
|
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
/**
|
|
247
|
-
*
|
|
247
|
+
* Format Permit request as user message
|
|
248
248
|
*/
|
|
249
249
|
formatPermitMessage(request) {
|
|
250
250
|
const { typed_data } = request;
|
|
251
251
|
const { message } = typed_data;
|
|
252
|
-
return `\u{1F510}
|
|
252
|
+
return `\u{1F510} **Signature Authorization Request**
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
Authorize \`${(Number(message.value) / 1e6).toFixed(2)} USDC\` to service provider
|
|
255
255
|
|
|
256
|
-
|
|
256
|
+
**Signature Details:**
|
|
257
257
|
- Owner: \`${message.owner}\`
|
|
258
258
|
- Spender: \`${message.spender}\`
|
|
259
259
|
- Amount: ${(Number(message.value) / 1e6).toFixed(2)} USDC
|
|
260
260
|
- Deadline: ${new Date(message.deadline * 1e3).toISOString()}
|
|
261
261
|
|
|
262
|
-
|
|
262
|
+
Please sign this request in your wallet (no gas required).
|
|
263
263
|
|
|
264
264
|
\`\`\`json
|
|
265
265
|
${JSON.stringify(typed_data, null, 2)}
|
package/dist/permit/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/permit/index.ts","../../src/permit/Permit.ts","../../src/chains/index.ts"],"sourcesContent":["export { PermitPayment, type PermitConfig } from './Permit.js';\n","/**\n * PermitPayment - EIP-2612 无 Gas 预授权\n * \n * 让用户通过签名授权,服务方代付 Gas 执行 transferFrom\n */\n\nimport { ethers } from 'ethers';\nimport { getChain, ERC20_ABI } from '../chains/index.js';\nimport type {\n ChainName,\n ChainConfig,\n PermitRequest,\n PermitSignature,\n PermitExecuteResult,\n EIP712TypedData,\n} from '../types/index.js';\n\nexport interface PermitConfig {\n chain?: ChainName;\n privateKey?: string;\n spenderAddress?: string;\n rpcUrl?: string;\n}\n\nexport class PermitPayment {\n readonly chain: ChainName;\n readonly chainConfig: ChainConfig;\n readonly spenderAddress: string;\n \n private provider: ethers.JsonRpcProvider;\n private wallet?: ethers.Wallet;\n private usdcContract: ethers.Contract;\n\n constructor(config: PermitConfig = {}) {\n this.chain = config.chain || 'base_sepolia';\n this.chainConfig = getChain(this.chain);\n this.spenderAddress = config.spenderAddress || process.env.PAYMENT_AGENT_WALLET || '';\n\n const rpcUrl = config.rpcUrl || this.chainConfig.rpc;\n this.provider = new ethers.JsonRpcProvider(rpcUrl);\n\n const privateKey = config.privateKey || process.env.PAYMENT_AGENT_PRIVATE_KEY;\n if (privateKey) {\n this.wallet = new ethers.Wallet(privateKey, this.provider);\n this.spenderAddress = this.wallet.address;\n }\n\n this.usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ERC20_ABI,\n this.wallet || this.provider\n );\n }\n\n /**\n * 获取用户当前 nonce\n */\n async getNonce(owner: string): Promise<number> {\n return Number(await this.usdcContract.nonces(owner));\n }\n\n /**\n * 生成 EIP-712 签名请求(发给前端/用户钱包)\n */\n async createPermitRequest(\n owner: string,\n amount: number,\n orderId: string,\n deadlineMinutes: number = 30\n ): Promise<PermitRequest> {\n const nonce = await this.getNonce(owner);\n const deadline = Math.floor(Date.now() / 1000) + deadlineMinutes * 60;\n const value = BigInt(Math.floor(amount * 1e6)).toString();\n\n // USDC 的 EIP-712 domain(不同链可能不同)\n const domain = {\n name: 'USD Coin',\n version: '2',\n chainId: this.chainConfig.chainId,\n verifyingContract: this.chainConfig.usdc,\n };\n\n const types = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n };\n\n const message = {\n owner,\n spender: this.spenderAddress,\n value,\n nonce,\n deadline,\n };\n\n const typedData: EIP712TypedData = {\n types,\n primaryType: 'Permit',\n domain,\n message,\n };\n\n return {\n type: 'permit_request',\n version: '1.0',\n order_id: orderId,\n typed_data: typedData,\n };\n }\n\n /**\n * 执行 permit + transferFrom\n * \n * @param owner 用户地址\n * @param amount 金额\n * @param signature 用户签名 {v, r, s, deadline}\n */\n async executePermitAndTransfer(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n // 1. 调用 permit\n const permitTx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n await permitTx.wait();\n\n // 2. 调用 transferFrom\n const transferTx = await this.usdcContract.transferFrom(owner, this.spenderAddress, value);\n const receipt = await transferTx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: transferTx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * 仅执行 permit(不 transfer)\n */\n async executePermit(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n const tx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: tx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * 格式化 Permit 请求为用户消息\n */\n formatPermitMessage(request: PermitRequest): string {\n const { typed_data } = request;\n const { message } = typed_data;\n\n return `🔐 **签名授权请求**\n\n授权 \\`${(Number(message.value) / 1e6).toFixed(2)} USDC\\` 给服务方\n\n**签名信息:**\n- Owner: \\`${message.owner}\\`\n- Spender: \\`${message.spender}\\`\n- Amount: ${(Number(message.value) / 1e6).toFixed(2)} USDC\n- Deadline: ${new Date(message.deadline * 1000).toISOString()}\n\n请在钱包中签名此请求(不消耗 Gas)。\n\n\\`\\`\\`json\n${JSON.stringify(typed_data, null, 2)}\n\\`\\`\\``;\n }\n}\n","/**\n * 区块链配置\n */\n\nimport type { ChainConfig, ChainName } from '../types/index.js';\n\nexport const CHAINS: Record<ChainName, ChainConfig> = {\n // ============ 主网 ============\n base: {\n name: 'Base',\n chainId: 8453,\n rpc: 'https://mainnet.base.org',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n explorer: 'https://basescan.org/address/',\n explorerTx: 'https://basescan.org/tx/',\n avgBlockTime: 2,\n },\n polygon: {\n name: 'Polygon',\n chainId: 137,\n rpc: 'https://polygon-rpc.com',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n rpc: 'https://eth.llamarpc.com',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n explorer: 'https://etherscan.io/address/',\n explorerTx: 'https://etherscan.io/tx/',\n avgBlockTime: 12,\n },\n\n // ============ 测试网 ============\n base_sepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n rpc: 'https://sepolia.base.org',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n sepolia: {\n name: 'Sepolia',\n chainId: 11155111,\n rpc: 'https://rpc.sepolia.org',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n explorer: 'https://sepolia.etherscan.io/address/',\n explorerTx: 'https://sepolia.etherscan.io/tx/',\n avgBlockTime: 12,\n },\n};\n\n/**\n * 获取链配置\n */\nexport function getChain(name: ChainName): ChainConfig {\n const config = CHAINS[name];\n if (!config) {\n throw new Error(`Unsupported chain: ${name}. Supported: ${Object.keys(CHAINS).join(', ')}`);\n }\n return config;\n}\n\n/**\n * 列出所有支持的链\n */\nexport function listChains(): ChainName[] {\n return Object.keys(CHAINS) as ChainName[];\n}\n\n/**\n * 根据 chainId 获取链配置\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(CHAINS).find(c => c.chainId === chainId);\n}\n\n/**\n * ERC20 ABI(最小化,仅包含需要的方法)\n */\nexport const ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed owner, address indexed spender, uint256 value)',\n];\n\nexport type { ChainConfig, ChainName };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/permit/index.ts","../../src/permit/Permit.ts","../../src/chains/index.ts"],"sourcesContent":["export { PermitPayment, type PermitConfig } from './Permit.js';\n","/**\n * PermitPayment - EIP-2612 Gasless Pre-authorization\n * \n * User signs authorization, service provider pays gas to execute transferFrom\n */\n\nimport { ethers } from 'ethers';\nimport { getChain, ERC20_ABI } from '../chains/index.js';\nimport type {\n ChainName,\n ChainConfig,\n PermitRequest,\n PermitSignature,\n PermitExecuteResult,\n EIP712TypedData,\n} from '../types/index.js';\n\nexport interface PermitConfig {\n chain?: ChainName;\n privateKey?: string;\n spenderAddress?: string;\n rpcUrl?: string;\n}\n\nexport class PermitPayment {\n readonly chain: ChainName;\n readonly chainConfig: ChainConfig;\n readonly spenderAddress: string;\n \n private provider: ethers.JsonRpcProvider;\n private wallet?: ethers.Wallet;\n private usdcContract: ethers.Contract;\n\n constructor(config: PermitConfig = {}) {\n this.chain = config.chain || 'base_sepolia';\n this.chainConfig = getChain(this.chain);\n this.spenderAddress = config.spenderAddress || process.env.PAYMENT_AGENT_WALLET || '';\n\n const rpcUrl = config.rpcUrl || this.chainConfig.rpc;\n this.provider = new ethers.JsonRpcProvider(rpcUrl);\n\n const privateKey = config.privateKey || process.env.PAYMENT_AGENT_PRIVATE_KEY;\n if (privateKey) {\n this.wallet = new ethers.Wallet(privateKey, this.provider);\n this.spenderAddress = this.wallet.address;\n }\n\n this.usdcContract = new ethers.Contract(\n this.chainConfig.usdc,\n ERC20_ABI,\n this.wallet || this.provider\n );\n }\n\n /**\n * Get user current nonce\n */\n async getNonce(owner: string): Promise<number> {\n return Number(await this.usdcContract.nonces(owner));\n }\n\n /**\n * Generate EIP-712 signing request (for frontend/user wallet)\n */\n async createPermitRequest(\n owner: string,\n amount: number,\n orderId: string,\n deadlineMinutes: number = 30\n ): Promise<PermitRequest> {\n const nonce = await this.getNonce(owner);\n const deadline = Math.floor(Date.now() / 1000) + deadlineMinutes * 60;\n const value = BigInt(Math.floor(amount * 1e6)).toString();\n\n // USDC EIP-712 domain (may differ by chain)\n const domain = {\n name: 'USD Coin',\n version: '2',\n chainId: this.chainConfig.chainId,\n verifyingContract: this.chainConfig.usdc,\n };\n\n const types = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n };\n\n const message = {\n owner,\n spender: this.spenderAddress,\n value,\n nonce,\n deadline,\n };\n\n const typedData: EIP712TypedData = {\n types,\n primaryType: 'Permit',\n domain,\n message,\n };\n\n return {\n type: 'permit_request',\n version: '1.0',\n order_id: orderId,\n typed_data: typedData,\n };\n }\n\n /**\n * Execute permit + transferFrom\n * \n * @param owner User address\n * @param amount Amount\n * @param signature User signature {v, r, s, deadline}\n */\n async executePermitAndTransfer(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n // 1. Call permit\n const permitTx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n await permitTx.wait();\n\n // 2. Call transferFrom\n const transferTx = await this.usdcContract.transferFrom(owner, this.spenderAddress, value);\n const receipt = await transferTx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: transferTx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Execute permit only (no transfer)\n */\n async executePermit(\n owner: string,\n amount: number,\n signature: PermitSignature\n ): Promise<PermitExecuteResult> {\n if (!this.wallet) {\n return { success: false, error: 'Wallet not configured. Private key required.' };\n }\n\n try {\n const value = BigInt(Math.floor(amount * 1e6));\n\n const tx = await this.usdcContract.permit(\n owner,\n this.spenderAddress,\n value,\n signature.deadline,\n signature.v,\n signature.r,\n signature.s\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n tx_hash: tx.hash,\n };\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Format Permit request as user message\n */\n formatPermitMessage(request: PermitRequest): string {\n const { typed_data } = request;\n const { message } = typed_data;\n\n return `🔐 **Signature Authorization Request**\n\nAuthorize \\`${(Number(message.value) / 1e6).toFixed(2)} USDC\\` to service provider\n\n**Signature Details:**\n- Owner: \\`${message.owner}\\`\n- Spender: \\`${message.spender}\\`\n- Amount: ${(Number(message.value) / 1e6).toFixed(2)} USDC\n- Deadline: ${new Date(message.deadline * 1000).toISOString()}\n\nPlease sign this request in your wallet (no gas required).\n\n\\`\\`\\`json\n${JSON.stringify(typed_data, null, 2)}\n\\`\\`\\``;\n }\n}\n","/**\n * Blockchain Configuration\n */\n\nimport type { ChainConfig, ChainName } from '../types/index.js';\n\nexport const CHAINS: Record<ChainName, ChainConfig> = {\n // ============ Mainnet ============\n base: {\n name: 'Base',\n chainId: 8453,\n rpc: 'https://mainnet.base.org',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n explorer: 'https://basescan.org/address/',\n explorerTx: 'https://basescan.org/tx/',\n avgBlockTime: 2,\n },\n polygon: {\n name: 'Polygon',\n chainId: 137,\n rpc: 'https://polygon-rpc.com',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n explorer: 'https://polygonscan.com/address/',\n explorerTx: 'https://polygonscan.com/tx/',\n avgBlockTime: 2,\n },\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n rpc: 'https://eth.llamarpc.com',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n explorer: 'https://etherscan.io/address/',\n explorerTx: 'https://etherscan.io/tx/',\n avgBlockTime: 12,\n },\n\n // ============ Testnet ============\n base_sepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n rpc: 'https://sepolia.base.org',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n explorer: 'https://sepolia.basescan.org/address/',\n explorerTx: 'https://sepolia.basescan.org/tx/',\n avgBlockTime: 2,\n },\n sepolia: {\n name: 'Sepolia',\n chainId: 11155111,\n rpc: 'https://rpc.sepolia.org',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n explorer: 'https://sepolia.etherscan.io/address/',\n explorerTx: 'https://sepolia.etherscan.io/tx/',\n avgBlockTime: 12,\n },\n};\n\n/**\n * Get chain configuration\n */\nexport function getChain(name: ChainName): ChainConfig {\n const config = CHAINS[name];\n if (!config) {\n throw new Error(`Unsupported chain: ${name}. Supported: ${Object.keys(CHAINS).join(', ')}`);\n }\n return config;\n}\n\n/**\n * List all supported chains\n */\nexport function listChains(): ChainName[] {\n return Object.keys(CHAINS) as ChainName[];\n}\n\n/**\n * Get chain config by chainId\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(CHAINS).find(c => c.chainId === chainId);\n}\n\n/**\n * ERC20 ABI (minimal, only required methods)\n */\nexport const ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'function name() view returns (string)',\n 'function nonces(address owner) view returns (uint256)',\n 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed owner, address indexed spender, uint256 value)',\n];\n\nexport type { ChainConfig, ChainName };\n"],"mappings":"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","names":[]}
|