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.
Files changed (43) hide show
  1. package/dist/chains/index.d.mts +6 -6
  2. package/dist/chains/index.d.ts +6 -6
  3. package/dist/chains/index.js +2 -2
  4. package/dist/chains/index.js.map +1 -1
  5. package/dist/chains/index.mjs +2 -2
  6. package/dist/chains/index.mjs.map +1 -1
  7. package/dist/cli.js +42 -39
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cli.mjs +42 -39
  10. package/dist/cli.mjs.map +1 -1
  11. package/dist/{index-CZzgdtin.d.mts → index-CyFg9s2m.d.mts} +1 -1
  12. package/dist/{index-CZzgdtin.d.ts → index-CyFg9s2m.d.ts} +1 -1
  13. package/dist/index.d.mts +91 -27
  14. package/dist/index.d.ts +91 -27
  15. package/dist/index.js +255 -78
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.mjs +253 -78
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/orders/index.d.mts +13 -13
  20. package/dist/orders/index.d.ts +13 -13
  21. package/dist/orders/index.js +10 -10
  22. package/dist/orders/index.js.map +1 -1
  23. package/dist/orders/index.mjs +10 -10
  24. package/dist/orders/index.mjs.map +1 -1
  25. package/dist/permit/index.d.mts +11 -11
  26. package/dist/permit/index.d.ts +11 -11
  27. package/dist/permit/index.js +14 -14
  28. package/dist/permit/index.js.map +1 -1
  29. package/dist/permit/index.mjs +14 -14
  30. package/dist/permit/index.mjs.map +1 -1
  31. package/dist/verify/index.d.mts +4 -4
  32. package/dist/verify/index.d.ts +4 -4
  33. package/dist/verify/index.js +13 -13
  34. package/dist/verify/index.js.map +1 -1
  35. package/dist/verify/index.mjs +13 -13
  36. package/dist/verify/index.mjs.map +1 -1
  37. package/dist/wallet/index.d.mts +93 -23
  38. package/dist/wallet/index.d.ts +93 -23
  39. package/dist/wallet/index.js +102 -30
  40. package/dist/wallet/index.js.map +1 -1
  41. package/dist/wallet/index.mjs +100 -30
  42. package/dist/wallet/index.mjs.map +1 -1
  43. package/package.json +1 -1
@@ -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
- * 生成订单ID
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
  }
@@ -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
- * 生成订单ID
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
  }
@@ -60,13 +60,13 @@ var OrderManager = class {
60
60
  this.defaultChain = options.defaultChain || "base";
61
61
  }
