Revolutionary application enabling cryptocurrency transactions through Bluetooth Low Energy mesh networking - no internet required!
NONET is a groundbreaking mobile application that enables offline cryptocurrency transactions using Bluetooth Low Energy (BLE) mesh networking. When you don't have internet access, NONET creates a peer-to-peer network with nearby devices, allowing your transaction to "hop" through multiple devices until it reaches someone with internet connectivity who can broadcast it to the blockchain.
- π‘ Mesh Network Transactions - Send crypto without internet
- π Multi-Chain Support - Flow, Hedera, Ethereum compatible
- β‘ BLE Protocol - Custom packet fragmentation system
- π‘οΈ EIP-3009 Integration - Gasless meta-transactions
- π± Mobile-First - Native Android experience
- π¨ Modern UI - Clean, intuitive design system
Before you begin, ensure you have the following installed:
# Required
Node.js 18+
npm or yarn
Git
# For mobile development
Android Studio (for Android)-
Clone the Repository
git clone https://github.com/your-username/nonet.git cd nonet -
Navigate to App Directory
cd nonet-app-node -
Install Dependencies
npm install # or yarn install -
Install Expo CLI (if not already installed)
npm install -g @expo/cli
# Start the Expo development server
npm start
# This will open Expo DevTools in your browser
# Scan the QR code with Expo Go app (Android)
# Or press 'a' for Android emulator# Android (requires Android Studio/emulator)
npm run android
# Web (for testing UI components)
npm run web# Build for Android
npm run buildThe app requires the following permissions to function:
BLUETOOTH- For BLE communicationBLUETOOTH_ADMIN- For BLE advertisingACCESS_FINE_LOCATION- Required for BLE scanning on AndroidCAMERA- For QR code scanning
nonet/
βββ π± nonet-app-node/ # Main React Native application
β βββ app/ # Expo Router pages
β β βββ (tabs)/ # Tab-based navigation
β β β βββ index.tsx # Home/Dashboard
β β β βββ mesh.tsx # Mesh network status
β β β βββ show.tsx # Transaction history
β β βββ transaction.tsx # Send transaction
β β βββ wallet-demo.tsx # Wallet management
β βββ components/ # Reusable UI components
β β βββ NeoBrutalismComponents.tsx # UI components
β β βββ ui/ # Base UI components
β βββ contexts/ # React Context providers
β β βββ BleContext.tsx # π₯ Core BLE mesh networking
β β βββ WalletContext.tsx # Wallet state management
β βββ utils/ # Utility functions
β β βββ bleUtils.ts # π₯ BLE protocol implementation
β βββ lib/ # Business logic
β β βββ multiChainTransaction.ts # π₯ Blockchain integration
β βββ data/
β βββ chains.ts # Supported blockchain configs
βββ π contracts/ # Smart contracts
β βββ AuthAndMintToken.sol # EIP-3009 implementation
β βββ EIPThreeDoubleZeroNine.sol
βββ π scripts/ # Utility scripts
βββ π Documentation files
The heart of the mesh networking system. Manages:
- BLE device scanning and advertising
- Packet fragmentation and reassembly
- Message state tracking
- Internet gateway detection
Low-level BLE protocol implementation:
- Packet encoding/decoding
- Message fragmentation algorithm
- BLE advertising and scanning functions
Blockchain integration layer:
- Multi-chain transaction support
- EIP-3009 meta-transaction implementation
- Gas estimation and fee management
NONET implements a custom protocol over Bluetooth Low Energy (BLE) to create a mesh network:
Each BLE advertisement carries an 11-byte payload:
βββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββββββ
β ID β Total Chunksβ Chunk Index β Data β
β 1 byte β 1 byte β 1 byte β 8 bytes β
β (0-255) β (0-255) β (0-127) β (payload) β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββββββ
Large transactions are split into 8-byte chunks:
const HEADER_SIZE = 3;
const DATA_PER_CHUNK = 8;
const MAX_PAYLOAD_SIZE = HEADER_SIZE + DATA_PER_CHUNK;[Device A] --BLE--> [Device B] --BLE--> [Device C] --Internet--> [Blockchain]
(Sender) (Relay) (Gateway)
Each device maintains a master state of all active messages:
{
"packet.id": {
"ack_mode": false,
"is_complete": false,
"number_of_chunks": 10,
"data": {
1: "binary_chunk_1",
2: "binary_chunk_2",
...
}
}
}- Message Creation: Transaction data is encoded and fragmented
- Broadcasting: Fragments are advertised via BLE GAP
- Relay Propagation: Nearby devices receive and re-broadcast
- Gateway Processing: Internet-connected device submits to blockchain
- Acknowledgment: Response propagates back through mesh network
- Flow EVM Testnet (Chain ID: 545)
- Hedera Testnet (Chain ID: 296)
- Ethereum Sepolia (Chain ID: 11155111)
-
Hedera Testnet:
0xc6C46289fA5FdC583Cdb5e5C2900af4333423787 -
Flow Testnet:
0xc7a5Fd47Bc5725600E03124263056C897fb96b6c -
Hedera Testnet: 0xc7a5fd47bc5725600e03124263056c897fb96b6c
-
Flow Testnet: 0xc7a5Fd47Bc5725600E03124263056C897fb96b6c
-
Flow Mainnet: 0xD50C49eD8a5bd17d6C6E2522d75300d42A9746e5
-
Nonet tokens: https://evm.flowscan.io/token/0xD50C49eD8a5bd17d6C6E2522d75300d42A9746e5
NONET implements EIP-3009 for gasless transactions:
function transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
bytes calldata signature
) publicBenefits:
- Third parties can pay gas fees
- Transactions signed offline
- Replay attack protection via nonces
- Generate new wallet or import existing private key
- Wallet stored securely on device
- Enter recipient address (or scan QR code)
- Specify amount and select blockchain
- Sign transaction offline
- Transaction fragments broadcast via BLE
- Nearby NONET devices automatically relay
- Continues until reaching internet-connected device
- Gateway device submits to blockchain
- Confirmation propagates back through mesh
- Transaction appears in recipient's wallet
- ECDSA Signatures: All transactions cryptographically signed
- EIP-712: Structured data signing for meta-transactions
- Nonce Protection: Prevents replay attacks
- Packet Ordering: Fragments reassembled in correct sequence
- Duplicate Prevention: Each packet processed only once
- Data Integrity: Binary data verified during reassembly
- Non-Custodial: Users control private keys
- Local Storage: Keys encrypted on device
- Pseudonymous: Addresses don't reveal identity
The BLE protocol can be modified in utils/bleUtils.ts:
- Adjust packet structure
- Modify fragmentation algorithm
- Change advertising parameters
NONET uses a modern design system (components/NeoBrutalismComponents.tsx):
- Clean typography
- Intuitive color scheme
- Responsive design elements
npm test- Requires physical devices (BLE doesn't work in simulators)
- Test with multiple devices for mesh functionality
- Use Android devices for best BLE compatibility
- Use testnet tokens (available from faucets)
- Test transactions on supported networks
- Verify smart contract interactions
- Fork the Repository
- Create Feature Branch:
git checkout -b feature/amazing-feature - Commit Changes:
git commit -m 'Add amazing feature' - Push to Branch:
git push origin feature/amazing-feature - Open Pull Request
- Follow TypeScript best practices
- Maintain design consistency
- Test BLE functionality on physical devices
- Document new features thoroughly
- Advertisement Interval: 250ms per packet
- Data Rate: ~32 bytes/second per connection
- Range: ~100 meters in open space
- Concurrent Connections: Device-dependent
- Optimal Mesh Size: 5-20 nodes
- Maximum Message Size: ~1KB (127 chunks Γ 8 bytes)
- Typical Transaction: 3-5 chunks (~200-400 bytes)
- BLE mesh networking
- Multi-chain transactions
- EIP-3009 integration
- Modern UI design
- Advanced routing algorithms
- Network topology visualization
- Performance optimizations
- Additional blockchain support
- LoRa integration for extended range
- Layer 2 scaling solutions
- Cross-chain bridges
- Reputation system for relays
- Response authenticity verification (signature-based validation to prevent fake data injection)
- Ensure location permissions granted (Android)
- Check Bluetooth is enabled
- Test on physical devices (not simulators)
- Verify sufficient balance for gas fees
- Check network connectivity for gateway devices
- Ensure valid recipient addresses
- Clear app data and restart
- Check React Native logs:
npx react-native log-android - Verify all dependencies installed correctly
Enable debug logging in contexts/BleContext.tsx:
const DEBUG = true; // Set to true for verbose logging