From 8b31e5c54b87d1207225d12db2dc7e6fa0781307 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Mon, 5 Jan 2026 13:28:43 -0500 Subject: [PATCH] chore(init): Setup Makefile for build and test automation --- Makefile | 13 + _migrate/accounts.html | 1768 +++++++++++++++++++++++++++++ _migrate/activity.html | 882 +++++++++++++++ _migrate/asset.html | 1047 ++++++++++++++++++ _migrate/authorize.html | 719 ++++++++++++ _migrate/charts.js | 1082 ++++++++++++++++++ _migrate/connections.html | 860 +++++++++++++++ _migrate/dashboard.html | 2144 ++++++++++++++++++++++++++++++++++++ _migrate/demo.html | 654 +++++++++++ _migrate/device.html | 1310 ++++++++++++++++++++++ _migrate/login.html | 561 ++++++++++ _migrate/nfts.html | 850 ++++++++++++++ _migrate/register.html | 680 ++++++++++++ _migrate/service.html | 1338 ++++++++++++++++++++++ _migrate/settings.html | 1635 +++++++++++++++++++++++++++ _migrate/tokens.html | 1214 ++++++++++++++++++++ _migrate/transactions.html | 991 +++++++++++++++++ _migrate/welcome.html | 536 +++++++++ 18 files changed, 18284 insertions(+) create mode 100644 Makefile create mode 100644 _migrate/accounts.html create mode 100644 _migrate/activity.html create mode 100644 _migrate/asset.html create mode 100644 _migrate/authorize.html create mode 100644 _migrate/charts.js create mode 100644 _migrate/connections.html create mode 100644 _migrate/dashboard.html create mode 100644 _migrate/demo.html create mode 100644 _migrate/device.html create mode 100644 _migrate/login.html create mode 100644 _migrate/nfts.html create mode 100644 _migrate/register.html create mode 100644 _migrate/service.html create mode 100644 _migrate/settings.html create mode 100644 _migrate/tokens.html create mode 100644 _migrate/transactions.html create mode 100644 _migrate/welcome.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9e6bcef --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ + +all: gen start open + +gen: + @templ generate + +start: + @go run main.go + +open: + @open http://localhost:8080 + +.PHONY: gen start diff --git a/_migrate/accounts.html b/_migrate/accounts.html new file mode 100644 index 0000000..9771b27 --- /dev/null +++ b/_migrate/accounts.html @@ -0,0 +1,1768 @@ + + + + + + + Accounts - Sonr Motr Wallet + + + + + + + +
+ + +
+ + + + + + + + + + + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
1
+ Network +
+
+
+
2
+ Details +
+
+
+
3
+ Confirm +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + +
+
+ + +
+ + 1H + 1D + 1W + 1M + +
+
+ +
+ +
+
+
24h High
+
$2,412.50
+
+
+
24h Low
+
$2,298.20
+
+
+
24h Volume
+
$12.4B
+
+
+
Market Cap
+
$282.1B
+
+
+
+ + +
+
+ + + + diff --git a/_migrate/activity.html b/_migrate/activity.html new file mode 100644 index 0000000..bfa4257 --- /dev/null +++ b/_migrate/activity.html @@ -0,0 +1,882 @@ + + + + + + + Activity - Sonr Motr Wallet + + + + + +
+ + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + diff --git a/_migrate/asset.html b/_migrate/asset.html new file mode 100644 index 0000000..f58adbc --- /dev/null +++ b/_migrate/asset.html @@ -0,0 +1,1047 @@ + + + + + + + Ethereum (ETH) - Sonr Motr Wallet + + + + + + + +
+ + +
+ + + Back to Tokens + + + +
+
+ +
+ + +
+ Rank #2 + + + Ethereum + +
+
+
+ +
+
+ +
+
+ + +$75.32 (3.31%) + 24h +
+
+ 24h Low: $2,298.20 + 24h High: $2,412.50 +
+
+ +
+ + + Buy + + + + Sell + + + + Swap + + + + Send + +
+ + + + + + +
+
+ + + + + + + +
+
+
+ Market Cap + + + +
+
$282.1B
+
#2 by market cap
+
+ +
+
+ 24h Volume + + + +
+
$12.4B
+
4.4% of market cap
+
+ +
+
+ Circulating Supply + + + +
+
120.2M ETH
+
No max supply
+
+ +
+
+ All-Time High + + + +
+
$4,878.26
+
Nov 10, 2021 (-51.9%)
+
+ +
+
+ All-Time Low + + + +
+
$0.432
+
Oct 20, 2015 (+542,617%)
+
+ +
+
+ Fully Diluted Valuation + + + +
+
$282.1B
+
Same as market cap
+
+
+ + + +
+ + + 1D + 1W + 1M + 1Y + ALL + +
+
+
+ + +
+ + +
+ +
+ +
+

+ Ethereum is a decentralized, open-source blockchain platform that enables the creation of smart contracts and decentralized applications (dApps). Founded by Vitalik Buterin in 2015, Ethereum introduced programmable blockchain technology, allowing developers to build applications that run exactly as programmed without downtime, censorship, or third-party interference. +

+

+ ETH is the native cryptocurrency of the Ethereum network, used to pay for transaction fees (gas) and computational services. Following "The Merge" in September 2022, Ethereum transitioned from Proof-of-Work to Proof-of-Stake consensus, significantly reducing energy consumption by ~99.95%. +

+