62
62
  /**
63
- * 生成订单ID
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" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/orders/index.ts"],"sourcesContent":["/**\n * 订单管理模块\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' // 等待支付\n | 'paid' // 已支付\n | 'generating' // 生成中\n | 'completed' // 已完成\n | 'failed' // 失败\n | '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 * 内存订单存储(默认实现)\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 * 订单管理器\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 * 生成订单ID\n */\n private generateOrderId(): string {\n return 'vo_' + randomBytes(4).toString('hex');\n }\n\n /**\n * 创建订单\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 * 获取订单\n */\n async getOrder(orderId: string): Promise<Order | null> {\n return this.store.get(orderId);\n }\n\n /**\n * 更新订单\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 * 查找用户的待支付订单\n */\n async findPendingOrder(userId: string): Promise<Order | null> {\n const orders = await this.store.findByUser(userId, 'pending');\n \n // 返回24小时内的待支付订单\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 * 标记订单为已支付\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 * 标记订单为生成中\n */\n async markAsGenerating(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'generating' });\n }\n\n /**\n * 标记订单为完成\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 * 标记订单为失败\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 * 取消订单\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":[]}
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":[]}
@@ -35,13 +35,13 @@ var OrderManager = class {
35
35
  this.defaultChain = options.defaultChain || "base";
36
36
  }
37
37
  /**
38
- * 生成订单ID
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 * 订单管理模块\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' // 等待支付\n | 'paid' // 已支付\n | 'generating' // 生成中\n | 'completed' // 已完成\n | 'failed' // 失败\n | '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 * 内存订单存储(默认实现)\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 * 订单管理器\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 * 生成订单ID\n */\n private generateOrderId(): string {\n return 'vo_' + randomBytes(4).toString('hex');\n }\n\n /**\n * 创建订单\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 * 获取订单\n */\n async getOrder(orderId: string): Promise<Order | null> {\n return this.store.get(orderId);\n }\n\n /**\n * 更新订单\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 * 查找用户的待支付订单\n */\n async findPendingOrder(userId: string): Promise<Order | null> {\n const orders = await this.store.findByUser(userId, 'pending');\n \n // 返回24小时内的待支付订单\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 * 标记订单为已支付\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 * 标记订单为生成中\n */\n async markAsGenerating(orderId: string): Promise<Order | null> {\n return this.updateOrder(orderId, { status: 'generating' });\n }\n\n /**\n * 标记订单为完成\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 * 标记订单为失败\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 * 取消订单\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":[]}
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":[]}
@@ -1,9 +1,9 @@
1
- import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-CZzgdtin.mjs';
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 Gas 预授权
4
+ * PermitPayment - EIP-2612 Gasless Pre-authorization
5
5
  *
6
- * 让用户通过签名授权,服务方代付 Gas 执行 transferFrom
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
- * 获取用户当前 nonce
24
+ * Get user current nonce
25
25
  */
26
26
  getNonce(owner: string): Promise<number>;
27
27
  /**
28
- * 生成 EIP-712 签名请求(发给前端/用户钱包)
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
- * 执行 permit + transferFrom
32
+ * Execute permit + transferFrom
33
33
  *
34
- * @param owner 用户地址
35
- * @param amount 金额
36
- * @param signature 用户签名 {v, r, s, deadline}
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
- * 仅执行 permit(不 transfer
40
+ * Execute permit only (no transfer)
41
41
  */
42
42
  executePermit(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
43
43
  /**
44
- * 格式化 Permit 请求为用户消息
44
+ * Format Permit request as user message
45
45
  */
46
46
  formatPermitMessage(request: PermitRequest): string;
47
47
  }
@@ -1,9 +1,9 @@
1
- import { C as ChainName, a as ChainConfig, g as PermitRequest, h as PermitSignature, f as PermitExecuteResult } from '../index-CZzgdtin.js';
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 Gas 预授权
4
+ * PermitPayment - EIP-2612 Gasless Pre-authorization
5
5
  *
6
- * 让用户通过签名授权,服务方代付 Gas 执行 transferFrom
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
- * 获取用户当前 nonce
24
+ * Get user current nonce
25
25
  */
26
26
  getNonce(owner: string): Promise<number>;
27
27
  /**
28
- * 生成 EIP-712 签名请求(发给前端/用户钱包)
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
- * 执行 permit + transferFrom
32
+ * Execute permit + transferFrom
33
33
  *
34
- * @param owner 用户地址
35
- * @param amount 金额
36
- * @param signature 用户签名 {v, r, s, deadline}
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
- * 仅执行 permit(不 transfer
40
+ * Execute permit only (no transfer)
41
41
  */
42
42
  executePermit(owner: string, amount: number, signature: PermitSignature): Promise<PermitExecuteResult>;
43
43
  /**
44
- * 格式化 Permit 请求为用户消息
44
+ * Format Permit request as user message
45
45
  */
46
46
  formatPermitMessage(request: PermitRequest): string;
47
47
  }
@@ -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
- * 获取用户当前 nonce
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
- * 生成 EIP-712 签名请求(发给前端/用户钱包)
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
- * 执行 permit + transferFrom
181
+ * Execute permit + transferFrom
182
182
  *
183
- * @param owner 用户地址
184
- * @param amount 金额
185
- * @param signature 用户签名 {v, r, s, deadline}
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
- * 仅执行 permit(不 transfer
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
- * 格式化 Permit 请求为用户消息
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} **\u7B7E\u540D\u6388\u6743\u8BF7\u6C42**
252
+ return `\u{1F510} **Signature Authorization Request**
253
253
 
254
- \u6388\u6743 \`${(Number(message.value) / 1e6).toFixed(2)} USDC\` \u7ED9\u670D\u52A1\u65B9
254
+ Authorize \`${(Number(message.value) / 1e6).toFixed(2)} USDC\` to service provider
255
255
 
256
- **\u7B7E\u540D\u4FE1\u606F\uFF1A**
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
- \u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D\u6B64\u8BF7\u6C42\uFF08\u4E0D\u6D88\u8017 Gas\uFF09\u3002
262
+ Please sign this request in your wallet (no gas required).
263
263
 
264
264
  \`\`\`json
265
265
  ${JSON.stringify(typed_data, null, 2)}
@@ -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":[]}