Technical Documentation
Technical Specifications
Complete technical details about the x4pay-core payment system implementation, including Bluetooth (BLE) protocol specifications, ESP32 memory management, payment verification process, and mobile app integration patterns.
Bluetooth (BLE) Protocol
Service & Characteristics
Service UUID:
6e400002-b5a3-f393-e0a9-e50e24dcca9e
TX Characteristic:
6e400003-b5a3-f393-e0a9-e50e24dcca9e
RX Characteristic:
6e400004-b5a3-f393-e0a9-e50e24dcca9e
Protocol: Nordic
UART Service (NUS)
Connection Parameters
MTU Size: 150
bytes (set in code)
Connection Interval:
7.5ms - 4000ms
Advertising Interval:
100ms
Range: ~10
meters (Class 2)
Data Transfer Protocol
1. Device Advertisement
ESP32 advertises with device name containing payment info:
Device Name Format: "x402-[DEVICE_NAME]"
Advertisement Data: Service UUID + Device Name
Scan Response: Additional device info if needed
2. Connection Handshake
APP:
Scans for devices with Nordic UART service UUID
APP:
Connects to device via GATT
APP:
Discovers services and characteristics
APP:
Subscribes to TX characteristic for notifications
ESP32:
Sends payment requirements JSON via TX
characteristic
3. Payment Requirements JSON
{
"network": "base-sepolia",
"payTo": "0xa78eD39F695615315458Bb066ac9a5F28Dfd65FE",
"maxAmountRequired": "1000000",
"logoURL": "https://example.com/logo.jpg",
"description": "Coffee machine payment",
"options": ["Espresso", "Americano", "Latte"],
"dynamicPricing": true,
"recurring": {
"enabled": true,
"intervalSeconds": 30
}
}
4. Payment Response
APP:
User selects options and confirms payment in
wallet
APP:
Signs transaction with private key
(PIN-protected)
APP:
Sends payment payload JSON via RX characteristic
5. Payment Payload JSON
{
"network": "base-sepolia",
"from": "0x742d35Cc6C3C0532925a3b8D345A2E5E0E2F",
"to": "0xa78eD39F695615315458Bb066ac9a5F28Dfd65FE",
"amount": "1500000",
"signature": "0x1c2b4d...",
"nonce": 42,
"selectedOptions": ["Latte"],
"timestamp": 1729814400
}
ESP32 Memory Management
Memory Usage
X402-Aurdino:
~15KB program memory
x4Pay-core:
~45KB program memory
RAM Usage: ~8KB
during operation
JSON Buffer: 2KB
allocated
Optimization Features
• Stack
monitoring with overflow detection
• Dynamic memory
allocation for JSON
• Automatic
garbage collection
• RTOS task
management
Multi-threading Architecture
x4Pay-core uses FreeRTOS tasks for concurrent operation:
Task Structure
BLE Task: Handles
Bluetooth connections (Priority 2)
Payment Task:
Processes payment verification (Priority 3)
Main Task: User
code execution (Priority 1)
Watchdog Task:
System monitoring (Priority 4)
Synchronization
• Mutex locks for
shared resources
• Queue-based
message passing
• Semaphore
signaling for events
• Atomic
operations for counters
Code Example: Task Creation
void X402Ble::begin() {
// Set active instance for worker callbacks
s_active = this;
NimBLEDevice::init(device_name_.c_str());
NimBLEDevice::setDeviceName(device_name_.c_str());
NimBLEDevice::setPower(ESP_PWR_LVL_P7);
NimBLEDevice::setSecurityAuth(false, false, false);
NimBLEDevice::setMTU(150);
// Start payment verification worker with large stack on core 1
PaymentVerifyWorker::begin(/*stackBytes=*/8192, /*prio=*/3, /*core=*/1);
pServer = NimBLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
pService = pServer->createService(SERVICE_UUID);
}
Mobile App Connection Process
React Native Implementation
1. BLE Manager: Uses
react-native-ble-plx library
2. Device Scanning:
Filters by Nordic UART service UUID
3. Auto-connect:
Connects to strongest signal device
4. Service Discovery:
Discovers payment service characteristics
5. Data Exchange:
Subscribes to notifications, sends payments
Key Code: Device Connection
// Scan for devices
const scanForDevices = () => {
bleManager.startDeviceScan(
[NORDIC_UART_SERVICE_UUID],
{ allowDuplicates: false },
(error, device) => {
if (device?.name?.startsWith('x402-')) {
bleManager.stopDeviceScan();
connectToDevice(device);
}
}
);
};
// Connect and setup
const connectToDevice = async (device) => {
const connected = await device.connect();
await connected.discoverAllServicesAndCharacteristics();
// Subscribe to TX characteristic for incoming data
connected.monitorCharacteristicForService(
NORDIC_UART_SERVICE_UUID,
TX_CHARACTERISTIC_UUID,
(error, characteristic) => {
const data = JSON.parse(base64Decode(characteristic.value));
handlePaymentRequirements(data);
}
);
};
Web App Implementation
1. Web Bluetooth API:
navigator.bluetooth in Chrome/Edge
2. Service Filter:
Requests access to Nordic UART service
3. GATT Connection:
Connects via Bluetooth GATT protocol
4. Characteristic Access:
Reads/writes to TX/RX characteristics
Key Code: Web Bluetooth
const connectToDevice = async () => {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['6e400002-b5a3-f393-e0a9-e50e24dcca9e'] }]
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService('6e400002-b5a3-f393-e0a9-e50e24dcca9e');
// Get characteristics
const txCharacteristic = await service.getCharacteristic('6e400003-b5a3-f393-e0a9-e50e24dcca9e');
const rxCharacteristic = await service.getCharacteristic('6e400004-b5a3-f393-e0a9-e50e24dcca9e');
// Listen for data from device
await txCharacteristic.startNotifications();
txCharacteristic.addEventListener('characteristicvaluechanged', (event) => {
const data = new TextDecoder().decode(event.target.value);
handlePaymentRequirements(JSON.parse(data));
});
};
Security & Privacy
Mobile App Security
• Private keys
encrypted with PIN
• Biometric
authentication support
• Secure element
storage (Android)
• Transaction
signing happens locally
ESP32 Security
• No private keys
stored on device
• Payment
verification via external API
• WiFi
credentials in encrypted flash
• Bluetooth (BLE)
pairing not required
Data Privacy
• No personal
information stored on ESP32
• Payment amounts and
addresses are public (blockchain)
• Bluetooth (BLE)
connections are not logged
• Device can operate
without internet (offline mode)
Supported Blockchain Networks
Mainnet Networks
• Base (base)
• Polygon
(polygon)
• Avalanche
(avalanche)
• IoTeX (iotex)
• Sei (sei)
• Peaq (peaq)
Testnet Networks
• Base Sepolia
(base-sepolia)
• Polygon Mumbai
(polygon-mumbai)
• Avalanche Fuji
(avalanche-fuji)
• IoTeX Testnet
(iotex-testnet)
Token Support
• USDC (primary)
• Native gas tokens
• Custom ERC-20
tokens
• Micro-amounts
(1 wei precision)
Performance Metrics
Connection Times
BLE Discovery: 1-3
seconds
GATT Connection:
0.5-2 seconds
Service Discovery:
0.5-1 seconds
Total Connect Time:
2-6 seconds
Payment Processing
Data Transfer:
100-500ms
API Verification:
2-10 seconds
Blockchain Confirm:
5-60 seconds
Total Payment:
10-70 seconds
Throughput Limits
Concurrent Connections:
1 per ESP32 (BLE limitation)
Payments per Hour:
~60 (limited by API rate limits)
Data Rate: ~10KB/s
over Bluetooth (BLE)
Range: 10 meters
line-of-sight