@micro-cms/crypto-payments 1.0.4 → 1.0.5

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/index.d.mts CHANGED
@@ -25,6 +25,23 @@ declare const useSolanaWallet: () => {
25
25
  sendPayment: (intent: PaymentIntent) => Promise<string>;
26
26
  };
27
27
 
28
+ interface EthereumWindow extends Window {
29
+ ethereum?: {
30
+ isMetaMask?: boolean;
31
+ request: (request: {
32
+ method: string;
33
+ params?: any[];
34
+ }) => Promise<any>;
35
+ on: (event: string, callback: (...args: any[]) => void) => void;
36
+ removeListener: (event: string, callback: (...args: any[]) => void) => void;
37
+ };
38
+ }
39
+ declare const useEVMWallet: () => {
40
+ isAvailable: boolean;
41
+ connect: () => Promise<any>;
42
+ sendPayment: (intent: PaymentIntent) => Promise<string>;
43
+ };
44
+
28
45
  declare const PaymentWidget: react__default.FC<PaymentWidgetProps>;
29
46
 
30
47
  interface PaymentWidgetProps {
@@ -49,6 +66,8 @@ declare const usePayment: (props: PaymentWidgetProps) => {
49
66
  setStatus: react.Dispatch<react.SetStateAction<PaymentStatus>>;
50
67
  isSolanaAvailable: boolean;
51
68
  handleSolanaPay: () => Promise<void>;
69
+ isEVMAvailable: boolean;
70
+ handleEVMPay: () => Promise<void>;
52
71
  };
53
72
 
54
- export { type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, usePayment, useSolanaWallet };
73
+ export { type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, useEVMWallet, usePayment, useSolanaWallet };
package/dist/index.d.ts CHANGED
@@ -25,6 +25,23 @@ declare const useSolanaWallet: () => {
25
25
  sendPayment: (intent: PaymentIntent) => Promise<string>;
26
26
  };
27
27
 
28
+ interface EthereumWindow extends Window {
29
+ ethereum?: {
30
+ isMetaMask?: boolean;
31
+ request: (request: {
32
+ method: string;
33
+ params?: any[];
34
+ }) => Promise<any>;
35
+ on: (event: string, callback: (...args: any[]) => void) => void;
36
+ removeListener: (event: string, callback: (...args: any[]) => void) => void;
37
+ };
38
+ }
39
+ declare const useEVMWallet: () => {
40
+ isAvailable: boolean;
41
+ connect: () => Promise<any>;
42
+ sendPayment: (intent: PaymentIntent) => Promise<string>;
43
+ };
44
+
28
45
  declare const PaymentWidget: react__default.FC<PaymentWidgetProps>;
29
46
 
30
47
  interface PaymentWidgetProps {
@@ -49,6 +66,8 @@ declare const usePayment: (props: PaymentWidgetProps) => {
49
66
  setStatus: react.Dispatch<react.SetStateAction<PaymentStatus>>;
50
67
  isSolanaAvailable: boolean;
51
68
  handleSolanaPay: () => Promise<void>;
69
+ isEVMAvailable: boolean;
70
+ handleEVMPay: () => Promise<void>;
52
71
  };
53
72
 
54
- export { type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, usePayment, useSolanaWallet };
73
+ export { type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, useEVMWallet, usePayment, useSolanaWallet };
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  PaymentWidget: () => PaymentWidget,
24
+ useEVMWallet: () => useEVMWallet,
24
25
  usePayment: () => usePayment,
25
26
  useSolanaWallet: () => useSolanaWallet
26
27
  });
@@ -60,6 +61,36 @@ var useSolanaWallet = () => {
60
61
  return { isAvailable: !!getProvider(), connect, sendPayment };
61
62
  };
62
63
 
64
+ // src/providers/EVMProvider.ts
65
+ var useEVMWallet = () => {
66
+ const getProvider = () => {
67
+ if (typeof window !== "undefined" && "ethereum" in window) {
68
+ return window.ethereum;
69
+ }
70
+ return void 0;
71
+ };
72
+ const connect = async () => {
73
+ const provider = getProvider();
74
+ if (provider) {
75
+ try {
76
+ const accounts = await provider.request({ method: "eth_requestAccounts" });
77
+ return accounts[0];
78
+ } catch (err) {
79
+ throw new Error("User rejected the connection");
80
+ }
81
+ } else {
82
+ throw new Error("MetaMask or EVM wallet not found");
83
+ }
84
+ };
85
+ const sendPayment = async (intent) => {
86
+ const provider = getProvider();
87
+ if (!provider) throw new Error("Wallet not connected");
88
+ console.log(`Simulating EVM payment to ${intent.paymentAddress} for ${intent.amount} ${intent.currency}`);
89
+ return "simulated_evm_tx_hash_" + Math.random().toString(36).slice(2);
90
+ };
91
+ return { isAvailable: !!getProvider(), connect, sendPayment };
92
+ };
93
+
63
94
  // src/PaymentWidget.tsx
