Merge branch 'master' into limpbrains-cc

This commit is contained in:
marcosrdz 2020-11-14 23:33:02 -05:00
commit a0a48f3865
18 changed files with 241 additions and 155 deletions

View File

@ -136,7 +136,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "5.6.5"
versionName "5.6.6"
multiDexEnabled true
missingDimensionStrategy 'react-native-camera', 'general'
testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type

View File

@ -44,6 +44,17 @@ async function connectMain() {
usingPeer = savedPeer;
}
try {
await DefaultPreference.setName('group.io.bluewallet.bluewallet');
await DefaultPreference.set(AppStorage.ELECTRUM_HOST, usingPeer.host);
await DefaultPreference.set(AppStorage.ELECTRUM_TCP_PORT, usingPeer.tcp);
await DefaultPreference.set(AppStorage.ELECTRUM_SSL_PORT, usingPeer.ssl);
RNWidgetCenter.reloadAllTimelines();
} catch (e) {
// Must be running on Android
console.log(e);
}
try {
console.log('begin connection:', JSON.stringify(usingPeer));
mainClient = new ElectrumClient(usingPeer.ssl || usingPeer.tcp, usingPeer.host, usingPeer.ssl ? 'tls' : 'tcp');
@ -105,17 +116,6 @@ async function getSavedPeer() {
const host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST);
const port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT);
const sslPort = await AsyncStorage.getItem(AppStorage.ELECTRUM_SSL_PORT);
try {
await DefaultPreference.setName('group.io.bluewallet.bluewallet');
await DefaultPreference.set(AppStorage.ELECTRUM_HOST, host);
await DefaultPreference.set(AppStorage.ELECTRUM_TCP_PORT, port);
await DefaultPreference.set(AppStorage.ELECTRUM_SSL_PORT, sslPort);
RNWidgetCenter.reloadAllTimelines();
} catch (e) {
// Must be running on Android
console.log(e);
}
return { host, tcp: port, ssl: sslPort };
}

View File

