Mobile users (<768px) now see a native app-style home page with:
- Green gradient header with avatar, greeting, language/wallet/notification
- Horizontal scrollable score cards (auth-aware: login prompt for guests)
- App grid sections (Finance, Governance, Social, Education) with 4-col layout
- Bottom tab bar (Home / Citizen / Referral)
- MobileShell wrapper for consistent mobile navigation across pages
BeCitizen page redesigned for mobile with full-viewport hero screen,
scroll-to-reveal content, and compact benefits/process cards.
New Identity page (/identity) with realistic Kurdistan Republic ID card
and passport design. Users can fill personal info, upload photo from
camera/gallery, and save to device (localStorage only).
Desktop layout completely untouched. i18n keys added for all 6 languages.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- x25519 ECDH + XChaCha20-Poly1305 encryption via @noble libs
- Key derivation from wallet signRaw, private key held in memory only
- Messaging pallet integration (registerEncryptionKey, sendMessage, inbox)
- Inbox polling every 12s, auto-decrypt when key unlocked
- ComposeDialog with recipient key validation and 512-byte limit
- Settings moved from grid to nav bar gear icon, PEZMessage takes its slot
- i18n translations for all 6 languages (en, tr, kmr, ckb, ar, fa)
P2P modules (TradeModal, p2p-fiat) use Sonner toast but the Sonner
Toaster component was not mounted in App.tsx. Only the shadcn Toaster
was rendered, causing all P2P toast.error/success calls to be invisible.
Replace all supabase.auth.getUser() calls with P2PIdentityContext that
resolves identity from on-chain citizen NFT or off-chain visa system.
- Add identityToUUID() in shared/lib/identity.ts (UUID v5 from citizen/visa number)
- Add P2PIdentityContext with citizen NFT detection and visa fallback
- Add p2p_visa migration for off-chain visa issuance
- Refactor p2p-fiat.ts: all functions now accept userId parameter
- Fix all P2P components to use useP2PIdentity() instead of useAuth()
- Update verify-deposit edge function: walletToUUID -> identityToUUID
- Add P2PLayout with identity gate (wallet/citizen/visa checks)
- Wrap all P2P routes with P2PLayout in App.tsx
Implemented complete presale system for PEZ token distribution:
Backend (Pallet):
- Created pallet-presale at /home/mamostehp/Pezkuwi-SDK/pezkuwi/pallets/presale/
- Accepts wUSDT (Asset ID 2) contributions
- Tracks all contributors and amounts
- Distributes PEZ (Asset ID 1) after 45-day period
- Conversion rate: 1 wUSDT = 100 PEZ
- Includes emergency pause/unpause functionality
- Runtime integration documentation provided
Frontend:
- Created Presale page with contribution form
- Live stats: time remaining, total raised, contributors count
- Real-time balance display and conversion calculator
- Progress bar showing fundraising goal ($1M target)
- Added route /presale and navigation under Trading menu
- Connected to PolkadotContext and WalletContext
Technical Details:
- wUSDT: 6 decimals (Asset ID 2)
- PEZ: 12 decimals (Asset ID 1)
- Duration: 648,000 blocks (45 days @ 6s blocks)
- Treasury: PalletId "py/prsal"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Frontend changes:
- Add ReferralHandler to App.tsx to capture ?ref= URL parameter
- Store referrer address in localStorage for KYC registration
- Improve DashboardContext error handling for Supabase
All referral functionality now complete:
- URL parameter capture and storage
- On-chain referral initiation via InviteUserModal
- Auto-confirmation via OnKycApproved hook
- DefaultReferrer fallback to QaziMuhammedAccount
- Real-time stats and event subscription
- Referral score calculation (0-500 points)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
## Problem
Frontend was showing 'connecting network' message on production (pezkuwichain.io) because:
1. WebSocket endpoint was hardcoded to localhost in App.tsx
2. DEFAULT_ENDPOINT in polkadot.ts was not reading environment variables
## Solution
### shared/blockchain/polkadot.ts
- Added getWebSocketEndpoint() function to read VITE_NETWORK and corresponding VITE_WS_ENDPOINT_* env vars
- Changed DEFAULT_ENDPOINT from hardcoded value to call getWebSocketEndpoint()
- Now correctly uses wss://ws.pezkuwichain.io in production
### web/src/App.tsx
- Removed hardcoded endpoint="ws://127.0.0.1:9944" prop from PolkadotProvider
- Now uses DEFAULT_ENDPOINT which reads from environment
### web/vite.config.ts
- Minor formatting improvements (no functional changes)
### CLAUDE_README_KRITIK.md (New file)
- Critical documentation for future Claude instances
- Documents VPS validator setup, bootnode configuration
- Strict warnings not to modify working blockchain
- Troubleshooting commands and procedures
- Frontend deployment steps
## Result
- Production site now correctly connects to wss://ws.pezkuwichain.io
- Environment-based configuration working as expected
- Local dev still uses ws://127.0.0.1:9944
## Files Changed
- shared/blockchain/polkadot.ts: Dynamic endpoint selection
- web/src/App.tsx: Remove hardcoded endpoint
- CLAUDE_README_KRITIK.md: Critical documentation (new)
Restructured the project to support multiple frontend applications:
- Move web app to web/ directory
- Create pezkuwi-sdk-ui/ for Polkadot SDK clone (planned)
- Create mobile/ directory for mobile app development
- Add shared/ directory with common utilities, types, and blockchain code
- Update README.md with comprehensive documentation
- Remove obsolete DKSweb/ directory
This monorepo structure enables better code sharing and organized
development across web, mobile, and SDK UI projects.