@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 +20 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +87 -2
- package/dist/index.mjs +86 -2
- package/package.json +1 -1
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 {
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
};
|