@use-glyph/sdk-react 1.2.12 → 1.2.14
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/EIP1193Strategy.js +23 -22
- package/dist/EIP1193Strategy.js.map +1 -1
- package/dist/glyph-widget.es.js +3 -3
- package/dist/glyph-widget.umd.js +42 -51
- package/dist/glyph-widget.umd.js.map +1 -1
- package/dist/index.js +10918 -15956
- package/dist/index.js.map +1 -1
- package/dist/types/hooks/useGlyphFunding.d.ts +1 -1
- package/package.json +1 -1
package/dist/EIP1193Strategy.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { jsx as Y } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
2
|
+
import { useState as f, useEffect as h, useCallback as l } from "react";
|
|
3
|
+
import { apeChain as B } from "viem/chains";
|
|
4
|
+
import { useAccount as J, useDisconnect as R, useSignMessage as q, useSendTransaction as z, useAccountEffect as H } from "wagmi";
|
|
5
|
+
import { c as Q, W as S, b as V, a as X } from "./index.js";
|
|
6
|
+
const A = "__glyph-widget-token__", _ = "__glyph-widget-nonce__", r = Q("EIP1193Strategy"), oe = ({
|
|
6
7
|
children: M,
|
|
7
8
|
glyphUrl: a,
|
|
8
9
|
onLogin: P,
|
|
9
10
|
onLogout: W,
|
|
10
11
|
askForSignature: y = !0
|
|
11
12
|
}) => {
|
|
12
|
-
const [j, c] =
|
|
13
|
+
const [j, c] = f(!1), [L, g] = f(null), { address: t, isConnected: o, chainId: I } = J(), { disconnectAsync: v } = R(), { signMessageAsync: d } = q(), { sendTransactionAsync: C } = z();
|
|
13
14
|
r.log({ address: t, isConnected: o });
|
|
14
|
-
const [i,
|
|
15
|
+
const [i, m] = f(() => {
|
|
15
16
|
if (typeof window > "u")
|
|
16
17
|
return null;
|
|
17
18
|
try {
|
|
@@ -19,7 +20,7 @@ const A = "__glyph-widget-token__", _ = "__glyph-widget-nonce__", r = H("EIP1193
|
|
|
19
20
|
} catch (e) {
|
|
20
21
|
return r.warn("Error reading session token", e), null;
|
|
21
22
|
}
|
|
22
|
-
}), [u, O] =
|
|
23
|
+
}), [u, O] = f(null), [n, w] = f(() => {
|
|
23
24
|
if (typeof window > "u")
|
|
24
25
|
return null;
|
|
25
26
|
try {
|
|
@@ -61,17 +62,17 @@ const A = "__glyph-widget-token__", _ = "__glyph-widget-nonce__", r = H("EIP1193
|
|
|
61
62
|
);
|
|
62
63
|
h(() => {
|
|
63
64
|
!t || !o || n || (c(!0), T(t).then(({ message: e, nonce: s }) => {
|
|
64
|
-
O(e),
|
|
65
|
+
O(e), w(s), c(!1);
|
|
65
66
|
}).finally(() => {
|
|
66
67
|
c(!1);
|
|
67
68
|
}));
|
|
68
69
|
}, [t, o, T, n]), h(() => {
|
|
69
70
|
if (!i || !n) return;
|
|
70
|
-
const e =
|
|
71
|
+
const e = V(a || S, async () => i, {
|
|
71
72
|
"x-evm-address": t,
|
|
72
73
|
"x-glyph-nonce": n
|
|
73
74
|
});
|
|
74
|
-
|
|
75
|
+
g(() => e);
|
|
75
76
|
}, [i, t, a, n]);
|
|
76
77
|
const $ = l(async () => {
|
|
77
78
|
await v();
|
|
@@ -82,38 +83,38 @@ const A = "__glyph-widget-token__", _ = "__glyph-widget-nonce__", r = H("EIP1193
|
|
|
82
83
|
}
|
|
83
84
|
try {
|
|
84
85
|
if (!t || !o || !u || !n) {
|
|
85
|
-
|
|
86
|
+
g(null), c(!1);
|
|
86
87
|
return;
|
|
87
88
|
}
|
|
88
89
|
c(!0);
|
|
89
|
-
const e = await
|
|
90
|
+
const e = await d({ account: t, message: u });
|
|
90
91
|
console.log(n, u, e);
|
|
91
92
|
const s = (await k(t, e, n))?.token;
|
|
92
|
-
|
|
93
|
+
m(s);
|
|
93
94
|
} catch (e) {
|
|
94
95
|
r.error("Authentication failed", e), e?.message?.toLowerCase?.().includes?.("user rejected") || await alert(
|
|
95
96
|
"Authentication failed - your browser could be blocking the popups. Allow popups or try to manually click sign in."
|
|
96
|
-
),
|
|
97
|
+
), g(null), m(null), w(null);
|
|
97
98
|
} finally {
|
|
98
99
|
c(!1), P?.();
|
|
99
100
|
}
|
|
100
|
-
}, [t, o, u, n,
|
|
101
|
-
|
|
101
|
+
}, [t, o, u, n, d, k]), D = l(async () => {
|
|
102
|
+
w(null), m(null), c(!1), g(null), W?.();
|
|
102
103
|
}, []), F = l(
|
|
103
104
|
async ({ message: e }) => {
|
|
104
105
|
if (!t || !o)
|
|
105
106
|
throw new Error("Wallet not connected");
|
|
106
|
-
return
|
|
107
|
+
return d({ account: t, message: e });
|
|
107
108
|
},
|
|
108
|
-
[t, o,
|
|
109
|
+
[t, o, d]
|
|
109
110
|
), K = l(
|
|
110
111
|
async ({ transaction: e }) => {
|
|
111
112
|
if (!t || !o) throw new Error("Wallet not connected");
|
|
112
|
-
return C({ ...e, chainId: I ||
|
|
113
|
+
return C({ ...e, chainId: I || B.id });
|
|
113
114
|
},
|
|
114
115
|
[t, o, C, I]
|
|
115
|
-
), [b, N] =
|
|
116
|
-
return
|
|
116
|
+
), [b, N] = f(!1);
|
|
117
|
+
return H({
|
|
117
118
|
onConnect: () => {
|
|
118
119
|
y && N(!0);
|
|
119
120
|
},
|
|
@@ -143,6 +144,6 @@ const A = "__glyph-widget-token__", _ = "__glyph-widget-nonce__", r = H("EIP1193
|
|
|
143
144
|
);
|
|
144
145
|
};
|
|
145
146
|
export {
|
|
146
|
-
|
|
147
|
+
oe as default
|
|
147
148
|
};
|
|
148
149
|
//# sourceMappingURL=EIP1193Strategy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EIP1193Strategy.js","sources":["../src/context/strategies/EIP1193Strategy.tsx"],"sourcesContent":["import { UnsignedTransactionRequest } from \"@privy-io/react-auth\";\nimport { FC, useCallback, useEffect, useState } from \"react\";\nimport { apeChain } from \"viem/chains\";\nimport { useAccount, useAccountEffect, useDisconnect, useSendTransaction, useSignMessage } from \"wagmi\";\nimport { WIDGET_API_BASE_URL } from \"../../lib/constants\";\nimport { createLogger } from \"../../lib/utils\";\nimport { BaseGlyphProviderOptionsWithSignature } from \"../../types\";\nimport { GlyphApiFetch, GlyphContext, createApiFetch } from \"../GlyphContext\";\n\ntype GlyphSigningMsgResponse = { message: string; nonce: string };\ntype GlyphSignatureVerifyResponse = { token: string };\n\nconst TOKEN_KEY = \"__glyph-widget-token__\";\nconst NONCE_KEY = \"__glyph-widget-nonce__\";\nconst logger = createLogger(\"EIP1193Strategy\");\n\nconst EIP1193Strategy: FC<BaseGlyphProviderOptionsWithSignature> = ({\n children,\n glyphUrl,\n onLogin,\n onLogout,\n askForSignature = true\n}) => {\n const [loading, setLoading] = useState(false);\n const [apiFetch, setApiFetch] = useState<GlyphApiFetch | null>(null);\n const { address, isConnected, chainId } = useAccount(); // detect wallet connection\n const { disconnectAsync } = useDisconnect(); // disconnect the wallet\n const { signMessageAsync } = useSignMessage(); // signing messages with the wallet\n const { sendTransactionAsync } = useSendTransaction(); // sending transactions with the wallet\n\n logger.log({ address, isConnected });\n\n // Fetch authentication token from session storage\n const [token, setToken] = useState<string | null>(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return localStorage.getItem(TOKEN_KEY);\n } catch (error) {\n logger.warn(\"Error reading session token\", error);\n return null;\n }\n });\n\n const [message, setMessage] = useState<string | null>(null);\n\n // fetch nonce from session storage\n const [sessNonce, setSessNonce] = useState<string | null>(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return localStorage.getItem(NONCE_KEY);\n } catch (error) {\n logger.warn(\"Error reading session nonce\", error);\n return null;\n }\n });\n\n // Keep token and nonce updated in session storage\n useEffect(() => {\n try {\n if (!token || !sessNonce) {\n localStorage.removeItem(TOKEN_KEY);\n localStorage.removeItem(NONCE_KEY);\n } else {\n localStorage.setItem(TOKEN_KEY, token!);\n localStorage.setItem(NONCE_KEY, sessNonce!);\n }\n } catch (error) {\n logger.error(\"Error saving session token\", error);\n }\n }, [sessNonce, token]);\n\n const fetchMessageToSign = useCallback(\n async (address: string): Promise<GlyphSigningMsgResponse> => {\n try {\n const payload = (await fetch(\n `${glyphUrl || WIDGET_API_BASE_URL}/api/widget/auth/message/${address}`\n ).then((resp) => resp.json())) as GlyphSigningMsgResponse;\n\n return payload;\n } catch (error) {\n logger.error(\"Can't fetch message to sign\", error);\n throw new Error(\"Failed to fetch the message to sign.\");\n }\n },\n [glyphUrl]\n );\n\n const verifySignature = useCallback(\n async (address: string, signature: string, nonce: string): Promise<GlyphSignatureVerifyResponse> => {\n try {\n const payload = await fetch(`${glyphUrl || WIDGET_API_BASE_URL}/api/widget/auth/verify/${address}`, {\n method: \"POST\",\n body: JSON.stringify({ signature, nonce })\n }).then((resp) => resp.json());\n return payload as unknown as GlyphSignatureVerifyResponse;\n } catch (error) {\n logger.error(\"Can't verify signature\", error);\n throw new Error(\"Signature verification failed.\");\n }\n },\n [glyphUrl]\n );\n\n useEffect(() => {\n if (!address || !isConnected) return;\n if (sessNonce) return;\n\n setLoading(true);\n fetchMessageToSign(address)\n .then(({ message, nonce }) => {\n setMessage(message);\n setSessNonce(nonce);\n setLoading(false);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [address, isConnected, fetchMessageToSign, sessNonce]);\n\n useEffect(() => {\n if (!token || !sessNonce) return;\n\n const glyphApiFetch = createApiFetch(glyphUrl || WIDGET_API_BASE_URL, async () => token, {\n \"x-evm-address\": address!,\n \"x-glyph-nonce\": sessNonce!\n });\n setApiFetch(() => glyphApiFetch);\n }, [token, address, glyphUrl, sessNonce]);\n\n const disconnect = useCallback(async () => {\n await disconnectAsync();\n }, [disconnectAsync]);\n\n const authenticate = useCallback(async () => {\n logger.log(\"authenticate\");\n if (!address) {\n logger.error(\"no wallet connected.\");\n return;\n }\n\n try {\n if (!address || !isConnected || !message || !sessNonce) {\n setApiFetch(null);\n setLoading(false);\n return;\n }\n\n // Sign a message with the wallet to authenticate\n setLoading(true);\n\n const userSignature = await signMessageAsync({ account: address, message: message });\n console.log(sessNonce, message, userSignature);\n\n const token = (await verifySignature(address, userSignature, sessNonce))?.token;\n\n setToken(token);\n } catch (error) {\n logger.error(\"Authentication failed\", error);\n if (!(error as Error)?.message?.toLowerCase?.().includes?.(\"user rejected\")) {\n await alert(\n \"Authentication failed - your browser could be blocking the popups. Allow popups or try to manually click sign in.\"\n );\n }\n setApiFetch(null);\n setToken(null);\n setSessNonce(null);\n } finally {\n setLoading(false);\n onLogin?.();\n }\n }, [address, isConnected, message, sessNonce, signMessageAsync, verifySignature]);\n\n const logoutSideEffect = useCallback(async () => {\n setSessNonce(null);\n setToken(null);\n setLoading(false);\n setApiFetch(null);\n onLogout?.();\n }, []);\n\n const signMessage = useCallback(\n async ({ message }: { message: string }) => {\n if (!address || !isConnected) {\n throw new Error(\"Wallet not connected\");\n }\n return signMessageAsync({ account: address, message });\n },\n [address, isConnected, signMessageAsync]\n );\n\n const sendTransaction = useCallback(\n async ({ transaction }: { transaction: Omit<UnsignedTransactionRequest, \"chainId\"> }) => {\n if (!address || !isConnected) throw new Error(\"Wallet not connected\");\n\n return sendTransactionAsync({ ...transaction, chainId: chainId || apeChain.id } as any);\n },\n [address, isConnected, sendTransactionAsync, chainId]\n );\n\n const [tryAuthenticate, setTryAuthenticate] = useState<boolean>(false);\n // Perform graceful logout when the wallet is disconnected from anywhere within the app\n useAccountEffect({\n onConnect: () => {\n if (askForSignature) {\n // Perform initial authentication when the wallet is connected\n setTryAuthenticate(true);\n }\n },\n onDisconnect: () => {\n logoutSideEffect();\n }\n });\n useEffect(() => {\n if (askForSignature && isConnected && address && tryAuthenticate && sessNonce && message) {\n // Initial authentication\n authenticate();\n setTryAuthenticate(false);\n }\n }, [isConnected, address, authenticate, tryAuthenticate, sessNonce, message, askForSignature]);\n\n return (\n <GlyphContext.Provider\n value={{\n ready: !loading && !!sessNonce,\n authenticated: isConnected && !!address && token !== null,\n glyphUrl: glyphUrl as string, // Pass as string to avoid type error (we are passing fallback value in useGlyph hook at a common place)\n hideWidget: !isConnected || !address,\n login: authenticate,\n logout: disconnect, // on disconnect, logoutSideEffect is called and clears states\n signMessage,\n sendTransaction,\n apiFetch: apiFetch!\n }}\n children={children}\n />\n );\n};\n\nexport default EIP1193Strategy;\n"],"names":["TOKEN_KEY","NONCE_KEY","logger","createLogger","EIP1193Strategy","children","glyphUrl","onLogin","onLogout","askForSignature","loading","setLoading","useState","apiFetch","setApiFetch","address","isConnected","chainId","useAccount","disconnectAsync","useDisconnect","signMessageAsync","useSignMessage","sendTransactionAsync","useSendTransaction","token","setToken","error","message","setMessage","sessNonce","setSessNonce","useEffect","fetchMessageToSign","useCallback","WIDGET_API_BASE_URL","resp","verifySignature","signature","nonce","glyphApiFetch","createApiFetch","disconnect","authenticate","userSignature","logoutSideEffect","signMessage","sendTransaction","transaction","apeChain","tryAuthenticate","setTryAuthenticate","useAccountEffect","jsx","GlyphContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EIP1193Strategy.js","sources":["../src/context/strategies/EIP1193Strategy.tsx"],"sourcesContent":["import { UnsignedTransactionRequest } from \"@privy-io/react-auth\";\nimport { FC, useCallback, useEffect, useState } from \"react\";\nimport { apeChain } from \"viem/chains\";\nimport { useAccount, useAccountEffect, useDisconnect, useSendTransaction, useSignMessage } from \"wagmi\";\nimport { WIDGET_API_BASE_URL } from \"../../lib/constants\";\nimport { createLogger } from \"../../lib/utils\";\nimport { BaseGlyphProviderOptionsWithSignature } from \"../../types\";\nimport { GlyphApiFetch, GlyphContext, createApiFetch } from \"../GlyphContext\";\n\ntype GlyphSigningMsgResponse = { message: string; nonce: string };\ntype GlyphSignatureVerifyResponse = { token: string };\n\nconst TOKEN_KEY = \"__glyph-widget-token__\";\nconst NONCE_KEY = \"__glyph-widget-nonce__\";\nconst logger = createLogger(\"EIP1193Strategy\");\n\nconst EIP1193Strategy: FC<BaseGlyphProviderOptionsWithSignature> = ({\n children,\n glyphUrl,\n onLogin,\n onLogout,\n askForSignature = true\n}) => {\n const [loading, setLoading] = useState(false);\n const [apiFetch, setApiFetch] = useState<GlyphApiFetch | null>(null);\n const { address, isConnected, chainId } = useAccount(); // detect wallet connection\n const { disconnectAsync } = useDisconnect(); // disconnect the wallet\n const { signMessageAsync } = useSignMessage(); // signing messages with the wallet\n const { sendTransactionAsync } = useSendTransaction(); // sending transactions with the wallet\n\n logger.log({ address, isConnected });\n\n // Fetch authentication token from session storage\n const [token, setToken] = useState<string | null>(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return localStorage.getItem(TOKEN_KEY);\n } catch (error) {\n logger.warn(\"Error reading session token\", error);\n return null;\n }\n });\n\n const [message, setMessage] = useState<string | null>(null);\n\n // fetch nonce from session storage\n const [sessNonce, setSessNonce] = useState<string | null>(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n return localStorage.getItem(NONCE_KEY);\n } catch (error) {\n logger.warn(\"Error reading session nonce\", error);\n return null;\n }\n });\n\n // Keep token and nonce updated in session storage\n useEffect(() => {\n try {\n if (!token || !sessNonce) {\n localStorage.removeItem(TOKEN_KEY);\n localStorage.removeItem(NONCE_KEY);\n } else {\n localStorage.setItem(TOKEN_KEY, token!);\n localStorage.setItem(NONCE_KEY, sessNonce!);\n }\n } catch (error) {\n logger.error(\"Error saving session token\", error);\n }\n }, [sessNonce, token]);\n\n const fetchMessageToSign = useCallback(\n async (address: string): Promise<GlyphSigningMsgResponse> => {\n try {\n const payload = (await fetch(\n `${glyphUrl || WIDGET_API_BASE_URL}/api/widget/auth/message/${address}`\n ).then((resp) => resp.json())) as GlyphSigningMsgResponse;\n\n return payload;\n } catch (error) {\n logger.error(\"Can't fetch message to sign\", error);\n throw new Error(\"Failed to fetch the message to sign.\");\n }\n },\n [glyphUrl]\n );\n\n const verifySignature = useCallback(\n async (address: string, signature: string, nonce: string): Promise<GlyphSignatureVerifyResponse> => {\n try {\n const payload = await fetch(`${glyphUrl || WIDGET_API_BASE_URL}/api/widget/auth/verify/${address}`, {\n method: \"POST\",\n body: JSON.stringify({ signature, nonce })\n }).then((resp) => resp.json());\n return payload as unknown as GlyphSignatureVerifyResponse;\n } catch (error) {\n logger.error(\"Can't verify signature\", error);\n throw new Error(\"Signature verification failed.\");\n }\n },\n [glyphUrl]\n );\n\n useEffect(() => {\n if (!address || !isConnected) return;\n if (sessNonce) return;\n\n setLoading(true);\n fetchMessageToSign(address)\n .then(({ message, nonce }) => {\n setMessage(message);\n setSessNonce(nonce);\n setLoading(false);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [address, isConnected, fetchMessageToSign, sessNonce]);\n\n useEffect(() => {\n if (!token || !sessNonce) return;\n\n const glyphApiFetch = createApiFetch(glyphUrl || WIDGET_API_BASE_URL, async () => token, {\n \"x-evm-address\": address!,\n \"x-glyph-nonce\": sessNonce!\n });\n setApiFetch(() => glyphApiFetch);\n }, [token, address, glyphUrl, sessNonce]);\n\n const disconnect = useCallback(async () => {\n await disconnectAsync();\n }, [disconnectAsync]);\n\n const authenticate = useCallback(async () => {\n logger.log(\"authenticate\");\n if (!address) {\n logger.error(\"no wallet connected.\");\n return;\n }\n\n try {\n if (!address || !isConnected || !message || !sessNonce) {\n setApiFetch(null);\n setLoading(false);\n return;\n }\n\n // Sign a message with the wallet to authenticate\n setLoading(true);\n\n const userSignature = await signMessageAsync({ account: address, message: message });\n console.log(sessNonce, message, userSignature);\n\n const token = (await verifySignature(address, userSignature, sessNonce))?.token;\n\n setToken(token);\n } catch (error) {\n logger.error(\"Authentication failed\", error);\n if (!(error as Error)?.message?.toLowerCase?.().includes?.(\"user rejected\")) {\n await alert(\n \"Authentication failed - your browser could be blocking the popups. Allow popups or try to manually click sign in.\"\n );\n }\n setApiFetch(null);\n setToken(null);\n setSessNonce(null);\n } finally {\n setLoading(false);\n onLogin?.();\n }\n }, [address, isConnected, message, sessNonce, signMessageAsync, verifySignature]);\n\n const logoutSideEffect = useCallback(async () => {\n setSessNonce(null);\n setToken(null);\n setLoading(false);\n setApiFetch(null);\n onLogout?.();\n }, []);\n\n const signMessage = useCallback(\n async ({ message }: { message: string }) => {\n if (!address || !isConnected) {\n throw new Error(\"Wallet not connected\");\n }\n return signMessageAsync({ account: address, message });\n },\n [address, isConnected, signMessageAsync]\n );\n\n const sendTransaction = useCallback(\n async ({ transaction }: { transaction: Omit<UnsignedTransactionRequest, \"chainId\"> }) => {\n if (!address || !isConnected) throw new Error(\"Wallet not connected\");\n\n return sendTransactionAsync({ ...transaction, chainId: chainId || apeChain.id } as any);\n },\n [address, isConnected, sendTransactionAsync, chainId]\n );\n\n const [tryAuthenticate, setTryAuthenticate] = useState<boolean>(false);\n // Perform graceful logout when the wallet is disconnected from anywhere within the app\n useAccountEffect({\n onConnect: () => {\n if (askForSignature) {\n // Perform initial authentication when the wallet is connected\n setTryAuthenticate(true);\n }\n },\n onDisconnect: () => {\n logoutSideEffect();\n }\n });\n useEffect(() => {\n if (askForSignature && isConnected && address && tryAuthenticate && sessNonce && message) {\n // Initial authentication\n authenticate();\n setTryAuthenticate(false);\n }\n }, [isConnected, address, authenticate, tryAuthenticate, sessNonce, message, askForSignature]);\n\n return (\n <GlyphContext.Provider\n value={{\n ready: !loading && !!sessNonce,\n authenticated: isConnected && !!address && token !== null,\n glyphUrl: glyphUrl as string, // Pass as string to avoid type error (we are passing fallback value in useGlyph hook at a common place)\n hideWidget: !isConnected || !address,\n login: authenticate,\n logout: disconnect, // on disconnect, logoutSideEffect is called and clears states\n signMessage,\n sendTransaction,\n apiFetch: apiFetch!\n }}\n children={children}\n />\n );\n};\n\nexport default EIP1193Strategy;\n"],"names":["TOKEN_KEY","NONCE_KEY","logger","createLogger","EIP1193Strategy","children","glyphUrl","onLogin","onLogout","askForSignature","loading","setLoading","useState","apiFetch","setApiFetch","address","isConnected","chainId","useAccount","disconnectAsync","useDisconnect","signMessageAsync","useSignMessage","sendTransactionAsync","useSendTransaction","token","setToken","error","message","setMessage","sessNonce","setSessNonce","useEffect","fetchMessageToSign","useCallback","WIDGET_API_BASE_URL","resp","verifySignature","signature","nonce","glyphApiFetch","createApiFetch","disconnect","authenticate","userSignature","logoutSideEffect","signMessage","sendTransaction","transaction","apeChain","tryAuthenticate","setTryAuthenticate","useAccountEffect","jsx","GlyphContext"],"mappings":"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"}
|
package/dist/glyph-widget.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as e,
|
|
1
|
+
import { D as e, l as t, A as l, z as n, G as o, B as G, d as p, q as y, w as P, e as i, I as _, L as h, f as r, N as u, C as g, S as I, g as C, r as A, s as L, p as N, v as T, x as v, y as c, k as H, u as Y, h as B, j as D, n as O, m as d, o as W, t as S, E } from "./index.js";
|
|
2
2
|
export {
|
|
3
3
|
e as DB_OFFCHAIN_TX_TYPE,
|
|
4
4
|
t as DB_ONCHAIN_TX_TYPE,
|
|
@@ -28,8 +28,8 @@ export {
|
|
|
28
28
|
B as useGlyph,
|
|
29
29
|
D as useGlyphFunding,
|
|
30
30
|
O as useGlyphOwnershipCheck,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
d as useGlyphTokenGate,
|
|
32
|
+
W as useGlyphView,
|
|
33
33
|
S as useNativeGlyphConnection,
|
|
34
34
|
E as usePrivyCrossAppProvider
|
|
35
35
|
};
|