@qinzhehan/rainbow-wallet-kit 0.1.0

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,56 @@
1
+ # Rainbow Wallet Kit
2
+
3
+ RainbowKit-style React wallet component packaged as ESM, CJS, UMD and TypeScript declarations.
4
+
5
+ ## Features
6
+
7
+ - MetaMask, OKX Wallet and Phantom adapters
8
+ - EventEmitter-driven wallet state with BroadcastChannel/localStorage multi-tab sync
9
+ - Nonce signature verification hooks
10
+ - JWT auto-renewal helper
11
+ - Unified timeout, rejection and provider errors
12
+ - Mobile H5 deep links for wallet apps
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install @local/rainbow-wallet-kit
18
+ ```
19
+
20
+ ```tsx
21
+ import { WalletProvider, ConnectWalletButton } from '@local/rainbow-wallet-kit';
22
+ import '@local/rainbow-wallet-kit/style.css';
23
+
24
+ export function App() {
25
+ return (
26
+ <WalletProvider
27
+ auth={{
28
+ enabled: true,
29
+ audience: 'example-dapp',
30
+ getNonce: async ({ address }) => fetch(`/api/nonce?address=${address}`).then((r) => r.text()),
31
+ verifySignature: async (payload) =>
32
+ fetch('/api/wallet/verify', {
33
+ method: 'POST',
34
+ headers: { 'content-type': 'application/json' },
35
+ body: JSON.stringify(payload),
36
+ }).then((r) => r.json()),
37
+ refreshJwt: async ({ token }) =>
38
+ fetch('/api/session/refresh', {
39
+ method: 'POST',
40
+ headers: { authorization: `Bearer ${token}` },
41
+ }).then((r) => r.json()),
42
+ }}
43
+ >
44
+ <ConnectWalletButton />
45
+ </WalletProvider>
46
+ );
47
+ }
48
+ ```
49
+
50
+ UMD usage:
51
+
52
+ ```html
53
+ <script src="https://unpkg.com/react/umd/react.production.min.js"></script>
54
+ <script src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
55
+ <script src="./dist/index.umd.js"></script>
56
+ ```
package/dist/index.cjs ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";var q=Object.defineProperty;var V=(t,e,n)=>e in t?q(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var k=(t,e,n)=>V(t,typeof e!="symbol"?e+"":e,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),u=require("react");class w extends Error{constructor(n,a,s){super(a);k(this,"code");k(this,"cause");this.name="WalletKitError",this.code=n,this.cause=s}}function M(t){return[t.audience??"Wallet Login","",`Wallet: ${t.wallet}`,`Address: ${t.address}`,`Chain: ${t.chainType}`,`Nonce: ${t.nonce}`,`Issued At: ${new Date().toISOString()}`].join(`
2
+ `)}async function _(t){var s;if(!((s=t.auth)!=null&&s.enabled))return;if(!t.auth.getNonce||!t.auth.verifySignature)throw new w("AUTH_FAILED","Wallet auth requires getNonce and verifySignature callbacks.");const e=await t.auth.getNonce({wallet:t.wallet,address:t.account.address,chainType:t.account.chainType,audience:t.auth.audience}),n=M({nonce:e,address:t.account.address,wallet:t.wallet,chainType:t.account.chainType,audience:t.auth.audience}),a=await t.signMessage(n).catch(m=>{throw new w("SIGNATURE_REJECTED","Wallet signature was rejected or failed.",m)});return t.auth.verifySignature({wallet:t.wallet,address:t.account.address,chainType:t.account.chainType,audience:t.auth.audience,nonce:e,message:n,signature:a})}async function I(t){var e;if(!((e=t.auth)!=null&&e.enabled)||!t.auth.refreshJwt||!t.session||!t.wallet||!t.account)return t.session;try{return await t.auth.refreshJwt({token:t.session.token,refreshToken:t.session.refreshToken,wallet:t.wallet,address:t.account.address})}catch(n){throw new w("JWT_REFRESH_FAILED","JWT refresh failed.",n)}}function B(t,e=6e4){return Math.max(0,t.expiresAt-Date.now()-e)}const b={metamask:"https://metamask.app.link/dapp/",okx:"okx://wallet/dapp/url?dappUrl=",phantom:"https://phantom.app/ul/browse/"};function L(){return typeof navigator>"u"?!1:/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent)}function z(t){return t!=null&&t.dappUrl?t.dappUrl:typeof window>"u"?"":window.location.href}function P(t,e,n){const a=encodeURIComponent(e);return t==="metamask"?`${(n==null?void 0:n.metamask)??b.metamask}${e.replace(/^https?:\/\//,"")}`:t==="okx"?`${(n==null?void 0:n.okx)??b.okx}${a}`:`${(n==null?void 0:n.phantom)??b.phantom}${a}?ref=${a}`}class R{constructor(){k(this,"listeners",new Map)}on(e,n){const a=this.listeners.get(e)??new Set;return a.add(n),this.listeners.set(e,a),()=>this.off(e,n)}off(e,n){var a;(a=this.listeners.get(e))==null||a.delete(n)}emit(e,n){var a;(a=this.listeners.get(e))==null||a.forEach(s=>s(n))}removeAllListeners(){this.listeners.clear()}}function O(t){var n;if(t instanceof w)return t;const e=t;return(e==null?void 0:e.code)===4001||(e==null?void 0:e.code)==="ACTION_REJECTED"?new w("USER_REJECTED",e.message??"User rejected wallet request.",t):(n=e==null?void 0:e.message)!=null&&n.toLowerCase().includes("timeout")?new w("CONNECT_TIMEOUT",e.message,t):new w("UNKNOWN",(e==null?void 0:e.message)??"Unexpected wallet error.",t)}function U(t,e,n){let a;const s=new Promise((m,p)=>{a=setTimeout(()=>p(new w("CONNECT_TIMEOUT",n)),e)});return Promise.race([t,s]).finally(()=>{a&&clearTimeout(a)})}const H="rainbow-wallet-kit:state";class ${constructor(e,n){k(this,"channel");k(this,"tabId",Math.random().toString(36).slice(2));k(this,"handleStorage",e=>{if(!(e.key!==this.storageKey||!e.newValue))try{const n=JSON.parse(e.newValue);n.tabId!==this.tabId&&this.emitter.emit("state",n.state)}catch{}});this.emitter=e,this.storageKey=n,!(typeof window>"u")&&("BroadcastChannel"in window&&(this.channel=new BroadcastChannel(H),this.channel.onmessage=a=>{var s;((s=a.data)==null?void 0:s.tabId)!==this.tabId&&this.emitter.emit("state",a.data.state)}),window.addEventListener("storage",this.handleStorage))}publish(e){var a;if(typeof window>"u")return;const n={tabId:this.tabId,state:e};localStorage.setItem(this.storageKey,JSON.stringify(n)),(a=this.channel)==null||a.postMessage(n)}read(){if(typeof window>"u")return;const e=localStorage.getItem(this.storageKey);if(e)try{return JSON.parse(e).state}catch{return}}destroy(){var e;(e=this.channel)==null||e.close(),typeof window<"u"&&window.removeEventListener("storage",this.handleStorage)}}function D(t){var a,s,m;if(typeof window>"u")return;const e=t==="okx"?(a=window.okxwallet)==null?void 0:a.ethereum:window.ethereum,n=(e==null?void 0:e.providers)??((s=window.ethereum)==null?void 0:s.providers);if(n!=null&&n.length){const p=n.find(f=>t==="metamask"?f.isMetaMask&&!f.isOkxWallet:f.isOkxWallet);if(p)return p}if(t==="metamask"&&(e!=null&&e.isMetaMask)&&!e.isOkxWallet||t==="okx"&&(e!=null&&e.isOkxWallet||(m=window.okxwallet)!=null&&m.ethereum))return e}function G(t){if(t)return Number.parseInt(t,16)}function W(t){return{id:t.id,name:t.name,chainType:"evm",icon:t.icon,installed:()=>!!D(t.id),connect:async()=>{const e=D(t.id);if(!e)throw new w("PROVIDER_NOT_FOUND",`${t.name} provider was not found.`);const n=await e.request({method:"eth_requestAccounts"}),a=await e.request({method:"eth_chainId"}).catch(()=>{}),s=n[0];if(!s)throw new w("PROVIDER_NOT_FOUND",`${t.name} did not return an address.`);return{address:s,chainType:"evm",chainId:G(a)}},signMessage:async(e,n)=>{const a=D(t.id);if(!a)throw new w("PROVIDER_NOT_FOUND",`${t.name} provider was not found.`);return a.request({method:"personal_sign",params:[e,n.address]})},getDeepLink:e=>P(t.id,e,t.deepLinks)}}function x(){var t,e;if(!(typeof window>"u"))return(e=(t=window.phantom)==null?void 0:t.solana)!=null&&e.isPhantom?window.phantom.solana:void 0}function Y(t){let e="";return t.forEach(n=>{e+=String.fromCharCode(n)}),btoa(e)}function X(t){return{id:"phantom",name:"Phantom",chainType:"solana",icon:"P",installed:()=>!!x(),connect:async()=>{const e=x();if(!e)throw new w("PROVIDER_NOT_FOUND","Phantom provider was not found.");const a=(await e.connect()).publicKey.toString();return{address:a,publicKey:a,chainType:"solana",chainId:"solana:mainnet"}},disconnect:async()=>{var e,n;await((n=(e=x())==null?void 0:e.disconnect)==null?void 0:n.call(e))},signMessage:async e=>{const n=x();if(!n)throw new w("PROVIDER_NOT_FOUND","Phantom provider was not found.");const a=new TextEncoder().encode(e),{signature:s}=await n.signMessage(a,"utf8");return Y(s)},getDeepLink:e=>P("phantom",e,t)}}function j(t){return[W({id:"metamask",name:"MetaMask",icon:"M",deepLinks:t}),W({id:"okx",name:"OKX Wallet",icon:"O",deepLinks:t}),X(t)]}const Q=3e4,Z="rainbow-wallet-kit:wallet-state",ee={status:"idle",updatedAt:Date.now()},S=u.createContext(void 0);function te({children:t,auth:e,deepLinks:n,connectTimeoutMs:a=Q,storageKey:s=Z,initialWallet:m,autoConnect:p}){const f=u.useRef(new R),E=u.useRef(null),[o,v]=u.useState(ee),c=u.useMemo(()=>j(n),[n]),h=u.useCallback(r=>{var l;v(r),f.current.emit("state",r),(l=E.current)==null||l.publish(r)},[]),T=u.useCallback(async r=>{const l=c.find(d=>d.id===r);if(!l)return;if(!l.installed()&&(n==null?void 0:n.enabled)!==!1&&L()){window.location.href=l.getDeepLink(z(n));return}const g={...o,status:"connecting",wallet:r,error:void 0,updatedAt:Date.now()};h(g);try{const d=await U(l.connect(),a,`${l.name} connection timed out.`),y=await _({auth:e,wallet:r,account:d,signMessage:F=>l.signMessage(F,d)});h({status:"connected",wallet:r,account:d,auth:y,updatedAt:Date.now()}),f.current.emit("accountChanged",d)}catch(d){const y=O(d);throw h({status:"error",wallet:r,error:y,updatedAt:Date.now()}),f.current.emit("error",y),y}},[e,a,n,h,o,c]),C=u.useCallback(async()=>{var g;const r=c.find(d=>d.id===o.wallet);await((g=r==null?void 0:r.disconnect)==null?void 0:g.call(r));const l={status:"disconnected",updatedAt:Date.now()};h(l),f.current.emit("disconnect",void 0)},[h,o.wallet,c]),N=u.useCallback(async()=>{const r=await I({auth:e,session:o.auth,wallet:o.wallet,account:o.account});r&&o.status==="connected"&&h({...o,auth:r,updatedAt:Date.now()})},[e,h,o]);u.useEffect(()=>{const r=new $(f.current,s);E.current=r;const l=r.read();l&&v(l);const g=f.current.on("state",d=>{v(y=>d.updatedAt>=y.updatedAt?d:y)});return()=>{g(),r.destroy()}},[s]),u.useEffect(()=>{p&&m&&T(m).catch(()=>{})},[p,T,m]),u.useEffect(()=>{if(!o.auth||o.status!=="connected")return;const r=B(o.auth,e==null?void 0:e.renewalWindowMs),l=window.setTimeout(()=>{N().catch(g=>{const d=O(g);h({...o,status:"error",error:d,updatedAt:Date.now()})})},r);return()=>window.clearTimeout(l)},[e==null?void 0:e.renewalWindowMs,h,N,o]);const K=u.useMemo(()=>({state:o,wallets:c,connect:T,disconnect:C,refreshAuth:N}),[T,C,N,o,c]);return i.jsx(S.Provider,{value:K,children:t})}function J(){const t=u.useContext(S);if(!t)throw new Error("useWallet must be used inside WalletProvider.");return t}function ne({label:t="Connect Wallet",className:e="",preferredWallets:n,onError:a}){const{state:s,wallets:m,connect:p,disconnect:f}=J(),[E,o]=u.useState(!1),v=n!=null&&n.length?n.flatMap(c=>m.filter(h=>h.id===c)):m;return s.status==="connected"&&s.account?i.jsxs("div",{className:`rwk-root ${e}`,children:[i.jsxs("button",{className:"rwk-account",type:"button",onClick:()=>o(c=>!c),children:[i.jsx("span",{className:"rwk-status-dot"}),i.jsx("span",{children:A(s.account.address)})]}),E?i.jsxs("div",{className:"rwk-panel",role:"dialog","aria-label":"Wallet account",children:[i.jsxs("div",{className:"rwk-account-row",children:[i.jsx("span",{children:s.wallet}),i.jsx("strong",{children:A(s.account.address)})]}),i.jsx("button",{className:"rwk-disconnect",type:"button",onClick:()=>void f(),children:"Disconnect"})]}):null]}):i.jsxs("div",{className:`rwk-root ${e}`,children:[i.jsx("button",{className:"rwk-connect",type:"button",disabled:s.status==="connecting",onClick:()=>o(c=>!c),children:s.status==="connecting"?"Connecting...":t}),E?i.jsxs("div",{className:"rwk-panel",role:"dialog","aria-label":"Connect wallet",children:[v.map(c=>i.jsxs("button",{className:"rwk-wallet",type:"button",onClick:()=>{p(c.id).then(()=>o(!1)).catch(h=>a==null?void 0:a(h))},children:[i.jsx("span",{className:"rwk-wallet-icon",children:c.icon}),i.jsx("span",{children:c.name}),i.jsx("small",{children:c.installed()?"Detected":"Open app"})]},c.id)),s.error?i.jsx("p",{className:"rwk-error",children:s.error.message}):null]}):null]})}function A(t){return t.length<=12?t:`${t.slice(0,6)}...${t.slice(-4)}`}exports.ConnectWalletButton=ne;exports.EventEmitter=R;exports.WalletContext=S;exports.WalletKitError=w;exports.WalletProvider=te;exports.WalletStateSync=$;exports.authenticateWallet=_;exports.createNonceMessage=M;exports.createWalletAdapters=j;exports.normalizeWalletError=O;exports.refreshJwtSession=I;exports.useWallet=J;exports.withTimeout=U;
3
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/core/auth.ts","../src/core/deepLinks.ts","../src/core/eventEmitter.ts","../src/core/errors.ts","../src/core/storageSync.ts","../src/wallets/eip1193.ts","../src/wallets/phantom.ts","../src/wallets/index.ts","../src/react/WalletProvider.tsx","../src/react/useWallet.ts","../src/react/ConnectWalletButton.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type ChainType = 'evm' | 'solana';\nexport type WalletId = 'metamask' | 'okx' | 'phantom';\nexport type WalletStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface WalletAccount {\n address: string;\n chainType: ChainType;\n chainId?: string | number;\n publicKey?: string;\n}\n\nexport interface WalletState {\n status: WalletStatus;\n wallet?: WalletId;\n account?: WalletAccount;\n auth?: AuthSession;\n error?: WalletKitError;\n updatedAt: number;\n}\n\nexport interface AuthSession {\n token: string;\n expiresAt: number;\n refreshToken?: string;\n}\n\nexport interface NonceRequest {\n wallet: WalletId;\n address: string;\n chainType: ChainType;\n audience?: string;\n}\n\nexport interface VerifySignaturePayload extends NonceRequest {\n nonce: string;\n message: string;\n signature: string;\n}\n\nexport interface JwtRefreshRequest {\n token: string;\n refreshToken?: string;\n wallet: WalletId;\n address: string;\n}\n\nexport interface WalletAuthConfig {\n enabled?: boolean;\n audience?: string;\n renewalWindowMs?: number;\n getNonce?: (request: NonceRequest) => Promise<string>;\n verifySignature?: (payload: VerifySignaturePayload) => Promise<AuthSession>;\n refreshJwt?: (request: JwtRefreshRequest) => Promise<AuthSession>;\n}\n\nexport interface DeepLinkConfig {\n enabled?: boolean;\n dappUrl?: string;\n metamask?: string;\n okx?: string;\n phantom?: string;\n}\n\nexport interface WalletKitOptions {\n auth?: WalletAuthConfig;\n deepLinks?: DeepLinkConfig;\n connectTimeoutMs?: number;\n storageKey?: string;\n}\n\nexport interface WalletProviderProps extends WalletKitOptions {\n children: ReactNode;\n initialWallet?: WalletId;\n autoConnect?: boolean;\n}\n\nexport type WalletKitErrorCode =\n | 'PROVIDER_NOT_FOUND'\n | 'USER_REJECTED'\n | 'CONNECT_TIMEOUT'\n | 'SIGNATURE_REJECTED'\n | 'AUTH_FAILED'\n | 'JWT_REFRESH_FAILED'\n | 'UNSUPPORTED_CHAIN'\n | 'UNKNOWN';\n\nexport class WalletKitError extends Error {\n code: WalletKitErrorCode;\n cause?: unknown;\n\n constructor(code: WalletKitErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'WalletKitError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nexport interface WalletAdapter {\n id: WalletId;\n name: string;\n chainType: ChainType;\n icon: string;\n installed: () => boolean;\n connect: () => Promise<WalletAccount>;\n disconnect?: () => Promise<void>;\n signMessage: (message: string, account: WalletAccount) => Promise<string>;\n getDeepLink: (targetUrl: string) => string;\n}\n\nexport type WalletEventMap = {\n state: WalletState;\n accountChanged: WalletAccount | undefined;\n disconnect: undefined;\n error: WalletKitError;\n};\n\nexport interface WalletContextValue {\n state: WalletState;\n wallets: WalletAdapter[];\n connect: (wallet: WalletId) => Promise<void>;\n disconnect: () => Promise<void>;\n refreshAuth: () => Promise<void>;\n}\n","import { WalletKitError } from '../types';\nimport type { AuthSession, WalletAccount, WalletAuthConfig, WalletId } from '../types';\n\nexport function createNonceMessage(input: {\n nonce: string;\n address: string;\n wallet: WalletId;\n chainType: string;\n audience?: string;\n}): string {\n return [\n input.audience ?? 'Wallet Login',\n '',\n `Wallet: ${input.wallet}`,\n `Address: ${input.address}`,\n `Chain: ${input.chainType}`,\n `Nonce: ${input.nonce}`,\n `Issued At: ${new Date().toISOString()}`,\n ].join('\\n');\n}\n\nexport async function authenticateWallet(input: {\n auth?: WalletAuthConfig;\n wallet: WalletId;\n account: WalletAccount;\n signMessage: (message: string) => Promise<string>;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled) return undefined;\n if (!input.auth.getNonce || !input.auth.verifySignature) {\n throw new WalletKitError('AUTH_FAILED', 'Wallet auth requires getNonce and verifySignature callbacks.');\n }\n\n const nonce = await input.auth.getNonce({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const message = createNonceMessage({\n nonce,\n address: input.account.address,\n wallet: input.wallet,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const signature = await input.signMessage(message).catch((error) => {\n throw new WalletKitError('SIGNATURE_REJECTED', 'Wallet signature was rejected or failed.', error);\n });\n\n return input.auth.verifySignature({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n nonce,\n message,\n signature,\n });\n}\n\nexport async function refreshJwtSession(input: {\n auth?: WalletAuthConfig;\n session?: AuthSession;\n wallet?: WalletId;\n account?: WalletAccount;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled || !input.auth.refreshJwt || !input.session || !input.wallet || !input.account) {\n return input.session;\n }\n\n try {\n return await input.auth.refreshJwt({\n token: input.session.token,\n refreshToken: input.session.refreshToken,\n wallet: input.wallet,\n address: input.account.address,\n });\n } catch (error) {\n throw new WalletKitError('JWT_REFRESH_FAILED', 'JWT refresh failed.', error);\n }\n}\n\nexport function getRenewalDelay(session: AuthSession, windowMs = 60_000): number {\n return Math.max(0, session.expiresAt - Date.now() - windowMs);\n}\n","import type { DeepLinkConfig, WalletId } from '../types';\n\nconst DEFAULT_DEEP_LINKS: Required<Pick<DeepLinkConfig, 'metamask' | 'okx' | 'phantom'>> = {\n metamask: 'https://metamask.app.link/dapp/',\n okx: 'okx://wallet/dapp/url?dappUrl=',\n phantom: 'https://phantom.app/ul/browse/',\n};\n\nexport function isMobileH5(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n}\n\nexport function resolveDappUrl(config?: DeepLinkConfig): string {\n if (config?.dappUrl) return config.dappUrl;\n if (typeof window === 'undefined') return '';\n return window.location.href;\n}\n\nexport function getWalletDeepLink(wallet: WalletId, targetUrl: string, config?: DeepLinkConfig): string {\n const encoded = encodeURIComponent(targetUrl);\n if (wallet === 'metamask') return `${config?.metamask ?? DEFAULT_DEEP_LINKS.metamask}${targetUrl.replace(/^https?:\\/\\//, '')}`;\n if (wallet === 'okx') return `${config?.okx ?? DEFAULT_DEEP_LINKS.okx}${encoded}`;\n return `${config?.phantom ?? DEFAULT_DEEP_LINKS.phantom}${encoded}?ref=${encoded}`;\n}\n","type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter<Events extends Record<string, unknown>> {\n private listeners = new Map<keyof Events, Set<Listener<Events[keyof Events]>>>();\n\n on<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): () => void {\n const listeners = this.listeners.get(event) ?? new Set();\n listeners.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, listeners);\n return () => this.off(event, listener);\n }\n\n off<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): void {\n this.listeners.get(event)?.delete(listener as Listener<Events[keyof Events]>);\n }\n\n emit<Key extends keyof Events>(event: Key, payload: Events[Key]): void {\n this.listeners.get(event)?.forEach((listener) => listener(payload));\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import { WalletKitError } from '../types';\n\nexport function normalizeWalletError(error: unknown): WalletKitError {\n if (error instanceof WalletKitError) return error;\n\n const maybe = error as { code?: number | string; message?: string } | undefined;\n if (maybe?.code === 4001 || maybe?.code === 'ACTION_REJECTED') {\n return new WalletKitError('USER_REJECTED', maybe.message ?? 'User rejected wallet request.', error);\n }\n\n if (maybe?.message?.toLowerCase().includes('timeout')) {\n return new WalletKitError('CONNECT_TIMEOUT', maybe.message, error);\n }\n\n return new WalletKitError('UNKNOWN', maybe?.message ?? 'Unexpected wallet error.', error);\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeout = setTimeout(() => reject(new WalletKitError('CONNECT_TIMEOUT', message)), timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n if (timeout) clearTimeout(timeout);\n });\n}\n","import { EventEmitter } from './eventEmitter';\nimport type { WalletEventMap, WalletState } from '../types';\n\nconst SYNC_EVENT = 'rainbow-wallet-kit:state';\n\nexport class WalletStateSync {\n private channel?: BroadcastChannel;\n private tabId = Math.random().toString(36).slice(2);\n\n constructor(\n private emitter: EventEmitter<WalletEventMap>,\n private storageKey: string,\n ) {\n if (typeof window === 'undefined') return;\n\n if ('BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(SYNC_EVENT);\n this.channel.onmessage = (event: MessageEvent<{ tabId: string; state: WalletState }>) => {\n if (event.data?.tabId !== this.tabId) {\n this.emitter.emit('state', event.data.state);\n }\n };\n }\n\n window.addEventListener('storage', this.handleStorage);\n }\n\n publish(state: WalletState): void {\n if (typeof window === 'undefined') return;\n const payload = { tabId: this.tabId, state };\n localStorage.setItem(this.storageKey, JSON.stringify(payload));\n this.channel?.postMessage(payload);\n }\n\n read(): WalletState | undefined {\n if (typeof window === 'undefined') return undefined;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return undefined;\n\n try {\n const parsed = JSON.parse(raw) as { state?: WalletState };\n return parsed.state;\n } catch {\n return undefined;\n }\n }\n\n destroy(): void {\n this.channel?.close();\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', this.handleStorage);\n }\n }\n\n private handleStorage = (event: StorageEvent) => {\n if (event.key !== this.storageKey || !event.newValue) return;\n try {\n const payload = JSON.parse(event.newValue) as { tabId: string; state: WalletState };\n if (payload.tabId !== this.tabId) {\n this.emitter.emit('state', payload.state);\n }\n } catch {\n // Ignore malformed cross-tab payloads from older package versions.\n }\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter, WalletId } from '../types';\nimport type { Eip1193Provider } from './providerTypes';\n\nfunction pickInjectedProvider(wallet: WalletId): Eip1193Provider | undefined {\n if (typeof window === 'undefined') return undefined;\n\n const injected = wallet === 'okx' ? window.okxwallet?.ethereum : window.ethereum;\n const providers = injected?.providers ?? window.ethereum?.providers;\n if (providers?.length) {\n const matched = providers.find((provider) => {\n if (wallet === 'metamask') return provider.isMetaMask && !provider.isOkxWallet;\n return provider.isOkxWallet;\n });\n if (matched) return matched;\n }\n\n if (wallet === 'metamask' && injected?.isMetaMask && !injected.isOkxWallet) return injected;\n if (wallet === 'okx' && (injected?.isOkxWallet || window.okxwallet?.ethereum)) return injected;\n return undefined;\n}\n\nfunction hexToNumber(hex?: string): number | undefined {\n if (!hex) return undefined;\n return Number.parseInt(hex, 16);\n}\n\nexport function createEvmAdapter(options: {\n id: Extract<WalletId, 'metamask' | 'okx'>;\n name: string;\n icon: string;\n deepLinks?: DeepLinkConfig;\n}): WalletAdapter {\n return {\n id: options.id,\n name: options.name,\n chainType: 'evm',\n icon: options.icon,\n installed: () => Boolean(pickInjectedProvider(options.id)),\n connect: async (): Promise<WalletAccount> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) {\n throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n }\n\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const chainId = await provider.request<string>({ method: 'eth_chainId' }).catch(() => undefined);\n const address = accounts[0];\n if (!address) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} did not return an address.`);\n\n return {\n address,\n chainType: 'evm',\n chainId: hexToNumber(chainId),\n };\n },\n signMessage: async (message: string, account: WalletAccount): Promise<string> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n return provider.request<string>({\n method: 'personal_sign',\n params: [message, account.address],\n });\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink(options.id, targetUrl, options.deepLinks),\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter } from '../types';\nimport type { PhantomSolanaProvider } from './providerTypes';\n\nfunction getProvider(): PhantomSolanaProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.phantom?.solana?.isPhantom ? window.phantom.solana : undefined;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\nexport function createPhantomAdapter(deepLinks?: DeepLinkConfig): WalletAdapter {\n return {\n id: 'phantom',\n name: 'Phantom',\n chainType: 'solana',\n icon: 'P',\n installed: () => Boolean(getProvider()),\n connect: async (): Promise<WalletAccount> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const response = await provider.connect();\n const address = response.publicKey.toString();\n return {\n address,\n publicKey: address,\n chainType: 'solana',\n chainId: 'solana:mainnet',\n };\n },\n disconnect: async () => {\n await getProvider()?.disconnect?.();\n },\n signMessage: async (message: string): Promise<string> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const encoded = new TextEncoder().encode(message);\n const { signature } = await provider.signMessage(encoded, 'utf8');\n return bytesToBase64(signature);\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink('phantom', targetUrl, deepLinks),\n };\n}\n","import type { DeepLinkConfig, WalletAdapter } from '../types';\nimport { createEvmAdapter } from './eip1193';\nimport { createPhantomAdapter } from './phantom';\n\nexport function createWalletAdapters(deepLinks?: DeepLinkConfig): WalletAdapter[] {\n return [\n createEvmAdapter({ id: 'metamask', name: 'MetaMask', icon: 'M', deepLinks }),\n createEvmAdapter({ id: 'okx', name: 'OKX Wallet', icon: 'O', deepLinks }),\n createPhantomAdapter(deepLinks),\n ];\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { authenticateWallet, getRenewalDelay, refreshJwtSession } from '../core/auth';\nimport { isMobileH5, resolveDappUrl } from '../core/deepLinks';\nimport { EventEmitter } from '../core/eventEmitter';\nimport { normalizeWalletError, withTimeout } from '../core/errors';\nimport { WalletStateSync } from '../core/storageSync';\nimport { createWalletAdapters } from '../wallets';\nimport type { WalletContextValue, WalletEventMap, WalletId, WalletProviderProps, WalletState } from '../types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_STORAGE_KEY = 'rainbow-wallet-kit:wallet-state';\n\nconst initialState: WalletState = {\n status: 'idle',\n updatedAt: Date.now(),\n};\n\nexport const WalletContext = createContext<WalletContextValue | undefined>(undefined);\n\nexport function WalletProvider({\n children,\n auth,\n deepLinks,\n connectTimeoutMs = DEFAULT_TIMEOUT_MS,\n storageKey = DEFAULT_STORAGE_KEY,\n initialWallet,\n autoConnect,\n}: WalletProviderProps) {\n const emitterRef = useRef(new EventEmitter<WalletEventMap>());\n const syncRef = useRef<WalletStateSync | null>(null);\n const [state, setState] = useState<WalletState>(initialState);\n const wallets = useMemo(() => createWalletAdapters(deepLinks), [deepLinks]);\n\n const publishState = useCallback((nextState: WalletState) => {\n setState(nextState);\n emitterRef.current.emit('state', nextState);\n syncRef.current?.publish(nextState);\n }, []);\n\n const connect = useCallback(\n async (walletId: WalletId) => {\n const wallet = wallets.find((item) => item.id === walletId);\n if (!wallet) return;\n\n if (!wallet.installed() && deepLinks?.enabled !== false && isMobileH5()) {\n window.location.href = wallet.getDeepLink(resolveDappUrl(deepLinks));\n return;\n }\n\n const connectingState: WalletState = {\n ...state,\n status: 'connecting',\n wallet: walletId,\n error: undefined,\n updatedAt: Date.now(),\n };\n publishState(connectingState);\n\n try {\n const account = await withTimeout(\n wallet.connect(),\n connectTimeoutMs,\n `${wallet.name} connection timed out.`,\n );\n const session = await authenticateWallet({\n auth,\n wallet: walletId,\n account,\n signMessage: (message) => wallet.signMessage(message, account),\n });\n publishState({\n status: 'connected',\n wallet: walletId,\n account,\n auth: session,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('accountChanged', account);\n } catch (error) {\n const normalized = normalizeWalletError(error);\n publishState({\n status: 'error',\n wallet: walletId,\n error: normalized,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('error', normalized);\n throw normalized;\n }\n },\n [auth, connectTimeoutMs, deepLinks, publishState, state, wallets],\n );\n\n const disconnect = useCallback(async () => {\n const wallet = wallets.find((item) => item.id === state.wallet);\n await wallet?.disconnect?.();\n const nextState: WalletState = {\n status: 'disconnected',\n updatedAt: Date.now(),\n };\n publishState(nextState);\n emitterRef.current.emit('disconnect', undefined);\n }, [publishState, state.wallet, wallets]);\n\n const refreshAuth = useCallback(async () => {\n const session = await refreshJwtSession({\n auth,\n session: state.auth,\n wallet: state.wallet,\n account: state.account,\n });\n if (session && state.status === 'connected') {\n publishState({\n ...state,\n auth: session,\n updatedAt: Date.now(),\n });\n }\n }, [auth, publishState, state]);\n\n useEffect(() => {\n const sync = new WalletStateSync(emitterRef.current, storageKey);\n syncRef.current = sync;\n const stored = sync.read();\n if (stored) setState(stored);\n\n const unsubscribe = emitterRef.current.on('state', (nextState) => {\n setState((current) => (nextState.updatedAt >= current.updatedAt ? nextState : current));\n });\n\n return () => {\n unsubscribe();\n sync.destroy();\n };\n }, [storageKey]);\n\n useEffect(() => {\n if (autoConnect && initialWallet) {\n void connect(initialWallet).catch(() => undefined);\n }\n }, [autoConnect, connect, initialWallet]);\n\n useEffect(() => {\n if (!state.auth || state.status !== 'connected') return;\n const delay = getRenewalDelay(state.auth, auth?.renewalWindowMs);\n const timer = window.setTimeout(() => {\n void refreshAuth().catch((error) => {\n const normalized = normalizeWalletError(error);\n publishState({ ...state, status: 'error', error: normalized, updatedAt: Date.now() });\n });\n }, delay);\n return () => window.clearTimeout(timer);\n }, [auth?.renewalWindowMs, publishState, refreshAuth, state]);\n\n const value = useMemo<WalletContextValue>(\n () => ({\n state,\n wallets,\n connect,\n disconnect,\n refreshAuth,\n }),\n [connect, disconnect, refreshAuth, state, wallets],\n );\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { WalletContext } from './WalletProvider';\n\nexport function useWallet() {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWallet must be used inside WalletProvider.');\n }\n return context;\n}\n","import { useState } from 'react';\nimport type { WalletId } from '../types';\nimport { useWallet } from './useWallet';\n\nexport interface ConnectWalletButtonProps {\n label?: string;\n className?: string;\n preferredWallets?: WalletId[];\n onError?: (error: unknown) => void;\n}\n\nexport function ConnectWalletButton({\n label = 'Connect Wallet',\n className = '',\n preferredWallets,\n onError,\n}: ConnectWalletButtonProps) {\n const { state, wallets, connect, disconnect } = useWallet();\n const [open, setOpen] = useState(false);\n const orderedWallets = preferredWallets?.length\n ? preferredWallets.flatMap((id) => wallets.filter((wallet) => wallet.id === id))\n : wallets;\n\n if (state.status === 'connected' && state.account) {\n return (\n <div className={`rwk-root ${className}`}>\n <button className=\"rwk-account\" type=\"button\" onClick={() => setOpen((value) => !value)}>\n <span className=\"rwk-status-dot\" />\n <span>{shortenAddress(state.account.address)}</span>\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Wallet account\">\n <div className=\"rwk-account-row\">\n <span>{state.wallet}</span>\n <strong>{shortenAddress(state.account.address)}</strong>\n </div>\n <button className=\"rwk-disconnect\" type=\"button\" onClick={() => void disconnect()}>\n Disconnect\n </button>\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className={`rwk-root ${className}`}>\n <button\n className=\"rwk-connect\"\n type=\"button\"\n disabled={state.status === 'connecting'}\n onClick={() => setOpen((value) => !value)}\n >\n {state.status === 'connecting' ? 'Connecting...' : label}\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Connect wallet\">\n {orderedWallets.map((wallet) => (\n <button\n className=\"rwk-wallet\"\n key={wallet.id}\n type=\"button\"\n onClick={() => {\n void connect(wallet.id)\n .then(() => setOpen(false))\n .catch((error) => onError?.(error));\n }}\n >\n <span className=\"rwk-wallet-icon\">{wallet.icon}</span>\n <span>{wallet.name}</span>\n <small>{wallet.installed() ? 'Detected' : 'Open app'}</small>\n </button>\n ))}\n {state.error ? <p className=\"rwk-error\">{state.error.message}</p> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction shortenAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n"],"names":["WalletKitError","code","message","cause","__publicField","createNonceMessage","input","authenticateWallet","_a","nonce","signature","error","refreshJwtSession","getRenewalDelay","session","windowMs","DEFAULT_DEEP_LINKS","isMobileH5","resolveDappUrl","config","getWalletDeepLink","wallet","targetUrl","encoded","EventEmitter","event","listener","listeners","payload","normalizeWalletError","maybe","withTimeout","promise","timeoutMs","timeout","timeoutPromise","_","reject","SYNC_EVENT","WalletStateSync","emitter","storageKey","state","raw","pickInjectedProvider","injected","providers","_b","matched","provider","_c","hexToNumber","hex","createEvmAdapter","options","accounts","chainId","address","account","getProvider","bytesToBase64","bytes","binary","byte","createPhantomAdapter","deepLinks","createWalletAdapters","DEFAULT_TIMEOUT_MS","DEFAULT_STORAGE_KEY","initialState","WalletContext","createContext","WalletProvider","children","auth","connectTimeoutMs","initialWallet","autoConnect","emitterRef","useRef","syncRef","setState","useState","wallets","useMemo","publishState","useCallback","nextState","connect","walletId","item","connectingState","normalized","disconnect","refreshAuth","useEffect","sync","stored","unsubscribe","current","delay","timer","value","jsx","useWallet","context","useContext","ConnectWalletButton","label","className","preferredWallets","onError","open","setOpen","orderedWallets","id","jsxs","shortenAddress"],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { Context } from 'react';
2
+ import { JSX } from 'react';
3
+ import { ReactNode } from 'react';
4
+
5
+ export declare function authenticateWallet(input: {
6
+ auth?: WalletAuthConfig;
7
+ wallet: WalletId;
8
+ account: WalletAccount;
9
+ signMessage: (message: string) => Promise<string>;
10
+ }): Promise<AuthSession | undefined>;
11
+
12
+ export declare interface AuthSession {
13
+ token: string;
14
+ expiresAt: number;
15
+ refreshToken?: string;
16
+ }
17
+
18
+ export declare type ChainType = 'evm' | 'solana';
19
+
20
+ export declare function ConnectWalletButton({ label, className, preferredWallets, onError, }: ConnectWalletButtonProps): JSX.Element;
21
+
22
+ export declare interface ConnectWalletButtonProps {
23
+ label?: string;
24
+ className?: string;
25
+ preferredWallets?: WalletId[];
26
+ onError?: (error: unknown) => void;
27
+ }
28
+
29
+ export declare function createNonceMessage(input: {
30
+ nonce: string;
31
+ address: string;
32
+ wallet: WalletId;
33
+ chainType: string;
34
+ audience?: string;
35
+ }): string;
36
+
37
+ export declare function createWalletAdapters(deepLinks?: DeepLinkConfig): WalletAdapter[];
38
+
39
+ export declare interface DeepLinkConfig {
40
+ enabled?: boolean;
41
+ dappUrl?: string;
42
+ metamask?: string;
43
+ okx?: string;
44
+ phantom?: string;
45
+ }
46
+
47
+ export declare class EventEmitter<Events extends Record<string, unknown>> {
48
+ private listeners;
49
+ on<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): () => void;
50
+ off<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): void;
51
+ emit<Key extends keyof Events>(event: Key, payload: Events[Key]): void;
52
+ removeAllListeners(): void;
53
+ }
54
+
55
+ export declare interface JwtRefreshRequest {
56
+ token: string;
57
+ refreshToken?: string;
58
+ wallet: WalletId;
59
+ address: string;
60
+ }
61
+
62
+ declare type Listener<T> = (payload: T) => void;
63
+
64
+ export declare interface NonceRequest {
65
+ wallet: WalletId;
66
+ address: string;
67
+ chainType: ChainType;
68
+ audience?: string;
69
+ }
70
+
71
+ export declare function normalizeWalletError(error: unknown): WalletKitError;
72
+
73
+ export declare function refreshJwtSession(input: {
74
+ auth?: WalletAuthConfig;
75
+ session?: AuthSession;
76
+ wallet?: WalletId;
77
+ account?: WalletAccount;
78
+ }): Promise<AuthSession | undefined>;
79
+
80
+ export declare function useWallet(): WalletContextValue;
81
+
82
+ export declare interface VerifySignaturePayload extends NonceRequest {
83
+ nonce: string;
84
+ message: string;
85
+ signature: string;
86
+ }
87
+
88
+ export declare interface WalletAccount {
89
+ address: string;
90
+ chainType: ChainType;
91
+ chainId?: string | number;
92
+ publicKey?: string;
93
+ }
94
+
95
+ export declare interface WalletAdapter {
96
+ id: WalletId;
97
+ name: string;
98
+ chainType: ChainType;
99
+ icon: string;
100
+ installed: () => boolean;
101
+ connect: () => Promise<WalletAccount>;
102
+ disconnect?: () => Promise<void>;
103
+ signMessage: (message: string, account: WalletAccount) => Promise<string>;
104
+ getDeepLink: (targetUrl: string) => string;
105
+ }
106
+
107
+ export declare interface WalletAuthConfig {
108
+ enabled?: boolean;
109
+ audience?: string;
110
+ renewalWindowMs?: number;
111
+ getNonce?: (request: NonceRequest) => Promise<string>;
112
+ verifySignature?: (payload: VerifySignaturePayload) => Promise<AuthSession>;
113
+ refreshJwt?: (request: JwtRefreshRequest) => Promise<AuthSession>;
114
+ }
115
+
116
+ export declare const WalletContext: Context<WalletContextValue | undefined>;
117
+
118
+ export declare interface WalletContextValue {
119
+ state: WalletState;
120
+ wallets: WalletAdapter[];
121
+ connect: (wallet: WalletId) => Promise<void>;
122
+ disconnect: () => Promise<void>;
123
+ refreshAuth: () => Promise<void>;
124
+ }
125
+
126
+ export declare type WalletEventMap = {
127
+ state: WalletState;
128
+ accountChanged: WalletAccount | undefined;
129
+ disconnect: undefined;
130
+ error: WalletKitError;
131
+ };
132
+
133
+ export declare type WalletId = 'metamask' | 'okx' | 'phantom';
134
+
135
+ export declare class WalletKitError extends Error {
136
+ code: WalletKitErrorCode;
137
+ cause?: unknown;
138
+ constructor(code: WalletKitErrorCode, message: string, cause?: unknown);
139
+ }
140
+
141
+ export declare type WalletKitErrorCode = 'PROVIDER_NOT_FOUND' | 'USER_REJECTED' | 'CONNECT_TIMEOUT' | 'SIGNATURE_REJECTED' | 'AUTH_FAILED' | 'JWT_REFRESH_FAILED' | 'UNSUPPORTED_CHAIN' | 'UNKNOWN';
142
+
143
+ export declare interface WalletKitOptions {
144
+ auth?: WalletAuthConfig;
145
+ deepLinks?: DeepLinkConfig;
146
+ connectTimeoutMs?: number;
147
+ storageKey?: string;
148
+ }
149
+
150
+ export declare function WalletProvider({ children, auth, deepLinks, connectTimeoutMs, storageKey, initialWallet, autoConnect, }: WalletProviderProps): JSX.Element;
151
+
152
+ export declare interface WalletProviderProps extends WalletKitOptions {
153
+ children: ReactNode;
154
+ initialWallet?: WalletId;
155
+ autoConnect?: boolean;
156
+ }
157
+
158
+ export declare interface WalletState {
159
+ status: WalletStatus;
160
+ wallet?: WalletId;
161
+ account?: WalletAccount;
162
+ auth?: AuthSession;
163
+ error?: WalletKitError;
164
+ updatedAt: number;
165
+ }
166
+
167
+ export declare class WalletStateSync {
168
+ private emitter;
169
+ private storageKey;
170
+ private channel?;
171
+ private tabId;
172
+ constructor(emitter: EventEmitter<WalletEventMap>, storageKey: string);
173
+ publish(state: WalletState): void;
174
+ read(): WalletState | undefined;
175
+ destroy(): void;
176
+ private handleStorage;
177
+ }
178
+
179
+ export declare type WalletStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error';
180
+
181
+ export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T>;
182
+
183
+ export { }
package/dist/index.mjs ADDED
@@ -0,0 +1,450 @@
1
+ var J = Object.defineProperty;
2
+ var K = (t, e, n) => e in t ? J(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;
3
+ var y = (t, e, n) => K(t, typeof e != "symbol" ? e + "" : e, n);
4
+ import { jsx as m, jsxs as k } from "react/jsx-runtime";
5
+ import { createContext as V, useRef as C, useState as R, useMemo as I, useCallback as D, useEffect as b, useContext as q } from "react";
6
+ class u extends Error {
7
+ constructor(n, a, s) {
8
+ super(a);
9
+ y(this, "code");
10
+ y(this, "cause");
11
+ this.name = "WalletKitError", this.code = n, this.cause = s;
12
+ }
13
+ }
14
+ function B(t) {
15
+ return [
16
+ t.audience ?? "Wallet Login",
17
+ "",
18
+ `Wallet: ${t.wallet}`,
19
+ `Address: ${t.address}`,
20
+ `Chain: ${t.chainType}`,
21
+ `Nonce: ${t.nonce}`,
22
+ `Issued At: ${(/* @__PURE__ */ new Date()).toISOString()}`
23
+ ].join(`
24
+ `);
25
+ }
26
+ async function L(t) {
27
+ var s;
28
+ if (!((s = t.auth) != null && s.enabled)) return;
29
+ if (!t.auth.getNonce || !t.auth.verifySignature)
30
+ throw new u("AUTH_FAILED", "Wallet auth requires getNonce and verifySignature callbacks.");
31
+ const e = await t.auth.getNonce({
32
+ wallet: t.wallet,
33
+ address: t.account.address,
34
+ chainType: t.account.chainType,
35
+ audience: t.auth.audience
36
+ }), n = B({
37
+ nonce: e,
38
+ address: t.account.address,
39
+ wallet: t.wallet,
40
+ chainType: t.account.chainType,
41
+ audience: t.auth.audience
42
+ }), a = await t.signMessage(n).catch((h) => {
43
+ throw new u("SIGNATURE_REJECTED", "Wallet signature was rejected or failed.", h);
44
+ });
45
+ return t.auth.verifySignature({
46
+ wallet: t.wallet,
47
+ address: t.account.address,
48
+ chainType: t.account.chainType,
49
+ audience: t.auth.audience,
50
+ nonce: e,
51
+ message: n,
52
+ signature: a
53
+ });
54
+ }
55
+ async function z(t) {
56
+ var e;
57
+ if (!((e = t.auth) != null && e.enabled) || !t.auth.refreshJwt || !t.session || !t.wallet || !t.account)
58
+ return t.session;
59
+ try {
60
+ return await t.auth.refreshJwt({
61
+ token: t.session.token,
62
+ refreshToken: t.session.refreshToken,
63
+ wallet: t.wallet,
64
+ address: t.account.address
65
+ });
66
+ } catch (n) {
67
+ throw new u("JWT_REFRESH_FAILED", "JWT refresh failed.", n);
68
+ }
69
+ }
70
+ function H(t, e = 6e4) {
71
+ return Math.max(0, t.expiresAt - Date.now() - e);
72
+ }
73
+ const A = {
74
+ metamask: "https://metamask.app.link/dapp/",
75
+ okx: "okx://wallet/dapp/url?dappUrl=",
76
+ phantom: "https://phantom.app/ul/browse/"
77
+ };
78
+ function G() {
79
+ return typeof navigator > "u" ? !1 : /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);
80
+ }
81
+ function Y(t) {
82
+ return t != null && t.dappUrl ? t.dappUrl : typeof window > "u" ? "" : window.location.href;
83
+ }
84
+ function W(t, e, n) {
85
+ const a = encodeURIComponent(e);
86
+ return t === "metamask" ? `${(n == null ? void 0 : n.metamask) ?? A.metamask}${e.replace(/^https?:\/\//, "")}` : t === "okx" ? `${(n == null ? void 0 : n.okx) ?? A.okx}${a}` : `${(n == null ? void 0 : n.phantom) ?? A.phantom}${a}?ref=${a}`;
87
+ }
88
+ class j {
89
+ constructor() {
90
+ y(this, "listeners", /* @__PURE__ */ new Map());
91
+ }
92
+ on(e, n) {
93
+ const a = this.listeners.get(e) ?? /* @__PURE__ */ new Set();
94
+ return a.add(n), this.listeners.set(e, a), () => this.off(e, n);
95
+ }
96
+ off(e, n) {
97
+ var a;
98
+ (a = this.listeners.get(e)) == null || a.delete(n);
99
+ }
100
+ emit(e, n) {
101
+ var a;
102
+ (a = this.listeners.get(e)) == null || a.forEach((s) => s(n));
103
+ }
104
+ removeAllListeners() {
105
+ this.listeners.clear();
106
+ }
107
+ }
108
+ function M(t) {
109
+ var n;
110
+ if (t instanceof u) return t;
111
+ const e = t;
112
+ return (e == null ? void 0 : e.code) === 4001 || (e == null ? void 0 : e.code) === "ACTION_REJECTED" ? new u("USER_REJECTED", e.message ?? "User rejected wallet request.", t) : (n = e == null ? void 0 : e.message) != null && n.toLowerCase().includes("timeout") ? new u("CONNECT_TIMEOUT", e.message, t) : new u("UNKNOWN", (e == null ? void 0 : e.message) ?? "Unexpected wallet error.", t);
113
+ }
114
+ function X(t, e, n) {
115
+ let a;
116
+ const s = new Promise((h, f) => {
117
+ a = setTimeout(() => f(new u("CONNECT_TIMEOUT", n)), e);
118
+ });
119
+ return Promise.race([t, s]).finally(() => {
120
+ a && clearTimeout(a);
121
+ });
122
+ }
123
+ const Q = "rainbow-wallet-kit:state";
124
+ class Z {
125
+ constructor(e, n) {
126
+ y(this, "channel");
127
+ y(this, "tabId", Math.random().toString(36).slice(2));
128
+ y(this, "handleStorage", (e) => {
129
+ if (!(e.key !== this.storageKey || !e.newValue))
130
+ try {
131
+ const n = JSON.parse(e.newValue);
132
+ n.tabId !== this.tabId && this.emitter.emit("state", n.state);
133
+ } catch {
134
+ }
135
+ });
136
+ this.emitter = e, this.storageKey = n, !(typeof window > "u") && ("BroadcastChannel" in window && (this.channel = new BroadcastChannel(Q), this.channel.onmessage = (a) => {
137
+ var s;
138
+ ((s = a.data) == null ? void 0 : s.tabId) !== this.tabId && this.emitter.emit("state", a.data.state);
139
+ }), window.addEventListener("storage", this.handleStorage));
140
+ }
141
+ publish(e) {
142
+ var a;
143
+ if (typeof window > "u") return;
144
+ const n = { tabId: this.tabId, state: e };
145
+ localStorage.setItem(this.storageKey, JSON.stringify(n)), (a = this.channel) == null || a.postMessage(n);
146
+ }
147
+ read() {
148
+ if (typeof window > "u") return;
149
+ const e = localStorage.getItem(this.storageKey);
150
+ if (e)
151
+ try {
152
+ return JSON.parse(e).state;
153
+ } catch {
154
+ return;
155
+ }
156
+ }
157
+ destroy() {
158
+ var e;
159
+ (e = this.channel) == null || e.close(), typeof window < "u" && window.removeEventListener("storage", this.handleStorage);
160
+ }
161
+ }
162
+ function S(t) {
163
+ var a, s, h;
164
+ if (typeof window > "u") return;
165
+ const e = t === "okx" ? (a = window.okxwallet) == null ? void 0 : a.ethereum : window.ethereum, n = (e == null ? void 0 : e.providers) ?? ((s = window.ethereum) == null ? void 0 : s.providers);
166
+ if (n != null && n.length) {
167
+ const f = n.find((w) => t === "metamask" ? w.isMetaMask && !w.isOkxWallet : w.isOkxWallet);
168
+ if (f) return f;
169
+ }
170
+ if (t === "metamask" && (e != null && e.isMetaMask) && !e.isOkxWallet || t === "okx" && (e != null && e.isOkxWallet || (h = window.okxwallet) != null && h.ethereum)) return e;
171
+ }
172
+ function ee(t) {
173
+ if (t)
174
+ return Number.parseInt(t, 16);
175
+ }
176
+ function x(t) {
177
+ return {
178
+ id: t.id,
179
+ name: t.name,
180
+ chainType: "evm",
181
+ icon: t.icon,
182
+ installed: () => !!S(t.id),
183
+ connect: async () => {
184
+ const e = S(t.id);
185
+ if (!e)
186
+ throw new u("PROVIDER_NOT_FOUND", `${t.name} provider was not found.`);
187
+ const n = await e.request({ method: "eth_requestAccounts" }), a = await e.request({ method: "eth_chainId" }).catch(() => {
188
+ }), s = n[0];
189
+ if (!s) throw new u("PROVIDER_NOT_FOUND", `${t.name} did not return an address.`);
190
+ return {
191
+ address: s,
192
+ chainType: "evm",
193
+ chainId: ee(a)
194
+ };
195
+ },
196
+ signMessage: async (e, n) => {
197
+ const a = S(t.id);
198
+ if (!a) throw new u("PROVIDER_NOT_FOUND", `${t.name} provider was not found.`);
199
+ return a.request({
200
+ method: "personal_sign",
201
+ params: [e, n.address]
202
+ });
203
+ },
204
+ getDeepLink: (e) => W(t.id, e, t.deepLinks)
205
+ };
206
+ }
207
+ function O() {
208
+ var t, e;
209
+ if (!(typeof window > "u"))
210
+ return (e = (t = window.phantom) == null ? void 0 : t.solana) != null && e.isPhantom ? window.phantom.solana : void 0;
211
+ }
212
+ function te(t) {
213
+ let e = "";
214
+ return t.forEach((n) => {
215
+ e += String.fromCharCode(n);
216
+ }), btoa(e);
217
+ }
218
+ function ne(t) {
219
+ return {
220
+ id: "phantom",
221
+ name: "Phantom",
222
+ chainType: "solana",
223
+ icon: "P",
224
+ installed: () => !!O(),
225
+ connect: async () => {
226
+ const e = O();
227
+ if (!e) throw new u("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
228
+ const a = (await e.connect()).publicKey.toString();
229
+ return {
230
+ address: a,
231
+ publicKey: a,
232
+ chainType: "solana",
233
+ chainId: "solana:mainnet"
234
+ };
235
+ },
236
+ disconnect: async () => {
237
+ var e, n;
238
+ await ((n = (e = O()) == null ? void 0 : e.disconnect) == null ? void 0 : n.call(e));
239
+ },
240
+ signMessage: async (e) => {
241
+ const n = O();
242
+ if (!n) throw new u("PROVIDER_NOT_FOUND", "Phantom provider was not found.");
243
+ const a = new TextEncoder().encode(e), { signature: s } = await n.signMessage(a, "utf8");
244
+ return te(s);
245
+ },
246
+ getDeepLink: (e) => W("phantom", e, t)
247
+ };
248
+ }
249
+ function ae(t) {
250
+ return [
251
+ x({ id: "metamask", name: "MetaMask", icon: "M", deepLinks: t }),
252
+ x({ id: "okx", name: "OKX Wallet", icon: "O", deepLinks: t }),
253
+ ne(t)
254
+ ];
255
+ }
256
+ const se = 3e4, re = "rainbow-wallet-kit:wallet-state", oe = {
257
+ status: "idle",
258
+ updatedAt: Date.now()
259
+ }, U = V(void 0);
260
+ function ue({
261
+ children: t,
262
+ auth: e,
263
+ deepLinks: n,
264
+ connectTimeoutMs: a = se,
265
+ storageKey: s = re,
266
+ initialWallet: h,
267
+ autoConnect: f
268
+ }) {
269
+ const w = C(new j()), T = C(null), [o, v] = R(oe), c = I(() => ae(n), [n]), l = D((r) => {
270
+ var i;
271
+ v(r), w.current.emit("state", r), (i = T.current) == null || i.publish(r);
272
+ }, []), E = D(
273
+ async (r) => {
274
+ const i = c.find((d) => d.id === r);
275
+ if (!i) return;
276
+ if (!i.installed() && (n == null ? void 0 : n.enabled) !== !1 && G()) {
277
+ window.location.href = i.getDeepLink(Y(n));
278
+ return;
279
+ }
280
+ const p = {
281
+ ...o,
282
+ status: "connecting",
283
+ wallet: r,
284
+ error: void 0,
285
+ updatedAt: Date.now()
286
+ };
287
+ l(p);
288
+ try {
289
+ const d = await X(
290
+ i.connect(),
291
+ a,
292
+ `${i.name} connection timed out.`
293
+ ), g = await L({
294
+ auth: e,
295
+ wallet: r,
296
+ account: d,
297
+ signMessage: (F) => i.signMessage(F, d)
298
+ });
299
+ l({
300
+ status: "connected",
301
+ wallet: r,
302
+ account: d,
303
+ auth: g,
304
+ updatedAt: Date.now()
305
+ }), w.current.emit("accountChanged", d);
306
+ } catch (d) {
307
+ const g = M(d);
308
+ throw l({
309
+ status: "error",
310
+ wallet: r,
311
+ error: g,
312
+ updatedAt: Date.now()
313
+ }), w.current.emit("error", g), g;
314
+ }
315
+ },
316
+ [e, a, n, l, o, c]
317
+ ), _ = D(async () => {
318
+ var p;
319
+ const r = c.find((d) => d.id === o.wallet);
320
+ await ((p = r == null ? void 0 : r.disconnect) == null ? void 0 : p.call(r));
321
+ const i = {
322
+ status: "disconnected",
323
+ updatedAt: Date.now()
324
+ };
325
+ l(i), w.current.emit("disconnect", void 0);
326
+ }, [l, o.wallet, c]), N = D(async () => {
327
+ const r = await z({
328
+ auth: e,
329
+ session: o.auth,
330
+ wallet: o.wallet,
331
+ account: o.account
332
+ });
333
+ r && o.status === "connected" && l({
334
+ ...o,
335
+ auth: r,
336
+ updatedAt: Date.now()
337
+ });
338
+ }, [e, l, o]);
339
+ b(() => {
340
+ const r = new Z(w.current, s);
341
+ T.current = r;
342
+ const i = r.read();
343
+ i && v(i);
344
+ const p = w.current.on("state", (d) => {
345
+ v((g) => d.updatedAt >= g.updatedAt ? d : g);
346
+ });
347
+ return () => {
348
+ p(), r.destroy();
349
+ };
350
+ }, [s]), b(() => {
351
+ f && h && E(h).catch(() => {
352
+ });
353
+ }, [f, E, h]), b(() => {
354
+ if (!o.auth || o.status !== "connected") return;
355
+ const r = H(o.auth, e == null ? void 0 : e.renewalWindowMs), i = window.setTimeout(() => {
356
+ N().catch((p) => {
357
+ const d = M(p);
358
+ l({ ...o, status: "error", error: d, updatedAt: Date.now() });
359
+ });
360
+ }, r);
361
+ return () => window.clearTimeout(i);
362
+ }, [e == null ? void 0 : e.renewalWindowMs, l, N, o]);
363
+ const $ = I(
364
+ () => ({
365
+ state: o,
366
+ wallets: c,
367
+ connect: E,
368
+ disconnect: _,
369
+ refreshAuth: N
370
+ }),
371
+ [E, _, N, o, c]
372
+ );
373
+ return /* @__PURE__ */ m(U.Provider, { value: $, children: t });
374
+ }
375
+ function ce() {
376
+ const t = q(U);
377
+ if (!t)
378
+ throw new Error("useWallet must be used inside WalletProvider.");
379
+ return t;
380
+ }
381
+ function he({
382
+ label: t = "Connect Wallet",
383
+ className: e = "",
384
+ preferredWallets: n,
385
+ onError: a
386
+ }) {
387
+ const { state: s, wallets: h, connect: f, disconnect: w } = ce(), [T, o] = R(!1), v = n != null && n.length ? n.flatMap((c) => h.filter((l) => l.id === c)) : h;
388
+ return s.status === "connected" && s.account ? /* @__PURE__ */ k("div", { className: `rwk-root ${e}`, children: [
389
+ /* @__PURE__ */ k("button", { className: "rwk-account", type: "button", onClick: () => o((c) => !c), children: [
390
+ /* @__PURE__ */ m("span", { className: "rwk-status-dot" }),
391
+ /* @__PURE__ */ m("span", { children: P(s.account.address) })
392
+ ] }),
393
+ T ? /* @__PURE__ */ k("div", { className: "rwk-panel", role: "dialog", "aria-label": "Wallet account", children: [
394
+ /* @__PURE__ */ k("div", { className: "rwk-account-row", children: [
395
+ /* @__PURE__ */ m("span", { children: s.wallet }),
396
+ /* @__PURE__ */ m("strong", { children: P(s.account.address) })
397
+ ] }),
398
+ /* @__PURE__ */ m("button", { className: "rwk-disconnect", type: "button", onClick: () => void w(), children: "Disconnect" })
399
+ ] }) : null
400
+ ] }) : /* @__PURE__ */ k("div", { className: `rwk-root ${e}`, children: [
401
+ /* @__PURE__ */ m(
402
+ "button",
403
+ {
404
+ className: "rwk-connect",
405
+ type: "button",
406
+ disabled: s.status === "connecting",
407
+ onClick: () => o((c) => !c),
408
+ children: s.status === "connecting" ? "Connecting..." : t
409
+ }
410
+ ),
411
+ T ? /* @__PURE__ */ k("div", { className: "rwk-panel", role: "dialog", "aria-label": "Connect wallet", children: [
412
+ v.map((c) => /* @__PURE__ */ k(
413
+ "button",
414
+ {
415
+ className: "rwk-wallet",
416
+ type: "button",
417
+ onClick: () => {
418
+ f(c.id).then(() => o(!1)).catch((l) => a == null ? void 0 : a(l));
419
+ },
420
+ children: [
421
+ /* @__PURE__ */ m("span", { className: "rwk-wallet-icon", children: c.icon }),
422
+ /* @__PURE__ */ m("span", { children: c.name }),
423
+ /* @__PURE__ */ m("small", { children: c.installed() ? "Detected" : "Open app" })
424
+ ]
425
+ },
426
+ c.id
427
+ )),
428
+ s.error ? /* @__PURE__ */ m("p", { className: "rwk-error", children: s.error.message }) : null
429
+ ] }) : null
430
+ ] });
431
+ }
432
+ function P(t) {
433
+ return t.length <= 12 ? t : `${t.slice(0, 6)}...${t.slice(-4)}`;
434
+ }
435
+ export {
436
+ he as ConnectWalletButton,
437
+ j as EventEmitter,
438
+ U as WalletContext,
439
+ u as WalletKitError,
440
+ ue as WalletProvider,
441
+ Z as WalletStateSync,
442
+ L as authenticateWallet,
443
+ B as createNonceMessage,
444
+ ae as createWalletAdapters,
445
+ M as normalizeWalletError,
446
+ z as refreshJwtSession,
447
+ ce as useWallet,
448
+ X as withTimeout
449
+ };
450
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/core/auth.ts","../src/core/deepLinks.ts","../src/core/eventEmitter.ts","../src/core/errors.ts","../src/core/storageSync.ts","../src/wallets/eip1193.ts","../src/wallets/phantom.ts","../src/wallets/index.ts","../src/react/WalletProvider.tsx","../src/react/useWallet.ts","../src/react/ConnectWalletButton.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type ChainType = 'evm' | 'solana';\nexport type WalletId = 'metamask' | 'okx' | 'phantom';\nexport type WalletStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface WalletAccount {\n address: string;\n chainType: ChainType;\n chainId?: string | number;\n publicKey?: string;\n}\n\nexport interface WalletState {\n status: WalletStatus;\n wallet?: WalletId;\n account?: WalletAccount;\n auth?: AuthSession;\n error?: WalletKitError;\n updatedAt: number;\n}\n\nexport interface AuthSession {\n token: string;\n expiresAt: number;\n refreshToken?: string;\n}\n\nexport interface NonceRequest {\n wallet: WalletId;\n address: string;\n chainType: ChainType;\n audience?: string;\n}\n\nexport interface VerifySignaturePayload extends NonceRequest {\n nonce: string;\n message: string;\n signature: string;\n}\n\nexport interface JwtRefreshRequest {\n token: string;\n refreshToken?: string;\n wallet: WalletId;\n address: string;\n}\n\nexport interface WalletAuthConfig {\n enabled?: boolean;\n audience?: string;\n renewalWindowMs?: number;\n getNonce?: (request: NonceRequest) => Promise<string>;\n verifySignature?: (payload: VerifySignaturePayload) => Promise<AuthSession>;\n refreshJwt?: (request: JwtRefreshRequest) => Promise<AuthSession>;\n}\n\nexport interface DeepLinkConfig {\n enabled?: boolean;\n dappUrl?: string;\n metamask?: string;\n okx?: string;\n phantom?: string;\n}\n\nexport interface WalletKitOptions {\n auth?: WalletAuthConfig;\n deepLinks?: DeepLinkConfig;\n connectTimeoutMs?: number;\n storageKey?: string;\n}\n\nexport interface WalletProviderProps extends WalletKitOptions {\n children: ReactNode;\n initialWallet?: WalletId;\n autoConnect?: boolean;\n}\n\nexport type WalletKitErrorCode =\n | 'PROVIDER_NOT_FOUND'\n | 'USER_REJECTED'\n | 'CONNECT_TIMEOUT'\n | 'SIGNATURE_REJECTED'\n | 'AUTH_FAILED'\n | 'JWT_REFRESH_FAILED'\n | 'UNSUPPORTED_CHAIN'\n | 'UNKNOWN';\n\nexport class WalletKitError extends Error {\n code: WalletKitErrorCode;\n cause?: unknown;\n\n constructor(code: WalletKitErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'WalletKitError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nexport interface WalletAdapter {\n id: WalletId;\n name: string;\n chainType: ChainType;\n icon: string;\n installed: () => boolean;\n connect: () => Promise<WalletAccount>;\n disconnect?: () => Promise<void>;\n signMessage: (message: string, account: WalletAccount) => Promise<string>;\n getDeepLink: (targetUrl: string) => string;\n}\n\nexport type WalletEventMap = {\n state: WalletState;\n accountChanged: WalletAccount | undefined;\n disconnect: undefined;\n error: WalletKitError;\n};\n\nexport interface WalletContextValue {\n state: WalletState;\n wallets: WalletAdapter[];\n connect: (wallet: WalletId) => Promise<void>;\n disconnect: () => Promise<void>;\n refreshAuth: () => Promise<void>;\n}\n","import { WalletKitError } from '../types';\nimport type { AuthSession, WalletAccount, WalletAuthConfig, WalletId } from '../types';\n\nexport function createNonceMessage(input: {\n nonce: string;\n address: string;\n wallet: WalletId;\n chainType: string;\n audience?: string;\n}): string {\n return [\n input.audience ?? 'Wallet Login',\n '',\n `Wallet: ${input.wallet}`,\n `Address: ${input.address}`,\n `Chain: ${input.chainType}`,\n `Nonce: ${input.nonce}`,\n `Issued At: ${new Date().toISOString()}`,\n ].join('\\n');\n}\n\nexport async function authenticateWallet(input: {\n auth?: WalletAuthConfig;\n wallet: WalletId;\n account: WalletAccount;\n signMessage: (message: string) => Promise<string>;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled) return undefined;\n if (!input.auth.getNonce || !input.auth.verifySignature) {\n throw new WalletKitError('AUTH_FAILED', 'Wallet auth requires getNonce and verifySignature callbacks.');\n }\n\n const nonce = await input.auth.getNonce({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const message = createNonceMessage({\n nonce,\n address: input.account.address,\n wallet: input.wallet,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const signature = await input.signMessage(message).catch((error) => {\n throw new WalletKitError('SIGNATURE_REJECTED', 'Wallet signature was rejected or failed.', error);\n });\n\n return input.auth.verifySignature({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n nonce,\n message,\n signature,\n });\n}\n\nexport async function refreshJwtSession(input: {\n auth?: WalletAuthConfig;\n session?: AuthSession;\n wallet?: WalletId;\n account?: WalletAccount;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled || !input.auth.refreshJwt || !input.session || !input.wallet || !input.account) {\n return input.session;\n }\n\n try {\n return await input.auth.refreshJwt({\n token: input.session.token,\n refreshToken: input.session.refreshToken,\n wallet: input.wallet,\n address: input.account.address,\n });\n } catch (error) {\n throw new WalletKitError('JWT_REFRESH_FAILED', 'JWT refresh failed.', error);\n }\n}\n\nexport function getRenewalDelay(session: AuthSession, windowMs = 60_000): number {\n return Math.max(0, session.expiresAt - Date.now() - windowMs);\n}\n","import type { DeepLinkConfig, WalletId } from '../types';\n\nconst DEFAULT_DEEP_LINKS: Required<Pick<DeepLinkConfig, 'metamask' | 'okx' | 'phantom'>> = {\n metamask: 'https://metamask.app.link/dapp/',\n okx: 'okx://wallet/dapp/url?dappUrl=',\n phantom: 'https://phantom.app/ul/browse/',\n};\n\nexport function isMobileH5(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n}\n\nexport function resolveDappUrl(config?: DeepLinkConfig): string {\n if (config?.dappUrl) return config.dappUrl;\n if (typeof window === 'undefined') return '';\n return window.location.href;\n}\n\nexport function getWalletDeepLink(wallet: WalletId, targetUrl: string, config?: DeepLinkConfig): string {\n const encoded = encodeURIComponent(targetUrl);\n if (wallet === 'metamask') return `${config?.metamask ?? DEFAULT_DEEP_LINKS.metamask}${targetUrl.replace(/^https?:\\/\\//, '')}`;\n if (wallet === 'okx') return `${config?.okx ?? DEFAULT_DEEP_LINKS.okx}${encoded}`;\n return `${config?.phantom ?? DEFAULT_DEEP_LINKS.phantom}${encoded}?ref=${encoded}`;\n}\n","type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter<Events extends Record<string, unknown>> {\n private listeners = new Map<keyof Events, Set<Listener<Events[keyof Events]>>>();\n\n on<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): () => void {\n const listeners = this.listeners.get(event) ?? new Set();\n listeners.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, listeners);\n return () => this.off(event, listener);\n }\n\n off<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): void {\n this.listeners.get(event)?.delete(listener as Listener<Events[keyof Events]>);\n }\n\n emit<Key extends keyof Events>(event: Key, payload: Events[Key]): void {\n this.listeners.get(event)?.forEach((listener) => listener(payload));\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import { WalletKitError } from '../types';\n\nexport function normalizeWalletError(error: unknown): WalletKitError {\n if (error instanceof WalletKitError) return error;\n\n const maybe = error as { code?: number | string; message?: string } | undefined;\n if (maybe?.code === 4001 || maybe?.code === 'ACTION_REJECTED') {\n return new WalletKitError('USER_REJECTED', maybe.message ?? 'User rejected wallet request.', error);\n }\n\n if (maybe?.message?.toLowerCase().includes('timeout')) {\n return new WalletKitError('CONNECT_TIMEOUT', maybe.message, error);\n }\n\n return new WalletKitError('UNKNOWN', maybe?.message ?? 'Unexpected wallet error.', error);\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeout = setTimeout(() => reject(new WalletKitError('CONNECT_TIMEOUT', message)), timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n if (timeout) clearTimeout(timeout);\n });\n}\n","import { EventEmitter } from './eventEmitter';\nimport type { WalletEventMap, WalletState } from '../types';\n\nconst SYNC_EVENT = 'rainbow-wallet-kit:state';\n\nexport class WalletStateSync {\n private channel?: BroadcastChannel;\n private tabId = Math.random().toString(36).slice(2);\n\n constructor(\n private emitter: EventEmitter<WalletEventMap>,\n private storageKey: string,\n ) {\n if (typeof window === 'undefined') return;\n\n if ('BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(SYNC_EVENT);\n this.channel.onmessage = (event: MessageEvent<{ tabId: string; state: WalletState }>) => {\n if (event.data?.tabId !== this.tabId) {\n this.emitter.emit('state', event.data.state);\n }\n };\n }\n\n window.addEventListener('storage', this.handleStorage);\n }\n\n publish(state: WalletState): void {\n if (typeof window === 'undefined') return;\n const payload = { tabId: this.tabId, state };\n localStorage.setItem(this.storageKey, JSON.stringify(payload));\n this.channel?.postMessage(payload);\n }\n\n read(): WalletState | undefined {\n if (typeof window === 'undefined') return undefined;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return undefined;\n\n try {\n const parsed = JSON.parse(raw) as { state?: WalletState };\n return parsed.state;\n } catch {\n return undefined;\n }\n }\n\n destroy(): void {\n this.channel?.close();\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', this.handleStorage);\n }\n }\n\n private handleStorage = (event: StorageEvent) => {\n if (event.key !== this.storageKey || !event.newValue) return;\n try {\n const payload = JSON.parse(event.newValue) as { tabId: string; state: WalletState };\n if (payload.tabId !== this.tabId) {\n this.emitter.emit('state', payload.state);\n }\n } catch {\n // Ignore malformed cross-tab payloads from older package versions.\n }\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter, WalletId } from '../types';\nimport type { Eip1193Provider } from './providerTypes';\n\nfunction pickInjectedProvider(wallet: WalletId): Eip1193Provider | undefined {\n if (typeof window === 'undefined') return undefined;\n\n const injected = wallet === 'okx' ? window.okxwallet?.ethereum : window.ethereum;\n const providers = injected?.providers ?? window.ethereum?.providers;\n if (providers?.length) {\n const matched = providers.find((provider) => {\n if (wallet === 'metamask') return provider.isMetaMask && !provider.isOkxWallet;\n return provider.isOkxWallet;\n });\n if (matched) return matched;\n }\n\n if (wallet === 'metamask' && injected?.isMetaMask && !injected.isOkxWallet) return injected;\n if (wallet === 'okx' && (injected?.isOkxWallet || window.okxwallet?.ethereum)) return injected;\n return undefined;\n}\n\nfunction hexToNumber(hex?: string): number | undefined {\n if (!hex) return undefined;\n return Number.parseInt(hex, 16);\n}\n\nexport function createEvmAdapter(options: {\n id: Extract<WalletId, 'metamask' | 'okx'>;\n name: string;\n icon: string;\n deepLinks?: DeepLinkConfig;\n}): WalletAdapter {\n return {\n id: options.id,\n name: options.name,\n chainType: 'evm',\n icon: options.icon,\n installed: () => Boolean(pickInjectedProvider(options.id)),\n connect: async (): Promise<WalletAccount> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) {\n throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n }\n\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const chainId = await provider.request<string>({ method: 'eth_chainId' }).catch(() => undefined);\n const address = accounts[0];\n if (!address) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} did not return an address.`);\n\n return {\n address,\n chainType: 'evm',\n chainId: hexToNumber(chainId),\n };\n },\n signMessage: async (message: string, account: WalletAccount): Promise<string> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n return provider.request<string>({\n method: 'personal_sign',\n params: [message, account.address],\n });\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink(options.id, targetUrl, options.deepLinks),\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter } from '../types';\nimport type { PhantomSolanaProvider } from './providerTypes';\n\nfunction getProvider(): PhantomSolanaProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.phantom?.solana?.isPhantom ? window.phantom.solana : undefined;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\nexport function createPhantomAdapter(deepLinks?: DeepLinkConfig): WalletAdapter {\n return {\n id: 'phantom',\n name: 'Phantom',\n chainType: 'solana',\n icon: 'P',\n installed: () => Boolean(getProvider()),\n connect: async (): Promise<WalletAccount> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const response = await provider.connect();\n const address = response.publicKey.toString();\n return {\n address,\n publicKey: address,\n chainType: 'solana',\n chainId: 'solana:mainnet',\n };\n },\n disconnect: async () => {\n await getProvider()?.disconnect?.();\n },\n signMessage: async (message: string): Promise<string> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const encoded = new TextEncoder().encode(message);\n const { signature } = await provider.signMessage(encoded, 'utf8');\n return bytesToBase64(signature);\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink('phantom', targetUrl, deepLinks),\n };\n}\n","import type { DeepLinkConfig, WalletAdapter } from '../types';\nimport { createEvmAdapter } from './eip1193';\nimport { createPhantomAdapter } from './phantom';\n\nexport function createWalletAdapters(deepLinks?: DeepLinkConfig): WalletAdapter[] {\n return [\n createEvmAdapter({ id: 'metamask', name: 'MetaMask', icon: 'M', deepLinks }),\n createEvmAdapter({ id: 'okx', name: 'OKX Wallet', icon: 'O', deepLinks }),\n createPhantomAdapter(deepLinks),\n ];\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { authenticateWallet, getRenewalDelay, refreshJwtSession } from '../core/auth';\nimport { isMobileH5, resolveDappUrl } from '../core/deepLinks';\nimport { EventEmitter } from '../core/eventEmitter';\nimport { normalizeWalletError, withTimeout } from '../core/errors';\nimport { WalletStateSync } from '../core/storageSync';\nimport { createWalletAdapters } from '../wallets';\nimport type { WalletContextValue, WalletEventMap, WalletId, WalletProviderProps, WalletState } from '../types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_STORAGE_KEY = 'rainbow-wallet-kit:wallet-state';\n\nconst initialState: WalletState = {\n status: 'idle',\n updatedAt: Date.now(),\n};\n\nexport const WalletContext = createContext<WalletContextValue | undefined>(undefined);\n\nexport function WalletProvider({\n children,\n auth,\n deepLinks,\n connectTimeoutMs = DEFAULT_TIMEOUT_MS,\n storageKey = DEFAULT_STORAGE_KEY,\n initialWallet,\n autoConnect,\n}: WalletProviderProps) {\n const emitterRef = useRef(new EventEmitter<WalletEventMap>());\n const syncRef = useRef<WalletStateSync | null>(null);\n const [state, setState] = useState<WalletState>(initialState);\n const wallets = useMemo(() => createWalletAdapters(deepLinks), [deepLinks]);\n\n const publishState = useCallback((nextState: WalletState) => {\n setState(nextState);\n emitterRef.current.emit('state', nextState);\n syncRef.current?.publish(nextState);\n }, []);\n\n const connect = useCallback(\n async (walletId: WalletId) => {\n const wallet = wallets.find((item) => item.id === walletId);\n if (!wallet) return;\n\n if (!wallet.installed() && deepLinks?.enabled !== false && isMobileH5()) {\n window.location.href = wallet.getDeepLink(resolveDappUrl(deepLinks));\n return;\n }\n\n const connectingState: WalletState = {\n ...state,\n status: 'connecting',\n wallet: walletId,\n error: undefined,\n updatedAt: Date.now(),\n };\n publishState(connectingState);\n\n try {\n const account = await withTimeout(\n wallet.connect(),\n connectTimeoutMs,\n `${wallet.name} connection timed out.`,\n );\n const session = await authenticateWallet({\n auth,\n wallet: walletId,\n account,\n signMessage: (message) => wallet.signMessage(message, account),\n });\n publishState({\n status: 'connected',\n wallet: walletId,\n account,\n auth: session,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('accountChanged', account);\n } catch (error) {\n const normalized = normalizeWalletError(error);\n publishState({\n status: 'error',\n wallet: walletId,\n error: normalized,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('error', normalized);\n throw normalized;\n }\n },\n [auth, connectTimeoutMs, deepLinks, publishState, state, wallets],\n );\n\n const disconnect = useCallback(async () => {\n const wallet = wallets.find((item) => item.id === state.wallet);\n await wallet?.disconnect?.();\n const nextState: WalletState = {\n status: 'disconnected',\n updatedAt: Date.now(),\n };\n publishState(nextState);\n emitterRef.current.emit('disconnect', undefined);\n }, [publishState, state.wallet, wallets]);\n\n const refreshAuth = useCallback(async () => {\n const session = await refreshJwtSession({\n auth,\n session: state.auth,\n wallet: state.wallet,\n account: state.account,\n });\n if (session && state.status === 'connected') {\n publishState({\n ...state,\n auth: session,\n updatedAt: Date.now(),\n });\n }\n }, [auth, publishState, state]);\n\n useEffect(() => {\n const sync = new WalletStateSync(emitterRef.current, storageKey);\n syncRef.current = sync;\n const stored = sync.read();\n if (stored) setState(stored);\n\n const unsubscribe = emitterRef.current.on('state', (nextState) => {\n setState((current) => (nextState.updatedAt >= current.updatedAt ? nextState : current));\n });\n\n return () => {\n unsubscribe();\n sync.destroy();\n };\n }, [storageKey]);\n\n useEffect(() => {\n if (autoConnect && initialWallet) {\n void connect(initialWallet).catch(() => undefined);\n }\n }, [autoConnect, connect, initialWallet]);\n\n useEffect(() => {\n if (!state.auth || state.status !== 'connected') return;\n const delay = getRenewalDelay(state.auth, auth?.renewalWindowMs);\n const timer = window.setTimeout(() => {\n void refreshAuth().catch((error) => {\n const normalized = normalizeWalletError(error);\n publishState({ ...state, status: 'error', error: normalized, updatedAt: Date.now() });\n });\n }, delay);\n return () => window.clearTimeout(timer);\n }, [auth?.renewalWindowMs, publishState, refreshAuth, state]);\n\n const value = useMemo<WalletContextValue>(\n () => ({\n state,\n wallets,\n connect,\n disconnect,\n refreshAuth,\n }),\n [connect, disconnect, refreshAuth, state, wallets],\n );\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { WalletContext } from './WalletProvider';\n\nexport function useWallet() {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWallet must be used inside WalletProvider.');\n }\n return context;\n}\n","import { useState } from 'react';\nimport type { WalletId } from '../types';\nimport { useWallet } from './useWallet';\n\nexport interface ConnectWalletButtonProps {\n label?: string;\n className?: string;\n preferredWallets?: WalletId[];\n onError?: (error: unknown) => void;\n}\n\nexport function ConnectWalletButton({\n label = 'Connect Wallet',\n className = '',\n preferredWallets,\n onError,\n}: ConnectWalletButtonProps) {\n const { state, wallets, connect, disconnect } = useWallet();\n const [open, setOpen] = useState(false);\n const orderedWallets = preferredWallets?.length\n ? preferredWallets.flatMap((id) => wallets.filter((wallet) => wallet.id === id))\n : wallets;\n\n if (state.status === 'connected' && state.account) {\n return (\n <div className={`rwk-root ${className}`}>\n <button className=\"rwk-account\" type=\"button\" onClick={() => setOpen((value) => !value)}>\n <span className=\"rwk-status-dot\" />\n <span>{shortenAddress(state.account.address)}</span>\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Wallet account\">\n <div className=\"rwk-account-row\">\n <span>{state.wallet}</span>\n <strong>{shortenAddress(state.account.address)}</strong>\n </div>\n <button className=\"rwk-disconnect\" type=\"button\" onClick={() => void disconnect()}>\n Disconnect\n </button>\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className={`rwk-root ${className}`}>\n <button\n className=\"rwk-connect\"\n type=\"button\"\n disabled={state.status === 'connecting'}\n onClick={() => setOpen((value) => !value)}\n >\n {state.status === 'connecting' ? 'Connecting...' : label}\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Connect wallet\">\n {orderedWallets.map((wallet) => (\n <button\n className=\"rwk-wallet\"\n key={wallet.id}\n type=\"button\"\n onClick={() => {\n void connect(wallet.id)\n .then(() => setOpen(false))\n .catch((error) => onError?.(error));\n }}\n >\n <span className=\"rwk-wallet-icon\">{wallet.icon}</span>\n <span>{wallet.name}</span>\n <small>{wallet.installed() ? 'Detected' : 'Open app'}</small>\n </button>\n ))}\n {state.error ? <p className=\"rwk-error\">{state.error.message}</p> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction shortenAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n"],"names":["WalletKitError","code","message","cause","__publicField","createNonceMessage","input","authenticateWallet","_a","nonce","signature","error","refreshJwtSession","getRenewalDelay","session","windowMs","DEFAULT_DEEP_LINKS","isMobileH5","resolveDappUrl","config","getWalletDeepLink","wallet","targetUrl","encoded","EventEmitter","event","listener","listeners","payload","normalizeWalletError","maybe","withTimeout","promise","timeoutMs","timeout","timeoutPromise","_","reject","SYNC_EVENT","WalletStateSync","emitter","storageKey","state","raw","pickInjectedProvider","injected","providers","_b","matched","provider","_c","hexToNumber","hex","createEvmAdapter","options","accounts","chainId","address","account","getProvider","bytesToBase64","bytes","binary","byte","createPhantomAdapter","deepLinks","createWalletAdapters","DEFAULT_TIMEOUT_MS","DEFAULT_STORAGE_KEY","initialState","WalletContext","createContext","WalletProvider","children","auth","connectTimeoutMs","initialWallet","autoConnect","emitterRef","useRef","syncRef","setState","useState","wallets","useMemo","publishState","useCallback","nextState","connect","walletId","item","connectingState","normalized","disconnect","refreshAuth","useEffect","sync","stored","unsubscribe","current","delay","timer","value","jsx","useWallet","context","useContext","ConnectWalletButton","label","className","preferredWallets","onError","open","setOpen","orderedWallets","id","jsxs","shortenAddress"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ (function(r,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],o):(r=typeof globalThis<"u"?globalThis:r||self,o(r.RainbowWalletKit={},r.jsxRuntime,r.React))})(this,(function(r,o,d){"use strict";var ne=Object.defineProperty;var ae=(r,o,d)=>o in r?ne(r,o,{enumerable:!0,configurable:!0,writable:!0,value:d}):r[o]=d;var E=(r,o,d)=>ae(r,typeof o!="symbol"?o+"":o,d);class w extends Error{constructor(n,a,s){super(a);E(this,"code");E(this,"cause");this.name="WalletKitError",this.code=n,this.cause=s}}function A(t){return[t.audience??"Wallet Login","",`Wallet: ${t.wallet}`,`Address: ${t.address}`,`Chain: ${t.chainType}`,`Nonce: ${t.nonce}`,`Issued At: ${new Date().toISOString()}`].join(`
2
+ `)}async function M(t){var s;if(!((s=t.auth)!=null&&s.enabled))return;if(!t.auth.getNonce||!t.auth.verifySignature)throw new w("AUTH_FAILED","Wallet auth requires getNonce and verifySignature callbacks.");const e=await t.auth.getNonce({wallet:t.wallet,address:t.account.address,chainType:t.account.chainType,audience:t.auth.audience}),n=A({nonce:e,address:t.account.address,wallet:t.wallet,chainType:t.account.chainType,audience:t.auth.audience}),a=await t.signMessage(n).catch(m=>{throw new w("SIGNATURE_REJECTED","Wallet signature was rejected or failed.",m)});return t.auth.verifySignature({wallet:t.wallet,address:t.account.address,chainType:t.account.chainType,audience:t.auth.audience,nonce:e,message:n,signature:a})}async function _(t){var e;if(!((e=t.auth)!=null&&e.enabled)||!t.auth.refreshJwt||!t.session||!t.wallet||!t.account)return t.session;try{return await t.auth.refreshJwt({token:t.session.token,refreshToken:t.session.refreshToken,wallet:t.wallet,address:t.account.address})}catch(n){throw new w("JWT_REFRESH_FAILED","JWT refresh failed.",n)}}function q(t,e=6e4){return Math.max(0,t.expiresAt-Date.now()-e)}const O={metamask:"https://metamask.app.link/dapp/",okx:"okx://wallet/dapp/url?dappUrl=",phantom:"https://phantom.app/ul/browse/"};function V(){return typeof navigator>"u"?!1:/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent)}function B(t){return t!=null&&t.dappUrl?t.dappUrl:typeof window>"u"?"":window.location.href}function I(t,e,n){const a=encodeURIComponent(e);return t==="metamask"?`${(n==null?void 0:n.metamask)??O.metamask}${e.replace(/^https?:\/\//,"")}`:t==="okx"?`${(n==null?void 0:n.okx)??O.okx}${a}`:`${(n==null?void 0:n.phantom)??O.phantom}${a}?ref=${a}`}class P{constructor(){E(this,"listeners",new Map)}on(e,n){const a=this.listeners.get(e)??new Set;return a.add(n),this.listeners.set(e,a),()=>this.off(e,n)}off(e,n){var a;(a=this.listeners.get(e))==null||a.delete(n)}emit(e,n){var a;(a=this.listeners.get(e))==null||a.forEach(s=>s(n))}removeAllListeners(){this.listeners.clear()}}function S(t){var n;if(t instanceof w)return t;const e=t;return(e==null?void 0:e.code)===4001||(e==null?void 0:e.code)==="ACTION_REJECTED"?new w("USER_REJECTED",e.message??"User rejected wallet request.",t):(n=e==null?void 0:e.message)!=null&&n.toLowerCase().includes("timeout")?new w("CONNECT_TIMEOUT",e.message,t):new w("UNKNOWN",(e==null?void 0:e.message)??"Unexpected wallet error.",t)}function U(t,e,n){let a;const s=new Promise((m,g)=>{a=setTimeout(()=>g(new w("CONNECT_TIMEOUT",n)),e)});return Promise.race([t,s]).finally(()=>{a&&clearTimeout(a)})}const L="rainbow-wallet-kit:state";class ${constructor(e,n){E(this,"channel");E(this,"tabId",Math.random().toString(36).slice(2));E(this,"handleStorage",e=>{if(!(e.key!==this.storageKey||!e.newValue))try{const n=JSON.parse(e.newValue);n.tabId!==this.tabId&&this.emitter.emit("state",n.state)}catch{}});this.emitter=e,this.storageKey=n,!(typeof window>"u")&&("BroadcastChannel"in window&&(this.channel=new BroadcastChannel(L),this.channel.onmessage=a=>{var s;((s=a.data)==null?void 0:s.tabId)!==this.tabId&&this.emitter.emit("state",a.data.state)}),window.addEventListener("storage",this.handleStorage))}publish(e){var a;if(typeof window>"u")return;const n={tabId:this.tabId,state:e};localStorage.setItem(this.storageKey,JSON.stringify(n)),(a=this.channel)==null||a.postMessage(n)}read(){if(typeof window>"u")return;const e=localStorage.getItem(this.storageKey);if(e)try{return JSON.parse(e).state}catch{return}}destroy(){var e;(e=this.channel)==null||e.close(),typeof window<"u"&&window.removeEventListener("storage",this.handleStorage)}}function C(t){var a,s,m;if(typeof window>"u")return;const e=t==="okx"?(a=window.okxwallet)==null?void 0:a.ethereum:window.ethereum,n=(e==null?void 0:e.providers)??((s=window.ethereum)==null?void 0:s.providers);if(n!=null&&n.length){const g=n.find(y=>t==="metamask"?y.isMetaMask&&!y.isOkxWallet:y.isOkxWallet);if(g)return g}if(t==="metamask"&&(e!=null&&e.isMetaMask)&&!e.isOkxWallet||t==="okx"&&(e!=null&&e.isOkxWallet||(m=window.okxwallet)!=null&&m.ethereum))return e}function j(t){if(t)return Number.parseInt(t,16)}function x(t){return{id:t.id,name:t.name,chainType:"evm",icon:t.icon,installed:()=>!!C(t.id),connect:async()=>{const e=C(t.id);if(!e)throw new w("PROVIDER_NOT_FOUND",`${t.name} provider was not found.`);const n=await e.request({method:"eth_requestAccounts"}),a=await e.request({method:"eth_chainId"}).catch(()=>{}),s=n[0];if(!s)throw new w("PROVIDER_NOT_FOUND",`${t.name} did not return an address.`);return{address:s,chainType:"evm",chainId:j(a)}},signMessage:async(e,n)=>{const a=C(t.id);if(!a)throw new w("PROVIDER_NOT_FOUND",`${t.name} provider was not found.`);return a.request({method:"personal_sign",params:[e,n.address]})},getDeepLink:e=>I(t.id,e,t.deepLinks)}}function N(){var t,e;if(!(typeof window>"u"))return(e=(t=window.phantom)==null?void 0:t.solana)!=null&&e.isPhantom?window.phantom.solana:void 0}function z(t){let e="";return t.forEach(n=>{e+=String.fromCharCode(n)}),btoa(e)}function H(t){return{id:"phantom",name:"Phantom",chainType:"solana",icon:"P",installed:()=>!!N(),connect:async()=>{const e=N();if(!e)throw new w("PROVIDER_NOT_FOUND","Phantom provider was not found.");const a=(await e.connect()).publicKey.toString();return{address:a,publicKey:a,chainType:"solana",chainId:"solana:mainnet"}},disconnect:async()=>{var e,n;await((n=(e=N())==null?void 0:e.disconnect)==null?void 0:n.call(e))},signMessage:async e=>{const n=N();if(!n)throw new w("PROVIDER_NOT_FOUND","Phantom provider was not found.");const a=new TextEncoder().encode(e),{signature:s}=await n.signMessage(a,"utf8");return z(s)},getDeepLink:e=>I("phantom",e,t)}}function K(t){return[x({id:"metamask",name:"MetaMask",icon:"M",deepLinks:t}),x({id:"okx",name:"OKX Wallet",icon:"O",deepLinks:t}),H(t)]}const G=3e4,Y="rainbow-wallet-kit:wallet-state",X={status:"idle",updatedAt:Date.now()},W=d.createContext(void 0);function Q({children:t,auth:e,deepLinks:n,connectTimeoutMs:a=G,storageKey:s=Y,initialWallet:m,autoConnect:g}){const y=d.useRef(new P),T=d.useRef(null),[i,v]=d.useState(X),l=d.useMemo(()=>K(n),[n]),f=d.useCallback(c=>{var u;v(c),y.current.emit("state",c),(u=T.current)==null||u.publish(c)},[]),b=d.useCallback(async c=>{const u=l.find(h=>h.id===c);if(!u)return;if(!u.installed()&&(n==null?void 0:n.enabled)!==!1&&V()){window.location.href=u.getDeepLink(B(n));return}const p={...i,status:"connecting",wallet:c,error:void 0,updatedAt:Date.now()};f(p);try{const h=await U(u.connect(),a,`${u.name} connection timed out.`),k=await M({auth:e,wallet:c,account:h,signMessage:te=>u.signMessage(te,h)});f({status:"connected",wallet:c,account:h,auth:k,updatedAt:Date.now()}),y.current.emit("accountChanged",h)}catch(h){const k=S(h);throw f({status:"error",wallet:c,error:k,updatedAt:Date.now()}),y.current.emit("error",k),k}},[e,a,n,f,i,l]),R=d.useCallback(async()=>{var p;const c=l.find(h=>h.id===i.wallet);await((p=c==null?void 0:c.disconnect)==null?void 0:p.call(c));const u={status:"disconnected",updatedAt:Date.now()};f(u),y.current.emit("disconnect",void 0)},[f,i.wallet,l]),D=d.useCallback(async()=>{const c=await _({auth:e,session:i.auth,wallet:i.wallet,account:i.account});c&&i.status==="connected"&&f({...i,auth:c,updatedAt:Date.now()})},[e,f,i]);d.useEffect(()=>{const c=new $(y.current,s);T.current=c;const u=c.read();u&&v(u);const p=y.current.on("state",h=>{v(k=>h.updatedAt>=k.updatedAt?h:k)});return()=>{p(),c.destroy()}},[s]),d.useEffect(()=>{g&&m&&b(m).catch(()=>{})},[g,b,m]),d.useEffect(()=>{if(!i.auth||i.status!=="connected")return;const c=q(i.auth,e==null?void 0:e.renewalWindowMs),u=window.setTimeout(()=>{D().catch(p=>{const h=S(p);f({...i,status:"error",error:h,updatedAt:Date.now()})})},c);return()=>window.clearTimeout(u)},[e==null?void 0:e.renewalWindowMs,f,D,i]);const ee=d.useMemo(()=>({state:i,wallets:l,connect:b,disconnect:R,refreshAuth:D}),[b,R,D,i,l]);return o.jsx(W.Provider,{value:ee,children:t})}function J(){const t=d.useContext(W);if(!t)throw new Error("useWallet must be used inside WalletProvider.");return t}function Z({label:t="Connect Wallet",className:e="",preferredWallets:n,onError:a}){const{state:s,wallets:m,connect:g,disconnect:y}=J(),[T,i]=d.useState(!1),v=n!=null&&n.length?n.flatMap(l=>m.filter(f=>f.id===l)):m;return s.status==="connected"&&s.account?o.jsxs("div",{className:`rwk-root ${e}`,children:[o.jsxs("button",{className:"rwk-account",type:"button",onClick:()=>i(l=>!l),children:[o.jsx("span",{className:"rwk-status-dot"}),o.jsx("span",{children:F(s.account.address)})]}),T?o.jsxs("div",{className:"rwk-panel",role:"dialog","aria-label":"Wallet account",children:[o.jsxs("div",{className:"rwk-account-row",children:[o.jsx("span",{children:s.wallet}),o.jsx("strong",{children:F(s.account.address)})]}),o.jsx("button",{className:"rwk-disconnect",type:"button",onClick:()=>void y(),children:"Disconnect"})]}):null]}):o.jsxs("div",{className:`rwk-root ${e}`,children:[o.jsx("button",{className:"rwk-connect",type:"button",disabled:s.status==="connecting",onClick:()=>i(l=>!l),children:s.status==="connecting"?"Connecting...":t}),T?o.jsxs("div",{className:"rwk-panel",role:"dialog","aria-label":"Connect wallet",children:[v.map(l=>o.jsxs("button",{className:"rwk-wallet",type:"button",onClick:()=>{g(l.id).then(()=>i(!1)).catch(f=>a==null?void 0:a(f))},children:[o.jsx("span",{className:"rwk-wallet-icon",children:l.icon}),o.jsx("span",{children:l.name}),o.jsx("small",{children:l.installed()?"Detected":"Open app"})]},l.id)),s.error?o.jsx("p",{className:"rwk-error",children:s.error.message}):null]}):null]})}function F(t){return t.length<=12?t:`${t.slice(0,6)}...${t.slice(-4)}`}r.ConnectWalletButton=Z,r.EventEmitter=P,r.WalletContext=W,r.WalletKitError=w,r.WalletProvider=Q,r.WalletStateSync=$,r.authenticateWallet=M,r.createNonceMessage=A,r.createWalletAdapters=K,r.normalizeWalletError=S,r.refreshJwtSession=_,r.useWallet=J,r.withTimeout=U,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
3
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/types.ts","../src/core/auth.ts","../src/core/deepLinks.ts","../src/core/eventEmitter.ts","../src/core/errors.ts","../src/core/storageSync.ts","../src/wallets/eip1193.ts","../src/wallets/phantom.ts","../src/wallets/index.ts","../src/react/WalletProvider.tsx","../src/react/useWallet.ts","../src/react/ConnectWalletButton.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type ChainType = 'evm' | 'solana';\nexport type WalletId = 'metamask' | 'okx' | 'phantom';\nexport type WalletStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface WalletAccount {\n address: string;\n chainType: ChainType;\n chainId?: string | number;\n publicKey?: string;\n}\n\nexport interface WalletState {\n status: WalletStatus;\n wallet?: WalletId;\n account?: WalletAccount;\n auth?: AuthSession;\n error?: WalletKitError;\n updatedAt: number;\n}\n\nexport interface AuthSession {\n token: string;\n expiresAt: number;\n refreshToken?: string;\n}\n\nexport interface NonceRequest {\n wallet: WalletId;\n address: string;\n chainType: ChainType;\n audience?: string;\n}\n\nexport interface VerifySignaturePayload extends NonceRequest {\n nonce: string;\n message: string;\n signature: string;\n}\n\nexport interface JwtRefreshRequest {\n token: string;\n refreshToken?: string;\n wallet: WalletId;\n address: string;\n}\n\nexport interface WalletAuthConfig {\n enabled?: boolean;\n audience?: string;\n renewalWindowMs?: number;\n getNonce?: (request: NonceRequest) => Promise<string>;\n verifySignature?: (payload: VerifySignaturePayload) => Promise<AuthSession>;\n refreshJwt?: (request: JwtRefreshRequest) => Promise<AuthSession>;\n}\n\nexport interface DeepLinkConfig {\n enabled?: boolean;\n dappUrl?: string;\n metamask?: string;\n okx?: string;\n phantom?: string;\n}\n\nexport interface WalletKitOptions {\n auth?: WalletAuthConfig;\n deepLinks?: DeepLinkConfig;\n connectTimeoutMs?: number;\n storageKey?: string;\n}\n\nexport interface WalletProviderProps extends WalletKitOptions {\n children: ReactNode;\n initialWallet?: WalletId;\n autoConnect?: boolean;\n}\n\nexport type WalletKitErrorCode =\n | 'PROVIDER_NOT_FOUND'\n | 'USER_REJECTED'\n | 'CONNECT_TIMEOUT'\n | 'SIGNATURE_REJECTED'\n | 'AUTH_FAILED'\n | 'JWT_REFRESH_FAILED'\n | 'UNSUPPORTED_CHAIN'\n | 'UNKNOWN';\n\nexport class WalletKitError extends Error {\n code: WalletKitErrorCode;\n cause?: unknown;\n\n constructor(code: WalletKitErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'WalletKitError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nexport interface WalletAdapter {\n id: WalletId;\n name: string;\n chainType: ChainType;\n icon: string;\n installed: () => boolean;\n connect: () => Promise<WalletAccount>;\n disconnect?: () => Promise<void>;\n signMessage: (message: string, account: WalletAccount) => Promise<string>;\n getDeepLink: (targetUrl: string) => string;\n}\n\nexport type WalletEventMap = {\n state: WalletState;\n accountChanged: WalletAccount | undefined;\n disconnect: undefined;\n error: WalletKitError;\n};\n\nexport interface WalletContextValue {\n state: WalletState;\n wallets: WalletAdapter[];\n connect: (wallet: WalletId) => Promise<void>;\n disconnect: () => Promise<void>;\n refreshAuth: () => Promise<void>;\n}\n","import { WalletKitError } from '../types';\nimport type { AuthSession, WalletAccount, WalletAuthConfig, WalletId } from '../types';\n\nexport function createNonceMessage(input: {\n nonce: string;\n address: string;\n wallet: WalletId;\n chainType: string;\n audience?: string;\n}): string {\n return [\n input.audience ?? 'Wallet Login',\n '',\n `Wallet: ${input.wallet}`,\n `Address: ${input.address}`,\n `Chain: ${input.chainType}`,\n `Nonce: ${input.nonce}`,\n `Issued At: ${new Date().toISOString()}`,\n ].join('\\n');\n}\n\nexport async function authenticateWallet(input: {\n auth?: WalletAuthConfig;\n wallet: WalletId;\n account: WalletAccount;\n signMessage: (message: string) => Promise<string>;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled) return undefined;\n if (!input.auth.getNonce || !input.auth.verifySignature) {\n throw new WalletKitError('AUTH_FAILED', 'Wallet auth requires getNonce and verifySignature callbacks.');\n }\n\n const nonce = await input.auth.getNonce({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const message = createNonceMessage({\n nonce,\n address: input.account.address,\n wallet: input.wallet,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n });\n const signature = await input.signMessage(message).catch((error) => {\n throw new WalletKitError('SIGNATURE_REJECTED', 'Wallet signature was rejected or failed.', error);\n });\n\n return input.auth.verifySignature({\n wallet: input.wallet,\n address: input.account.address,\n chainType: input.account.chainType,\n audience: input.auth.audience,\n nonce,\n message,\n signature,\n });\n}\n\nexport async function refreshJwtSession(input: {\n auth?: WalletAuthConfig;\n session?: AuthSession;\n wallet?: WalletId;\n account?: WalletAccount;\n}): Promise<AuthSession | undefined> {\n if (!input.auth?.enabled || !input.auth.refreshJwt || !input.session || !input.wallet || !input.account) {\n return input.session;\n }\n\n try {\n return await input.auth.refreshJwt({\n token: input.session.token,\n refreshToken: input.session.refreshToken,\n wallet: input.wallet,\n address: input.account.address,\n });\n } catch (error) {\n throw new WalletKitError('JWT_REFRESH_FAILED', 'JWT refresh failed.', error);\n }\n}\n\nexport function getRenewalDelay(session: AuthSession, windowMs = 60_000): number {\n return Math.max(0, session.expiresAt - Date.now() - windowMs);\n}\n","import type { DeepLinkConfig, WalletId } from '../types';\n\nconst DEFAULT_DEEP_LINKS: Required<Pick<DeepLinkConfig, 'metamask' | 'okx' | 'phantom'>> = {\n metamask: 'https://metamask.app.link/dapp/',\n okx: 'okx://wallet/dapp/url?dappUrl=',\n phantom: 'https://phantom.app/ul/browse/',\n};\n\nexport function isMobileH5(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n}\n\nexport function resolveDappUrl(config?: DeepLinkConfig): string {\n if (config?.dappUrl) return config.dappUrl;\n if (typeof window === 'undefined') return '';\n return window.location.href;\n}\n\nexport function getWalletDeepLink(wallet: WalletId, targetUrl: string, config?: DeepLinkConfig): string {\n const encoded = encodeURIComponent(targetUrl);\n if (wallet === 'metamask') return `${config?.metamask ?? DEFAULT_DEEP_LINKS.metamask}${targetUrl.replace(/^https?:\\/\\//, '')}`;\n if (wallet === 'okx') return `${config?.okx ?? DEFAULT_DEEP_LINKS.okx}${encoded}`;\n return `${config?.phantom ?? DEFAULT_DEEP_LINKS.phantom}${encoded}?ref=${encoded}`;\n}\n","type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter<Events extends Record<string, unknown>> {\n private listeners = new Map<keyof Events, Set<Listener<Events[keyof Events]>>>();\n\n on<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): () => void {\n const listeners = this.listeners.get(event) ?? new Set();\n listeners.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, listeners);\n return () => this.off(event, listener);\n }\n\n off<Key extends keyof Events>(event: Key, listener: Listener<Events[Key]>): void {\n this.listeners.get(event)?.delete(listener as Listener<Events[keyof Events]>);\n }\n\n emit<Key extends keyof Events>(event: Key, payload: Events[Key]): void {\n this.listeners.get(event)?.forEach((listener) => listener(payload));\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import { WalletKitError } from '../types';\n\nexport function normalizeWalletError(error: unknown): WalletKitError {\n if (error instanceof WalletKitError) return error;\n\n const maybe = error as { code?: number | string; message?: string } | undefined;\n if (maybe?.code === 4001 || maybe?.code === 'ACTION_REJECTED') {\n return new WalletKitError('USER_REJECTED', maybe.message ?? 'User rejected wallet request.', error);\n }\n\n if (maybe?.message?.toLowerCase().includes('timeout')) {\n return new WalletKitError('CONNECT_TIMEOUT', maybe.message, error);\n }\n\n return new WalletKitError('UNKNOWN', maybe?.message ?? 'Unexpected wallet error.', error);\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timeout = setTimeout(() => reject(new WalletKitError('CONNECT_TIMEOUT', message)), timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n if (timeout) clearTimeout(timeout);\n });\n}\n","import { EventEmitter } from './eventEmitter';\nimport type { WalletEventMap, WalletState } from '../types';\n\nconst SYNC_EVENT = 'rainbow-wallet-kit:state';\n\nexport class WalletStateSync {\n private channel?: BroadcastChannel;\n private tabId = Math.random().toString(36).slice(2);\n\n constructor(\n private emitter: EventEmitter<WalletEventMap>,\n private storageKey: string,\n ) {\n if (typeof window === 'undefined') return;\n\n if ('BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(SYNC_EVENT);\n this.channel.onmessage = (event: MessageEvent<{ tabId: string; state: WalletState }>) => {\n if (event.data?.tabId !== this.tabId) {\n this.emitter.emit('state', event.data.state);\n }\n };\n }\n\n window.addEventListener('storage', this.handleStorage);\n }\n\n publish(state: WalletState): void {\n if (typeof window === 'undefined') return;\n const payload = { tabId: this.tabId, state };\n localStorage.setItem(this.storageKey, JSON.stringify(payload));\n this.channel?.postMessage(payload);\n }\n\n read(): WalletState | undefined {\n if (typeof window === 'undefined') return undefined;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return undefined;\n\n try {\n const parsed = JSON.parse(raw) as { state?: WalletState };\n return parsed.state;\n } catch {\n return undefined;\n }\n }\n\n destroy(): void {\n this.channel?.close();\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', this.handleStorage);\n }\n }\n\n private handleStorage = (event: StorageEvent) => {\n if (event.key !== this.storageKey || !event.newValue) return;\n try {\n const payload = JSON.parse(event.newValue) as { tabId: string; state: WalletState };\n if (payload.tabId !== this.tabId) {\n this.emitter.emit('state', payload.state);\n }\n } catch {\n // Ignore malformed cross-tab payloads from older package versions.\n }\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter, WalletId } from '../types';\nimport type { Eip1193Provider } from './providerTypes';\n\nfunction pickInjectedProvider(wallet: WalletId): Eip1193Provider | undefined {\n if (typeof window === 'undefined') return undefined;\n\n const injected = wallet === 'okx' ? window.okxwallet?.ethereum : window.ethereum;\n const providers = injected?.providers ?? window.ethereum?.providers;\n if (providers?.length) {\n const matched = providers.find((provider) => {\n if (wallet === 'metamask') return provider.isMetaMask && !provider.isOkxWallet;\n return provider.isOkxWallet;\n });\n if (matched) return matched;\n }\n\n if (wallet === 'metamask' && injected?.isMetaMask && !injected.isOkxWallet) return injected;\n if (wallet === 'okx' && (injected?.isOkxWallet || window.okxwallet?.ethereum)) return injected;\n return undefined;\n}\n\nfunction hexToNumber(hex?: string): number | undefined {\n if (!hex) return undefined;\n return Number.parseInt(hex, 16);\n}\n\nexport function createEvmAdapter(options: {\n id: Extract<WalletId, 'metamask' | 'okx'>;\n name: string;\n icon: string;\n deepLinks?: DeepLinkConfig;\n}): WalletAdapter {\n return {\n id: options.id,\n name: options.name,\n chainType: 'evm',\n icon: options.icon,\n installed: () => Boolean(pickInjectedProvider(options.id)),\n connect: async (): Promise<WalletAccount> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) {\n throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n }\n\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const chainId = await provider.request<string>({ method: 'eth_chainId' }).catch(() => undefined);\n const address = accounts[0];\n if (!address) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} did not return an address.`);\n\n return {\n address,\n chainType: 'evm',\n chainId: hexToNumber(chainId),\n };\n },\n signMessage: async (message: string, account: WalletAccount): Promise<string> => {\n const provider = pickInjectedProvider(options.id);\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', `${options.name} provider was not found.`);\n return provider.request<string>({\n method: 'personal_sign',\n params: [message, account.address],\n });\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink(options.id, targetUrl, options.deepLinks),\n };\n}\n","import { getWalletDeepLink } from '../core/deepLinks';\nimport { WalletKitError } from '../types';\nimport type { DeepLinkConfig, WalletAccount, WalletAdapter } from '../types';\nimport type { PhantomSolanaProvider } from './providerTypes';\n\nfunction getProvider(): PhantomSolanaProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.phantom?.solana?.isPhantom ? window.phantom.solana : undefined;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\nexport function createPhantomAdapter(deepLinks?: DeepLinkConfig): WalletAdapter {\n return {\n id: 'phantom',\n name: 'Phantom',\n chainType: 'solana',\n icon: 'P',\n installed: () => Boolean(getProvider()),\n connect: async (): Promise<WalletAccount> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const response = await provider.connect();\n const address = response.publicKey.toString();\n return {\n address,\n publicKey: address,\n chainType: 'solana',\n chainId: 'solana:mainnet',\n };\n },\n disconnect: async () => {\n await getProvider()?.disconnect?.();\n },\n signMessage: async (message: string): Promise<string> => {\n const provider = getProvider();\n if (!provider) throw new WalletKitError('PROVIDER_NOT_FOUND', 'Phantom provider was not found.');\n const encoded = new TextEncoder().encode(message);\n const { signature } = await provider.signMessage(encoded, 'utf8');\n return bytesToBase64(signature);\n },\n getDeepLink: (targetUrl: string) => getWalletDeepLink('phantom', targetUrl, deepLinks),\n };\n}\n","import type { DeepLinkConfig, WalletAdapter } from '../types';\nimport { createEvmAdapter } from './eip1193';\nimport { createPhantomAdapter } from './phantom';\n\nexport function createWalletAdapters(deepLinks?: DeepLinkConfig): WalletAdapter[] {\n return [\n createEvmAdapter({ id: 'metamask', name: 'MetaMask', icon: 'M', deepLinks }),\n createEvmAdapter({ id: 'okx', name: 'OKX Wallet', icon: 'O', deepLinks }),\n createPhantomAdapter(deepLinks),\n ];\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { authenticateWallet, getRenewalDelay, refreshJwtSession } from '../core/auth';\nimport { isMobileH5, resolveDappUrl } from '../core/deepLinks';\nimport { EventEmitter } from '../core/eventEmitter';\nimport { normalizeWalletError, withTimeout } from '../core/errors';\nimport { WalletStateSync } from '../core/storageSync';\nimport { createWalletAdapters } from '../wallets';\nimport type { WalletContextValue, WalletEventMap, WalletId, WalletProviderProps, WalletState } from '../types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_STORAGE_KEY = 'rainbow-wallet-kit:wallet-state';\n\nconst initialState: WalletState = {\n status: 'idle',\n updatedAt: Date.now(),\n};\n\nexport const WalletContext = createContext<WalletContextValue | undefined>(undefined);\n\nexport function WalletProvider({\n children,\n auth,\n deepLinks,\n connectTimeoutMs = DEFAULT_TIMEOUT_MS,\n storageKey = DEFAULT_STORAGE_KEY,\n initialWallet,\n autoConnect,\n}: WalletProviderProps) {\n const emitterRef = useRef(new EventEmitter<WalletEventMap>());\n const syncRef = useRef<WalletStateSync | null>(null);\n const [state, setState] = useState<WalletState>(initialState);\n const wallets = useMemo(() => createWalletAdapters(deepLinks), [deepLinks]);\n\n const publishState = useCallback((nextState: WalletState) => {\n setState(nextState);\n emitterRef.current.emit('state', nextState);\n syncRef.current?.publish(nextState);\n }, []);\n\n const connect = useCallback(\n async (walletId: WalletId) => {\n const wallet = wallets.find((item) => item.id === walletId);\n if (!wallet) return;\n\n if (!wallet.installed() && deepLinks?.enabled !== false && isMobileH5()) {\n window.location.href = wallet.getDeepLink(resolveDappUrl(deepLinks));\n return;\n }\n\n const connectingState: WalletState = {\n ...state,\n status: 'connecting',\n wallet: walletId,\n error: undefined,\n updatedAt: Date.now(),\n };\n publishState(connectingState);\n\n try {\n const account = await withTimeout(\n wallet.connect(),\n connectTimeoutMs,\n `${wallet.name} connection timed out.`,\n );\n const session = await authenticateWallet({\n auth,\n wallet: walletId,\n account,\n signMessage: (message) => wallet.signMessage(message, account),\n });\n publishState({\n status: 'connected',\n wallet: walletId,\n account,\n auth: session,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('accountChanged', account);\n } catch (error) {\n const normalized = normalizeWalletError(error);\n publishState({\n status: 'error',\n wallet: walletId,\n error: normalized,\n updatedAt: Date.now(),\n });\n emitterRef.current.emit('error', normalized);\n throw normalized;\n }\n },\n [auth, connectTimeoutMs, deepLinks, publishState, state, wallets],\n );\n\n const disconnect = useCallback(async () => {\n const wallet = wallets.find((item) => item.id === state.wallet);\n await wallet?.disconnect?.();\n const nextState: WalletState = {\n status: 'disconnected',\n updatedAt: Date.now(),\n };\n publishState(nextState);\n emitterRef.current.emit('disconnect', undefined);\n }, [publishState, state.wallet, wallets]);\n\n const refreshAuth = useCallback(async () => {\n const session = await refreshJwtSession({\n auth,\n session: state.auth,\n wallet: state.wallet,\n account: state.account,\n });\n if (session && state.status === 'connected') {\n publishState({\n ...state,\n auth: session,\n updatedAt: Date.now(),\n });\n }\n }, [auth, publishState, state]);\n\n useEffect(() => {\n const sync = new WalletStateSync(emitterRef.current, storageKey);\n syncRef.current = sync;\n const stored = sync.read();\n if (stored) setState(stored);\n\n const unsubscribe = emitterRef.current.on('state', (nextState) => {\n setState((current) => (nextState.updatedAt >= current.updatedAt ? nextState : current));\n });\n\n return () => {\n unsubscribe();\n sync.destroy();\n };\n }, [storageKey]);\n\n useEffect(() => {\n if (autoConnect && initialWallet) {\n void connect(initialWallet).catch(() => undefined);\n }\n }, [autoConnect, connect, initialWallet]);\n\n useEffect(() => {\n if (!state.auth || state.status !== 'connected') return;\n const delay = getRenewalDelay(state.auth, auth?.renewalWindowMs);\n const timer = window.setTimeout(() => {\n void refreshAuth().catch((error) => {\n const normalized = normalizeWalletError(error);\n publishState({ ...state, status: 'error', error: normalized, updatedAt: Date.now() });\n });\n }, delay);\n return () => window.clearTimeout(timer);\n }, [auth?.renewalWindowMs, publishState, refreshAuth, state]);\n\n const value = useMemo<WalletContextValue>(\n () => ({\n state,\n wallets,\n connect,\n disconnect,\n refreshAuth,\n }),\n [connect, disconnect, refreshAuth, state, wallets],\n );\n\n return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { WalletContext } from './WalletProvider';\n\nexport function useWallet() {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWallet must be used inside WalletProvider.');\n }\n return context;\n}\n","import { useState } from 'react';\nimport type { WalletId } from '../types';\nimport { useWallet } from './useWallet';\n\nexport interface ConnectWalletButtonProps {\n label?: string;\n className?: string;\n preferredWallets?: WalletId[];\n onError?: (error: unknown) => void;\n}\n\nexport function ConnectWalletButton({\n label = 'Connect Wallet',\n className = '',\n preferredWallets,\n onError,\n}: ConnectWalletButtonProps) {\n const { state, wallets, connect, disconnect } = useWallet();\n const [open, setOpen] = useState(false);\n const orderedWallets = preferredWallets?.length\n ? preferredWallets.flatMap((id) => wallets.filter((wallet) => wallet.id === id))\n : wallets;\n\n if (state.status === 'connected' && state.account) {\n return (\n <div className={`rwk-root ${className}`}>\n <button className=\"rwk-account\" type=\"button\" onClick={() => setOpen((value) => !value)}>\n <span className=\"rwk-status-dot\" />\n <span>{shortenAddress(state.account.address)}</span>\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Wallet account\">\n <div className=\"rwk-account-row\">\n <span>{state.wallet}</span>\n <strong>{shortenAddress(state.account.address)}</strong>\n </div>\n <button className=\"rwk-disconnect\" type=\"button\" onClick={() => void disconnect()}>\n Disconnect\n </button>\n </div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className={`rwk-root ${className}`}>\n <button\n className=\"rwk-connect\"\n type=\"button\"\n disabled={state.status === 'connecting'}\n onClick={() => setOpen((value) => !value)}\n >\n {state.status === 'connecting' ? 'Connecting...' : label}\n </button>\n {open ? (\n <div className=\"rwk-panel\" role=\"dialog\" aria-label=\"Connect wallet\">\n {orderedWallets.map((wallet) => (\n <button\n className=\"rwk-wallet\"\n key={wallet.id}\n type=\"button\"\n onClick={() => {\n void connect(wallet.id)\n .then(() => setOpen(false))\n .catch((error) => onError?.(error));\n }}\n >\n <span className=\"rwk-wallet-icon\">{wallet.icon}</span>\n <span>{wallet.name}</span>\n <small>{wallet.installed() ? 'Detected' : 'Open app'}</small>\n </button>\n ))}\n {state.error ? <p className=\"rwk-error\">{state.error.message}</p> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction shortenAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n"],"names":["WalletKitError","code","message","cause","__publicField","createNonceMessage","input","authenticateWallet","_a","nonce","signature","error","refreshJwtSession","getRenewalDelay","session","windowMs","DEFAULT_DEEP_LINKS","isMobileH5","resolveDappUrl","config","getWalletDeepLink","wallet","targetUrl","encoded","EventEmitter","event","listener","listeners","payload","normalizeWalletError","maybe","withTimeout","promise","timeoutMs","timeout","timeoutPromise","_","reject","SYNC_EVENT","WalletStateSync","emitter","storageKey","state","raw","pickInjectedProvider","injected","providers","_b","matched","provider","_c","hexToNumber","hex","createEvmAdapter","options","accounts","chainId","address","account","getProvider","bytesToBase64","bytes","binary","byte","createPhantomAdapter","deepLinks","createWalletAdapters","DEFAULT_TIMEOUT_MS","DEFAULT_STORAGE_KEY","initialState","WalletContext","createContext","WalletProvider","children","auth","connectTimeoutMs","initialWallet","autoConnect","emitterRef","useRef","syncRef","setState","useState","wallets","useMemo","publishState","useCallback","nextState","connect","walletId","item","connectingState","normalized","disconnect","refreshAuth","useEffect","sync","stored","unsubscribe","current","delay","timer","value","jsx","useWallet","context","useContext","ConnectWalletButton","label","className","preferredWallets","onError","open","setOpen","orderedWallets","id","jsxs","shortenAddress"],"mappings":"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"}
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .rwk-root{position:relative;display:inline-flex;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:#111827}.rwk-connect,.rwk-account,.rwk-disconnect,.rwk-wallet{border:0;font:inherit;cursor:pointer}.rwk-connect,.rwk-account{display:inline-flex;align-items:center;justify-content:center;min-height:42px;padding:0 16px;border-radius:8px;background:#111827;color:#fff;font-weight:700}.rwk-connect:disabled{cursor:wait;opacity:.68}.rwk-account{gap:8px;background:#f3f4f6;color:#111827;box-shadow:inset 0 0 0 1px #d1d5db}.rwk-status-dot{width:8px;height:8px;border-radius:50%;background:#10b981}.rwk-panel{position:absolute;z-index:40;top:calc(100% + 8px);right:0;width:min(320px,calc(100vw - 24px));padding:8px;border:1px solid #e5e7eb;border-radius:8px;background:#fff;box-shadow:0 18px 48px #0f172a2e}.rwk-wallet{display:grid;grid-template-columns:36px 1fr auto;align-items:center;width:100%;min-height:52px;gap:10px;padding:8px;border-radius:6px;background:transparent;color:#111827;text-align:left}.rwk-wallet:hover,.rwk-disconnect:hover{background:#f9fafb}.rwk-wallet-icon{display:grid;width:36px;height:36px;place-items:center;border-radius:8px;background:#eef2ff;color:#312e81;font-weight:800}.rwk-wallet small{color:#6b7280}.rwk-account-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 8px;text-transform:capitalize}.rwk-disconnect{width:100%;min-height:40px;border-radius:6px;background:transparent;color:#b91c1c;font-weight:700}.rwk-error{margin:8px;color:#b91c1c;font-size:13px}@media(max-width:520px){.rwk-root,.rwk-connect,.rwk-account{width:100%}.rwk-panel{left:0;right:auto;width:calc(100vw - 32px)}}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@qinzhehan/rainbow-wallet-kit",
3
+ "version": "0.1.0",
4
+ "description": "A RainbowKit-style wallet connect component with MetaMask, OKX Wallet, and Phantom support.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.ts",
10
+ "unpkg": "./dist/index.umd.js",
11
+ "jsdelivr": "./dist/index.umd.js",
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "sideEffects": [
17
+ "./dist/style.css"
18
+ ],
19
+ "publishConfig": {
20
+ "registry": "https://registry.npmjs.org",
21
+ "access": "public"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.mjs",
27
+ "require": "./dist/index.cjs",
28
+ "default": "./dist/index.umd.js"
29
+ },
30
+ "./style.css": "./dist/style.css"
31
+ },
32
+ "scripts": {
33
+ "clean": "rm -rf dist",
34
+ "build": "npm run clean && vite build",
35
+ "typecheck": "tsc --noEmit",
36
+ "prepack": "npm run build"
37
+ },
38
+ "peerDependencies": {
39
+ "react": ">=18.0.0",
40
+ "react-dom": ">=18.0.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/react": "^19.2.17",
44
+ "@types/react-dom": "^19.2.3",
45
+ "@vitejs/plugin-react": "^4.3.4",
46
+ "react": "^18.3.1",
47
+ "react-dom": "^18.3.1",
48
+ "typescript": "^5.7.2",
49
+ "vite": "^6.0.7",
50
+ "vite-plugin-dts": "^4.4.0"
51
+ }
52
+ }