@ -9,6 +9,7 @@ const constants = require('./constants');
const PUSH_TOKEN = 'PUSH_TOKEN';
const GROUNDCONTROL_BASE_URI = 'GROUNDCONTROL_BASE_URI';
const NOTIFICATIONS_STORAGE = 'NOTIFICATIONS_STORAGE';
const NOTIFICATIONS_NO_AND_DONT_ASK_FLAG = 'NOTIFICATIONS_NO_AND_DONT_ASK_FLAG';
let alreadyConfigured = false;
let baseURI = constants.groundControlUri;
@ -118,6 +119,10 @@ function Notifications(props) {
});
};
Notifications.cleanUserOptOutFlag = async function () {
return AsyncStorage.removeItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG);
};
/**
* Should be called when user is most interested in receiving push notifications.
* If we dont have a token it will show alert asking whether
@ -134,13 +139,26 @@ function Notifications(props) {
return true;
}
if (await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG)) {
// user doesnt want them
return false;
}
return new Promise(function (resolve) {
Alert.alert(
loc.settings.notifications,
'Would you like to receive notifications when you get incoming payments?',
loc.notifications.would_you_like_to_receive_notifications,
[
{
text: 'Ask Me Later',
text: loc.notifications.no_and_dont_ask,
onPress: () => {
AsyncStorage.setItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG, '1');
resolve(false);
},
style: 'cancel',
},
{
text: loc.notifications.ask_me_later,
onPress: () => {
resolve(false);
},

View File

@ -33,14 +33,13 @@ export const BlueStorageProvider = ({ children }) => {
const refreshAllWalletTransactions = async lastSnappedTo => {
let noErr = true;
try {
// await BlueElectrum.ping();
await BlueElectrum.waitTillConnected();
const balanceStart = +new Date();
await fetchWalletBalances(lastSnappedTo || 0);
await fetchWalletBalances(lastSnappedTo);
const balanceEnd = +new Date();
console.log('fetch balance took', (balanceEnd - balanceStart) / 1000, 'sec');
const start = +new Date();
await fetchWalletTransactions(lastSnappedTo || 0);
await fetchWalletTransactions(lastSnappedTo);
const end = +new Date();
console.log('fetch tx took', (end - start) / 1000, 'sec');
} catch (err) {

View File

@ -189,9 +189,9 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet {
}
}
} else {
// mnemonics. lets derive fingerprint
// mnemonics. lets derive fingerprint (if it wasnt provided)
if (!bip39.validateMnemonic(key)) throw new Error('Not a valid mnemonic phrase');
fingerprint = MultisigHDWallet.seedToFingerprint(key);
fingerprint = fingerprint || MultisigHDWallet.seedToFingerprint(key);
}
if (fingerprint && this._cosignersFingerprints.indexOf(fingerprint.toUpperCase()) !== -1 && fingerprint !== '00000000') {

View File

@ -1480,7 +1480,7 @@
"$(inherited)",
"$(PROJECT_DIR)",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -1520,7 +1520,7 @@
"$(inherited)",
"$(PROJECT_DIR)",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -1559,7 +1559,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension;
@ -1598,7 +1598,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension;
PRODUCT_NAME = "BlueWallet - Bitcoin Price";
@ -1637,7 +1637,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget;
@ -1678,7 +1678,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@ -1717,7 +1717,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget;
@ -1759,7 +1759,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@ -1799,7 +1799,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget;
@ -1843,7 +1843,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@ -1884,7 +1884,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget;
@ -1926,7 +1926,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@ -2066,7 +2066,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension;
@ -2105,7 +2105,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension;
PRODUCT_NAME = "${TARGET_NAME}";
@ -2138,7 +2138,7 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
IBSC_MODULE = BlueWalletWatch_Extension;
INFOPLIST_FILE = BlueWalletWatch/Info.plist;
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch;
@ -2173,7 +2173,7 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
IBSC_MODULE = BlueWalletWatch_Extension;
INFOPLIST_FILE = BlueWalletWatch/Info.plist;
MARKETING_VERSION = 5.6.5;
MARKETING_VERSION = 5.6.6;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch;
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@ -1,3 +1,17 @@
v5.6.5
======
* ADD: Price Current/Previous Widget
* ADD: Allow image for importing wallet
* FIX: wallets are not refreshing when app boots
* FIX: wallets are not refreshing when they are navigated to
* FIX: Some colors were not using usetheme
* FIX: Track time first seen of unconfirmed transactions
* FIX: missing transactions after restart for single-address wallets
* FIX: locales nl_NL, ru
* FIX: Widget Fiat calculation
* FIX: 'RnSksIsAppInstalled' was being read from the wrong suite
v5.6.3
======
@ -65,29 +79,3 @@ v5.5.9
* FIX: Only send wallets to watch app if installed
* FIX: Send Max not working
* FIX: Reorder screen is broken
v5.5.8
======
* ADD: Split for large devices
* ADD: Export file option
* ADD: Arabic, Slovenian & Hebrew language
* ADD: KES, NGN, TWD Fiat
* FIX: After broadcast, value of sent transaction is incorrect
* FIX: transaction time when using ElectrumPersonalServer
* FIX: some ElectrumPersonalServer txs stay unconfirmed
* FIX: Fixed dark/light theme switch
* FIX: updated languages pt_BR, pt_PT, es_ES, sl_SI, de_DE, fr_FR, cs_CZ, ja_JP, it, ru, he
* FIX: create-ln-invoice - button is not blocked, which can lead to multiple invoices created
* FIX: If user has approved notifications, send hash from watch
* FIX: If Camera not authorized, show Alert.
* FIX: Only show direct export
* FIX: better handling of errors from HodlHodl
* FIX: Safello buy-bitcoin flow
* FIX: Request location authorization for HodlHodl
* FIX: Settings|Network|Lightning Settings fails input for leading or trailing blank
* FIX: show Import file option
* FIX: Background had wrong color during loading phase
* REF: speeded up large wallets (>3k txs)
* REF: speedup onchain wallet creation

View File

@ -290,6 +290,11 @@
"save": "Save",
"saved": "Saved"
},
"notifications": {
"would_you_like_to_receive_notifications": "Would you like to receive notifications when you get incoming payments?",
"no_and_dont_ask": "No and dont ask",
"ask_me_later": "Ask Me Later"
},
"transactions": {
"cancel_explain": "We will replace this transaction with the one that pays you and has higher fees. This effectively cancels transaction. This is called RBF - Replace By Fee.",
"cancel_no": "This transaction is not replaceable",

View File

@ -12,9 +12,9 @@
"dont_allow": "No permitir",
"yes": "Sí",
"no": "No",
"save": "Save",
"seed": "Seed",
"wallet_key": "Wallet key",
"save": "Guardar",
"seed": "Semilla",
"wallet_key": "Llave de la cartera",
"invalid_animated_qr_code_fragment" : "Fragmento de Codigo QR invalido, favor intentar de nuevo",
"file_saved": "El archivo ({filePath}) se ha guardado en su carpeta de Descargas."
},
@ -62,7 +62,7 @@
"filter_buying": "Comprando",
"filter_country_global": "Ofertas globales",
"filter_country_near": "Cerca de mí",
"filter_currency": "Moneda",
"filter_currency": "Divisa",
"filter_detail": "Detalle",
"filter_filters": "Filtros",
"filter_iambuying": "Quiero comprar bitcoin",
@ -82,7 +82,7 @@
"offer_confirmations": "Confirmaciones",
"offer_minmax": "mín / máx",
"offer_minutes": "mín",
"offer_promt_fiat": "¿Cuánto {currency} quieres comprar?",
"offer_promt_fiat": "¿Cuántos {currency} quieres comprar?",
"offer_promt_fiat_e": "Por ejemplo: 100",
"offer_window": "ventana",
"p2p": "Una casa de cambio p2p"
@ -110,13 +110,13 @@
"has_been_paid": "Esta factura ha sido pagada para",
"open_direct_channel": "Abrir un canal directo con este nodo:",
"please_pay": "Por favor, pague",
"preimage": "Preimagen",
"preimage": "Preimage",
"sats": "sats",
"wasnt_paid_and_expired": "Esta factura no se pagó y ha caducado"
},
"plausibledeniability": {
"create_fake_storage": "Crear un almacen cifrado falso",
"create_password": "Crear una contraseña",
"create_password": "Crear contraseña",
"create_password_explanation": "La contraseña para el almacenamiento falso no puede ser igual que la del principal",
"help": "Bajo ciertas circunstancias, podrías verte forzado a revelar tu contraseña. Para proteger tus fondos, BlueWallet puede crear otro almacenamiento cifrado con una contraseña diferente. Da esta otra contraseña a quien te esté obligando a hacerlo y BlueWallet mostrará un almacenamiento \"falso\" que parecerá legítimo. Así mantendrás a buen recaudo el almacenamiento con tus fondos.",
"help2": "El nuevo almacen sera completamente funcional, y puedes almacenar cantidades minimas para que sea mas creible.",
@ -257,7 +257,7 @@
"encrypt_use": "Usar {type}",
"encrypt_use_expl": "{type} será usado para confirmar tu identidad antes de realizar una transacción y para desbloquear, exportar o borrar una cartera. {type} no será usado para desbloquear un almacenamiento encriptado.",
"general": "General",
"general_adv_mode": "Habilitar modo avanzado",
"general_adv_mode": "Modo avanzado",
"general_adv_mode_e": "Al activarlo podrás ver opciones avanzadas, como varios tipos de carteras, la posibilidad de especificar el LNDHub al que quieres conectar y entropía personalizada al crear una cartera.",
"general_continuity": "Continuidad",
"general_continuity_e": "Al activarlo, podrá ver las transacciones y carteras seleccionadas usando cualquiera de sus dispositivos Apple conectados a iCloud.",
@ -267,7 +267,7 @@
"language_restart": "Al seleccionar otro idioma, será necesario reiniciar BlueWallet para mostrar los cambios.",
"lightning_error_lndhub_uri": "LndHub URI no válida",
"lightning_saved": "Sus cambios se han guardado correctamente",
"lightning_settings": "Lightning settings",
"lightning_settings": "Configuración de Lightning",
"lightning_settings_explain": "Para conectar a tu propio nodo LND, por favor instala LndHub y escribe su URL aquí, en la pantalla de configuración. Déjalo en blanco para usar el LNDHub (lndhub.io) de BlueWallet. Las carteras creadas tras guardar los cambios se conectarán al LNDHub especificado.",
"network": "Red",
"network_broadcast": "Emitir transacción",
@ -280,16 +280,21 @@
"plausible_deniability": "Negación plausible",
"privacy": "Privacidad",
"privacy_read_clipboard": "Leer portapapeles",
"privacy_read_clipboard_alert": "BlueWallet will display shortcuts for handling an invoice or address found in your clipboard.",
"privacy_read_clipboard_alert": "BlueWallet usará facturas o direcciones encontradas en tu portapapeles para utilizarlas de forma más cómoda.",
"privacy_system_settings": "Configuración del sistema",
"privacy_quickactions": "Wallet Shortcuts",
"privacy_quickactions_explanation": "Touch and hold the BlueWallet app icon on your Home Screen to quickly view your wallet's balance.",
"privacy_clipboard_explanation": "Provide shortcuts if an address, or invoice, is found in your clipboard.",
"privacy_quickactions": "Atajos para tus carteras",
"privacy_quickactions_explanation": "Toca y mantén pulsado el icono de BlueWallet en tu pantalla de inicio para ver rápidamente el balance de tu cartera.",
"privacy_clipboard_explanation": "Muestra atajos si encuentra direcciones o facturas en tu portapapeles.",
"push_notifications": "Notificaciones push",
"retype_password": "Ingresa la contraseña nuevamente",
"retype_password": "Introduce la contraseña otra vez",
"save": "Guardar",
"saved": "Guardado"
},
"notifications": {
"would_you_like_to_receive_notifications": "¿Quires recibir notificaciones cuando detectemos transferencias entrantes?",
"no_and_dont_ask": "No y no preguntes",
"ask_me_later": "Pregúntame después"
},
"transactions": {
"cancel_explain": "Reemplazaremos esta transacción con la que te paga y tiene tasas más altas, lo que cancelará la transacción. A esto se le llama RBF (Replace By Fee).",
"cancel_no": "Esta transacción no se puede reemplazar",
@ -298,8 +303,8 @@
"cpfp_exp": "Crearemos otra transacción que gastará tu otra transacción aun no confirmada. La comisión total será mayor que la comisión original, lo cual debería hacer que sea minada antes. A esto se le llama CPFP (Child Pays For Parent).",
"cpfp_no_bump": "Esta transacción no se puede acelerar",
"cpfp_title": "Aumentar comisión (CPFP)",
"details_balance_hide": "Hide Balance",
"details_balance_show": "Show Balance",
"details_balance_hide": "Esconder balance",
"details_balance_show": "Mostrar balance",
"details_block": "Altura del bloque",
"details_copy": "Copiar",
"details_from": "Origen",
@ -310,8 +315,9 @@
"details_title": "Transaccion",
"details_to": "Destino",
"details_transaction_details": "Detalles de la transacción",
"enable_hw": "Esta cartera no está siendo usada en conjunción con una de hardware. ¿Quieres activar el uso con carteras de hardware?",
"enable_hw": "Esta cartera no está siendo usada junto a una cartera de hardware. ¿Quieres activar el uso con carteras de hardware?",
"list_conf": "conf: {number}",
"pending": "En espera",
"list_title": "Transacciones",
"rbf_explain": "Reemplazaremos esta transacción por la de mayor comisión, lo que debería hacer que sea minada en menos tiempo. A esto se le llama RBF (Replace By Fee).",
"rbf_title": "Incrementar comisión (RBF)",
@ -320,7 +326,7 @@
"transactions_count": "Número de transacciones"
},
"wallets": {
"add_bitcoin_explain": "Simple and powerful Bitcoin wallet",
"add_bitcoin_explain": "Una cartera de Bitcoin útil y facil de usar",
"add_bitcoin": "Bitcoin",
"add_create": "Crear",
"add_entropy_generated": "{gen} bytes de entropía generada",
@ -329,7 +335,7 @@
"add_import_wallet": "Importar cartera",
"import_file": "Importar archivo",
"add_lightning": "Lightning",
"add_lightning_explain": "For spending with instant transactions",
"add_lightning_explain": "Para pagos con transferencias instantáneas",
"add_lndhub": "Conecta a tu LDNHub",
"add_lndhub_error": "La dirección proporcionada no es válida para un nodo LNDHub.",
"add_lndhub_placeholder": "la dirección de tu nodo",
@ -365,12 +371,12 @@
"import_imported": "Importado",
"import_scan_qr": "Escanear o importar un archivo",
"import_success": "Tu cartera ha sido importada.",
"looks_like_bip38": "This looks like password-protected private key (BIP38)",
"looks_like_bip38": "Parece que esto es una llave privada protegida con contraseña (BIP38)",
"enter_bip38_password": "Introduce el password para descifrar",
"import_title": "importar",
"list_create_a_button": "Añadir",
"list_create_a_wallet": "Añadir cartera",
"list_create_a_wallet_text": "It's free and you can create \nas many as you like",
"list_create_a_wallet_text": "Es gratis y puedes crear\ntodas las que quieras",
"list_empty_txs1": "Tus transacciones aparecerán aquí",
"list_empty_txs1_lightning": "Usa carteras Lighting para tus transacciones diarias. Tienen tasas muy bajas y una velocidad de vértigo.",
"list_empty_txs2": "Empieza con tu cartera",
@ -394,11 +400,11 @@
"xpub_title": "XPUB de la cartera"
},
"multisig": {
"multisig_vault": "Vault",
"multisig_vault_explain": "Best security for large amounts",
"multisig_vault": "Caja fuerte",
"multisig_vault_explain": "La mejor seguridad para grandes cantidades",
"provide_signature": "Proporcionar firma",
"vault_key": "Clave de la bóveda {number}",
"required_keys_out_of_total": "Required keys out of the total",
"required_keys_out_of_total": "Las llaves que se necesitarán del total de llaves creadas",
"fee": "Tarifa: {number}",
"fee_btc": "{number} BTC",
"confirm": "Confirmar",
@ -408,42 +414,42 @@
"scan_or_import_file": "Escanear o importar archivo",
"export_coordination_setup": "exportar coordinacion",
"cosign_this_transaction": "Co-firmar esta transacción?",
"lets_start": "Let's start",
"create": "Create",
"provide_key": "Provide key",
"native_segwit_title": "Best practice",
"wrapped_segwit_title": "Best compatibility",
"legacy_title": "Legacy",
"co_sign_transaction": "Co-sign QR-airgapped transaction",
"what_is_vault": "A Vault is a",
"what_is_vault_numberOfWallets": " {m}-of-{n} multisig ",
"what_is_vault_wallet": "wallet",
"vault_advanced_customize": "Vault Settings...",
"lets_start": "Comencemos",
"create": "Crear",
"provide_key": "Introduce una llave",
"native_segwit_title": "La mejor opción para la mayoría de usuarios",
"wrapped_segwit_title": "Ofrece la mejor compatibilidad",
"legacy_title": "La versión antigua",
"co_sign_transaction": "Co-firmar transacción mediante un código QR offline ",
"what_is_vault": "Una caja fuerte es",
"what_is_vault_numberOfWallets": " {m}-of-{n} multifirma ",
"what_is_vault_wallet": "Cartera",
"vault_advanced_customize": "Opciones de la caja fuerte...",
"needs": "Needs",
"what_is_vault_description_number_of_vault_keys": " {m} vault keys ",
"what_is_vault_description_to_spend": "to spend and a 3rd one you \ncan use as backup.",
"quorum": "{m} of {n} quorum",
"quorum_header": "Quorum",
"of": "of",
"wallet_type": "Wallet type",
"view_key": "view",
"invalid_mnemonics": "This mnemonic phrase doesnt seem to be valid",
"invalid_cosigner": "Not a valid cosigner data",
"invalid_cosigner_format": "Incorrect cosigner: this is not a cosigner for {format} format",
"create_new_key": "Create New",
"scan_or_open_file": "Scan or open file",
"i_have_mnemonics": "I have a seed for this key...",
"please_write_down_mnemonics": "Please write down this mnemonic phrase on paper. Don't worry, you can write it down later.",
"i_wrote_it_down": "Ok, I wrote it down",
"type_your_mnemonics": "Insert a seed to import your existing vault key",
"this_is_cosigners_xpub": "This is cosigner's xpub, ready to be imported in other wallet. It is safe to share it.",
"wallet_key_created": "Your vault key was created. Take a moment to safely backup your mnemonic seed",
"are_you_sure_seed_will_be_lost": "Are you sure? Your mnemonic seed will be lost if you dont have a backup",
"forget_this_seed": "Forget this seed and use xpub instead",
"invalid_fingerprint": "Fingerprint for this seed doesnt match this cosigners fingerprint",
"view_edit_cosigners": "View/edit cosigners",
"this_cosigner_is_already_imported": "This cosigner is already imported",
"export_signed_psbt": "Export Signed PSBT",
"view_edit_cosigners_title": "Edit Cosigners"
"what_is_vault_description_number_of_vault_keys": " {m} llaves de la caja fuerte",
"what_is_vault_description_to_spend": "para gastar y una tercera que\npuedes usar como copia de seguridad.",
"quorum": "{m} de {n} quórum",
"quorum_header": "quórum",
"of": "de",
"wallet_type": "Tipo de cartera",
"view_key": "Ver",
"invalid_mnemonics": "Esta frase mnemotécnica no es válida",
"invalid_cosigner": "Los datos del co-firmante no son válidos",
"invalid_cosigner_format": "Co-firmante incorrecto: no es un co-firmante de {format}",
"create_new_key": "Crear una nueva",
"scan_or_open_file": "Escanear o abrir archivo",
"i_have_mnemonics": "Tengo una semilla para esta llave...",
"please_write_down_mnemonics": "Por favor, anota esta frase mnemotécnica en un papel. No te preocupes, la puedes anotar más tarde.",
"i_wrote_it_down": "OK, ya la he anotado",
"type_your_mnemonics": "Introduce una semilla para importar la llave de tu caja fuerte",
"this_is_cosigners_xpub": "Esto es el xpub del co-firmante, lista para ser importada en otra cartera. Es seguro compartirla.",
"wallet_key_created": "Caja fuerte creada. Tómate un momento para anotar la semilla mnemotécnica",
"are_you_sure_seed_will_be_lost": "Estás seguro? Tu semilla mnemotécnica se perderá si no tienes una copia de seguridad",
"forget_this_seed": "Olvida esta semilla y usa xpub",
"invalid_fingerprint": "La huella de esta semilla no encaja con la huella del co-firmante",
"view_edit_cosigners": "Ver/editar co-firmantes",
"this_cosigner_is_already_imported": "Este co-firmante ya ha sido importado",
"export_signed_psbt": "Exportar PSBT firmado",
"view_edit_cosigners_title": "Editar co-firmantes"
}
}

View File

@ -12,6 +12,9 @@
"dont_allow": "Запретить",
"yes": "Да",
"no": "Нет",
"save": "Сохранить",
"seed": "Сид-фраза",
"wallet_key": "Ключ кошелька",
"invalid_animated_qr_code_fragment" : "Ошибочный фрагмент QRCode, попробуйте снова",
"file_saved": "Файл ({filePath}) сохранён в папке Загрузки."
},
@ -115,13 +118,13 @@
"create_fake_storage": "Создать фальшивое хранилище",
"create_password": "Придумай пароль",
"create_password_explanation": "Пароль для фальшивого хранилища не должен быть таким же как основной пароль",
"help": "При определенных обстоятельствах тебя могут вынудить раскрыть пароль. Чтобы сохранить свой Bitcoin в безопасности, BlueWallet может создать еще одно зашифрованое хранилище, с другим паролем. В случае шантажа ты можешь раскрыть третьим лицам этот пароль. Если ввести этот пароль в BlueWallet, разблокируется 'фальшивое' хранилище. Это будет выглядеть правдоподобно для третьих лиц, но при этом сохранит ваше основное хранилище с Bitcoin в безопасности.",
"help": "При определенных обстоятельствах тебя могут вынудить раскрыть пароль. Чтобы сохранить свой Bitcoin в безопасности, BlueWallet может создать еще одно зашифрованное хранилище, с другим паролем. В случае шантажа ты можешь раскрыть третьим лицам этот пароль. Если ввести этот пароль в BlueWallet, разблокируется 'фальшивое' хранилище. Это будет выглядеть правдоподобно для третьих лиц, но при этом сохранит ваше основное хранилище с Bitcoin в безопасности.",
"help2": "Новое хранилище будет полностью функциональным и ты даже можешь хранить на нем немного Bitcoin, чтобы это выглядело более правдоподобно.",
"password_should_not_match": "Пароль для фальшивого хранилища не должен быть таким же как основной пароль",
"passwords_do_not_match": "Пароли не совпадают, попробуй еще раз",
"retype_password": "Набери пароль повторно",
"success": "Готово",
"title": "Правдоподобная имитация"
"title": "Двойное дно"
},
"pleasebackup": {
"ask": "Вы сохранили seed фразу вашего кошелька? Эта резервная фраза необходима для восстановления доступа к вашим средствам, если вы потеряете это устройство. Без резервной фразы ваши средства будут навсегда потеряны.",
@ -252,7 +255,7 @@
"encrypt_title": "Безопасность",
"encrypt_tstorage": "хранилище",
"encrypt_use": "Использовать {type}",
"encrypt_use_expl": "{тип} будет использоваться для подтверждения совершения транзакции, разблокировки, экспорта или удаления кошелька. {type} не будет использоваться для разблокировки зашифрованного хранилища.",
"encrypt_use_expl": "{type} будет использоваться для подтверждения совершения транзакции, разблокировки, экспорта или удаления кошелька. {type} не будет использоваться для разблокировки зашифрованного хранилища.",
"general": "Основные",
"general_adv_mode": "Включить расширенный режим",
"general_adv_mode_e": "При включении вы увидите расширенные параметры, такие как разные типы кошельков, возможность указать экземпляр LNDHub, к которому вы хотите подключиться, и пользовательскую энтропию при создании кошелька.",
@ -274,7 +277,7 @@
"password": "Пароль",
"password_explain": "Придумай пароль для расшифровки хранилища",
"passwords_do_not_match": "Пароли не совпадают",
"plausible_deniability": "Правдоподобная имитация...",
"plausible_deniability": "Двойное дно",
"privacy": "Приватность",
"privacy_read_clipboard": "Чтение Буфера обмена",
"privacy_read_clipboard_alert": "BlueWallet позволит быстро отправить Биткоины, если обнаружит адрес в Буфера обмена.",
@ -295,6 +298,8 @@
"cpfp_exp": "Мы создадим новую транзакцию, которая потратит вашу неподтвержденную. Общая сумма комиссии будет выше, чем первоначальная комиссия, поэтому она будет добыта быстрее. Это называется CPFP - ребенок платит за родителя.",
"cpfp_no_bump": "Нельзя повысить комиссию этой транзакции",
"cpfp_title": "Повысить комиссию (CPFP)",
"details_balance_hide": "Скрыть баланс",
"details_balance_show": "Показать баланс",
"details_block": "Номер Блока",
"details_copy": "копировать",
"details_from": "От",
@ -307,6 +312,7 @@
"details_transaction_details": "Детали транзакции",
"enable_hw": "Кошелек не используется вместе с аппаратным. Вы хотите включить поддержку аппаратного кошелека?",
"list_conf": "{number} подтв.",
"pending": "В процессе",
"list_title": "Мои транзакции",
"rbf_explain": "Мы заменим эту транзакцию другой с более высокой комиссией, поэтому будет обработана быстрее. Это называется RBF - Replace By Fee.",
"rbf_title": "Повысить комиссию (RBF)",
@ -315,7 +321,7 @@
"transactions_count": "кол-во транзакций"
},
"wallets": {
"add_bitcoin_explain": "Simple and powerful Bitcoin wallet",
"add_bitcoin_explain": "Простой и мощный Биткойн кошелек",
"add_bitcoin": "Bitcoin",
"add_create": "Создать",
"add_entropy_generated": "{gen} байтов сгенерированной энтории",
@ -324,7 +330,7 @@
"add_import_wallet": "Импортировать кошелек",
"import_file": "Импортировать файл",
"add_lightning": "Lightning",
"add_lightning_explain": "For spending with instant transactions",
"add_lightning_explain": "Для мгновенных переводов",
"add_lndhub": "Подключиться к своему LNDHub",
"add_lndhub_error": "Не верный адрес LNDHub.",
"add_lndhub_placeholder": "Адрес хоста",
@ -389,10 +395,11 @@
"xpub_title": "XPUB кошелька"
},
"multisig": {
"multisig_vault": "Vault",
"multisig_vault_explain": "Best security for large amounts",
"multisig_vault": "Хранилище",
"multisig_vault_explain": "Лучшая безопасность для больших сумм",
"provide_signature": "Предоставить подпись",
"vault_key": "Ключ хранилища {number}",
"required_keys_out_of_total": "Требуемое количество ключей",
"fee": "Коммисия: {number}",
"fee_btc": "{number} BTC",
"confirm": "Поддтвердить",
@ -402,6 +409,42 @@
"scan_or_import_file": "Сканировать или импортировать файл",
"export_coordination_setup": "экспортировать настройки координатора",
"cosign_this_transaction": "Участвовать в совместном подписании транзакции?",
"co_sign_transaction": "Подписать транзакцию \"по воздуху\" (QRCode)"
"lets_start": "Давайте начнем",
"create": "Создать",
"provide_key": "Предоставить ключ",
"native_segwit_title": "Лучшая практика",
"wrapped_segwit_title": "Лучшая совместимость",
"legacy_title": "Устаревший",
"co_sign_transaction": "Подписать транзакцию \"по воздуху\" (QRCode)",
"what_is_vault": "Хранилище — это",
"what_is_vault_numberOfWallets": "{m} из {n} мультисиг",
"what_is_vault_wallet": "кошелёк",
"vault_advanced_customize": "Настройки Хранилища...",
"needs": "Нужно",
"what_is_vault_description_number_of_vault_keys": "{m} ключа хранилища",
"what_is_vault_description_to_spend": "чтобы потратить и третий мы можете \nиспользовать как резервный",
"quorum": "{m} из {n} кворум",
"quorum_header": "Кворум",
"of": "из",
"wallet_type": "Тип кошелька",
"view_key": "посмотреть",
"invalid_mnemonics": "Сид-фраза не верна",
"invalid_cosigner": "Не действительные данные cosigner",
"invalid_cosigner_format": "Не верный cosigner: он не подходит для {format} формата",
"create_new_key": "Создать Новый",
"scan_or_open_file": "Сканировать или открыть файл",
"i_have_mnemonics": "У меня есть сид-фраза для этого ключа...",
"please_write_down_mnemonics": "Пожалуйста, запишите эту мнемоническую фразу на листе бумаги. Не волнуйтесь, это можно сделать и потом.",
"i_wrote_it_down": "Я всё записал!",
"type_your_mnemonics": "Вставьте сид-фразу для импорта вашего ключа хранилища",
"this_is_cosigners_xpub": "Это xpub cosigner'а готов к импорту в другой кошелёк. Делится им безопасно.",
"wallet_key_created": "Ваш ключ Хранилища был создан. Обязательно сделайте резервную копию вашей сид-фразы",
"are_you_sure_seed_will_be_lost": "Вы уверены? Ваша сид-фраза будет утеряна если нет резервной копии",
"forget_this_seed": "Забыть сид-фразу и использовать xpub вместо неё",
"invalid_fingerprint": "Отпечаток этой сид-фразы не соответствует отпечатку фразы cosigner'a ",
"view_edit_cosigners": "Просмотр/редактирование cosigner'ов",
"this_cosigner_is_already_imported": "Этот cosigner уже импортирован",
"export_signed_psbt": "Экспортировать PSBT с подписью",
"view_edit_cosigners_title": "Редактировать Cosigner'ов"
}
}

24
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "bluewallet",
"version": "5.6.5",
"version": "5.6.6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -9100,9 +9100,9 @@
}
},
"dayjs": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.1.tgz",
"integrity": "sha512-01NCTBg8cuMJG1OQc6PR7T66+AFYiPwgDvdJmvJBn29NGzIG+DIFxPLNjHzwz3cpFIvG+NcwIjP9hSaPVoOaDg=="
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.4.tgz",
"integrity": "sha512-ABSF3alrldf7nM9sQ2U+Ln67NRwmzlLOqG7kK03kck0mw3wlSSEKv/XhKGGxUjQcS57QeiCyNdrFgtj9nWlrng=="
},
"debug": {
"version": "4.1.1",
@ -10036,9 +10036,9 @@
}
},
"eslint-config-prettier": {
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz",
"integrity": "sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==",
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz",
"integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==",
"requires": {
"get-stdin": "^6.0.0"
}
@ -18096,9 +18096,9 @@
"optional": true
},
"prettier": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz",
"integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw=="
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
"integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg=="
},
"prettier-linter-helpers": {
"version": "1.0.0",
@ -19091,8 +19091,8 @@
"integrity": "sha512-vJzJE3zI1XUtqthrX3Dh2TBQWB+xFyaGhF52KBq9FjJUN5ws4xpLZJxBWa1KbGV3DilmcSZ4jmZR5LGordwE7w=="
},
"react-native-secure-key-store": {
"version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4ba25dedb3d5ae15c22fd0ea0555116055630966",
"from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4ba25dedb3d5ae15c22fd0ea0555116055630966"
"version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a",
"from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a"
},
"react-native-share": {
"version": "4.0.2",

View File

@ -1,6 +1,6 @@
{
"name": "bluewallet",
"version": "5.6.5",
"version": "5.6.6",
"license": "MIT",
"devDependencies": {
"@babel/core": "^7.10.4",
@ -93,12 +93,12 @@
"buffer-reverse": "1.0.1",
"coinselect": "3.1.12",
"crypto-js": "3.1.9-1",
"dayjs": "1.9.1",
"dayjs": "1.9.4",
"detox": "17.10.2",
"ecurve": "1.0.6",
"electrum-client": "git+https://github.com/BlueWallet/rn-electrum-client.git#f9a827e724a5a2e578fdfdb483f83793af55b030",
"electrum-mnemonic": "2.0.0",
"eslint-config-prettier": "6.12.0",
"eslint-config-prettier": "6.14.0",
"eslint-config-standard": "14.1.1",
"eslint-config-standard-react": "9.2.0",
"eslint-plugin-prettier": "3.1.4",
@ -112,7 +112,7 @@
"path-browserify": "1.0.1",
"payjoin-client": "git+https://github.com/bitcoinjs/payjoin-client.git#31d2118a4c0d00192d975f3a6da2a96238f8f7a5",
"pbkdf2": "3.1.1",
"prettier": "2.1.1",
"prettier": "2.1.2",
"process": "0.11.10",
"prop-types": "15.7.2",
"react": "16.13.1",
@ -148,7 +148,7 @@
"react-native-reanimated": "1.13.1",
"react-native-safe-area-context": "3.1.8",
"react-native-screens": "2.11.0",
"react-native-secure-key-store": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4ba25dedb3d5ae15c22fd0ea0555116055630966",
"react-native-secure-key-store": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a",
"react-native-share": "4.0.2",
"react-native-snap-carousel": "3.9.1",
"react-native-sortable-list": "0.0.24",

View File

@ -30,6 +30,7 @@ const NotificationSettings = () => {
setNotificationsEnabled(value); // so the slider is not 'jumpy'
if (value) {
// user is ENABLING notifications
await Notifications.cleanUserOptOutFlag();
if (await Notifications.getPushToken()) {
// we already have a token, so we just need to reenable ALL level on groundcontrol:
await Notifications.setLevels(true);

View File

@ -154,7 +154,8 @@ const WalletsAddMultisigStep2 = () => {
throw new Error('This should never happen');
}
for (const cc of cosigners) {
w.addCosigner(cc[0], cc[1], cc[2]);
const fp = cc[1] || getFpCacheForMnemonics(cc[0]);
w.addCosigner(cc[0], fp, cc[2]);
}
w.setLabel('Multisig Vault');
await w.fetchBalance();

View File

@ -33,7 +33,6 @@ const A = require('../../blue_modules/analytics');
const LocalQRCode = require('@remobile/react-native-qrcode-local-image');
const WalletsListSections = { CAROUSEL: 'CAROUSEL', LOCALTRADER: 'LOCALTRADER', TRANSACTIONS: 'TRANSACTIONS' };
let lastSnappedTo = 0;
const isDesktop = getSystemName() === 'Mac OS X';
const WalletsList = () => {
@ -135,14 +134,20 @@ const WalletsList = () => {
};
/**
* Forcefully fetches TXs and balance for lastSnappedTo (i.e. current) wallet.
* Forcefully fetches TXs and balance for ALL wallets.
* Triggered manually by user on pull-to-refresh.
*/
const refreshTransactions = () => {
setIsLoading(true);
refreshAllWalletTransactions(lastSnappedTo).finally(() => setIsLoading(false));
refreshAllWalletTransactions().finally(() => setIsLoading(false));
};
useEffect(
refreshTransactions,
// eslint-disable-next-line react-hooks/exhaustive-deps
[],
); // call refreshTransactions() only once, when screen mounts
const handleClick = index => {
console.log('click', index);
const wallet = carouselData[index];
@ -186,7 +191,11 @@ const WalletsList = () => {
const onSnapToItem = index => {
console.log('onSnapToItem', index);
lastSnappedTo = index;
if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) {
console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both');
setIsLoading(true);
refreshAllWalletTransactions(index).finally(() => setIsLoading(false));
}
};
const renderListHeaderComponent = () => {
@ -222,6 +231,7 @@ const WalletsList = () => {
};
const renderLocalTrader = () => {
if (carouselData.every(wallet => wallet === false)) return null;
if (carouselData.length > 0 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) {
return (
<TouchableOpacity

View File

@ -15,8 +15,15 @@ export default class WalletMigrate {
// 0: Let's start!
async start() {
if (Platform.OS === 'ios') {
const defaultPreferenceGroupName = await DefaultPreference.getName();
console.log('----- defaultPreferenceGroupName');
console.log(defaultPreferenceGroupName);
console.log('----- ');
const isNotFirstLaunch = await DefaultPreference.get('RnSksIsAppInstalled');
if (!isNotFirstLaunch) {
console.log('----- isNotFirstLaunch');
console.log(isNotFirstLaunch);
console.log('----- ');
if (isNotFirstLaunch === undefined) {
try {
console.warn('It is the first launch...');
await RNSecureKeyStore.setResetOnAppUninstallTo(false);
@ -26,10 +33,11 @@ export default class WalletMigrate {
console.log('----- ');
await RNSecureKeyStore.setResetOnAppUninstallTo(deleteWalletsFromKeychain === '1');
await RNSecureKeyStore.get(AppStorage.DELETE_WALLET_AFTER_UNINSTALL);
await DefaultPreference.set('RnSksIsAppInstalled', '1');
} catch (e) {
console.log(e);
}
} else {
console.warn('It is NOT the first launch...');
}
await DefaultPreference.set('RnSksIsAppInstalled', '1');
}

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash
TAG=`git tag | sort | tail -n 1`
HASH=`git show-ref -s $TAG`
git log --pretty=format:'* %s %b' $HASH..HEAD | grep -v "Merge branch 'master'" | grep -v "Merge remote-tracking branch 'origin/master'"
git log --pretty=format:'* %s %b' $HASH..HEAD | grep -v "Merge branch 'master'" | grep -v "Merge remote-tracking branch 'origin/master'" | grep -v "Merge pull request"

View File

@ -711,6 +711,13 @@ describe('multisig-wallet (native segwit)', () => {
assert.strictEqual(w.getCosignerForFingerprint(fp1cobo), Zpub1);
assert.strictEqual(w.getCosignerForFingerprint(fp2coldcard), process.env.MNEMONICS_COLDCARD);
assert.strictEqual(w.howManySignaturesCanWeMake(), 1);
// now, provide fp with mnemonics and expect that wallet wont recalculate fp, and will use provided
w = new MultisigHDWallet();
w.addCosigner(process.env.MNEMONICS_COLDCARD, 'DEADBABE');
w.addCosigner(process.env.MNEMONICS_COBO);
assert.strictEqual(w.getFingerprint(1), 'DEADBABE');
assert.strictEqual(w.getCosignerForFingerprint('DEADBABE'), process.env.MNEMONICS_COLDCARD);
});
it('basic operations work for 2-of-3', async () => {