Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge release branch into master resolved (v4.46.0) #3060

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
- Fix authentication view glitch at startup
- Remove "No priority" from fee options
- Display skeleton screens (placeholder) in the account page during data loading to enhance UX
- Fix Moonpay widget loading issues
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I'd move put the Moonpay change before the skeleton things, as it was released before

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer to not move it as it is an unordered list 😇


# 4.45.0
- Bundle BitBox02 firmware version v9.21.0
Expand Down
2 changes: 1 addition & 1 deletion backend/exchanges/btcdirect.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func GetBtcDirectSupportedRegions() []string {
// IsBtcDirectSupported is true if coin.Code and region are supported by BtcDirect.
func IsBtcDirectSupported(coinCode coin.Code, region string) bool {
supportedCoins := []coin.Code{
coin.CodeBTC, coin.CodeTBTC, coin.CodeETH, coin.CodeSEPETH,
coin.CodeBTC, coin.CodeTBTC, coin.CodeLTC, coin.CodeTLTC, coin.CodeETH, coin.CodeSEPETH,
"eth-erc20-usdt", "eth-erc20-usdc", "eth-erc20-link"}

coinSupported := slices.Contains(supportedCoins, coinCode)
Expand Down
2 changes: 1 addition & 1 deletion frontends/android/BitBoxApp/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ android {
applicationId "ch.shiftcrypto.bitboxapp"
minSdkVersion 21
targetSdkVersion 34
versionCode 54
versionCode 55
versionName "android-4.46.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,9 @@ public void run() {
vw.getSettings().setJavaScriptEnabled(true);
vw.getSettings().setAllowUniversalAccessFromFileURLs(true);
vw.getSettings().setAllowFileAccess(true);
// For MoonPay WebRTC camera access.

// For Moonpay widget: DOM storage and WebRTC camera access required.
vw.getSettings().setDomStorageEnabled(true);
vw.getSettings().setMediaPlaybackRequiresUserGesture(false);

vw.setWebViewClient(new WebViewClient() {
Expand Down
107 changes: 64 additions & 43 deletions frontends/web/src/hooks/qrcodescanner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,61 +34,82 @@ export const useQRScanner = (
const { t } = useTranslation();
const [initErrorMessage, setInitErrorMessage] = useState();
const scanner = useRef<QrScanner | null>(null);

useEffect(() => {
if (videoRef.current && !scanner.current) {
scanner.current = new QrScanner(
videoRef.current,
result => {
scanner.current?.stop();
onResult(result);
}, {
onDecodeError: err => {
const errorString = err.toString();
if (err && !errorString.includes('No QR code found')) {
onError(err);
}
},
highlightScanRegion: true,
highlightCodeOutline: true,
calculateScanRegion: (v) => {
const videoWidth = v.videoWidth;
const videoHeight = v.videoHeight;
const factor = 0.5;
const size = Math.floor(Math.min(videoWidth, videoHeight) * factor);
return {
x: (videoWidth - size) / 2,
y: (videoHeight - size) / 2,
width: size,
height: size
};
}
}
);
}
return () => {
scanner.current?.stop();
scanner.current?.destroy();
scanner.current = null;
};
}, [onError, onResult, videoRef]);
// loading is set to true while the scanner is being created/started/stopped/destroyed,
// this allows to sync across re-renders.
const loading = useRef<boolean>(false);

useEffect(() => {
(async () => {
if (!videoRef.current) {
return;
}

while (loading.current) {
await new Promise(r => setTimeout(r, 100));
}
try {
await new Promise(r => setTimeout(r, 300));
if (scanner.current) {
await scanner.current.start();
if (onStart) {
onStart();
loading.current = true;
scanner.current = new QrScanner(
videoRef.current,
result => {
scanner.current?.stop();
onResult(result);
}, {
onDecodeError: err => {
const errorString = err.toString();
if (err && !errorString.includes('No QR code found')) {
onError(err);
}
},
highlightScanRegion: true,
highlightCodeOutline: true,
calculateScanRegion: (v) => {
const videoWidth = v.videoWidth;
const videoHeight = v.videoHeight;
const factor = 0.5;
const size = Math.floor(Math.min(videoWidth, videoHeight) * factor);
return {
x: (videoWidth - size) / 2,
y: (videoHeight - size) / 2,
width: size,
height: size
};
}
}
);
// Somehow, the new QrScanner may return before it is ready to be started.
// We don't have a way to know when it is ready, but this 300ms wait seems
// to work well enough.
await new Promise(r => setTimeout(r, 300));
await scanner.current?.start();
loading.current = false;
if (onStart) {
onStart();
}
} catch (error: any) {
const stringifiedError = error.toString();
loading.current = false;
const cameraNotFound = stringifiedError === 'Camera not found.';
setInitErrorMessage(cameraNotFound ? t('send.scanQRNoCameraMessage') : stringifiedError);
onError(error);
}
})();

return () => {
(async() => {
while (loading.current) {
await new Promise(r => setTimeout(r, 100));
}
if (scanner.current) {
loading.current = true;
await scanner.current?.pause(true);
await scanner.current?.stop();
await scanner.current?.destroy();
scanner.current = null;
loading.current = false;
}
})();
};
}, [videoRef, onStart, onResult, onError, t]);

return { initErrorMessage };
Expand Down
8 changes: 4 additions & 4 deletions frontends/web/src/locales/cs/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@
"text": "Pojistěte si svůj BitBox02 a bitcoiny v hodnotě až 100 000 EUR",
"text2": "Pojistné plány začínají na 30 €/rok (2,50 €/měsíc). Více informací o společnosti Bitsurance a její přesné nabídce pojištění se dozvíte na stránce",
"text3": "V současné době k dispozici v Německu, další regiony budou následovat.",
"title": "Začněte"
"title": "Začínáme"
},
"intro": {
"link": "Web Bitsurance",
Expand Down Expand Up @@ -1359,7 +1359,7 @@
},
"note": {
"input": {
"description": "(volitelný)",
"description": "(volitelné)",
"placeholder": "Přidat poznámku…"
},
"title": "Poznámka"
Expand Down Expand Up @@ -1595,7 +1595,7 @@
"placeholder": "Zadejte částku"
},
"availableBalance": "Dostupný zůstatek",
"button": "Překontrolování",
"button": "Kontrola",
"coincontrol": {
"address": "Adresa",
"addressReused": "Opakovaně použitá adresa",
Expand Down Expand Up @@ -1773,7 +1773,7 @@
"summary": "Zde je shrnutí toho, co jste udělali",
"title": "Hotovo"
},
"getstarted": "Začněte",
"getstarted": "Začínáme",
"restore": {
"summary": "Úspěšně jste obnovili peněženku ze zálohy.",
"title": "Hotovo"
Expand Down
8 changes: 4 additions & 4 deletions frontends/web/src/locales/de/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -753,8 +753,8 @@
"fees": {
"extraNote": "Bitte beachte, dass du zuerst Bitcoin über Pocket kaufen musst, bevor du verkaufen kannst.",
"note": "Hinweis: Pockets Wechselkurse können von den Wechselkursen in der BitBoxApp abweichen.",
"p1": "<strong>Bitcoin kaufen:</strong>Nutze SEPA-Banküberweisung zum Versenden von EUR oder CHF, und erhalte Bitcoin direkt auf deine BitBox, sobald Pocket die Banküberweisung erhalten hat, normalerweise am selben Tag. ",
"p2": "<strong>Bitcoin verkaufen:</strong>Sende Bitcoin an Pocket, und erhalte EUR oder CHF in deinem angegebenen Bankkonto. Der Wechselkurs wird festgelegt, sobald Pocket deine Bitcoin erhalten hat.",
"p1": "<strong>Bitcoin kaufen:</strong> Nutze SEPA-Banküberweisung zum Versenden von EUR oder CHF, und erhalte Bitcoin direkt auf deine BitBox, sobald Pocket die Banküberweisung erhalten hat, normalerweise am selben Tag. ",
"p2": "<strong>Bitcoin verkaufen:</strong> Sende Bitcoin an Pocket, und erhalte EUR oder CHF in deinem angegebenen Bankkonto. Der Wechselkurs wird festgelegt, sobald Pocket deine Bitcoin erhalten hat.",
"title": "Zahlungsmethoden und Gebühren"
},
"kyc": {
Expand All @@ -766,8 +766,8 @@
"security": {
"link": "BitBox02 Sicherheitsbedrohungsmodell",
"p1": "Die Verwendung von Pocket ist ein externer Dienst welcher nicht von dem BitBox02 Sicherheitsbedrohungsmodell abgedeckt ist. Jedoch arbeiten wir eng mit Pocket zusammen um die allgemeine Sicherheit zu erhöhen.",
"p2": "<strong>Bitcoin kaufen:</strong>Du erhältst eine E-Mail zur Bestätigung deiner Bitcoin Empfangsadresse durch einen zweiten Kommunikationskanal.",
"p3": "<strong>Bitcoin verkaufen:</strong>Die BitBox02 verifiziert die Bitcoin Einzahlungsadresse kryptografisch und zeigt \"Pocket\" auf dem Hardware Wallet an.",
"p2": "<strong>Bitcoin kaufen:</strong> Du erhältst eine E-Mail zur Bestätigung deiner Bitcoin Empfangsadresse durch einen zweiten Kommunikationskanal.",
"p3": "<strong>Bitcoin verkaufen:</strong> Die BitBox02 verifiziert die Bitcoin Einzahlungsadresse kryptografisch und zeigt \"Pocket\" auf dem Hardware Wallet an.",
"title": "Sicherheit"
},
"welcome": {
Expand Down
16 changes: 8 additions & 8 deletions frontends/web/src/locales/it/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,8 @@
"title": "Servizio personalizzato con prezzo fisso"
},
"security": {
"link": "Modello di minaccia alla sicurezza di BitBox02",
"text": "Il Private Trading Desk di BTC Direct è un servizio esterno non coperto dal modello di minaccia alla sicurezza di BitBox02. Tuttavia, BTC Direct conosce bene i prodotti BitBox epuò guidarti in maniera sicura e competente. I prodotti BitBox verificano gli indirizzi crittografici durante le transazioni per garantire una consegna sicura.",
"link": "Security threat model di BitBox02",
"text": "Il Private Trading Desk di BTC Direct è un servizio esterno non coperto dal security threat model di BitBox02. Tuttavia, BTC Direct conosce bene i prodotti BitBox epuò guidarti in maniera sicura e competente. I prodotti BitBox verificano gli indirizzi crittografici durante le transazioni per garantire una consegna sicura.",
"title": "Sicurezza"
},
"title": "Disclaimer"
Expand Down Expand Up @@ -540,8 +540,8 @@
"title": "Protezione dei dati"
},
"security": {
"descriptionGeneric_bitcoin": "Quando acquisti Bitcoin tramite un exchange partner, stai usando un servizio esterno. Questo servizio è fuori dall'ambito del \\\"Securiy Threat model\\\" del BitBox02 e si affida al grado di sicurezza dell'ambiente in cui il software BitBoxApp è in esecuzione.",
"descriptionGeneric_crypto": "Quando acquisti crypto tramite un exchange partner, stai usando un servizio esterno. Questo servizio è fuori dall'ambito del \\\"Securiy Threat model\\\" del BitBox02 e si affida al grado di sicurezza dell'ambiente in cui il software BitBoxApp è in esecuzione.",
"descriptionGeneric_bitcoin": "Quando acquisti Bitcoin tramite un exchange partner, stai usando un servizio esterno. Questo servizio è fuori dall'ambito del Securiy Threat model del BitBox02 e si affida al grado di sicurezza dell'ambiente in cui il software BitBoxApp è in esecuzione.",
"descriptionGeneric_crypto": "Quando acquisti crypto tramite un exchange partner, stai usando un servizio esterno. Questo servizio è fuori dall'ambito del Securiy Threat model del BitBox02 e si affida al grado di sicurezza dell'ambiente in cui il software BitBoxApp è in esecuzione.",
"link": "Security threat model",
"title": "Security model"
},
Expand Down Expand Up @@ -764,8 +764,8 @@
"title": "KYC/AML (Know Your Customer / Anti-Money Laundering)"
},
"security": {
"link": "Modello di minaccia alla sicurezza di BitBox02",
"p1": "L'utilizzo di Pocket è un servizio esterno e non è coperto dal modello di minaccia alla sicurezza di BitBox02. Tuttavia, lavoriamo a stretto contatto con Pocket per migliorare la sicurezza complessiva.",
"link": "Security threat model di BitBox02",
"p1": "L'utilizzo di Pocket è un servizio esterno e non è coperto dal security threat model di BitBox02. Tuttavia, lavoriamo a stretto contatto con Pocket per migliorare la sicurezza complessiva.",
"p2": "<strong>Acquistare bitcoin:</strong> Riceverai un'e-mail per confermare il tuo indirizzo di ricezione bitcoin attraverso un secondo canale di comunicazione.",
"p3": "<strong>Vendere bitcoin:</strong> BitBox02 verifica crittograficamente l'indirizzo di deposito Bitcoin e visualizza \"Pocket\" sull'hardware wallet.",
"title": "Sicurezza"
Expand Down Expand Up @@ -1469,7 +1469,7 @@
"La passphrase è un ulteriore livello di sicurezza oltre al backup.\n",
"L'inserimento di una passphrase diversa genererà sempre un wallet diverso.",
"Per ripristinare il wallet sono necessari <strong>sia la passphrase che il backup</strong>.",
"Se si dimentica la passphrase, <strong>non è più possibile accedere ai propri fondi</strong>.\n"
"Se si dimentica la passphrase, <strong>non è più possibile accedere ai propri fondi</strong>."
]
},
"what": {
Expand All @@ -1479,7 +1479,7 @@
},
"why": {
"button": "Perchè usare una passphrase",
"message": "BitBox02 protegge il seed dall'estrazione dal dispositivo stesso, ma il backup (scheda microSD o parole di recupero) dà pieno accesso al wallet. Per questo motivo deve essere conservato in un luogo sicuro!\n\nPoiché una passphrase crea un nuovo wallet utilizzando il seed esistente, il wallet con la passphrase richiede sia il <strong>backup che la passphrase per il ripristino</strong>. Il vantaggio è che se qualcuno trova il tuo backup, ha comunque bisogno della passphrase per accedere al wallet con passphrase.\n\nInoltre, la funzione passphrase consente di creare piùwallet sullo stesso dispositivo, o \"wallet nascosti\", oltre a quello predefinito.",
"message": "BitBox02 protegge il seed dall'estrazione dal dispositivo stesso, ma il backup (scheda microSD o parole di recupero) dà pieno accesso al wallet. Per questo motivo deve essere conservato in un luogo sicuro!\n\nPoiché una passphrase crea un nuovo wallet utilizzando il seed esistente, il wallet con la passphrase richiede sia il <strong>backup che la passphrase per il ripristino</strong>. Il vantaggio è che se qualcuno trova il tuo backup, ha comunque bisogno della passphrase per accedere al wallet con passphrase.\n\nInoltre, la funzione passphrase consente di creare più wallet sullo stesso dispositivo, o \"wallet nascosti\", oltre a quello predefinito.",
"title": "Perchè usare una passphrase?"
}
},
Expand Down
49 changes: 49 additions & 0 deletions frontends/web/src/locales/nl/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,55 @@
"fast": "Snel",
"fee": "transactiekosten",
"infoContent": {
"btcdirect": {
"disclaimer": {
"dataProtection": {
"link": "BTC Direct privacybeleid",
"text": "De BitBoxApp verzamelt geen persoonlijke gegevens. BTC Direct verzamelt de benodigde informatie volgens hun Privacybeleid om te voldoen aan de wettelijke normen.",
"title": "Gegevensbescherming"
},
"kyc": {
"text": "Verificatie van de identiteit van de klant is vereist voor alle transacties. Je accountmanager zal je door het proces begeleiden en al je vragen beantwoorden.",
"title": "Identiteitsverificatie"
},
"partnership": {
"text": "In samenwerking met BTC Direct, een vertrouwde Europese broker, biedt BitBox grootschalige over-the-counter (OTC) handel voor Bitcoin, Ethereum, stablecoins en meer met deskundige ondersteuning direct in de BitBoxApp.",
"title": "Koop en verkoop met de BTC Direct Private Trading Desk"
},
"paymentMethods": {
"buy": "Bitcoin kopen:",
"buy2": "Plaats grote kooporders bij je accountmanager, zet een prijs vast en betaal via bankoverschrijving. Je crypto wordt na betaling direct geleverd aan je BitBox.",
"fee": "Minimum handelsbedragen van €50.000 zijn van toepassing, met een transparante vergoeding tussen 0,5% en 1%.",
"sell": "Bitcoin verkopen:",
"sell2": "Zet een OTC-prijs vast wanneer je een verkooporder plaatst. De betaling van EUR vindt plaats zodra je je crypto hebt verstuurd naar BTC Direct. Persoonlijke assistentie is beschikbaar indien nodig.",
"title": "Betaalmethoden en kosten"
},
"personal": {
"text": "Elke Private Trading klant krijgt een toegewijde accountmanager toegewezen voor persoonlijke hulp via telefoon, videogesprek, e-mail of chat. Koop- en verkoopprijzen worden onmiddellijk vastgesteld wanneer de order wordt geplaatst, zelfs als de afwikkeling later plaatsvindt. Orders worden uitgevoerd via de OTC-desk van BTC Direct, waardoor slippage wordt geminimaliseerd.",
"title": "Persoonlijke service met vaste prijzen"
},
"security": {
"link": "BitBox02 bedreigingsmodel",
"text": "De Private Trading Desk van BTC Direct is een externe dienst die niet valt onder het BitBox02 Security Threat model. BTC Direct is echter goed bekend met BitBox-producten en biedt veilige, deskundige begeleiding. BitBox-producten verifiëren cryptoadressen tijdens transacties om een veilige levering te garanderen.",
"title": "Beveiliging"
},
"title": "Disclaimer"
},
"info": "Krijg een persoonlijke adviseur, lagere kosten en plaats orders direct via je contactpersoon bij BTC Direct.",
"infobox": {
"intro_btconly": "Krijg persoonlijke hulp bij over-the-counter (OTC) Bitcoin-transacties van grote waarde.",
"intro_multi": "Krijg persoonlijke hulp bij over-the-counter (OTC) transacties van grote waarde voor Bitcoin, Ethereum, stablecoins en meer.",
"kyc": "BTC Direct vereist identiteitsverificatie voor alle transacties, waarbij je accountmanager je bij elke stap begeleidt.",
"learnmore": "Meer informatie over de BTC Direct Private Trading Desk.",
"listItem1": "Koop en verkoop op elk moment door contact op te nemen met je accountmanager via telefoon, e-mail, videogesprek of chat.",
"listItem2": "Betalingen worden voltooid via bankoverschrijving nadat de order is geplaatst.",
"listItem3": "Minimum orderbedrag: €50,000.",
"listItem4": "Transparante kosten vastgesteld op 0,5%-1%, inclusief persoonlijke begeleiding.",
"manager": "Een toegewijde accountmanager begeleidt je bij elke stap en zorgt voor een veilige, ongecompliceerde ervaring met vaste tarieven en minimale slippage."
},
"link": "Toegang BTC Direct - Private Trading Desk",
"title": "Koop of verkoop je meer dan € 50.000?"
},
"moonpay": {
"fees": {
"bankTransfer": "Bankoverschrijving: {{fee}}%",
Expand Down
Loading
Loading