64
95
  var import_lucide_react = require("lucide-react");
65
96
  var import_clsx = require("clsx");
@@ -72,7 +103,18 @@ var PaymentWidget = ({
72
103
  className,
73
104
  ...props
74
105
  }) => {
75
- const { status, intent, error, initiate, verify, setStatus, isSolanaAvailable, handleSolanaPay } = usePayment(props);
106
+ const {
107
+ status,
108
+ intent,
109
+ error,
110
+ initiate,
111
+ verify,
112
+ setStatus,
113
+ isSolanaAvailable,
114
+ handleSolanaPay,
115
+ isEVMAvailable,
116
+ handleEVMPay
117
+ } = usePayment(props);
76
118
  if (status === "success") {
77
119
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: cn("p-6 text-center bg-green-50 rounded-xl border border-green-200", className), children: [
78
120
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle, { className: "mx-auto w-12 h-12 text-green-500 mb-4" }),
@@ -134,6 +176,16 @@ var PaymentWidget = ({
134
176
  "Pay with Phantom"
135
177
  ]
136
178
  }
179
+ ) : (intent.network.toLowerCase().includes("ethereum") || intent.network.toLowerCase().includes("evm") || intent.network.toLowerCase().includes("polygon")) && isEVMAvailable ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
180
+ "button",
181
+ {
182
+ onClick: handleEVMPay,
183
+ className: "w-full py-3 px-4 bg-[#f6851b] hover:bg-[#e2761b] text-white font-medium rounded-xl transition-colors flex items-center justify-center gap-2",
184
+ children: [
185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: "https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg", className: "w-4 h-4", alt: "MetaMask" }),
186
+ "Pay with MetaMask"
187
+ ]
188
+ }
137
189
  ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
138
190
  "button",
139
191
  {
@@ -237,11 +289,44 @@ var usePayment = (props) => {
237
289
  props.onError?.(err instanceof Error ? err : new Error(String(err)));
238
290
  }
239
291
  };
240
- return { status, intent, error, initiate, verify, setStatus, isSolanaAvailable, handleSolanaPay };
292
+ const { isAvailable: isEVMAvailable, connect: connectEVM, sendPayment: sendEVMPayment } = useEVMWallet();
293
+ const handleEVMPay = async () => {
294
+ try {
295
+ if (!intent) {
296
+ setError("Payment intent not established.");
297
+ setStatus("error");
298
+ return;
299
+ }
300
+ setStatus("connecting");
301
+ const account = await connectEVM();
302
+ console.log("Connected to EVM with account:", account);
303
+ setStatus("pending_signature");
304
+ const txHash = await sendEVMPayment(intent);
305
+ setStatus("verifying");
306
+ await verify(txHash);
307
+ } catch (err) {
308
+ setError(err.message || "Failed to connect to MetaMask or sign transaction.");
309
+ setStatus("error");
310
+ props.onError?.(err instanceof Error ? err : new Error(String(err)));
311
+ }
312
+ };
313
+ return {
314
+ status,
315
+ intent,
316
+ error,
317
+ initiate,
318
+ verify,
319
+ setStatus,
320
+ isSolanaAvailable,
321
+ handleSolanaPay,
322
+ isEVMAvailable,
323
+ handleEVMPay
324
+ };
241
325
  };
242
326
  // Annotate the CommonJS export names for ESM import in node:
243
327
  0 && (module.exports = {
244
328
  PaymentWidget,
329
+ useEVMWallet,
245
330
  usePayment,
246
331
  useSolanaWallet
247
332
  });
package/dist/index.mjs CHANGED
@@ -34,6 +34,36 @@ var useSolanaWallet = () => {
34
34
  return { isAvailable: !!getProvider(), connect, sendPayment };
35
35
  };
36
36
 
