Implementing Cryptocurrency Receiving in Mobile Wallet
The receive screen looks simple: show address, generate QR. In practice, there are subtle solutions—supporting multiple networks with one seed, correct URI format for QR, and UX preventing users from sending to the wrong network.
Address Display and Multi-Network Support
An HD wallet derives different addresses for different networks from one mnemonic per BIP-44. The Ethereum address (m/44'/60'/0'/0/0) is the same for Ethereum, Polygon, BNB Chain—one hex address. But for Bitcoin (m/44'/0'/0'/0/0) and Solana (m/44'/501'/0'/0'), addresses differ.
Users must explicitly see which network they're receiving on: "Receive ETH / ERC-20 (Ethereum)," "Receive BNB (BNB Chain)." One UI mistake—and funds land in an unsupported network or burn entirely.
QR Code: URI Formats by Standard
For Bitcoin—BIP-21: bitcoin:1A2B3C...?amount=0.005
For Ethereum—EIP-681: ethereum:0xAbCd...@1?value=1e18
For Solana—solana:<address>?amount=0.1&spl-token=<mint>
Plain-address QR works everywhere; URI format works only if the sending app supports it. Generate URI by default, offer "address only" toggle for compatibility.
// iOS — QR generation via CoreImage
import CoreImage.CIFilterBuiltins
let filter = CIFilter.qrCodeGenerator()
filter.message = Data(uri.utf8)
filter.correctionLevel = "M"
let ciImage = filter.outputImage!
let scaled = ciImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
let uiImage = UIImage(ciImage: scaled)
// Android — ZXing
import com.google.zxing.BarcodeFormat
import com.google.zxing.qrcode.QRCodeWriter
val writer = QRCodeWriter()
val bitMatrix = writer.encode(uri, BarcodeFormat.QR_CODE, 512, 512)
val bitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.RGB_565)
// fill bitmap from bitMatrix
QR size must be scannable from 30+ cm. Minimum 200×200 dp, recommended 280×280. Light background, dark modules—don't invert; most scanners read inverted poorly.
Copy Address and Share
"Copy" button: mandatory. After copying—brief toast "Address copied" without blocking dialog. On iOS 16+, clipboard access requires explicit permission on paste in another app, so visual confirmation is crucial.
"Share" button opens system share sheet with address or URI text. Convenient for sending via messenger.
For memo/tag networks (XRP, XLM, ATOM): show memo in separate field with warning: "Without memo, funds may be lost on exchange."
Timeline: 1–3 days depending on network count. One address with QR—a day. Multi-network with switcher and different URI formats—2–3 days.







