@alphadevs_labs/upay-sdk 0.0.1 → 0.0.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/README.md ADDED
@@ -0,0 +1,115 @@
1
+ # @alphadevs_labs/upay-sdk
2
+
3
+ The official SDK for [UPay](https://tryupay.xyz) — a Stripe-style crypto checkout. Drop a Pay button on any website and let customers pay with whatever tokens they hold, on whatever chain, in one tap. You receive your chosen stablecoin on your chosen chain, powered by [Particle Network Universal Accounts](https://particle.network).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @alphadevs_labs/upay-sdk
9
+ # or
10
+ pnpm add @alphadevs_labs/upay-sdk
11
+ # or
12
+ yarn add @alphadevs_labs/upay-sdk
13
+ ```
14
+
15
+ Requires React ≥ 18 (only needed if you use `UPayButton`; the imperative `UPay` client has no React dependency).
16
+
17
+ ## Quick start — React
18
+
19
+ ```tsx
20
+ import { UPayButton } from "@alphadevs_labs/upay-sdk";
21
+
22
+ export function CheckoutButton() {
23
+ return (
24
+ <UPayButton
25
+ apiKey="pk_live_..."
26
+ amount="40"
27
+ token="USDC"
28
+ chain="base"
29
+ onSuccess={(payment) => console.log("Paid!", payment.txHashes)}
30
+ onError={(err) => console.error(err)}
31
+ />
32
+ );
33
+ }
34
+ ```
35
+
36
+ Clicking the button creates a checkout session against your UPay account and opens it in an embedded modal. On success, `onSuccess` fires with the completed payment.
37
+
38
+ ## Quick start — imperative client
39
+
40
+ Use `UPay` directly if you're not in React, or want full control over the checkout flow:
41
+
42
+ ```ts
43
+ import { UPay } from "@alphadevs_labs/upay-sdk";
44
+
45
+ const upay = new UPay({ apiKey: "pk_live_..." });
46
+
47
+ const session = await upay.createCheckout({
48
+ amount: "40",
49
+ token: "USDC",
50
+ chain: "base",
51
+ });
52
+
53
+ upay.openCheckout(session.id);
54
+ ```
55
+
56
+ ## Quick start — script tag (no build step)
57
+
58
+ ```html
59
+ <script src="https://tryupay.xyz/sdk.js" defer></script>
60
+
61
+ <div
62
+ data-upay-button
63
+ data-key="pk_live_..."
64
+ data-amount="40"
65
+ data-token="USDC"
66
+ data-chain="base"
67
+ ></div>
68
+ ```
69
+
70
+ The script scans the page for `[data-upay-button]` elements on load and mounts a working Pay button into each one.
71
+
72
+ ## API reference
73
+
74
+ ### `<UPayButton />`
75
+
76
+ | Prop | Type | Required | Description |
77
+ |---|---|---|---|
78
+ | `apiKey` | `string` | ✅ | Your publishable key (`pk_live_...`), safe to expose client-side. |
79
+ | `amount` | `string` | ✅ | Amount to charge, in the settlement token's units. |
80
+ | `baseUrl` | `string` | | Override the UPay API/checkout host. Defaults to the current origin. |
81
+ | `token` | `string` | | Settlement token override (e.g. `"USDC"`). |
82
+ | `chain` | `string` | | Settlement chain override (e.g. `"base"`). |
83
+ | `metadata` | `Record<string, unknown>` | | Arbitrary metadata attached to the session (order id, product id, etc.). |
84
+ | `label` | `string` | | Button text. Defaults to `"Pay with UPay"`. |
85
+ | `className` | `string` | | Use your own styles instead of the built-in gradient button. |
86
+ | `onSuccess` | `(payment: UPayPayment) => void` | | Called once the payment is confirmed. |
87
+ | `onError` | `(err: Error) => void` | | Called if session creation or checkout fails. |
88
+
89
+ ### `new UPay(options)`
90
+
91
+ | Option | Type | Required | Description |
92
+ |---|---|---|---|
93
+ | `apiKey` | `string` | ✅ | Your publishable key. |
94
+ | `baseUrl` | `string` | | Override the UPay API/checkout host. |
95
+
96
+ **`upay.createCheckout(options)`** → `Promise<UPayCheckoutSession>`
97
+
98
+ | Option | Type | Required |
99
+ |---|---|---|
100
+ | `amount` | `string` | ✅ |
101
+ | `token` | `string` | |
102
+ | `chain` | `string` | |
103
+ | `metadata` | `Record<string, unknown>` | |
104
+ | `successUrl` | `string` | |
105
+ | `cancelUrl` | `string` | |
106
+
107
+ **`upay.openCheckout(sessionId)`** — mounts an embedded checkout modal (iframe) for the given session and handles close/resize/success messaging automatically.
108
+
109
+ ## Getting API keys
110
+
111
+ Sign up and create a merchant account at [tryupay.xyz/dashboard](https://tryupay.xyz/dashboard) to get your publishable (`pk_live_...`) and secret (`sk_live_...`) keys. Only the publishable key is used by this SDK — never expose your secret key client-side.
112
+
113
+ ## License
114
+
115
+ MIT
package/dist/index.js CHANGED
@@ -117,7 +117,7 @@ var UPay = class {
117
117
  "transition:height 0.2s ease",
118
118
  "overflow:hidden"
119
119
  ].join(";");
120
- iframe.allow = "payment";
120
+ iframe.allow = "payment; clipboard-write";
121
121
  iframe.onload = () => {
122
122
  spinner.remove();
123
123
  iframe.style.display = "block";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["export { UPayButton } from \"./UPayButton\";\nexport { UPay } from \"./client\";\nexport type {\n UPayButtonProps,\n UPayPayment,\n UPayCheckoutSession,\n UPayClientOptions,\n CreateCheckoutOptions,\n} from \"./types\";\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":["React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["export { UPayButton } from \"./UPayButton\";\nexport { UPay } from \"./client\";\nexport type {\n UPayButtonProps,\n UPayPayment,\n UPayCheckoutSession,\n UPayClientOptions,\n CreateCheckoutOptions,\n} from \"./types\";\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment; clipboard-write\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":["React"]}
package/dist/index.mjs CHANGED
@@ -80,7 +80,7 @@ var UPay = class {
80
80
  "transition:height 0.2s ease",
81
81
  "overflow:hidden"
82
82
  ].join(";");
83
- iframe.allow = "payment";
83
+ iframe.allow = "payment; clipboard-write";
84
84
  iframe.onload = () => {
85
85
  spinner.remove();
86
86
  iframe.style.display = "block";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment; clipboard-write\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":";AAEA,OAAO,SAAS,UAAU,mBAAmB;;;ACI7C,IAAM,mBACJ,OAAO,WAAW,cACd,OAAO,SAAS,SAChB;AAEC,IAAM,OAAN,MAAW;AAAA,EACR;AAAA,EACA;AAAA,EAER,YAAY,SAA4B;AACtC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,eACJ,SAC8B;AAC9B,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,oBAAoB;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,QAClB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MACtB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,gBAAgB,EAAE;AACrE,YAAM,IAAI,MAAM,IAAI,SAAS,QAAQ,IAAI,MAAM,EAAE;AAAA,IACnD;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,aAAa,WAAyB;AACpC,UAAM,MAAM,GAAG,KAAK,OAAO,aAAa,SAAS;AAEjD,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,gBAAgB,SAAS,eAAe,sBAAsB;AACpE,QAAI,cAAe,eAAc,OAAO;AAExC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,KAAK;AACf,cAAU,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAGV,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,MAAM,UAAU;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AACV,YAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASpB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,MAAM,UAAU;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AACV,WAAO,QAAQ;AACf,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO;AACf,aAAO,MAAM,UAAU;AAAA,IACzB;AAEA,UAAM,QAAQ,MAAY,UAAU,OAAO;AAE3C,cAAU,iBAAiB,SAAS,CAAC,MAAM;AACzC,UAAI,EAAE,WAAW,UAAW,OAAM;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AACL,YAAI,EAAE,MAAM,SAAS,aAAc,OAAM;AACzC,YAAI,EAAE,MAAM,SAAS,eAAe;AAClC,gBAAM,QAAQ,OAAO,cAAc;AACnC,iBAAO,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,KAAK,QAAQ,KAAK,CAAC;AAAA,QACzD;AACA,YAAI,EAAE,MAAM,SAAS,gBAAgB;AACnC,gBAAM;AACN,iBAAO;AAAA,YACL,IAAI,YAAY,wBAAwB,EAAE,QAAQ,EAAE,KAAK,QAAQ,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,MAAM;AAAA,IAChB;AAEA,cAAU,YAAY,OAAO;AAC7B,cAAU,YAAY,MAAM;AAC5B,aAAS,KAAK,YAAY,SAAS;AAAA,EACrC;AACF;;;ADjIA,IAAM,gBAAgB;AAAA,EACpB,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,WAAW,MACf;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA;AAAA,EAEZ,oCAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,QAAO,yBAAwB;AAAA,EAC7D;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AACF;AAGF,IAAM,UAAU,MACd;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,OAAO,EAAE,WAAW,iCAAiC;AAAA;AAAA,EAErD;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,EACA,oCAAC,eAAO,oDAAqD;AAC/D;AAGK,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACF,GAAoB;AAClB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,cAAc,YAAY,YAAY;AAC1C,QAAI,QAAS;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,SAAS,IAAI,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAC3C,YAAM,UAAU,MAAM,OAAO,eAAe;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,aAAa,QAAQ,EAAE;AAE9B,YAAM,gBAAgB,CAAC,MAAa;AAClC,cAAM,UAAW,EAA+B;AAChD,oBAAY,OAAO;AACnB,eAAO,oBAAoB,wBAAwB,aAAa;AAAA,MAClE;AACA,aAAO,iBAAiB,wBAAwB,aAAa;AAAA,IAC/D,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAU,KAAK;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,CAAC;AAExE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA,OACE,YACI,SACA;AAAA,QACE,GAAG,cAAc;AAAA,QACjB,GAAI,UAAU,cAAc,UAAU,CAAC;AAAA,MACzC;AAAA,MAEN,cAAY,UAAU,6BAAwB;AAAA,MAC9C,aAAW;AAAA;AAAA,IAEV,UAAU,oCAAC,aAAQ,IAAK,oCAAC,cAAS;AAAA,IACnC,oCAAC,cAAM,UAAU,2BAAsB,KAAM;AAAA,EAC/C;AAEJ;","names":[]}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@alphadevs_labs/upay-sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "UPay SDK — UPayButton React component and imperative client",
5
5
  "license": "MIT",
6
+ "homepage": "https://tryupay.xyz",
6
7
  "publishConfig": {
7
8
  "access": "public"
8
9
  },
@@ -10,6 +11,7 @@
10
11
  "type": "git",
11
12
  "url": "https://github.com/0xyshv/upay"
12
13
  },
14
+ "keywords": ["crypto", "checkout", "payments", "web3", "stablecoin", "sdk"],
13
15
  "main": "./dist/index.js",
14
16
  "module": "./dist/index.mjs",
15
17
  "types": "./dist/index.d.ts",