37
+ // src/providers/EVMProvider.ts
38
+ var useEVMWallet = () => {
39
+ const getProvider = () => {
40
+ if (typeof window !== "undefined" && "ethereum" in window) {
41
+ return window.ethereum;
42
+ }
43
+ return void 0;
44
+ };
45
+ const connect = async () => {
46
+ const provider = getProvider();
47
+ if (provider) {
48
+ try {
49
+ const accounts = await provider.request({ method: "eth_requestAccounts" });
50
+ return accounts[0];
51
+ } catch (err) {
52
+ throw new Error("User rejected the connection");
53
+ }
54
+ } else {
55
+ throw new Error("MetaMask or EVM wallet not found");
56
+ }
57
+ };
58
+ const sendPayment = async (intent) => {
59
+ const provider = getProvider();
60
+ if (!provider) throw new Error("Wallet not connected");
61
+ console.log(`Simulating EVM payment to ${intent.paymentAddress} for ${intent.amount} ${intent.currency}`);
62
+ return "simulated_evm_tx_hash_" + Math.random().toString(36).slice(2);
63
+ };
64
+ return { isAvailable: !!getProvider(), connect, sendPayment };
65
+ };
66
+
37
67
  // src/PaymentWidget.tsx
38
68
  import { Wallet, CheckCircle, Loader2, AlertCircle, ExternalLink, Cpu } from "lucide-react";
39
69
  import { clsx } from "clsx";
@@ -46,7 +76,18 @@ var PaymentWidget = ({
46
76
  className,
47
77
  ...props
48
78
  }) => {
49
- const { status, intent, error, initiate, verify, setStatus, isSolanaAvailable, handleSolanaPay } = usePayment(props);
79
+ const {
80
+ status,
81
+ intent,
82
+ error,
83
+ initiate,
84
+ verify,
85
+ setStatus,
86
+ isSolanaAvailable,
87
+ handleSolanaPay,
88
+ isEVMAvailable,
89
+ handleEVMPay
90
+ } = usePayment(props);
50
91
  if (status === "success") {
51
92
  return /* @__PURE__ */ jsxs("div", { className: cn("p-6 text-center bg-green-50 rounded-xl border border-green-200", className), children: [
52
93
  /* @__PURE__ */ jsx(CheckCircle, { className: "mx-auto w-12 h-12 text-green-500 mb-4" }),
@@ -108,6 +149,16 @@ var PaymentWidget = ({
108
149
  "Pay with Phantom"
109
150
  ]
110
151
  }
152
+ ) : (intent.network.toLowerCase().includes("ethereum") || intent.network.toLowerCase().includes("evm") || intent.network.toLowerCase().includes("polygon")) && isEVMAvailable ? /* @__PURE__ */ jsxs(
153
+ "button",
154
+ {
155
+ onClick: handleEVMPay,
156
+ className: "w-full py-3 px-4 bg-[#f6851b] hover:bg-[#e2761b] text-white font-medium rounded-xl transition-colors flex items-center justify-center gap-2",
157
+ children: [
158
+ /* @__PURE__ */ jsx("img", { src: "https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg", className: "w-4 h-4", alt: "MetaMask" }),
159
+ "Pay with MetaMask"
160
+ ]
161
+ }
111
162
  ) : /* @__PURE__ */ jsx(
112
163
  "button",
113
164
  {
@@ -211,10 +262,43 @@ var usePayment = (props) => {
211
262
  props.onError?.(err instanceof Error ? err : new Error(String(err)));
212
263
  }
213
264
  };
214
- return { status, intent, error, initiate, verify, setStatus, isSolanaAvailable, handleSolanaPay };
265
+ const { isAvailable: isEVMAvailable, connect: connectEVM, sendPayment: sendEVMPayment } = useEVMWallet();
266
+ const handleEVMPay = async () => {
267
+ try {
268
+ if (!intent) {
269
+ setError("Payment intent not established.");
270
+ setStatus("error");
271
+ return;
272
+ }
273
+ setStatus("connecting");
274
+ const account = await connectEVM();
275
+ console.log("Connected to EVM with account:", account);
276
+ setStatus("pending_signature");
277
+ const txHash = await sendEVMPayment(intent);
278
+ setStatus("verifying");
279
+ await verify(txHash);
280
+ } catch (err) {
281
+ setError(err.message || "Failed to connect to MetaMask or sign transaction.");
282
+ setStatus("error");
283
+ props.onError?.(err instanceof Error ? err : new Error(String(err)));
284
+ }
285
+ };
286
+ return {
287
+ status,
288
+ intent,
289
+ error,
290
+ initiate,
291
+ verify,
292
+ setStatus,
293
+ isSolanaAvailable,
294
+ handleSolanaPay,
295
+ isEVMAvailable,
296
+ handleEVMPay
297
+ };
215
298
  };
216
299
  export {
217
300
  PaymentWidget,
301
+ useEVMWallet,
218
302
  usePayment,
219
303
  useSolanaWallet
220
304
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micro-cms/crypto-payments",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Composable Crypto Payment Widget for Micro-CMS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",