@lumen-dapps-kit/web3 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AddressDisplay.tsx","../src/components/WalletPill.tsx","../src/components/NetworkStatus.tsx","../src/components/ChainSelector.tsx","../src/components/GasIndicator.tsx","../src/components/TxStatus.tsx","../src/components/AmountDisplay.tsx"],"names":["useState","useCallback","jsx","cn","jsxs","Fragment","PulseDot"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useCallback, useState } from 'react';\nimport { cn } from '@lumen-dapps-kit/ui';\nimport { truncateAddress } from '../utils';\n\nexport interface AddressDisplayProps {\n /** Raw address. */\n address: string;\n /** Optional ENS / display name override. */\n name?: string;\n /** Show a small chain symbol after the address. */\n chainSymbol?: string;\n /** Enable click-to-copy. Defaults true. */\n copyable?: boolean;\n /** Surface treatment. */\n variant?: 'pill' | 'inline';\n /** Truncation params. */\n head?: number;\n tail?: number;\n className?: string;\n}\n\n/**\n * AddressDisplay — wallet address with optional name resolution, chain\n * label, and click-to-copy. Chain-agnostic — you resolve ENS/name yourself\n * (e.g. via wagmi's useEnsName) and pass it as `name`.\n */\nexport const AddressDisplay = ({\n address,\n name,\n chainSymbol,\n copyable = true,\n variant = 'pill',\n head = 4,\n tail = 4,\n className,\n}: AddressDisplayProps) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n if (!copyable || !address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {\n /* noop */\n }\n }, [address, copyable]);\n\n const label = name || truncateAddress(address, { head, tail });\n\n if (variant === 'inline') {\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!copyable}\n className={cn(\n 'mono text-[11px] text-ink-900 hover:text-white transition-colors',\n className\n )}\n title={address}\n >\n {copied ? 'COPIED' : label}\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!copyable}\n title={address}\n className={cn(\n 'flex items-center gap-2 px-3 h-8 hairline mono text-[11px] transition-colors',\n copyable && 'hover:bg-white/5',\n className\n )}\n >\n <span className=\"w-1.5 h-1.5 bg-white\" aria-hidden=\"true\" />\n <span className=\"text-ink-900\">{copied ? 'COPIED' : label}</span>\n {chainSymbol && (\n <>\n <span className=\"text-ink-700\">·</span>\n <span className=\"text-ink-700\">{chainSymbol}</span>\n </>\n )}\n </button>\n );\n};\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { cn, Button } from '@lumen-dapps-kit/ui';\nimport { truncateAddress } from '../utils';\n\nexport interface WalletPillProps {\n /** Address — undefined renders the connect CTA. */\n address?: string;\n /** Display name (ENS, etc). */\n name?: string;\n /** Active chain symbol shown after the address. */\n chainSymbol?: string;\n onConnect?: () => void;\n /** When provided, the pill becomes a click target (opens an account drawer, etc).\n * When omitted, the pill defaults to click-to-copy. */\n onClick?: () => void;\n /** Loading state during connect/reconnect handshake. */\n pending?: boolean;\n className?: string;\n}\n\n/**\n * WalletPill — top-right wallet affordance. Renders a CONNECT button when\n * disconnected; a pill with truncated address (+ optional ENS, chain symbol)\n * when connected. Wallet-library agnostic — pass state in via props.\n */\nexport const WalletPill = ({\n address,\n name,\n chainSymbol,\n onConnect,\n onClick,\n pending,\n className,\n}: WalletPillProps) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {\n /* noop */\n }\n }, [address]);\n\n if (!address) {\n return (\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onConnect}\n disabled={pending}\n className={cn(className)}\n >\n {pending ? 'CONNECTING…' : 'CONNECT WALLET'}\n </Button>\n );\n }\n\n const handleClick = onClick ?? handleCopy;\n const label = copied ? 'COPIED' : name || truncateAddress(address);\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n title={address}\n className={cn(\n 'flex items-center gap-2 px-3 h-8 hairline mono text-[11px] hover:bg-white/5 transition-colors',\n className\n )}\n >\n <span className=\"w-1.5 h-1.5 bg-white\" aria-hidden=\"true\" />\n <span className=\"text-ink-900\">{label}</span>\n {chainSymbol && (\n <>\n <span className=\"text-ink-700\">·</span>\n <span className=\"text-ink-700\">{chainSymbol}</span>\n </>\n )}\n </button>\n );\n};\n","'use client';\n\nimport { cn, PulseDot } from '@lumen-dapps-kit/ui';\n\nexport interface NetworkStatusProps {\n /** \"online\" | \"degraded\" | \"offline\" */\n state?: 'online' | 'degraded' | 'offline';\n /** Latency in ms, rendered as \"42ms\". */\n latencyMs?: number;\n /** Optional override label (\"NET ONLINE\", \"RPC DOWN\", etc). */\n label?: string;\n className?: string;\n}\n\nconst TONE = {\n online: { dot: 'ok' as const, txt: 'NET ONLINE' },\n degraded: { dot: 'warn' as const, txt: 'NET DEGRADED' },\n offline: { dot: 'err' as const, txt: 'NET OFFLINE' },\n};\n\n/**\n * NetworkStatus — the pulsing network-state pill from the header. Pairs\n * with RPC health checks or a wagmi `useBlockNumber` watcher.\n */\nexport const NetworkStatus = ({\n state = 'online',\n latencyMs,\n label,\n className,\n}: NetworkStatusProps) => {\n const tone = TONE[state];\n return (\n <div\n className={cn(\n 'flex items-center gap-2 px-3 h-8 hairline mono text-[11px] text-ink-800',\n className\n )}\n >\n <PulseDot tone={tone.dot} />\n <span>{label ?? tone.txt}</span>\n {typeof latencyMs === 'number' && (\n <>\n <span className=\"text-ink-600\">·</span>\n <span className=\"text-ink-700\">{Math.round(latencyMs)}ms</span>\n </>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { useState } from 'react';\nimport { cn } from '@lumen-dapps-kit/ui';\nimport type { ChainBrief } from '../utils';\n\nexport interface ChainSelectorProps {\n chains: ChainBrief[];\n /** Selected chain id. */\n value: ChainBrief['id'];\n onChange?: (id: ChainBrief['id']) => void;\n className?: string;\n}\n\n/**\n * ChainSelector — a minimal dropdown for switching active networks. Pure\n * controlled component — pair with wagmi's `useSwitchChain` for execution.\n *\n * For dApps that need testnet/mainnet groupings, sort the `chains` prop\n * upstream (testnets last) — this component renders them in input order.\n */\nexport const ChainSelector = ({\n chains,\n value,\n onChange,\n className,\n}: ChainSelectorProps) => {\n const [open, setOpen] = useState(false);\n const active = chains.find((c) => c.id === value) ?? chains[0];\n\n if (!active) return null;\n\n return (\n <div className={cn('relative', className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n className=\"flex items-center gap-2 px-3 h-8 hairline mono text-[11px] hover:bg-white/5\"\n >\n <span\n className=\"w-1.5 h-1.5\"\n style={{ backgroundColor: active.color ?? '#ffffff' }}\n aria-hidden=\"true\"\n />\n <span className=\"text-ink-900\">{active.symbol}</span>\n <span className=\"text-ink-700\">·</span>\n <span className=\"text-ink-700 text-[10.5px]\">{active.name}</span>\n {active.testnet && (\n <span className=\"text-signal-warn ml-1\">TESTNET</span>\n )}\n </button>\n\n {open && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n <div\n role=\"listbox\"\n className=\"absolute right-0 mt-1 min-w-[240px] glass z-50 p-1\"\n >\n {chains.map((c) => {\n const selected = c.id === value;\n return (\n <button\n key={c.id}\n role=\"option\"\n aria-selected={selected}\n type=\"button\"\n onClick={() => {\n onChange?.(c.id);\n setOpen(false);\n }}\n className={cn(\n 'w-full flex items-center gap-2 px-3 h-8 mono text-[11px] text-left transition-colors',\n selected\n ? 'bg-white text-black'\n : 'text-ink-800 hover:bg-white/5'\n )}\n >\n <span\n className=\"w-1.5 h-1.5\"\n style={{ backgroundColor: c.color ?? '#ffffff' }}\n aria-hidden=\"true\"\n />\n <span\n className={cn(\n 'font-medium',\n selected ? 'text-black' : 'text-ink-900'\n )}\n >\n {c.symbol}\n </span>\n <span\n className={cn(\n selected ? 'text-black/60' : 'text-ink-700'\n )}\n >\n · {c.name}\n </span>\n {c.testnet && (\n <span\n className={cn(\n 'ml-auto',\n selected ? 'text-black' : 'text-signal-warn'\n )}\n >\n TESTNET\n </span>\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@lumen-dapps-kit/ui';\nimport { formatGwei } from '../utils';\n\nexport interface GasIndicatorProps {\n /** Current gas price in wei (bigint) or gwei (pass `unit=\"gwei\"`). */\n value: bigint | string | number;\n /** Unit of the `value` prop. Defaults wei. */\n unit?: 'wei' | 'gwei';\n /** Optional threshold gwei values that flip tone (warn/err). */\n thresholds?: { warn: number; err: number };\n /** Label prefix. Defaults \"GAS\". */\n label?: string;\n className?: string;\n}\n\n/**\n * GasIndicator — chip showing current gas price with tone shifts at warn/err\n * thresholds. Drop into the footer status bar or near tx CTAs.\n */\nexport const GasIndicator = ({\n value,\n unit = 'wei',\n thresholds = { warn: 40, err: 100 },\n label = 'GAS',\n className,\n}: GasIndicatorProps) => {\n const gwei =\n unit === 'gwei'\n ? Number(value)\n : Number(typeof value === 'bigint' ? value : BigInt(value)) / 1e9;\n\n const tone =\n gwei >= thresholds.err\n ? 'text-signal-err'\n : gwei >= thresholds.warn\n ? 'text-signal-warn'\n : 'text-signal-ok';\n\n return (\n <span className={cn('mono text-[10.5px] tracking-wider', className)}>\n <span className=\"text-ink-800\">{label}</span>{' '}\n <span className={cn('tabular-nums', tone)}>{formatGwei(value)} gwei</span>\n </span>\n );\n};\n","'use client';\n\nimport { cn, StatusBadge, PulseDot } from '@lumen-dapps-kit/ui';\nimport type { TxState } from '../utils';\nimport { truncateAddress } from '../utils';\n\nexport interface TxStatusProps {\n state: TxState;\n /** Tx hash, when available. */\n hash?: string;\n /** Optional block explorer URL to link to. */\n explorerUrl?: string;\n /** Optional title (defaults from state). */\n title?: string;\n /** Confirmations seen so far. */\n confirmations?: number;\n /** Required confirmations target. */\n requiredConfirmations?: number;\n className?: string;\n}\n\nconst COPY: Record<TxState, { title: string; tone: 'ok' | 'warn' | 'err' | 'data' | 'muted'; live: boolean }> = {\n idle: { title: 'IDLE', tone: 'muted', live: false },\n preparing: { title: 'PREPARING', tone: 'data', live: true },\n 'awaiting-signature': { title: 'AWAITING SIGNATURE', tone: 'warn', live: true },\n pending: { title: 'PENDING', tone: 'data', live: true },\n confirmed: { title: 'CONFIRMED', tone: 'ok', live: false },\n failed: { title: 'FAILED', tone: 'err', live: false },\n rejected: { title: 'REJECTED', tone: 'err', live: false },\n};\n\n/**\n * TxStatus — transaction lifecycle indicator. Six canonical states, each\n * with its own tone + dot/badge. Pair with wagmi's `useWaitForTransactionReceipt`\n * to drive state, or any custom signer flow.\n */\nexport const TxStatus = ({\n state,\n hash,\n explorerUrl,\n title,\n confirmations,\n requiredConfirmations,\n className,\n}: TxStatusProps) => {\n const copy = COPY[state];\n const label = title ?? copy.title;\n const link =\n hash && explorerUrl\n ? `${explorerUrl.replace(/\\/$/, '')}/tx/${hash}`\n : undefined;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-between hairline px-3 py-2.5',\n className\n )}\n >\n <div className=\"flex items-center gap-2.5\">\n {copy.live ? (\n <PulseDot tone={copy.tone === 'muted' ? 'data' : copy.tone} />\n ) : (\n <StatusBadge tone={copy.tone} dot>\n {''}\n </StatusBadge>\n )}\n <span className=\"mono text-[11px] text-ink-900\">{label}</span>\n </div>\n <div className=\"flex items-center gap-3 mono text-[10.5px] text-ink-700\">\n {typeof confirmations === 'number' &&\n typeof requiredConfirmations === 'number' && (\n <span className=\"tabular-nums\">\n {confirmations}/{requiredConfirmations} CONF\n </span>\n )}\n {hash && (\n link ? (\n <a\n href={link}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-ink-800 hover:text-white underline-offset-2 hover:underline\"\n >\n {truncateAddress(hash, { head: 6, tail: 4 })}\n </a>\n ) : (\n <span className=\"text-ink-800\">\n {truncateAddress(hash, { head: 6, tail: 4 })}\n </span>\n )\n )}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@lumen-dapps-kit/ui';\nimport { formatUnits } from '../utils';\n\nexport interface AmountDisplayProps {\n /** Raw value in base units (e.g. wei for ETH). */\n value: bigint | string;\n /** Decimal places of the token. */\n decimals: number;\n /** Symbol to render after the amount. */\n symbol?: string;\n /** Decimals to display. Defaults 4. */\n displayDecimals?: number;\n /** Size scale of the rendered amount. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** USD value (numeric). Renders as a caption beneath. */\n usd?: number;\n className?: string;\n}\n\nconst SIZE = {\n sm: 'text-[14px]',\n md: 'text-[18px]',\n lg: 'text-[24px]',\n xl: 'text-[40px]',\n} as const;\n\n/**\n * AmountDisplay — formats a base-unit bigint as a tabular-nums token amount\n * with optional USD caption. Use for balances, deposits, claim amounts.\n */\nexport const AmountDisplay = ({\n value,\n decimals,\n symbol,\n displayDecimals = 4,\n size = 'md',\n usd,\n className,\n}: AmountDisplayProps) => (\n <div className={cn('leading-none', className)}>\n <div className=\"flex items-baseline gap-1\">\n <span\n className={cn('font-semibold tabular-nums tracking-tight', SIZE[size])}\n >\n {formatUnits(value, decimals, displayDecimals)}\n </span>\n {symbol && (\n <span className=\"text-ink-700 text-[11px]\">{symbol}</span>\n )}\n </div>\n {typeof usd === 'number' && (\n <div className=\"mono text-[10.5px] text-ink-700 mt-1 tabular-nums\">\n ${usd.toLocaleString('en-US', { maximumFractionDigits: 2 })}\n </div>\n )}\n </div>\n);\n"]}
package/dist/utils.cjs ADDED
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/utils.ts
4
+ var truncateAddress = (address, { head = 4, tail = 4, sep = "\u2026" } = {}) => {
5
+ if (!address) return "";
6
+ const hasPrefix = address.startsWith("0x");
7
+ const prefix = hasPrefix ? "0x" : "";
8
+ const body = hasPrefix ? address.slice(2) : address;
9
+ if (body.length <= head + tail) return address;
10
+ return `${prefix}${body.slice(0, head)}${sep}${body.slice(-tail)}`;
11
+ };
12
+ var formatGwei = (wei, decimals = 2) => {
13
+ const n = typeof wei === "bigint" ? Number(wei) : Number(wei);
14
+ const gwei = n / 1e9;
15
+ return gwei.toLocaleString("en-US", {
16
+ minimumFractionDigits: 0,
17
+ maximumFractionDigits: decimals
18
+ });
19
+ };
20
+ var formatUnits = (value, decimals, displayDecimals = 4) => {
21
+ const v = typeof value === "string" ? BigInt(value) : value;
22
+ const negative = v < 0n;
23
+ const abs = negative ? -v : v;
24
+ const base = 10n ** BigInt(decimals);
25
+ const whole = abs / base;
26
+ const frac = abs % base;
27
+ const fracStr = frac.toString().padStart(decimals, "0").slice(0, displayDecimals).replace(/0+$/, "");
28
+ const out = fracStr ? `${whole}.${fracStr}` : `${whole}`;
29
+ return negative ? `-${out}` : out;
30
+ };
31
+
32
+ exports.formatGwei = formatGwei;
33
+ exports.formatUnits = formatUnits;
34
+ exports.truncateAddress = truncateAddress;
35
+ //# sourceMappingURL=utils.cjs.map
36
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"names":[],"mappings":";;;AAiBO,IAAM,eAAA,GAAkB,CAC7B,OAAA,EACA,EAAE,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,GAAA,GAAM,QAAA,EAAI,GAAyB,EAAC,KAC/C;AACX,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAY,IAAA,GAAO,EAAA;AAClC,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,GAAO,IAAA,EAAM,OAAO,OAAA;AACvC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA,CAAA;AAClE;AAKO,IAAM,UAAA,GAAa,CACxB,GAAA,EACA,QAAA,GAAW,CAAA,KACA;AACX,EAAA,MAAM,CAAA,GAAI,OAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,GAAG,CAAA,GAAI,OAAO,GAAG,CAAA;AAC5D,EAAA,MAAM,OAAO,CAAA,GAAI,GAAA;AACjB,EAAA,OAAO,IAAA,CAAK,eAAe,OAAA,EAAS;AAAA,IAClC,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA;AACH;AAMO,IAAM,WAAA,GAAc,CACzB,KAAA,EACA,QAAA,EACA,kBAAkB,CAAA,KACP;AACX,EAAA,MAAM,IAAI,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AACtD,EAAA,MAAM,WAAW,CAAA,GAAI,EAAA;AACrB,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,CAAC,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,GAAA,IAAO,MAAA,CAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,QAAQ,GAAA,GAAM,IAAA;AACpB,EAAA,MAAM,OAAO,GAAA,GAAM,IAAA;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,CACb,QAAA,EAAS,CACT,SAAS,QAAA,EAAU,GAAG,CAAA,CACtB,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,CACxB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACpB,EAAA,MAAM,GAAA,GAAM,UAAU,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,GAAK,GAAG,KAAK,CAAA,CAAA;AACtD,EAAA,OAAO,QAAA,GAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAChC","file":"utils.cjs","sourcesContent":["/**\n * Chain-agnostic formatting helpers. No wallet library required.\n */\n\nexport interface TruncateAddressOpts {\n /** Characters to show after the 0x prefix. */\n head?: number;\n /** Characters to show at the tail. */\n tail?: number;\n /** Separator. Defaults \"…\". */\n sep?: string;\n}\n\n/**\n * truncateAddress(\"0x7F3a2bC9...9C2e\") -> \"0x7F3a…9C2e\"\n * Works for EVM (0x-prefixed) and any other string-based addressing scheme.\n */\nexport const truncateAddress = (\n address: string,\n { head = 4, tail = 4, sep = '…' }: TruncateAddressOpts = {}\n): string => {\n if (!address) return '';\n const hasPrefix = address.startsWith('0x');\n const prefix = hasPrefix ? '0x' : '';\n const body = hasPrefix ? address.slice(2) : address;\n if (body.length <= head + tail) return address;\n return `${prefix}${body.slice(0, head)}${sep}${body.slice(-tail)}`;\n};\n\n/**\n * Format wei (bigint or string) as a gwei value with a fixed number of decimals.\n */\nexport const formatGwei = (\n wei: bigint | string | number,\n decimals = 2\n): string => {\n const n = typeof wei === 'bigint' ? Number(wei) : Number(wei);\n const gwei = n / 1e9;\n return gwei.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n });\n};\n\n/**\n * Format a base-unit bigint as a human-readable token amount.\n * formatUnits(1500000000000000000n, 18) -> \"1.5\"\n */\nexport const formatUnits = (\n value: bigint | string,\n decimals: number,\n displayDecimals = 4\n): string => {\n const v = typeof value === 'string' ? BigInt(value) : value;\n const negative = v < 0n;\n const abs = negative ? -v : v;\n const base = 10n ** BigInt(decimals);\n const whole = abs / base;\n const frac = abs % base;\n const fracStr = frac\n .toString()\n .padStart(decimals, '0')\n .slice(0, displayDecimals)\n .replace(/0+$/, '');\n const out = fracStr ? `${whole}.${fracStr}` : `${whole}`;\n return negative ? `-${out}` : out;\n};\n\nexport type TxState =\n | 'idle'\n | 'preparing'\n | 'awaiting-signature'\n | 'pending'\n | 'confirmed'\n | 'failed'\n | 'rejected';\n\nexport interface ChainBrief {\n id: number | string;\n /** Short label, e.g. \"ETH\", \"BASE\", \"SOL\". */\n symbol: string;\n /** Full name, e.g. \"Ethereum Mainnet\". */\n name: string;\n /** Optional accent color (hex). */\n color?: string;\n /** True if this chain is a testnet. */\n testnet?: boolean;\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Chain-agnostic formatting helpers. No wallet library required.
3
+ */
4
+ interface TruncateAddressOpts {
5
+ /** Characters to show after the 0x prefix. */
6
+ head?: number;
7
+ /** Characters to show at the tail. */
8
+ tail?: number;
9
+ /** Separator. Defaults "…". */
10
+ sep?: string;
11
+ }
12
+ /**
13
+ * truncateAddress("0x7F3a2bC9...9C2e") -> "0x7F3a…9C2e"
14
+ * Works for EVM (0x-prefixed) and any other string-based addressing scheme.
15
+ */
16
+ declare const truncateAddress: (address: string, { head, tail, sep }?: TruncateAddressOpts) => string;
17
+ /**
18
+ * Format wei (bigint or string) as a gwei value with a fixed number of decimals.
19
+ */
20
+ declare const formatGwei: (wei: bigint | string | number, decimals?: number) => string;
21
+ /**
22
+ * Format a base-unit bigint as a human-readable token amount.
23
+ * formatUnits(1500000000000000000n, 18) -> "1.5"
24
+ */
25
+ declare const formatUnits: (value: bigint | string, decimals: number, displayDecimals?: number) => string;
26
+ type TxState = 'idle' | 'preparing' | 'awaiting-signature' | 'pending' | 'confirmed' | 'failed' | 'rejected';
27
+ interface ChainBrief {
28
+ id: number | string;
29
+ /** Short label, e.g. "ETH", "BASE", "SOL". */
30
+ symbol: string;
31
+ /** Full name, e.g. "Ethereum Mainnet". */
32
+ name: string;
33
+ /** Optional accent color (hex). */
34
+ color?: string;
35
+ /** True if this chain is a testnet. */
36
+ testnet?: boolean;
37
+ }
38
+
39
+ export { type ChainBrief, type TruncateAddressOpts, type TxState, formatGwei, formatUnits, truncateAddress };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Chain-agnostic formatting helpers. No wallet library required.
3
+ */
4
+ interface TruncateAddressOpts {
5
+ /** Characters to show after the 0x prefix. */
6
+ head?: number;
7
+ /** Characters to show at the tail. */
8
+ tail?: number;
9
+ /** Separator. Defaults "…". */
10
+ sep?: string;
11
+ }
12
+ /**
13
+ * truncateAddress("0x7F3a2bC9...9C2e") -> "0x7F3a…9C2e"
14
+ * Works for EVM (0x-prefixed) and any other string-based addressing scheme.
15
+ */
16
+ declare const truncateAddress: (address: string, { head, tail, sep }?: TruncateAddressOpts) => string;
17
+ /**
18
+ * Format wei (bigint or string) as a gwei value with a fixed number of decimals.
19
+ */
20
+ declare const formatGwei: (wei: bigint | string | number, decimals?: number) => string;
21
+ /**
22
+ * Format a base-unit bigint as a human-readable token amount.
23
+ * formatUnits(1500000000000000000n, 18) -> "1.5"
24
+ */
25
+ declare const formatUnits: (value: bigint | string, decimals: number, displayDecimals?: number) => string;
26
+ type TxState = 'idle' | 'preparing' | 'awaiting-signature' | 'pending' | 'confirmed' | 'failed' | 'rejected';
27
+ interface ChainBrief {
28
+ id: number | string;
29
+ /** Short label, e.g. "ETH", "BASE", "SOL". */
30
+ symbol: string;
31
+ /** Full name, e.g. "Ethereum Mainnet". */
32
+ name: string;
33
+ /** Optional accent color (hex). */
34
+ color?: string;
35
+ /** True if this chain is a testnet. */
36
+ testnet?: boolean;
37
+ }
38
+
39
+ export { type ChainBrief, type TruncateAddressOpts, type TxState, formatGwei, formatUnits, truncateAddress };
package/dist/utils.js ADDED
@@ -0,0 +1,3 @@
1
+ export { formatGwei, formatUnits, truncateAddress } from './chunk-AMDZMZJO.js';
2
+ //# sourceMappingURL=utils.js.map
3
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils.js"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@lumen-dapps-kit/web3",
3
+ "version": "0.1.0",
4
+ "description": "Web3 components for lumen-dapps-kit — wallet, network, gas, tx primitives",
5
+ "license": "Apache-2.0",
6
+ "homepage": "https://github.com/Bayanichain/lumen-dapps-developer-kit#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/Bayanichain/lumen-dapps-developer-kit.git",
10
+ "directory": "packages/web3"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Bayanichain/lumen-dapps-developer-kit/issues"
14
+ },
15
+ "keywords": ["web3", "react", "wallet", "blockchain", "ui", "components"],
16
+ "type": "module",
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "require": "./dist/index.cjs"
25
+ },
26
+ "./utils": {
27
+ "types": "./dist/utils.d.ts",
28
+ "import": "./dist/utils.js",
29
+ "require": "./dist/utils.cjs"
30
+ }
31
+ },
32
+ "sideEffects": false,
33
+ "files": ["dist", "src"],
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "dev": "tsup --watch",
37
+ "typecheck": "tsc --noEmit"
38
+ },
39
+ "peerDependencies": {
40
+ "react": ">=18",
41
+ "react-dom": ">=18"
42
+ },
43
+ "peerDependenciesMeta": {
44
+ "wagmi": { "optional": true },
45
+ "viem": { "optional": true }
46
+ },
47
+ "dependencies": {
48
+ "@lumen-dapps-kit/ui": "workspace:*",
49
+ "clsx": "^2.1.1",
50
+ "tailwind-merge": "^2.5.5"
51
+ },
52
+ "devDependencies": {
53
+ "@types/react": "^18.3.12",
54
+ "@types/react-dom": "^18.3.1",
55
+ "react": "^18.3.1",
56
+ "react-dom": "^18.3.1",
57
+ "tsup": "^8.3.5",
58
+ "typescript": "^5.6.3"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ }
63
+ }
@@ -0,0 +1,92 @@
1
+ 'use client';
2
+
3
+ import { useCallback, useState } from 'react';
4
+ import { cn } from '@lumen-dapps-kit/ui';
5
+ import { truncateAddress } from '../utils';
6
+
7
+ export interface AddressDisplayProps {
8
+ /** Raw address. */
9
+ address: string;
10
+ /** Optional ENS / display name override. */
11
+ name?: string;
12
+ /** Show a small chain symbol after the address. */
13
+ chainSymbol?: string;
14
+ /** Enable click-to-copy. Defaults true. */
15
+ copyable?: boolean;
16
+ /** Surface treatment. */
17
+ variant?: 'pill' | 'inline';
18
+ /** Truncation params. */
19
+ head?: number;
20
+ tail?: number;
21
+ className?: string;
22
+ }
23
+
24
+ /**
25
+ * AddressDisplay — wallet address with optional name resolution, chain
26
+ * label, and click-to-copy. Chain-agnostic — you resolve ENS/name yourself
27
+ * (e.g. via wagmi's useEnsName) and pass it as `name`.
28
+ */
29
+ export const AddressDisplay = ({
30
+ address,
31
+ name,
32
+ chainSymbol,
33
+ copyable = true,
34
+ variant = 'pill',
35
+ head = 4,
36
+ tail = 4,
37
+ className,
38
+ }: AddressDisplayProps) => {
39
+ const [copied, setCopied] = useState(false);
40
+ const handleCopy = useCallback(async () => {
41
+ if (!copyable || !address) return;
42
+ try {
43
+ await navigator.clipboard.writeText(address);
44
+ setCopied(true);
45
+ setTimeout(() => setCopied(false), 1200);
46
+ } catch {
47
+ /* noop */
48
+ }
49
+ }, [address, copyable]);
50
+
51
+ const label = name || truncateAddress(address, { head, tail });
52
+
53
+ if (variant === 'inline') {
54
+ return (
55
+ <button
56
+ type="button"
57
+ onClick={handleCopy}
58
+ disabled={!copyable}
59
+ className={cn(
60
+ 'mono text-[11px] text-ink-900 hover:text-white transition-colors',
61
+ className
62
+ )}
63
+ title={address}
64
+ >
65
+ {copied ? 'COPIED' : label}
66
+ </button>
67
+ );
68
+ }
69
+
70
+ return (
71
+ <button
72
+ type="button"
73
+ onClick={handleCopy}
74
+ disabled={!copyable}
75
+ title={address}
76
+ className={cn(
77
+ 'flex items-center gap-2 px-3 h-8 hairline mono text-[11px] transition-colors',
78
+ copyable && 'hover:bg-white/5',
79
+ className
80
+ )}
81
+ >
82
+ <span className="w-1.5 h-1.5 bg-white" aria-hidden="true" />
83
+ <span className="text-ink-900">{copied ? 'COPIED' : label}</span>
84
+ {chainSymbol && (
85
+ <>
86
+ <span className="text-ink-700">·</span>
87
+ <span className="text-ink-700">{chainSymbol}</span>
88
+ </>
89
+ )}
90
+ </button>
91
+ );
92
+ };
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+
3
+ import { cn } from '@lumen-dapps-kit/ui';
4
+ import { formatUnits } from '../utils';
5
+
6
+ export interface AmountDisplayProps {
7
+ /** Raw value in base units (e.g. wei for ETH). */
8
+ value: bigint | string;
9
+ /** Decimal places of the token. */
10
+ decimals: number;
11
+ /** Symbol to render after the amount. */
12
+ symbol?: string;
13
+ /** Decimals to display. Defaults 4. */
14
+ displayDecimals?: number;
15
+ /** Size scale of the rendered amount. */
16
+ size?: 'sm' | 'md' | 'lg' | 'xl';
17
+ /** USD value (numeric). Renders as a caption beneath. */
18
+ usd?: number;
19
+ className?: string;
20
+ }
21
+
22
+ const SIZE = {
23
+ sm: 'text-[14px]',
24
+ md: 'text-[18px]',
25
+ lg: 'text-[24px]',
26
+ xl: 'text-[40px]',
27
+ } as const;
28
+
29
+ /**
30
+ * AmountDisplay — formats a base-unit bigint as a tabular-nums token amount
31
+ * with optional USD caption. Use for balances, deposits, claim amounts.
32
+ */
33
+ export const AmountDisplay = ({
34
+ value,
35
+ decimals,
36
+ symbol,
37
+ displayDecimals = 4,
38
+ size = 'md',
39
+ usd,
40
+ className,
41
+ }: AmountDisplayProps) => (
42
+ <div className={cn('leading-none', className)}>
43
+ <div className="flex items-baseline gap-1">
44
+ <span
45
+ className={cn('font-semibold tabular-nums tracking-tight', SIZE[size])}
46
+ >
47
+ {formatUnits(value, decimals, displayDecimals)}
48
+ </span>
49
+ {symbol && (
50
+ <span className="text-ink-700 text-[11px]">{symbol}</span>
51
+ )}
52
+ </div>
53
+ {typeof usd === 'number' && (
54
+ <div className="mono text-[10.5px] text-ink-700 mt-1 tabular-nums">
55
+ ${usd.toLocaleString('en-US', { maximumFractionDigits: 2 })}
56
+ </div>
57
+ )}
58
+ </div>
59
+ );
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { cn } from '@lumen-dapps-kit/ui';
5
+ import type { ChainBrief } from '../utils';
6
+
7
+ export interface ChainSelectorProps {
8
+ chains: ChainBrief[];
9
+ /** Selected chain id. */
10
+ value: ChainBrief['id'];
11
+ onChange?: (id: ChainBrief['id']) => void;
12
+ className?: string;
13
+ }
14
+
15
+ /**
16
+ * ChainSelector — a minimal dropdown for switching active networks. Pure
17
+ * controlled component — pair with wagmi's `useSwitchChain` for execution.
18
+ *
19
+ * For dApps that need testnet/mainnet groupings, sort the `chains` prop
20
+ * upstream (testnets last) — this component renders them in input order.
21
+ */
22
+ export const ChainSelector = ({
23
+ chains,
24
+ value,
25
+ onChange,
26
+ className,
27
+ }: ChainSelectorProps) => {
28
+ const [open, setOpen] = useState(false);
29
+ const active = chains.find((c) => c.id === value) ?? chains[0];
30
+
31
+ if (!active) return null;
32
+
33
+ return (
34
+ <div className={cn('relative', className)}>
35
+ <button
36
+ type="button"
37
+ onClick={() => setOpen((o) => !o)}
38
+ aria-haspopup="listbox"
39
+ aria-expanded={open}
40
+ className="flex items-center gap-2 px-3 h-8 hairline mono text-[11px] hover:bg-white/5"
41
+ >
42
+ <span
43
+ className="w-1.5 h-1.5"
44
+ style={{ backgroundColor: active.color ?? '#ffffff' }}
45
+ aria-hidden="true"
46
+ />
47
+ <span className="text-ink-900">{active.symbol}</span>
48
+ <span className="text-ink-700">·</span>
49
+ <span className="text-ink-700 text-[10.5px]">{active.name}</span>
50
+ {active.testnet && (
51
+ <span className="text-signal-warn ml-1">TESTNET</span>
52
+ )}
53
+ </button>
54
+
55
+ {open && (
56
+ <>
57
+ <div
58
+ className="fixed inset-0 z-40"
59
+ onClick={() => setOpen(false)}
60
+ aria-hidden="true"
61
+ />
62
+ <div
63
+ role="listbox"
64
+ className="absolute right-0 mt-1 min-w-[240px] glass z-50 p-1"
65
+ >
66
+ {chains.map((c) => {
67
+ const selected = c.id === value;
68
+ return (
69
+ <button
70
+ key={c.id}
71
+ role="option"
72
+ aria-selected={selected}
73
+ type="button"
74
+ onClick={() => {
75
+ onChange?.(c.id);
76
+ setOpen(false);
77
+ }}
78
+ className={cn(
79
+ 'w-full flex items-center gap-2 px-3 h-8 mono text-[11px] text-left transition-colors',
80
+ selected
81
+ ? 'bg-white text-black'
82
+ : 'text-ink-800 hover:bg-white/5'
83
+ )}
84
+ >
85
+ <span
86
+ className="w-1.5 h-1.5"
87
+ style={{ backgroundColor: c.color ?? '#ffffff' }}
88
+ aria-hidden="true"
89
+ />
90
+ <span
91
+ className={cn(
92
+ 'font-medium',
93
+ selected ? 'text-black' : 'text-ink-900'
94
+ )}
95
+ >
96
+ {c.symbol}
97
+ </span>
98
+ <span
99
+ className={cn(
100
+ selected ? 'text-black/60' : 'text-ink-700'
101
+ )}
102
+ >
103
+ · {c.name}
104
+ </span>
105
+ {c.testnet && (
106
+ <span
107
+ className={cn(
108
+ 'ml-auto',
109
+ selected ? 'text-black' : 'text-signal-warn'
110
+ )}
111
+ >
112
+ TESTNET
113
+ </span>
114
+ )}
115
+ </button>
116
+ );
117
+ })}
118
+ </div>
119
+ </>
120
+ )}
121
+ </div>
122
+ );
123
+ };
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+
3
+ import { cn } from '@lumen-dapps-kit/ui';
4
+ import { formatGwei } from '../utils';
5
+
6
+ export interface GasIndicatorProps {
7
+ /** Current gas price in wei (bigint) or gwei (pass `unit="gwei"`). */
8
+ value: bigint | string | number;
9
+ /** Unit of the `value` prop. Defaults wei. */
10
+ unit?: 'wei' | 'gwei';
11
+ /** Optional threshold gwei values that flip tone (warn/err). */
12
+ thresholds?: { warn: number; err: number };
13
+ /** Label prefix. Defaults "GAS". */
14
+ label?: string;
15
+ className?: string;
16
+ }
17
+
18
+ /**
19
+ * GasIndicator — chip showing current gas price with tone shifts at warn/err
20
+ * thresholds. Drop into the footer status bar or near tx CTAs.
21
+ */
22
+ export const GasIndicator = ({
23
+ value,
24
+ unit = 'wei',
25
+ thresholds = { warn: 40, err: 100 },
26
+ label = 'GAS',
27
+ className,
28
+ }: GasIndicatorProps) => {
29
+ const gwei =
30
+ unit === 'gwei'
31
+ ? Number(value)
32
+ : Number(typeof value === 'bigint' ? value : BigInt(value)) / 1e9;
33
+
34
+ const tone =
35
+ gwei >= thresholds.err
36
+ ? 'text-signal-err'
37
+ : gwei >= thresholds.warn
38
+ ? 'text-signal-warn'
39
+ : 'text-signal-ok';
40
+
41
+ return (
42
+ <span className={cn('mono text-[10.5px] tracking-wider', className)}>
43
+ <span className="text-ink-800">{label}</span>{' '}
44
+ <span className={cn('tabular-nums', tone)}>{formatGwei(value)} gwei</span>
45
+ </span>
46
+ );
47
+ };
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+
3
+ import { cn, PulseDot } from '@lumen-dapps-kit/ui';
4
+
5
+ export interface NetworkStatusProps {
6
+ /** "online" | "degraded" | "offline" */
7
+ state?: 'online' | 'degraded' | 'offline';
8
+ /** Latency in ms, rendered as "42ms". */
9
+ latencyMs?: number;
10
+ /** Optional override label ("NET ONLINE", "RPC DOWN", etc). */
11
+ label?: string;
12
+ className?: string;
13
+ }
14
+
15
+ const TONE = {
16
+ online: { dot: 'ok' as const, txt: 'NET ONLINE' },
17
+ degraded: { dot: 'warn' as const, txt: 'NET DEGRADED' },
18
+ offline: { dot: 'err' as const, txt: 'NET OFFLINE' },
19
+ };
20
+
21
+ /**
22
+ * NetworkStatus — the pulsing network-state pill from the header. Pairs
23
+ * with RPC health checks or a wagmi `useBlockNumber` watcher.
24
+ */
25
+ export const NetworkStatus = ({
26
+ state = 'online',
27
+ latencyMs,
28
+ label,
29
+ className,
30
+ }: NetworkStatusProps) => {
31
+ const tone = TONE[state];
32
+ return (
33
+ <div
34
+ className={cn(
35
+ 'flex items-center gap-2 px-3 h-8 hairline mono text-[11px] text-ink-800',
36
+ className
37
+ )}
38
+ >
39
+ <PulseDot tone={tone.dot} />
40
+ <span>{label ?? tone.txt}</span>
41
+ {typeof latencyMs === 'number' && (
42
+ <>
43
+ <span className="text-ink-600">·</span>
44
+ <span className="text-ink-700">{Math.round(latencyMs)}ms</span>
45
+ </>
46
+ )}
47
+ </div>
48
+ );
49
+ };