+ As the leading smart contract platform, Ethereum hosts the majority of DeFi protocols, NFT marketplaces, and Layer 2 scaling solutions, making it the backbone of Web3 infrastructure. +

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArticleSentiment
+ Ethereum ETF Sees Record $500M Inflows as Institutional Interest Surges +
+ CoinDesk + + 2 hours ago +
+
+ + + Bullish + +
+ Vitalik Buterin Proposes New EIP for Account Abstraction Improvements +
+ The Block + + 5 hours ago +
+
+ + + Bullish + +
+ Ethereum Gas Fees Drop to Yearly Low Amid Layer 2 Adoption +
+ Decrypt + + 8 hours ago +
+
+ + + Bullish + +
+ DeFi TVL on Ethereum Reaches $50B Milestone +
+ DeFi Pulse + + 12 hours ago +
+
+ + + Bullish + +
+ SEC Delays Decision on Ethereum Options ETF Until Q2 +
+ Bloomberg + + 1 day ago +
+
+ + + Neutral + +
+ Ethereum Foundation Sells 100 ETH, Sparking Community Debate +
+ CryptoSlate + + 1 day ago +
+
+ + + Bearish + +
+ + +
+
+
+
+
+ + + + diff --git a/_migrate/authorize.html b/_migrate/authorize.html new file mode 100644 index 0000000..b40bdb9 --- /dev/null +++ b/_migrate/authorize.html @@ -0,0 +1,719 @@ + + + + + + + Allow Access - Sonr + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + + diff --git a/_migrate/charts.js b/_migrate/charts.js new file mode 100644 index 0000000..5fbf597 --- /dev/null +++ b/_migrate/charts.js @@ -0,0 +1,1082 @@ +/** + * RosenCharts - Vanilla JS/D3 Chart Components for wa-sink + * + * Migrated from React/TypeScript to browser-compatible vanilla JavaScript. + * Uses D3.js for data manipulation and SVG rendering. + * Styled with Web Awesome CSS variables. + * + * Charts included: + * 1. CandleChart - OHLC price history with zoom/crosshair + * 2. AreaChartStacked - Multi-series stacked area for total asset value + * 3. BubbleChart - Circle packing for market cap dominance + * 4. AreaChartSemiFilled - Line/area chart for individual asset performance + */ + +// ============================================================================= +// UTILITY FUNCTIONS +// ============================================================================= + +const RosenCharts = { + // Color mappings from Tailwind to Web Awesome CSS variables + colors: { + success: 'var(--wa-color-success)', + danger: 'var(--wa-color-danger)', + primary: 'var(--wa-color-primary)', + neutral400: 'var(--wa-color-neutral-400)', + neutral500: 'var(--wa-color-neutral-500)', + neutral600: 'var(--wa-color-neutral-600)', + surfaceAlt: 'var(--wa-color-surface-alt)', + surface: 'var(--wa-color-surface)', + // Chart-specific palette + fuchsia: { from: '#f0abfc', to: '#e879f9' }, + purple: { from: '#c4b5fd', to: '#a855f7' }, + blue: { from: '#93c5fd', to: '#3b82f6' }, + sky: { from: '#bae6fd', to: '#38bdf8' }, + orange: { from: '#fed7aa', to: '#fb923c' }, + yellow: { from: '#fef08a', to: '#facc15' }, + emerald: { from: '#6ee7b7', to: '#10b981' }, + red: { from: '#fca5a5', to: '#ef4444' } + }, + + // Format number with commas + formatNumber(value, decimals = 2) { + return new Intl.NumberFormat('en-US', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals + }).format(value); + }, + + // Format currency + formatCurrency(value) { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' + }).format(value); + }, + + // Check if desktop + isDesktop() { + return window.innerWidth > 1024; + }, + + // Create SVG element with proper namespace + createSVG(tag, attrs = {}) { + const el = document.createElementNS('http://www.w3.org/2000/svg', tag); + Object.entries(attrs).forEach(([key, value]) => { + el.setAttribute(key, value); + }); + return el; + }, + + // Create HTML element + createElement(tag, attrs = {}, children = []) { + const el = document.createElement(tag); + Object.entries(attrs).forEach(([key, value]) => { + if (key === 'style' && typeof value === 'object') { + Object.assign(el.style, value); + } else if (key === 'className') { + el.className = value; + } else if (key.startsWith('data')) { + el.setAttribute(key.replace(/([A-Z])/g, '-$1').toLowerCase(), value); + } else { + el.setAttribute(key, value); + } + }); + children.forEach(child => { + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else if (child) { + el.appendChild(child); + } + }); + return el; + } +}; + +// ============================================================================= +// 1. CANDLE CHART - OHLC Price History with Zoom and Crosshair +// ============================================================================= + +class CandleChart { + constructor(container, options = {}) { + this.container = typeof container === 'string' + ? document.querySelector(container) + : container; + + this.options = { + marginTop: 10, + marginRight: 60, + marginBottom: 56, + marginLeft: 30, + height: 288, // h-72 = 18rem = 288px + ...options + }; + + this.data = options.data || []; + this.zoomLevel = 1; + this.visibleRange = { start: 0, end: this.data.length - 1 }; + this.mousePosition = null; + this.hoverData = null; + + this.init(); + } + + init() { + this.container.innerHTML = ''; + this.container.style.position = 'relative'; + + // Create wrapper with @container for responsive queries + this.wrapper = RosenCharts.createElement('div', { + className: 'candle-chart-wrapper', + style: { position: 'relative' } + }); + + // Create OHLC Legend + this.legend = RosenCharts.createElement('div', { + className: 'candle-legend', + style: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: '8px', + padding: '4px 32px', + background: 'var(--wa-color-surface-alt)', + borderRadius: 'var(--wa-radius-s)', + fontSize: 'var(--wa-font-size-xs)' + } + }); + this.updateLegend(); + + // Create chart area + this.chartArea = RosenCharts.createElement('div', { + className: 'candle-chart-area', + style: { + position: 'relative', + height: `${this.options.height}px`, + width: '100%' + } + }); + + // Set CSS custom properties for margins + this.chartArea.style.setProperty('--marginTop', `${this.options.marginTop}px`); + this.chartArea.style.setProperty('--marginRight', `${this.options.marginRight}px`); + this.chartArea.style.setProperty('--marginBottom', `${this.options.marginBottom}px`); + this.chartArea.style.setProperty('--marginLeft', `${this.options.marginLeft}px`); + + this.wrapper.appendChild(this.legend); + this.wrapper.appendChild(this.chartArea); + this.container.appendChild(this.wrapper); + + this.render(); + this.attachEvents(); + } + + setData(data) { + this.data = data; + this.visibleRange = { start: 0, end: data.length - 1 }; + this.zoomLevel = 1; + this.render(); + } + + getVisibleData() { + return this.data.slice(this.visibleRange.start, this.visibleRange.end + 1); + } + + createScales() { + const visibleData = this.getVisibleData(); + + // X Scale - band scale for discrete candles + this.xScale = d3.scaleBand() + .domain(visibleData.map(d => d.date)) + .range([0, 100]) + .padding(0.3); + + // Y Scale - linear scale for price values + const yMin = d3.min(visibleData, d => d.low) * 0.995; + const yMax = d3.max(visibleData, d => d.high) * 1.005; + + this.yScale = d3.scaleLinear() + .domain([yMin, yMax]) + .range([100, 0]); + } + + updateLegend() { + const visibleData = this.getVisibleData(); + + if (this.hoverData) { + const changePercent = ((this.hoverData.close - this.hoverData.open) / this.hoverData.open * 100).toFixed(2); + const isPositive = this.hoverData.close > this.hoverData.open; + + this.legend.innerHTML = ` +
+ Zoom: ${this.zoomLevel.toFixed(1)}x | Showing ${visibleData.length} of ${this.data.length} candles +
+
+ O: ${this.hoverData.open.toFixed(2)} + H: ${this.hoverData.high.toFixed(2)} + L: ${this.hoverData.low.toFixed(2)} + C: ${this.hoverData.close.toFixed(2)} + + ${changePercent}% + +
+ `; + } else { + this.legend.innerHTML = ` +
Hover over chart to see OHLC data
+
+ `; + } + } + + render() { + this.createScales(); + const visibleData = this.getVisibleData(); + + // Clear and rebuild chart area + this.chartArea.innerHTML = ''; + + // Y-axis (right side) + const yAxisContainer = RosenCharts.createElement('div', { + style: { + position: 'absolute', + height: `calc(100% - ${this.options.marginTop}px - ${this.options.marginBottom}px)`, + transform: `translateY(${this.options.marginTop}px)`, + right: `calc(${this.options.marginRight}px - 1rem)`, + overflow: 'visible' + } + }); + + const yTicks = this.yScale.ticks(6); + yTicks.forEach(value => { + const label = RosenCharts.createElement('div', { + style: { + position: 'absolute', + right: '0%', + top: `${this.yScale(value)}%`, + transform: 'translateY(-50%)', + fontSize: 'var(--wa-font-size-xs)', + fontVariantNumeric: 'tabular-nums', + color: 'var(--wa-color-neutral-400)', + width: '100%', + textAlign: 'right' + } + }, [value.toFixed(2)]); + yAxisContainer.appendChild(label); + }); + + // Main chart container + const chartInner = RosenCharts.createElement('div', { + className: 'chart-inner', + style: { + position: 'absolute', + inset: 0, + height: `calc(100% - ${this.options.marginTop}px - ${this.options.marginBottom}px)`, + width: `calc(100% - ${this.options.marginLeft}px - ${this.options.marginRight}px)`, + transform: `translate(${this.options.marginLeft}px, ${this.options.marginTop}px)`, + overflow: 'visible' + } + }); + + // SVG for grid lines and wicks + const svg = RosenCharts.createSVG('svg', { + viewBox: '0 0 100 100', + preserveAspectRatio: 'none', + style: 'overflow: visible; width: 100%; height: 100%;' + }); + + // Grid lines + yTicks.forEach(value => { + const line = RosenCharts.createSVG('line', { + x1: 0, + x2: 100, + y1: this.yScale(value), + y2: this.yScale(value), + stroke: 'var(--wa-color-neutral-200)', + 'stroke-dasharray': '6,5', + 'stroke-width': 0.5, + 'vector-effect': 'non-scaling-stroke' + }); + svg.appendChild(line); + }); + + // Wicks (high-low lines) + visibleData.forEach(d => { + const barX = this.xScale(d.date) + this.xScale.bandwidth() / 2; + const line = RosenCharts.createSVG('line', { + x1: barX, + y1: this.yScale(d.high), + x2: barX, + y2: this.yScale(d.low), + stroke: 'var(--wa-color-neutral-300)', + 'stroke-width': 1, + 'vector-effect': 'non-scaling-stroke' + }); + svg.appendChild(line); + }); + + chartInner.appendChild(svg); + + // X-axis labels + const skipFactor = Math.max(1, Math.floor(RosenCharts.isDesktop() ? 12 : 24 / this.zoomLevel)); + visibleData.forEach((entry, i) => { + if (i % skipFactor !== 0) return; + + const xPos = this.xScale(entry.date) + this.xScale.bandwidth() / 2; + const date = new Date(entry.date); + const timeLabel = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + const dateLabel = `${date.getMonth() + 1}/${date.getDate()}`; + + const label = RosenCharts.createElement('div', { + style: { + position: 'absolute', + overflow: 'visible', + color: 'var(--wa-color-neutral-400)', + pointerEvents: 'none', + left: `${xPos}%`, + top: '100%', + transform: 'rotate(45deg) translateX(4px) translateY(8px)' + } + }); + + const text = RosenCharts.createElement('div', { + style: { + position: 'absolute', + fontSize: 'var(--wa-font-size-xs)', + transform: 'translateY(-50%)', + whiteSpace: 'nowrap' + } + }, [`${dateLabel} - `, RosenCharts.createElement('strong', {}, [timeLabel])]); + + label.appendChild(text); + chartInner.appendChild(label); + }); + + // Candle bodies (open-close bars) + visibleData.forEach(d => { + const barWidth = this.xScale.bandwidth(); + const barHeight = Math.abs(this.yScale(d.open) - this.yScale(d.close)); + const barX = this.xScale(d.date); + const barY = this.yScale(Math.max(d.open, d.close)); + const isUp = d.close > d.open; + + const bar = RosenCharts.createElement('div', { + style: { + position: 'absolute', + width: `${barWidth}%`, + height: `${barHeight}%`, + left: `${barX}%`, + top: `${barY}%`, + background: isUp + ? 'linear-gradient(to bottom, #6ee7b7, #10b981)' + : 'linear-gradient(to bottom, #fca5a5, #ef4444)', + borderRadius: '1px' + } + }); + chartInner.appendChild(bar); + }); + + // Crosshair container (will be updated on mouse move) + this.crosshairContainer = RosenCharts.createElement('div', { + className: 'crosshair-container', + style: { display: 'none' } + }); + chartInner.appendChild(this.crosshairContainer); + + this.chartArea.appendChild(yAxisContainer); + this.chartArea.appendChild(chartInner); + this.chartInner = chartInner; + } + + updateCrosshair() { + if (!this.mousePosition) { + this.crosshairContainer.style.display = 'none'; + return; + } + + this.crosshairContainer.style.display = 'block'; + this.crosshairContainer.innerHTML = ''; + + // Vertical line + const vLine = RosenCharts.createElement('div', { + style: { + position: 'absolute', + top: 0, + height: '100%', + width: '1px', + borderLeft: '1px dashed var(--wa-color-neutral-300)', + pointerEvents: 'none', + zIndex: 20, + left: `${this.mousePosition.x}%` + } + }); + + // Horizontal line + const hLine = RosenCharts.createElement('div', { + style: { + position: 'absolute', + left: 0, + width: '100%', + height: '1px', + borderTop: '1px dashed var(--wa-color-neutral-300)', + pointerEvents: 'none', + zIndex: 20, + top: `${this.mousePosition.y}%` + } + }); + + // Y-axis value label + const yValue = this.yScale.invert(this.mousePosition.y); + const yLabel = RosenCharts.createElement('div', { + style: { + position: 'absolute', + right: 0, + transform: 'translateX(4px) translateY(-50%)', + background: 'var(--wa-color-surface-alt)', + padding: '0 4px', + fontSize: 'var(--wa-font-size-xs)', + borderRadius: 'var(--wa-radius-s)', + pointerEvents: 'none', + zIndex: 20, + top: `${this.mousePosition.y}%` + } + }, [yValue.toFixed(2)]); + + this.crosshairContainer.appendChild(vLine); + this.crosshairContainer.appendChild(hLine); + this.crosshairContainer.appendChild(yLabel); + + // Date label at bottom + if (this.hoverData) { + const dateLabel = RosenCharts.createElement('div', { + style: { + position: 'absolute', + bottom: 0, + transform: 'translateY(24px) translateX(-50%)', + background: 'var(--wa-color-surface-alt)', + padding: '4px 8px', + fontSize: 'var(--wa-font-size-xs)', + borderRadius: 'var(--wa-radius-s)', + pointerEvents: 'none', + zIndex: 20, + fontWeight: 500, + left: `${this.mousePosition.x}%` + } + }, [this.hoverData.date]); + this.crosshairContainer.appendChild(dateLabel); + } + } + + attachEvents() { + // Mouse move for crosshair + this.chartArea.addEventListener('mousemove', (e) => { + const rect = this.chartInner.getBoundingClientRect(); + const x = ((e.clientX - rect.left) / rect.width) * 100; + const y = ((e.clientY - rect.top) / rect.height) * 100; + + this.mousePosition = { x, y }; + + // Find closest data point + const visibleData = this.getVisibleData(); + const xPos = (x / 100) * rect.width; + let closestIndex = 0; + let minDistance = Infinity; + + visibleData.forEach((d, i) => { + const barX = (this.xScale(d.date) / 100) * rect.width + + ((this.xScale.bandwidth() / 100) * rect.width) / 2; + const distance = Math.abs(barX - xPos); + if (distance < minDistance) { + minDistance = distance; + closestIndex = i; + } + }); + + this.hoverData = visibleData[closestIndex]; + this.updateLegend(); + this.updateCrosshair(); + }); + + // Mouse leave + this.chartArea.addEventListener('mouseleave', () => { + this.mousePosition = null; + this.hoverData = null; + this.updateLegend(); + this.updateCrosshair(); + }); + + // Wheel for zoom + this.chartArea.addEventListener('wheel', (e) => { + e.preventDefault(); + + const zoomIn = e.deltaY < 0; + const zoomFactor = 1.04; + + const newZoomLevel = zoomIn + ? Math.min(this.zoomLevel * zoomFactor, 20) + : Math.max(this.zoomLevel / zoomFactor, 1); + + const visibleCount = Math.max(5, Math.floor(this.data.length / newZoomLevel)); + const newEnd = this.data.length - 1; + const newStart = Math.max(0, newEnd - visibleCount + 1); + + this.zoomLevel = newZoomLevel; + this.visibleRange = { start: newStart, end: newEnd }; + + this.render(); + this.updateLegend(); + }, { passive: false }); + } +} + +// ============================================================================= +// 2. STACKED AREA CHART - Total Asset Value Over Time +// ============================================================================= + +class StackedAreaChart { + constructor(container, options = {}) { + this.container = typeof container === 'string' + ? document.querySelector(container) + : container; + + this.options = { + height: 256, // h-64 + colors: [ + { from: '#f5d0fe', to: '#e879f9', bg: '#e879f9' }, // fuchsia + { from: '#c4b5fd', to: '#a855f7', bg: '#a855f7' }, // purple + { from: '#bfdbfe', to: '#3b82f6', bg: '#3b82f6' }, // blue + { from: '#bae6fd', to: '#38bdf8', bg: '#38bdf8' }, // sky + { from: '#fed7aa', to: '#fb923c', bg: '#fb923c' } // orange + ], + ...options + }; + + this.data = options.data || []; + this.init(); + } + + init() { + this.container.innerHTML = ''; + this.container.style.position = 'relative'; + this.container.classList.add('group'); + + this.processData(); + this.render(); + } + + setData(data) { + this.data = data; + this.processData(); + this.render(); + } + + processData() { + if (!this.data.length) return; + + const parseDate = d3.utcParse('%Y-%m-%d'); + + // Get unique industries/categories + this.industries = Array.from(new Set(this.data.map(d => d.industry))); + + // Group by date + this.groupedData = Array.from( + d3.group(this.data, d => d.date), + ([date, values]) => { + const obj = { date: parseDate(date.split('T')[0]) }; + values.forEach(val => { + obj[val.industry] = val.unemployed || val.value || 0; + }); + return obj; + } + ); + + // Create stacked series + this.series = d3.stack() + .keys(this.industries)(this.groupedData); + } + + render() { + if (!this.series || !this.series.length) return; + + this.container.innerHTML = ''; + + // Legend + const legendContainer = RosenCharts.createElement('div', { + style: { + display: 'flex', + textAlign: 'center', + gap: '16px', + fontSize: 'var(--wa-font-size-xs)', + height: 'fit-content', + overflowX: 'auto', + padding: '0 40px', + marginBottom: '32px' + } + }); + + this.industries.slice().reverse().forEach((industry, i) => { + const colorIndex = this.industries.length - 1 - i; + const color = this.options.colors[colorIndex % this.options.colors.length]; + + const item = RosenCharts.createElement('div', { + style: { display: 'flex', gap: '6px', alignItems: 'center' } + }); + + const dot = RosenCharts.createElement('div', { + style: { + width: '4px', + height: '100%', + borderRadius: '9999px', + background: color.bg + } + }); + + item.appendChild(dot); + item.appendChild(document.createTextNode(industry)); + legendContainer.appendChild(item); + }); + + // Chart container + const chartContainer = RosenCharts.createElement('div', { + style: { + position: 'relative', + height: `${this.options.height}px`, + width: '100%' + } + }); + + // Scales + const xScale = d3.scaleUtc() + .domain(d3.extent(this.groupedData, d => d.date)) + .range([0, 100]); + + const yScale = d3.scaleLinear() + .domain([0, d3.max(this.series, d => d3.max(d, d => d[1])) || 0]) + .rangeRound([100, 0]); + + // Area generator + const area = d3.area() + .x(d => xScale(d.data.date)) + .y0(d => yScale(d[0])) + .y1(d => yScale(d[1])) + .curve(d3.curveMonotoneX); + + // SVG + const svg = RosenCharts.createSVG('svg', { + style: 'position: absolute; inset: 0; z-index: 10; height: 100%; width: 100%; overflow: visible;' + }); + + const innerSvg = RosenCharts.createSVG('svg', { + viewBox: '0 0 100 100', + preserveAspectRatio: 'none', + style: 'overflow: visible;' + }); + + // Gradients + const defs = RosenCharts.createSVG('defs'); + this.series.forEach((_, i) => { + const color = this.options.colors[i % this.options.colors.length]; + const gradient = RosenCharts.createSVG('linearGradient', { + id: `stacked-area-gradient-${i}`, + x1: 0, x2: 0.5, y1: 0.25, y2: 1 + }); + + const stop1 = RosenCharts.createSVG('stop', { + offset: '0%', 'stop-color': color.from + }); + const stop2 = RosenCharts.createSVG('stop', { + offset: '80%', 'stop-color': color.to + }); + + gradient.appendChild(stop1); + gradient.appendChild(stop2); + defs.appendChild(gradient); + }); + innerSvg.appendChild(defs); + + // Areas + this.series.forEach((layer, layerIndex) => { + const path = RosenCharts.createSVG('path', { + fill: `url(#stacked-area-gradient-${layerIndex})`, + d: area(layer), + stroke: '#ccc', + 'stroke-width': '0.05' + }); + innerSvg.appendChild(path); + }); + + svg.appendChild(innerSvg); + + // X-axis + const xAxisSvg = RosenCharts.createSVG('svg', { + style: ` + position: absolute; inset: 0; + height: 100%; width: 100%; + transform: translateY(-12px); + overflow: visible; z-index: 0; + opacity: 0; transition: opacity 0.3s; + `, + class: 'x-axis-svg' + }); + + this.series[0].forEach((day, i) => { + if (i % 2 === 0) return; + const date = day.data.date; + const text = RosenCharts.createSVG('text', { + x: `${xScale(date)}%`, + y: '100%', + 'text-anchor': i === 0 ? 'start' : i === this.series[0].length - 1 ? 'end' : 'middle', + fill: 'var(--wa-color-neutral-500)', + style: 'font-size: var(--wa-font-size-xs);' + }); + text.textContent = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); + xAxisSvg.appendChild(text); + }); + + // Y-axis + const yAxisSvg = RosenCharts.createSVG('svg', { + style: ` + position: absolute; inset: 0; + width: 100%; height: 100%; + transform: translateX(90%); + overflow: visible; z-index: 20; + pointer-events: none; + opacity: 0; transition: opacity 0.3s; + `, + class: 'y-axis-svg' + }); + + yScale.ticks(8).forEach((value, i) => { + if (i === 0) return; + const text = RosenCharts.createSVG('text', { + y: `${yScale(value)}%`, + 'alignment-baseline': 'middle', + 'text-anchor': 'start', + fill: 'var(--wa-color-neutral-600)', + style: 'font-size: var(--wa-font-size-xs);' + }); + text.textContent = value; + yAxisSvg.appendChild(text); + }); + + chartContainer.appendChild(svg); + chartContainer.appendChild(xAxisSvg); + chartContainer.appendChild(yAxisSvg); + + this.container.appendChild(legendContainer); + this.container.appendChild(chartContainer); + + // Hover effect for axes + this.container.addEventListener('mouseenter', () => { + chartContainer.querySelector('.x-axis-svg').style.opacity = '1'; + chartContainer.querySelector('.y-axis-svg').style.opacity = '1'; + }); + this.container.addEventListener('mouseleave', () => { + chartContainer.querySelector('.x-axis-svg').style.opacity = '0'; + chartContainer.querySelector('.y-axis-svg').style.opacity = '0'; + }); + } +} + +// ============================================================================= +// 3. BUBBLE CHART - Market Cap Dominance +// ============================================================================= + +class BubbleChart { + constructor(container, options = {}) { + this.container = typeof container === 'string' + ? document.querySelector(container) + : container; + + this.options = { + colors: ['#f472b6', '#8b5cf6', '#84cc16', '#38bdf8', '#fb923c'], + strokeWidth: 1, + ...options + }; + + this.data = options.data || []; + this.init(); + } + + init() { + this.container.innerHTML = ''; + this.render(); + } + + setData(data) { + this.data = data; + this.render(); + } + + render() { + if (!this.data.length) return; + + this.container.innerHTML = ''; + this.container.style.position = 'relative'; + this.container.style.width = '100%'; + this.container.style.aspectRatio = '1'; + this.container.style.maxWidth = '18rem'; + this.container.style.margin = '0 auto'; + + // Color scale by sector + const sectors = Array.from(new Set(this.data.map(d => d.sector))); + const color = d3.scaleOrdinal() + .domain(sectors) + .range(this.options.colors); + + // Pack layout + const pack = d3.pack() + .size([1000, 1000]) + .padding(12); + + // Compute hierarchy + const root = pack( + d3.hierarchy({ children: this.data }) + .sum(d => d.value) + ); + + // Create nodes + root.leaves().forEach(d => { + const x = d.x; + const y = d.y; + const r = d.r; + const fillColor = color(d.data.sector); + const name = d.data.name; + const value = d.data.value; + + const bubble = RosenCharts.createElement('div', { + style: { + position: 'absolute', + transform: 'translate(-50%, -50%)', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + left: `${(x / 1000) * 100}%`, + top: `${(y / 1000) * 100}%`, + width: `${((r * 2) / 1000) * 100}%`, + height: `${((r * 2) / 1000) * 100}%`, + borderRadius: '50%', + backgroundColor: fillColor, + border: `${this.options.strokeWidth}px solid rgba(255,255,255,0.2)`, + cursor: 'default' + }, + title: `${name}\n${d3.format(',d')(value)}` + }); + + if (value > 1000) { + const nameEl = RosenCharts.createElement('div', { + style: { + color: 'white', + textAlign: 'center', + whiteSpace: 'nowrap', + fontSize: `${r / 9}px`, + lineHeight: `${r / 7}px` + } + }, [name]); + + const valueEl = RosenCharts.createElement('div', { + style: { + color: 'white', + textAlign: 'center', + whiteSpace: 'nowrap', + opacity: 0.7, + fontSize: `${r / 10}px`, + lineHeight: `${r / 8}px` + } + }, [d3.format(',d')(value)]); + + bubble.appendChild(nameEl); + bubble.appendChild(valueEl); + } + + this.container.appendChild(bubble); + }); + } +} + +// ============================================================================= +// 4. SEMI-FILLED AREA CHART - Individual Asset Performance +// ============================================================================= + +class SemiFilledAreaChart { + constructor(container, options = {}) { + this.container = typeof container === 'string' + ? document.querySelector(container) + : container; + + this.options = { + height: 288, // h-72 + color: { + line: '#facc15', // yellow-400 + areaFrom: 'rgba(234, 179, 8, 0.2)', // yellow-500/20 + areaTo: 'rgba(234, 179, 8, 0.05)' // yellow-50/5 + }, + ...options + }; + + this.data = options.data || []; + this.init(); + } + + init() { + this.container.innerHTML = ''; + this.processData(); + this.render(); + } + + setData(data) { + this.data = data; + this.processData(); + this.render(); + } + + processData() { + // Convert date strings to Date objects + this.processedData = this.data.map(d => ({ + ...d, + date: typeof d.date === 'string' ? new Date(d.date) : d.date + })); + } + + render() { + if (!this.processedData || !this.processedData.length) return; + + this.container.innerHTML = ''; + this.container.style.position = 'relative'; + this.container.style.height = `${this.options.height}px`; + this.container.style.width = '100%'; + + const data = this.processedData; + + // Scales + const xScale = d3.scaleTime() + .domain([data[0].date, data[data.length - 1].date]) + .range([0, 100]); + + const yScale = d3.scaleLinear() + .domain([0, d3.max(data, d => d.value) || 0]) + .range([100, 0]); + + // Line generator + const line = d3.line() + .x(d => xScale(d.date)) + .y(d => yScale(d.value)) + .curve(d3.curveMonotoneX); + + // Area generator + const area = d3.area() + .x(d => xScale(d.date)) + .y0(yScale(0)) + .y1(d => yScale(d.value)) + .curve(d3.curveMonotoneX); + + // Chart inner container + const chartInner = RosenCharts.createElement('div', { + style: { + position: 'absolute', + inset: 0, + height: '100%', + width: '100%', + overflow: 'visible' + } + }); + + // SVG + const svg = RosenCharts.createSVG('svg', { + viewBox: '0 0 100 100', + preserveAspectRatio: 'none', + style: 'width: 100%; height: 100%; overflow: visible;' + }); + + // Gradient for area + const defs = RosenCharts.createSVG('defs'); + const gradient = RosenCharts.createSVG('linearGradient', { + id: 'semi-filled-gradient', + x1: 0, x2: 0, y1: 0, y2: 1 + }); + + const stop1 = RosenCharts.createSVG('stop', { + offset: '0%', + 'stop-color': this.options.color.areaFrom + }); + const stop2 = RosenCharts.createSVG('stop', { + offset: '100%', + 'stop-color': this.options.color.areaTo + }); + + gradient.appendChild(stop1); + gradient.appendChild(stop2); + defs.appendChild(gradient); + svg.appendChild(defs); + + // Area path + const areaPath = RosenCharts.createSVG('path', { + d: area(data), + fill: 'url(#semi-filled-gradient)' + }); + svg.appendChild(areaPath); + + // Line path + const linePath = RosenCharts.createSVG('path', { + d: line(data), + fill: 'none', + stroke: this.options.color.line, + 'stroke-width': '1.5', + 'vector-effect': 'non-scaling-stroke' + }); + svg.appendChild(linePath); + + chartInner.appendChild(svg); + + // X-axis labels + data.forEach((day, i) => { + if (i % 6 !== 0 || i === 0 || i >= data.length - 3) return; + + const label = RosenCharts.createElement('div', { + style: { + position: 'absolute', + left: `${xScale(day.date)}%`, + top: '90%', + fontSize: 'var(--wa-font-size-xs)', + color: 'var(--wa-color-neutral-500)', + transform: 'translateX(-50%)' + } + }, [day.date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })]); + + chartInner.appendChild(label); + }); + + this.container.appendChild(chartInner); + + // Y-axis labels + yScale.ticks(8).forEach((value, i) => { + if (i < 1) return; + + const label = RosenCharts.createElement('div', { + style: { + position: 'absolute', + top: `${yScale(value)}%`, + right: '3%', + fontSize: 'var(--wa-font-size-xs)', + fontVariantNumeric: 'tabular-nums', + color: 'var(--wa-color-neutral-400)', + transform: 'translateY(-50%)' + } + }, [value.toString()]); + + this.container.appendChild(label); + }); + } +} + +// ============================================================================= +// EXPORT FOR GLOBAL USE +// ============================================================================= + +// Make available globally +window.RosenCharts = RosenCharts; +window.CandleChart = CandleChart; +window.StackedAreaChart = StackedAreaChart; +window.BubbleChart = BubbleChart; +window.SemiFilledAreaChart = SemiFilledAreaChart; diff --git a/_migrate/connections.html b/_migrate/connections.html new file mode 100644 index 0000000..357863f --- /dev/null +++ b/_migrate/connections.html @@ -0,0 +1,860 @@ + + + + + + + Connections - Sonr Motr Wallet + + + + + +
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + +
+ + + + diff --git a/_migrate/dashboard.html b/_migrate/dashboard.html new file mode 100644 index 0000000..3b6f896 --- /dev/null +++ b/_migrate/dashboard.html @@ -0,0 +1,2144 @@ + + + + + + + Dashboard - Sonr Motr Wallet + + + + + + + +
+ +
+
+
+ + Sonr Wallet +
+ +
+ + + +
+ +
+ + + + Connections + + + + Devices + + + + Services + + + + Settings + + + + + Sign Out + +
+
+
+
+ + +
+
+
+ + + + Accounts + + + + Transactions + + + + Tokens + + + + NFTs + + + + Activity + + + +
+ +
+ + + + + + + + + + +
+ + +
+ +
+ + + + +
+ + + + Send + + + + Receive + + + + Swap + + + + + ETH + SNR + USDC + AVAX + + +
+ + + + +
+ +
+
+

Today

+ 3 transactions +
+ +
+
+ +
+
+
Received ETH
+
From: 0x742d...35Cb
+
+
+ + ETH +
+
+
+0.25 ETH
+
$586.25
+
+
+
2:34 PM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Swapped SNR → USDC
+
via Uniswap V3
+
+
+ + + +
+
+
500 SNR → 248.50 USDC
+
$248.50
+
+
+
11:22 AM
+ Confirmed +
+
+ + + + +
+
+
+ +
+
+

Yesterday

+ 2 transactions +
+ +
+
+ +
+
+
Sent SNR
+
To: sonr1k4m...9p3q
+
+
+ + SNR +
+
+
-500 SNR
+
$250.00
+
+
+
4:18 PM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Received AVAX
+
From: 0xaBcD...1234
+
+
+ + AVAX +
+
+
+10.00 AVAX
+
$281.50
+
+
+
9:45 AM
+ Confirmed +
+
+ + + + +
+
+
+ + +
+
+ + +
+ +
+ + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Asset NetworkPrice 24h Chart24h Change Holdings Value
+
+ + +
+
+ + + Ethereum + + +
+ + + +
+
+3.24% + + +
+ + + + + Swap + View Chart + +
+
+
+ + +
+
+ + + Sonr Mainnet + + +
+ + + +
+
+5.67% + + +
+ + + + + Swap + View Chart + +
+
+
+ + +
+
+ + + Ethereum + + +
+ + + +
+
0.00% + + +
+ + + + + Swap + View Chart + +
+
+
+ + +
+
+ + + Avalanche + + +
+ + + +
+
-2.18% + + +
+ + + + + Swap + View Chart + +
+
+
+
+ + +
+ +
+ + + + + + + + + +
+ + Bored Ape Yacht Club + Sonr Genesis + + + + Recently Added + Value: High to Low + Value: Low to High + Name A-Z + +
+ +
+
+
+ Bored Ape #4521 +
+ Listed +
+
+ + + + + + +
+
+
+
+ + Bored Ape Yacht Club +
+
Bored Ape #4521
+
+ Floor: 28.5 ETH + 32.0 ETH +
+
+
+ +
+
+ Sonr Genesis #001 +
+ Rare +
+
+ + + + + + +
+
+
+
+ + Sonr Genesis +
+
Sonr Genesis #001
+
+ Floor: 0.8 ETH + 2.5 ETH +
+
+
+ +
+
+ Sonr Genesis #042 +
+ + + + + + +
+
+
+
+ + Sonr Genesis +
+
Sonr Genesis #042
+
+ Floor: 0.8 ETH + 0.95 ETH +
+
+
+ +
+
+ Bored Ape #2187 +
+ + + + + + +
+
+
+
+ + Bored Ape Yacht Club +
+
Bored Ape #2187
+
+ Floor: 28.5 ETH + 30.2 ETH +
+
+
+
+
+
+ + +
+ +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_migrate/demo.html b/_migrate/demo.html new file mode 100644 index 0000000..810084e --- /dev/null +++ b/_migrate/demo.html @@ -0,0 +1,654 @@ + + + + + + + Auth Demo - Sonr Motr Wallet + + + + +
+
+
+ + +
+
+ +
+ + +
+
+ + + + + +
+
+ +
+
+
+
+
+
+
+
+
+ + auth.sonr.io/welcome +
+
+ +
+
420 × 600
+
+ +
+
+
+ +
+ + +
+ +
+ + + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ + +
+
+ +
+ +
+ +
+ + + Popup Window + Embedded Iframe + Redirect Flow + + + + + + + + + + + + + +
+
+
+
+ + + + + + diff --git a/_migrate/device.html b/_migrate/device.html new file mode 100644 index 0000000..52aba40 --- /dev/null +++ b/_migrate/device.html @@ -0,0 +1,1310 @@ + + + + + + + MacBook Pro - Sonr Motr Wallet + + + + + +
+ + +
+ + + Back to Devices + + + +
+
+
+ +
+
+ + +
+ + + Active + + + + Trusted + + + + Touch ID + +
+
+
+ +
+ Current Device +
+ Last used: Just now +
+
+ Added: Dec 15, 2024 + IP: 192.168.1.42 + Location: San Francisco, CA +
+
+ +
+ + + Rename + + + + Sign Out All Sessions + +
+ + + Remove Device + +
+
+ + +
+
+
+ +
+
Successful Logins
+
47
+
+ +
+
+ +
+
Failed Attempts
+
2
+
+ +
+
+ +
+
Active Sessions
+
3
+
+ +
+
+ +
+
Days Since Added
+
20
+
+ +
+
+ +
+
Total Sessions
+
156
+
+ +
+
+ +
+
Transactions Signed
+
89
+
+
+ + + + + +
+ Credential ID +
YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkw
+
+ +
+
+ +
+
Public Key Algorithm
+
ES256 (P-256)
+
+
+ +
+ +
+
Attestation Type
+
Packed (Apple)
+
+
+ +
+ +
+
User Verification
+
Required (UV)
+
+
+ +
+ +
+
Backup Status
+
Eligible, Synced
+
+
+ +
+ +
+
AAGUID
+
adce0002-35bc...
+
+
+ +
+ +
+
Registered
+
Dec 15, 2024
+
+
+
+ +
+ + + + Internal + + + + Hybrid + +
+
+ + +
+ + + + +
    +
  • +
    + +
    +
    +
    Successful login
    +
    Just now · 192.168.1.42
    +
    San Francisco, CA · Chrome 120
    +
    +
  • + +
  • +
    + +
    +
    +
    Transaction signed
    +
    2 hours ago · 192.168.1.42
    +
    Sent 0.5 ETH to 0x7a2b...4f9c
    +
    +
  • + +
  • +
    + +
    +
    +
    App connected
    +
    5 hours ago · 192.168.1.42
    +
    Granted access to Uniswap
    +
    +
  • + +
  • +
    + +
    +
    +
    Failed login attempt
    +
    Yesterday · 45.67.89.123
    +
    Unknown location · User verification failed
    +
    +
  • + +
  • +
    + +
    +
    +
    Successful login
    +
    Yesterday · 192.168.1.42
    +
    San Francisco, CA · Chrome 120
    +
    +
  • + +
  • +
    + +
    +
    +
    Session refreshed
    +
    2 days ago · 192.168.1.42
    +
    Token renewed for 7 days
    +
    +
  • +
+ + +
+ + + + + +
    +
  • +
    +
    + + Current Session +
    +
    Started just now · Expires in 7 days
    +
    192.168.1.42 · San Francisco, CA
    +
    +
  • + +
  • +
    +
    + + Chrome Extension +
    +
    Started 2 days ago · Expires in 5 days
    +
    192.168.1.42 · San Francisco, CA
    +
    + + Revoke + +
  • + +
  • +
    +
    + + API Access +
    +
    Started 5 days ago · Expires in 2 days
    +
    192.168.1.42 · San Francisco, CA
    +
    + + Revoke + +
  • +
+ + + + +
+
+ + + +
+ +
+ +
+
+
92
+
Security Score
+
+ +
+ +
+
+ + + + +
+
+
+
+ + + +
+ +
+ +
+ + + + + + + + + + diff --git a/_migrate/login.html b/_migrate/login.html new file mode 100644 index 0000000..40859aa --- /dev/null +++ b/_migrate/login.html @@ -0,0 +1,561 @@ + + + + + + + Sign In - Sonr + + + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + Create Account + +
+
+
+
+ + + + diff --git a/_migrate/nfts.html b/_migrate/nfts.html new file mode 100644 index 0000000..cac917b --- /dev/null +++ b/_migrate/nfts.html @@ -0,0 +1,850 @@ + + + + + + + NFTs - Sonr Motr Wallet + + + + + +
+ + +
+ + + + + + + + + + +
+ + All NFTs + Listed + Unlisted + + + + Bored Ape Yacht Club + Azuki + Sonr Genesis + Art Blocks Curated + + + + Recently Added + Value: High to Low + Value: Low to High + Name A-Z + + +
+ + + + + + +
+
+ +
+
+
+ Bored Ape #4521 +
+ Listed +
+
+ + + + + + +
+
+
+
+ + Bored Ape Yacht Club +
+
Bored Ape #4521
+
+ Floor: 28.5 ETH + 32.0 ETH +
+
+
+ +
+
+ Azuki #8234 +
+ + + + + + +
+
+
+
+ + Azuki +
+
Azuki #8234
+
+ Floor: 8.2 ETH + 9.5 ETH +
+
+
+ +
+
+ Sonr Genesis #001 +
+ Rare +
+
+ + + + + + +
+
+
+
+ + Sonr Genesis +
+
Sonr Genesis #001
+
+ Floor: 0.8 ETH + 2.5 ETH +
+
+
+ +
+
+ Sonr Genesis #042 +
+ + + + + + +
+
+
+
+ + Sonr Genesis +
+
Sonr Genesis #042
+
+ Floor: 0.8 ETH + 0.95 ETH +
+
+
+ +
+
+ Art Blocks #7821 +
+ + + + + + +
+
+
+
+ Art Blocks Curated +
+
Chromie Squiggle #7821
+
+ Floor: 1.2 ETH + 1.8 ETH +
+
+
+ +
+
+ Bored Ape #2187 +
+ + + + + + +
+
+
+
+ + Bored Ape Yacht Club +
+
Bored Ape #2187
+
+ Floor: 28.5 ETH + 30.2 ETH +
+
+
+ +
+
+ Azuki #5102 +
+ + + + + + +
+
+
+
+ + Azuki +
+
Azuki #5102
+
+ Floor: 8.2 ETH + 8.5 ETH +
+
+
+ +
+
+ Sonr Genesis #128 +
+ + + + + + +
+
+
+
+ + Sonr Genesis +
+
Sonr Genesis #128
+
+ Floor: 0.8 ETH + 0.85 ETH +
+
+
+
+
+
+
+
+ + + + diff --git a/_migrate/register.html b/_migrate/register.html new file mode 100644 index 0000000..9b4395d --- /dev/null +++ b/_migrate/register.html @@ -0,0 +1,680 @@ + + + + + + + Create Account - Sonr + + + + + +
+ +
+
+
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + Sign In +
+
+
+
+ + + + diff --git a/_migrate/service.html b/_migrate/service.html new file mode 100644 index 0000000..d45b8ca --- /dev/null +++ b/_migrate/service.html @@ -0,0 +1,1338 @@ + + + + + + + Uniswap - Sonr Motr Wallet + + + + + +
+ + +
+ + + Back to Connections + + + +
+
+ +
+ + +
+ + + Verified + + + + Active + + + + DeFi + +
+

+ Uniswap is a decentralized exchange protocol that allows users to swap ERC-20 tokens without intermediaries. Trade, earn, and build on the leading decentralized crypto trading protocol. +

+
+
+ +
+ Connected +
+ Connected: Dec 20, 2024 + Last used: 2 hours ago + Expires: Never +
+
+ +
+ + + Visit Site + + + + Refresh Token + +
+ + + Disconnect + +
+
+ + +
+
+
+ +
+
Active Sessions
+
3
+
+ +
+
+ +
+
Signatures (30d)
+
47
+
+ + +12% vs last month +
+
+ +
+
+ +
+
TX Approved
+
89
+
+ +
+
+ +
+
TX Rejected
+
3
+
+ +
+
+ +
+
Permissions
+
4 / 6
+
+ +
+
+ +
+
Data Requests
+
234
+
+
+ + +
+ + + + +
    +
  • +
    +
    + View Profile + Required +
    + openid profile +

    Access your public profile information including display name and avatar.

    +
    Used 45 times · Last used 2 hours ago
    +
    + +
  • + +
  • +
    +
    + View Wallet Balance + Required +
    + wallet:read +

    View your wallet balances and transaction history.

    +
    Used 189 times · Last used 2 hours ago
    +
    + +
  • + +
  • +
    +
    + Request Signatures + Optional +
    + wallet:sign +

    Request message signatures for authentication and verification.

    +
    Used 47 times · Last used 5 hours ago
    +
    + +
  • + +
  • +
    +
    + Submit Transactions + Optional +
    + wallet:transact +

    Request approval to submit transactions on your behalf. Each transaction requires explicit approval.

    +
    Used 92 times · Last used 1 day ago
    +
    + +
  • + +
  • +
    +
    + View NFTs + Optional +
    + wallet:nfts:read +

    View your NFT collection and metadata.

    +
    Never used
    +
    + +
  • + +
  • +
    +
    + Notifications + Optional +
    + notifications +

    Send you notifications about swaps, price alerts, and governance proposals.

    +
    Never used
    +
    + +
  • +
+ +
+
+ + + +
+ +
+ +
+ Client ID +
uniswap_0x7a2b4c9d8e3f1a5b6c7d8e9f0a1b2c3d
+
+ +
+
+ Token Type + Bearer +
+
+ Issued At + Dec 20, 2024 +
+
+ Expires + Never (Refresh Token) +
+
+ Granted Scopes + 4 of 6 +
+
+ + + + + + + + +
+
+ + + + + + + All + Auth + Signatures + Transactions + + +
    +
  • +
    + +
    +
    +
    Session started
    +
    2 hours ago · 192.168.1.42 · San Francisco, CA
    +
    Chrome 120 on macOS
    +
    + Active +
  • + +
  • +
    + +
    +
    +
    Message signed
    +
    2 hours ago · 192.168.1.42
    +
    Signed login message for Uniswap
    +
    + Success +
  • + +
  • +
    + +
    +
    +
    Swap executed
    +
    5 hours ago · 192.168.1.42
    +
    + Swapped 0.5 ETH → 1,245.32 USDC +
    + 0x7a2b4c9d...8e3f1a5b +
    +
    + Confirmed +
  • + +
  • +
    + +
    +
    +
    Balance checked
    +
    5 hours ago · 192.168.1.42
    +
    Read wallet balances for swap interface
    +
    +
  • + +
  • +
    + +
    +
    +
    Swap executed
    +
    1 day ago · 192.168.1.42
    +
    + Swapped 100 USDC → 0.042 ETH +
    + 0x9c8d7e6f...2a1b0c9d +
    +
    + Confirmed +
  • + +
  • +
    + +
    +
    +
    Transaction rejected
    +
    2 days ago · 192.168.1.42
    +
    User declined swap request: 1 ETH → USDT
    +
    + Rejected +
  • + +
  • +
    + +
    +
    +
    Permit signature
    +
    3 days ago · 192.168.1.42
    +
    Signed EIP-2612 permit for USDC spending
    +
    + Success +
  • + +
  • +
    + +
    +
    +
    App connected
    +
    Dec 20, 2024 · 192.168.1.42 · San Francisco, CA
    +
    Initial connection with 4 permissions granted
    +
    + Connected +
  • +
+ + +
+ + + +
+ +
+ +
+
+
45
+
Profile Reads
+
+
+
189
+
Balance Checks
+
+
+
56
+
Transaction Reads
+
+
+
0
+
NFT Reads
+
+
+
47
+
Signature Requests
+
+
+
92
+
TX Requests
+
+
+ + + + +
+
+
+
+ + + + + + + + + + + + + + + + diff --git a/_migrate/settings.html b/_migrate/settings.html new file mode 100644 index 0000000..a4c2bb1 --- /dev/null +++ b/_migrate/settings.html @@ -0,0 +1,1635 @@ + + + + + + + Settings - Sonr Motr Wallet + + + + + +
+ + +
+ + +
+ + + + Profile + + + + Devices + + + + OAuth + + + + Notifications + + + + Emails + + + + Phone Numbers + + + + Developer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/_migrate/tokens.html b/_migrate/tokens.html new file mode 100644 index 0000000..fb9a75e --- /dev/null +++ b/_migrate/tokens.html @@ -0,0 +1,1214 @@ + + + + + + + Tokens - Sonr Motr Wallet + + + + + + + +
+ + +
+ + + + + +
+ + All Networks + Sonr Mainnet + Ethereum + Cosmos + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Asset + + Network + Price + + 24h Chart + 24h Change + + + Holdings + + + Value + +
+
+ + +
+
+ + + Ethereum + + + + +
+ + + +
+
+ + + +3.24% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Sonr Mainnet + + + + +
+ + + +
+
+ + + +5.67% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Ethereum + + + + +
+ + + +
+
+ + 0.00% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Avalanche + + + + +
+ + + +
+
+ + + -2.18% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Cosmos Hub + + + + +
+ + + +
+
+ + + +1.85% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Optimism + + + + +
+ + + +
+
+ + + -4.32% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+ + +
+
+ + + Polygon + + + + +
+ + + +
+
+ + + +2.91% + + + + + + +
+ + + + + + + + + Swap + View Chart + Explorer + + Hide Token + +
+
+
+
+
+
+ + +
+
+ + +
+ + 1H + 1D + 1W + 1M + 1Y + +
+
+ +
+ +
+
+
24h High
+
$2,412.50
+
+
+
24h Low
+
$2,298.20
+
+
+
24h Volume
+
$12.4B
+
+
+
Market Cap
+
$282.1B
+
+
+
+ + +
+ + + + diff --git a/_migrate/transactions.html b/_migrate/transactions.html new file mode 100644 index 0000000..553e264 --- /dev/null +++ b/_migrate/transactions.html @@ -0,0 +1,991 @@ + + + + + + + Transactions - Sonr Motr Wallet + + + + + +
+ + +
+ + + + + +
+ + + + Send + + + + Receive + + + + Swap + + + + Approve + + + + Contract + + + + + ETH + SNR + USDC + AVAX + + + + Main Wallet + Trading + Savings + + + + + + +
+ + + + +
+ +
+
+

Today

+ 3 transactions +
+ +
+
+ +
+
+
Received ETH
+
From: 0x742d...35Cb
+
+
+ + ETH +
+
+
+0.25 ETH
+
$586.25
+
+
+
2:34 PM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Swapped SNR → USDC
+
via Uniswap V3
+
+
+ + + +
+
+
500 SNR → 248.50 USDC
+
$248.50
+
+
+
11:22 AM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Approved USDC
+
Spender: Uniswap V3 Router
+
+
+ + USDC +
+
+
Unlimited
+
+
+
+
11:20 AM
+ Confirmed +
+
+ + + + +
+
+
+ +
+
+

Yesterday

+ 2 transactions +
+ +
+
+ +
+
+
Sent SNR
+
To: sonr1k4m...9p3q
+
+
+ + SNR +
+
+
-500 SNR
+
$250.00
+
+
+
4:18 PM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Received AVAX
+
From: 0xaBcD...1234
+
+
+ + AVAX +
+
+
+10.00 AVAX
+
$281.50
+
+
+
9:45 AM
+ Confirmed +
+
+ + + + +
+
+
+ +
+
+

January 1, 2026

+ 4 transactions +
+ +
+
+ +
+
+
Swapped ETH → USDC
+
via Uniswap V3
+
+
+ + + +
+
+
0.5 ETH → 1,172.50 USDC
+
$1,172.50
+
+
+
9:15 AM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Contract Interaction
+
Staking Contract: 0x5f3c...8a2b
+
+
+ + SNR +
+
+
-1,000 SNR
+
$500.00 staked
+
+
+
8:30 AM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Sent ETH
+
To: 0x9f8e...7d6c
+
+
+ + ETH +
+
+
-0.15 ETH
+
$351.85
+
+
+
7:22 AM
+ Confirmed +
+
+ + + + +
+
+ +
+
+ +
+
+
Received SNR
+
From: sonr1abc...xyz9 (Airdrop)
+
+
+ + SNR +
+
+
+2,500 SNR
+
$1,250.00
+
+
+
12:00 AM
+ Confirmed +
+
+ + + + +
+
+
+ +
+
+

December 30, 2025

+ 1 transaction +
+ +
+
+ +
+
+
Received AVAX
+
From: 0xfEdC...bA98
+
+
+ + AVAX +
+
+
+14.83 AVAX
+
$417.53
+
+
+
4:48 PM
+ Confirmed +
+
+ + + + +
+
+
+ + +
+
+
+
+ + + + diff --git a/_migrate/welcome.html b/_migrate/welcome.html new file mode 100644 index 0000000..89a6cdf --- /dev/null +++ b/_migrate/welcome.html @@ -0,0 +1,536 @@ + + + + + + + Welcome - Sonr Motr Wallet + + + + + +
+ +
+
+
+
1
+ Welcome +
+
+
+
2
+ Learn +
+
+
+
3
+ Get Started +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ + + +