diff --git a/web/cashtab/src/components/Common/ScanQRCode.js b/web/cashtab/src/components/Common/ScanQRCode.js --- a/web/cashtab/src/components/Common/ScanQRCode.js +++ b/web/cashtab/src/components/Common/ScanQRCode.js @@ -5,6 +5,7 @@ import { BrowserQRCodeReader } from '@zxing/library'; import { currency } from '@components/Common/Ticker.js'; import { Event } from '@utils/GoogleAnalytics'; +import BigNumber from 'bignumber.js'; const StyledScanQRCode = styled.span` display: block; @@ -56,10 +57,47 @@ // If what scanner reads from QR code begins with 'bitcoincash:' or 'simpleledger:' or their successor prefixes if ( content.split(currency.prefix).length > 1 || - content.split(currency.tokenPrefix).length > 1 + content.split(currency.tokenPrefix).length > 1 || + content.split('ecash:').length > 1 ) { type = 'address'; - values = { address: content }; + + // Check for params + // eg mercurymessenger.io + // ecash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25mc?amount=500000 + + const paramCheck = content.split('?'); + let cleanAddress = paramCheck[0]; + + let queryString; + let amount = null; + + if (paramCheck.length > 1) { + queryString = paramCheck[1]; + + const addrParams = new URLSearchParams(queryString); + if (addrParams.has('amount')) { + // Amount in satoshis + try { + amount = new BigNumber( + parseInt(addrParams.get('amount')), + ) + .div(1e8) + .toString(); + } catch (err) { + amount = null; + } + } + } + + // NB for now, backend will only accept legacy prefixes + // So, convert `ecash:` to `bitcoincash:` + if (cleanAddress.split('ecash:').length > 1) { + cleanAddress = `bitcoincash:` + cleanAddress.split('ecash:')[1]; + } + + values = { address: cleanAddress, amount: amount }; + // Event("Category", "Action", "Label") // Track number of successful QR code scans // BCH or slp? @@ -100,7 +138,7 @@ if (result.type === 'address') { // Hide the scanner setVisible(false); - onScan(result.values.address); + onScan(result.values); return teardownCodeReader(codeReader); } } catch (err) { diff --git a/web/cashtab/src/components/Send/Send.js b/web/cashtab/src/components/Send/Send.js --- a/web/cashtab/src/components/Send/Send.js +++ b/web/cashtab/src/components/Send/Send.js @@ -371,7 +371,8 @@ onScan={result => setFormData({ ...formData, - address: result, + address: result.address, + value: result.amount, }) } inputProps={{ diff --git a/web/cashtab/src/components/Send/SendToken.js b/web/cashtab/src/components/Send/SendToken.js --- a/web/cashtab/src/components/Send/SendToken.js +++ b/web/cashtab/src/components/Send/SendToken.js @@ -209,7 +209,7 @@ onScan={result => setFormData({ ...formData, - address: result, + address: result.address, }) } inputProps={{