Merge branch 'master' into complicationprice

This commit is contained in:
marcosrdz 2021-02-09 13:43:30 -05:00
commit 657f7a0918
21 changed files with 396 additions and 319 deletions

View file

@ -1265,7 +1265,7 @@ export const BlueReceiveButtonIcon = props => {
);
};
export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = BitcoinUnit.BTC, timeElapsed }) => {
export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = BitcoinUnit.BTC, walletID }) => {
const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1);
const { colors } = useTheme();
const { navigate } = useNavigation();
@ -1422,46 +1422,38 @@ export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = Bitco
const onPress = useCallback(async () => {
if (item.hash) {
navigate('TransactionStatus', { hash: item.hash });
navigate('TransactionStatus', { hash: item.hash, walletID });
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') {
const lightningWallet = wallets.filter(wallet => {
if (typeof wallet === 'object') {
if ('secret' in wallet) {
return wallet.getSecret() === item.fromWallet;
}
try {
// is it a successful lnurl-pay?
const LN = new Lnurl(false, AsyncStorage);
let paymentHash = item.payment_hash;
if (typeof paymentHash === 'object') {
paymentHash = Buffer.from(paymentHash.data).toString('hex');
}
});
if (lightningWallet.length === 1) {
try {
// is it a successful lnurl-pay?
const LN = new Lnurl(false, AsyncStorage);
let paymentHash = item.payment_hash;
if (typeof paymentHash === 'object') {
paymentHash = Buffer.from(paymentHash.data).toString('hex');
}
const loaded = await LN.loadSuccessfulPayment(paymentHash);
if (loaded) {
NavigationService.navigate('ScanLndInvoiceRoot', {
screen: 'LnurlPaySuccess',
params: {
paymentHash,
justPaid: false,
fromWalletID: lightningWallet[0].getID(),
},
});
return;
}
} catch (e) {
console.log(e);
const loaded = await LN.loadSuccessfulPayment(paymentHash);
if (loaded) {
NavigationService.navigate('ScanLndInvoiceRoot', {
screen: 'LnurlPaySuccess',
params: {
paymentHash,
justPaid: false,
fromWalletID: walletID,
},
});
return;
}
navigate('LNDViewInvoice', {
invoice: item,
walletID: lightningWallet[0].getID(),
isModal: false,
});
} catch (e) {
console.log(e);
}
navigate('LNDViewInvoice', {
invoice: item,
walletID,
isModal: false,
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [item, wallets]);
@ -1484,7 +1476,7 @@ export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = Bitco
onPress={onPress}
onLongPress={onLongPress}
chevron={false}
Component={TouchableOpacity}
Component={item.type === 'bitcoind_tx' ? View : TouchableOpacity}
rightTitle={rowTitle}
rightTitleStyle={rowTitleStyle}
containerStyle={containerStyle}

View file

@ -21,7 +21,6 @@ export const BlueStorageProvider = ({ children }) => {
const [language, _setLanguage] = useState();
const getPreferredCurrencyAsyncStorage = useAsyncStorage(AppStorage.PREFERRED_CURRENCY).getItem;
const getLanguageAsyncStorage = useAsyncStorage(AppStorage.LANG).getItem;
const [newWalletAdded, setNewWalletAdded] = useState(false);
const [isHandOffUseEnabled, setIsHandOffUseEnabled] = useState(false);
const [isDrawerListBlurred, _setIsDrawerListBlurred] = useState(false);
@ -213,8 +212,6 @@ export const BlueStorageProvider = ({ children }) => {
sleep,
setHodlHodlApiKey,
createFakeStorage,
newWalletAdded,
setNewWalletAdded,
resetWallets,
getHodlHodlApiKey,
decryptStorage,

View file

@ -567,6 +567,7 @@ export class AppStorage {
const walletTransactions = wallet.getTransactions();
for (const t of walletTransactions) {
t.walletPreferredBalanceUnit = wallet.getPreferredBalanceUnit();
t.walletID = wallet.getID();
}
txs = txs.concat(walletTransactions);
}

View file

@ -27,7 +27,7 @@ const wif = require('wif');
const prompt = require('../blue_modules/prompt');
function WalletImport() {
const { wallets, pendingWallets, setPendingWallets, saveToDisk, addWallet, setNewWalletAdded } = useContext(BlueStorageContext);
const { wallets, pendingWallets, setPendingWallets, saveToDisk, addWallet } = useContext(BlueStorageContext);
/**
*
@ -53,7 +53,6 @@ function WalletImport() {
}
addWallet(w);
await saveToDisk();
setNewWalletAdded(true);
A(A.ENUM.CREATED_WALLET);
alert(loc.wallets.import_success);
Notifications.majorTomToGroundControl(w.getAllExternalAddresses(), [], []);

View file

@ -164,12 +164,25 @@ export class AbstractWallet {
}
try {
const parsedSecret = JSON.parse(this.secret);
let parsedSecret;
// regex might've matched invalid data. if so, parse newSecret.
if (this.secret.trim().length > 0) {
try {
parsedSecret = JSON.parse(this.secret);
} catch (e) {
console.log(e);
parsedSecret = JSON.parse(newSecret);
}
} else {
parsedSecret = JSON.parse(newSecret);
}
if (parsedSecret && parsedSecret.keystore && parsedSecret.keystore.xpub) {
let masterFingerprint = false;
if (parsedSecret.keystore.ckcc_xfp) {
// It is a ColdCard Hardware Wallet
masterFingerprint = Number(parsedSecret.keystore.ckcc_xfp);
} else if (parsedSecret.keystore.root_fingerprint) {
masterFingerprint = Number(parsedSecret.keystore.root_fingerprint);
}
if (parsedSecret.keystore.label) {
this.setLabel(parsedSecret.keystore.label);

View file

@ -480,7 +480,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet {
}
// is it electrum json?
if (json && json.wallet_type) {
if (json && json.wallet_type && json.wallet_type !== 'standard') {
const mofn = json.wallet_type.split('of');
this.setM(parseInt(mofn[0].trim()));
const n = parseInt(mofn[1].trim());

View file

@ -97,7 +97,7 @@
6DEB4C3B254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; };
6DEB4C3C254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; };
6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; };
6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; };
6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; };
6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; };
764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; };
782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; };
@ -501,7 +501,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */,
6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -849,6 +849,7 @@
2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */,
3271B0B6236E2E0700DA766F /* Embed App Extensions */,
C18D00A61007A84C9887DEDE /* [CP] Copy Pods Resources */,
68CD4C52AC5B27E333599B5C /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -1003,7 +1004,7 @@
);
name = "BlueWalletWatch Extension";
packageProductDependencies = (
6DFC806F24EA0B6C007B8700 /* EFQRCode */,
6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */,
);
productName = "BlueWalletWatch Extension";
productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */;
@ -1098,7 +1099,7 @@
);
mainGroup = 83CBB9F61A601CBA00E9B192;
packageReferences = (
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */,
6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */,
);
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
@ -1250,6 +1251,24 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
68CD4C52AC5B27E333599B5C /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
6F7747C31A9EE6DDC5108476 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -2537,7 +2556,7 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = {
6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/EFPrefix/EFQRCode.git";
requirement = {
@ -2548,9 +2567,9 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
6DFC806F24EA0B6C007B8700 /* EFQRCode */ = {
6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = {
isa = XCSwiftPackageProductDependency;
package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */;
package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */;
productName = EFQRCode;
};
/* End XCSwiftPackageProductDependency section */

View file

@ -12,11 +12,12 @@ target 'BlueWallet' do
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
use_flipper!
use_flipper!({ 'Flipper' => '0.74.0' })
post_install do |installer|
flipper_post_install(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
if ['React-Core-AccessibilityResources'].include? target.name
config.build_settings['CODE_SIGN_STYLE'] = "Manual"
config.build_settings['CODE_SIGN_IDENTITY'] = "Apple Distribution: Bluewallet Services, S. R. L. (A7W54YZ4WU)"

View file

@ -2,8 +2,7 @@ PODS:
- boost-for-react-native (1.63.0)
- BVLinearGradient (2.5.6):
- React
- CocoaAsyncSocket (7.6.4)
- CocoaLibEvent (1.0.0)
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
- FBLazyVector (0.63.3)
- FBReactNativeSpec (0.63.3):
@ -13,50 +12,50 @@ PODS:
- React-Core (= 0.63.3)
- React-jsi (= 0.63.3)
- ReactCommon/turbomodule/core (= 0.63.3)
- Flipper (0.54.0):
- Flipper-Folly (~> 2.2)
- Flipper-RSocket (~> 1.1)
- Flipper (0.74.0):
- Flipper-Folly (~> 2.5)
- Flipper-RSocket (~> 1.3)
- Flipper-DoubleConversion (1.1.7)
- Flipper-Folly (2.3.0):
- Flipper-Folly (2.5.1):
- boost-for-react-native
- CocoaLibEvent (~> 1.0)
- Flipper-DoubleConversion
- Flipper-Glog
- OpenSSL-Universal (= 1.0.2.20)
- libevent (~> 2.1.12)
- OpenSSL-Universal (= 1.1.180)
- Flipper-Glog (0.3.6)
- Flipper-PeerTalk (0.0.4)
- Flipper-RSocket (1.1.0):
- Flipper-Folly (~> 2.2)
- FlipperKit (0.54.0):
- FlipperKit/Core (= 0.54.0)
- FlipperKit/Core (0.54.0):
- Flipper (~> 0.54.0)
- Flipper-RSocket (1.3.0):
- Flipper-Folly (~> 2.5)
- FlipperKit (0.74.0):
- FlipperKit/Core (= 0.74.0)
- FlipperKit/Core (0.74.0):
- Flipper (~> 0.74.0)
- FlipperKit/CppBridge
- FlipperKit/FBCxxFollyDynamicConvert
- FlipperKit/FBDefines
- FlipperKit/FKPortForwarding
- FlipperKit/CppBridge (0.54.0):
- Flipper (~> 0.54.0)
- FlipperKit/FBCxxFollyDynamicConvert (0.54.0):
- Flipper-Folly (~> 2.2)
- FlipperKit/FBDefines (0.54.0)
- FlipperKit/FKPortForwarding (0.54.0):
- FlipperKit/CppBridge (0.74.0):
- Flipper (~> 0.74.0)
- FlipperKit/FBCxxFollyDynamicConvert (0.74.0):
- Flipper-Folly (~> 2.5)
- FlipperKit/FBDefines (0.74.0)
- FlipperKit/FKPortForwarding (0.74.0):
- CocoaAsyncSocket (~> 7.6)
- Flipper-PeerTalk (~> 0.0.4)
- FlipperKit/FlipperKitHighlightOverlay (0.54.0)
- FlipperKit/FlipperKitLayoutPlugin (0.54.0):
- FlipperKit/FlipperKitHighlightOverlay (0.74.0)
- FlipperKit/FlipperKitLayoutPlugin (0.74.0):
- FlipperKit/Core
- FlipperKit/FlipperKitHighlightOverlay
- FlipperKit/FlipperKitLayoutTextSearchable
- YogaKit (~> 1.18)
- FlipperKit/FlipperKitLayoutTextSearchable (0.54.0)
- FlipperKit/FlipperKitNetworkPlugin (0.54.0):
- FlipperKit/FlipperKitLayoutTextSearchable (0.74.0)
- FlipperKit/FlipperKitNetworkPlugin (0.74.0):
- FlipperKit/Core
- FlipperKit/FlipperKitReactPlugin (0.54.0):
- FlipperKit/FlipperKitReactPlugin (0.74.0):
- FlipperKit/Core
- FlipperKit/FlipperKitUserDefaultsPlugin (0.54.0):
- FlipperKit/FlipperKitUserDefaultsPlugin (0.74.0):
- FlipperKit/Core
- FlipperKit/SKIOSNetworkPlugin (0.54.0):
- FlipperKit/SKIOSNetworkPlugin (0.74.0):
- FlipperKit/Core
- FlipperKit/FlipperKitNetworkPlugin
- Folly (2020.01.13.00):
@ -72,13 +71,12 @@ PODS:
- GCDWebServer/Core (= 3.5.4)
- GCDWebServer/Core (3.5.4)
- glog (0.3.5)
- libevent (2.1.12)
- lottie-ios (3.1.8)
- lottie-react-native (3.5.0):
- lottie-ios (~> 3.1.8)
- React
- OpenSSL-Universal (1.0.2.20):
- OpenSSL-Universal/Static (= 1.0.2.20)
- OpenSSL-Universal/Static (1.0.2.20)
- OpenSSL-Universal (1.1.180)
- PasscodeAuth (1.0.0):
- React
- RCTRequired (0.63.3)
@ -251,13 +249,13 @@ PODS:
- React
- react-native-blur (0.8.0):
- React
- react-native-camera (3.40.0):
- react-native-camera (3.42.0):
- React-Core
- react-native-camera/RCT (= 3.40.0)
- react-native-camera/RN (= 3.40.0)
- react-native-camera/RCT (3.40.0):
- react-native-camera/RCT (= 3.42.0)
- react-native-camera/RN (= 3.42.0)
- react-native-camera/RCT (3.42.0):
- React-Core
- react-native-camera/RN (3.40.0):
- react-native-camera/RN (3.42.0):
- React-Core
- react-native-document-picker (3.5.4):
- React
@ -342,7 +340,7 @@ PODS:
- React-Core (= 0.63.3)
- React-cxxreact (= 0.63.3)
- React-jsi (= 0.63.3)
- RealmJS (6.1.4):
- RealmJS (10.2.0):
- GCDWebServer
- React
- RemobileReactNativeQrcodeLocalImage (1.0.4):
@ -367,7 +365,7 @@ PODS:
- React
- RNInAppBrowser (3.5.1):
- React-Core
- RNLocalize (1.4.2):
- RNLocalize (2.0.1):
- React-Core
- RNPrivacySnapshot (1.0.0):
- React
@ -379,14 +377,14 @@ PODS:
- React-Core
- RNReanimated (1.13.1):
- React
- RNScreens (2.11.0):
- React
- RNScreens (2.16.1):
- React-Core
- RNSecureKeyStore (1.0.0):
- React
- RNSentry (1.9.0):
- React-Core
- Sentry (~> 5.2.0)
- RNShare (4.0.2):
- RNShare (5.1.0):
- React-Core
- RNSVG (12.1.0):
- React
@ -409,25 +407,25 @@ DEPENDENCIES:
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
- Flipper (~> 0.54.0)
- Flipper (= 0.74.0)
- Flipper-DoubleConversion (= 1.1.7)
- Flipper-Folly (~> 2.2)
- Flipper-Glog (= 0.3.6)
- Flipper-PeerTalk (~> 0.0.4)
- Flipper-RSocket (~> 1.1)
- FlipperKit (~> 0.54.0)
- FlipperKit/Core (~> 0.54.0)
- FlipperKit/CppBridge (~> 0.54.0)
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.54.0)
- FlipperKit/FBDefines (~> 0.54.0)
- FlipperKit/FKPortForwarding (~> 0.54.0)
- FlipperKit/FlipperKitHighlightOverlay (~> 0.54.0)
- FlipperKit/FlipperKitLayoutPlugin (~> 0.54.0)
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.54.0)
- FlipperKit/FlipperKitNetworkPlugin (~> 0.54.0)
- FlipperKit/FlipperKitReactPlugin (~> 0.54.0)
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.54.0)
- FlipperKit/SKIOSNetworkPlugin (~> 0.54.0)
- FlipperKit (= 0.74.0)
- FlipperKit/Core (= 0.74.0)
- FlipperKit/CppBridge (= 0.74.0)
- FlipperKit/FBCxxFollyDynamicConvert (= 0.74.0)
- FlipperKit/FBDefines (= 0.74.0)
- FlipperKit/FKPortForwarding (= 0.74.0)
- FlipperKit/FlipperKitHighlightOverlay (= 0.74.0)
- FlipperKit/FlipperKitLayoutPlugin (= 0.74.0)
- FlipperKit/FlipperKitLayoutTextSearchable (= 0.74.0)
- FlipperKit/FlipperKitNetworkPlugin (= 0.74.0)
- FlipperKit/FlipperKitReactPlugin (= 0.74.0)
- FlipperKit/FlipperKitUserDefaultsPlugin (= 0.74.0)
- FlipperKit/SKIOSNetworkPlugin (= 0.74.0)
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- lottie-ios (from `../node_modules/lottie-ios`)
@ -502,7 +500,6 @@ SPEC REPOS:
trunk:
- boost-for-react-native
- CocoaAsyncSocket
- CocoaLibEvent
- Flipper
- Flipper-DoubleConversion
- Flipper-Folly
@ -511,6 +508,7 @@ SPEC REPOS:
- Flipper-RSocket
- FlipperKit
- GCDWebServer
- libevent
- OpenSSL-Universal
- Sentry
- YogaKit
@ -668,24 +666,24 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845
CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: 878b59e31113e289e275165efbe4b54fa614d43d
FBReactNativeSpec: 7da9338acfb98d4ef9e5536805a0704572d33c2f
Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365
Flipper: c1ad50344bffdce628b1906b48f6e7cd06724236
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a
Flipper-Folly: f7a3caafbd74bda4827954fd7a6e000e36355489
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7
FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d
Flipper-RSocket: 602921fee03edacf18f5d6f3d3594ba477f456e5
FlipperKit: f42987ea58737ac0fb3fbc38f8e703452ba56940
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
lottie-ios: 48fac6be217c76937e36e340e2d09cf7b10b7f5f
lottie-react-native: 1fb4ce21d6ad37dab8343eaff8719df76035bd93
OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd
OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b
PasscodeAuth: 1cc99b13d8e4de4716d7e2b4069af2f1a9de30b2
RCTRequired: 48884c74035a0b5b76dbb7a998bd93bcfc5f2047
RCTTypeSafety: edf4b618033c2f1c5b7bc3d90d8e085ed95ba2ab
@ -699,7 +697,7 @@ SPEC CHECKSUMS:
React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2
react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
react-native-camera: 5c1fbfecf63b802b8ca4a71c60d30a71550fb348
react-native-camera: d145df27a9178041b48b839b80ad79c9ef373fbd
react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf
react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0
react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b
@ -721,7 +719,7 @@ SPEC CHECKSUMS:
React-RCTText: 65a6de06a7389098ce24340d1d3556015c38f746
React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454
ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3
RealmJS: 899b4839a8bee46e248bc277995ad58da855e41f
RealmJS: 5195064e9aeccf94ae3756bd9d0f2301b9074b07
RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa
RNCAsyncStorage: 32c7cbe1d43dff5f03f3d0b9e9d2c44d8ec91a3a
RNCClipboard: 5e299c6df8e0c98f3d7416b86ae563d3a9f768a3
@ -733,16 +731,16 @@ SPEC CHECKSUMS:
RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39
RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa
RNInAppBrowser: 3733c1aa6699983a1c9b4963e85d5e5a48ad297e
RNLocalize: 4071198b59b461f3b74eebc5fee8c50f13e39e79
RNLocalize: dcf0fdb332b37b0d24178e876a7ce4dbbc9c838d
RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93
RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf
RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285
RNReanimated: dd8c286ab5dd4ba36d3a7fef8bff7e08711b5476
RNScreens: 0e91da98ab26d5d04c7b59a9b6bd694124caf88c
RNScreens: 45c457af3d2ee9e08fc01e70da87e653d46b1198
RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8
RNSentry: 1adaa43b01c6a3ab5091d4d1add66b7c58558898
RNShare: 7a7277f3c313652422d9de072ac50714dff5e8a4
RNShare: fed99fd743f80ca255903c1da46fc9a6430efab6
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59
RNWatch: e4c5d19506c94506860032fb68aedd5991beb985
@ -752,6 +750,6 @@ SPEC CHECKSUMS:
Yoga: 7d13633d129fd179e01b8953d38d47be90db185a
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
PODFILE CHECKSUM: b3a4c68ed1fc7dace2357d96ad07c3e104e0afe2
PODFILE CHECKSUM: 0a9cc46978a031458f110f72f4b1f21d675a659a
COCOAPODS: 1.10.0

View file

@ -9,7 +9,7 @@
"ok": "OK",
"storage_is_encrypted": "Your storage is encrypted. Password is required to decrypt it.",
"allow": "Allow",
"dont_allow": "Don't Allow",
"dont_allow": "Dont Allow",
"yes": "Yes",
"no": "No",
"save": "Save",
@ -35,67 +35,67 @@
"undo": "Undo"
},
"errors": {
"broadcast": "Broadcast failed",
"broadcast": "Broadcast failed.",
"error": "Error",
"network": "Network Error"
},
"hodl": {
"are_you_sure_you_want_to_logout": "Are you sure you want to logout from HodlHodl?",
"are_you_sure_you_want_to_logout": "Are you sure you want to log out from Hodl Hodl?",
"cont_address_escrow": "Escrow",
"cont_address_to": "To",
"cont_buying": "Buying",
"cont_cancel": "Cancel contract",
"cont_cancel_q": "Are you sure you want to cancel this contract?",
"cont_cancel_y": "Yes, cancel contract",
"cont_chat": "Open chat with counterparty",
"cont_chat": "Open chat with the counterparty",
"cont_how": "How to pay",
"cont_no": "You don't have any contracts in progress.",
"cont_paid": "Mark contract as Paid",
"cont_paid_e": "Do this only if you sent funds to the seller via agreed payment method",
"cont_no": "You dont have any contracts in progress.",
"cont_paid": "Mark contract as paid",
"cont_paid_e": "Do this only if you sent funds to the seller via the agreed payment method",
"cont_paid_q": "Are you sure you want to mark this contract as paid?",
"cont_selling": "Selling",
"cont_st_completed": "All done!",
"cont_st_in_progress_buyer": "Coins are in escrow. Please pay seller.",
"cont_st_paid_enought": "Bitcoins are in escrow. Please pay seller\nvia agreed payment method.",
"cont_st_paid_waiting": "Waiting for seller to release coins from escrow",
"cont_st_waiting": "Waiting for seller to deposit bitcoins to escrow",
"cont_title": "My contracts",
"cont_st_in_progress_buyer": "Coins are in escrow. Please pay the seller.",
"cont_st_paid_enought": "Bitcoins are in escrow. Please pay the seller\nvia the agreed payment method.",
"cont_st_paid_waiting": "Waiting for the seller to release the coins from escrow",
"cont_st_waiting": "Waiting for the seller to deposit bitcoins to escrow",
"cont_title": "My Contracts",
"filter_any": "Any",
"filter_buying": "Buying",
"filter_country_global": "Global Offers",
"filter_currency": "Currency",
"filter_detail": "Detail",
"filter_filters": "Filters",
"filter_iambuying": "I'm buying bitcoin",
"filter_iamselling": "I'm selling bitcoin",
"filter_iambuying": "Im buying bitcoin",
"filter_iamselling": "Im selling bitcoin",
"filter_method": "Payment Method",
"filter_search": "Search",
"filter_selling": "Selling",
"item_minmax": "Min/Max",
"item_nooffers": "No offers. Try to change \"Near me\" to Global offers.",
"item_nooffers": "No offers. Try to change “Near me” to “Global Offers.”",
"item_rating": "{rating} trades",
"item_rating_no": "No rating",
"local_trader": "Local Trader",
"local_trader_new": "New",
"login": "Login",
"logout": "logout",
"mycont": "My contracts",
"logout": "Logout",
"mycont": "My Contracts",
"offer_accept": "Accept offer",
"offer_account_finish": "Looks like you didn't finish setting up account on HodlHodl. Would you like to finish setup now?",
"offer_choosemethod": "Choose payment method",
"offer_account_finish": "It looks like you didnt finish setting up an account on Hodl Hodl. Would you like to finish setup now?",
"offer_choosemethod": "Choose Payment Method",
"offer_confirmations": "confirmations",
"offer_minmax": "Min/Max",
"offer_minutes": "Min",
"offer_promt_fiat": "How much {currency} do you want to buy?",
"offer_promt_fiat_e": "For example, 100",
"offer_window": "window",
"p2p": "Buy Bitcoin on a p2p exchange"
"offer_window": "Window",
"p2p": "Buy Bitcoin on a Peer-to-Peer Exchange"
},
"lnd": {
"errorInvoiceExpired": "Invoice expired",
"exchange": "Exchange",
"expired": "Expired",
"expiredLow": "expired",
"expiredLow": "Expired",
"expiresIn": "Expires: {time}",
"payButton": "Pay",
"placeholder": "Invoice",
@ -105,26 +105,26 @@
"refill_create": "In order to proceed, please create a Bitcoin wallet to refill with.",
"refill_external": "Refill with External Wallet",
"refill_lnd_balance": "Refill Lightning Wallet Balance",
"sameWalletAsInvoiceError": "You cannot pay an invoice with the same wallet used to create it.",
"sameWalletAsInvoiceError": "You cant pay an invoice with the same wallet used to create it.",
"title": "Manage Funds"
},
"lndViewInvoice": {
"additional_info": "Additional Information",
"for": "For:",
"lightning_invoice": "Lightning Invoice",
"has_been_paid": "This invoice has been paid for",
"has_been_paid": "This invoice has been paid.",
"open_direct_channel": "Open direct channel with this node:",
"please_pay": "Please pay",
"preimage": "Preimage",
"sats": "sats",
"wasnt_paid_and_expired": "This invoice was not paid for and has expired."
"sats": "sats.",
"wasnt_paid_and_expired": "This invoice was not paid and has expired."
},
"plausibledeniability": {
"create_fake_storage": "Create Encrypted Storage",
"create_password": "Create a password",
"create_password_explanation": "Password for fake storage should not match the password for your main storage.",
"help": "Under certain circumstances, you might be forced to disclose a password. To keep your coins safe, BlueWallet can create another encrypted storage with a different password. Under pressure, you can disclose this password to a 3rd party. If entered in BlueWallet, it will unlock a new “fake” storage. This will seem legit to the third party, but it will secretly keep your main storage with coins safe.",
"help2": "The new storage will be fully functional, and you can store some minimum amounts there so it looks more believable.",
"create_password_explanation": "Password for the fake storage should not match the password for your main storage.",
"help": "Under certain circumstances, you might be forced to disclose a password. To keep your coins safe, BlueWallet can create another encrypted storage with a different password. Under pressure, you may disclose this password to a third party. If entered in BlueWallet, it will unlock a new “fake” storage. This will seem legit to the third party, but it will secretly keep your main storage with coins safe.",
"help2": "The new storage will be fully functional, and you can store some minimum amounts there so that it looks more believable.",
"password_should_not_match": "Password is currently in use. Please try a different password.",
"passwords_do_not_match": "Passwords do not match. Please try again.",
"retype_password": "Re-type password",
@ -132,21 +132,21 @@
"title": "Plausible Deniability"
},
"pleasebackup": {
"ask": "Have you saved your wallet's backup phrase? This backup phrase is required to access your funds in case you lose this device. Without the backup phrase, your funds will be permanently lost.",
"ask": "Have you saved your wallets backup phrase? This backup phrase is required to access your funds in case you lose this device. Without the backup phrase, your funds will be permanently lost.",
"ask_no": "No, I have not",
"ask_yes": "Yes, I have",
"ok": "OK, I wrote this down.",
"ok_lnd": "OK, I have saved it.",
"text": "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.",
"text": "Please take a moment to write down this mnemonic phrase on a piece of paper. Its your backup you can use to restore the wallet on other device.",
"text_lnd": "Please save this wallet backup. It allows you to restore the wallet in case of loss.",
"text_lnd2": "This wallet is hosted by BlueWallet.",
"title": "Your wallet is created"
"title": "Your wallet has been created."
},
"receive": {
"details_create": "Create",
"details_label": "Description",
"details_setAmount": "Receive with amount",
"details_share": "share",
"details_share": "Share",
"header": "Receive"
},
"send": {
@ -164,28 +164,28 @@
"create_fee": "Fee",
"create_memo": "Memo",
"create_satoshi_per_byte": "Satoshi per byte",
"create_this_is_hex": "This is your transaction's hex—signed and ready to be broadcasted to the network.",
"create_this_is_hex": "This is your transactions hex—signed and ready to be broadcasted to the network.",
"create_to": "To",
"create_tx_size": "Transaction Size",
"create_verify": "Verify on coinb.in",
"details_add_rec_add": "Add Recipient",
"details_add_rec_rem": "Remove Recipient",
"details_address": "Address",
"details_address_field_is_not_valid": "Address field is not valid",
"details_address_field_is_not_valid": "The address is not valid.",
"details_adv_fee_bump": "Allow Fee Bump",
"details_adv_full": "Use Full Balance",
"details_adv_full_remove": "Your other recipients will be removed from this transaction.",
"details_adv_full_sure": "Are you sure you want to use your wallet's full balance for this transaction?",
"details_adv_full_sure": "Are you sure you want to use your wallets full balance for this transaction?",
"details_adv_import": "Import Transaction",
"details_amount_field_is_not_valid": "Amount field is not valid",
"details_amount_field_is_not_valid": "The amount is not valid.",
"details_amount_field_is_less_than_minimum_amount_sat": "The specified amount is too small. Please enter an amount greater than 500 sats.",
"details_create": "Create Invoice",
"details_error_decode": "Error: Unable to decode Bitcoin address",
"details_fee_field_is_not_valid": "Fee field is not valid",
"details_fee_field_is_not_valid": "The fee is not valid.",
"details_next": "Next",
"details_no_maximum": "The selected wallet does not support automatic maximum balance calculation. Are you sure to want to select this wallet?",
"details_no_multiple": "The selected wallet does not support sending Bitcoin to multiple recipients. Are you sure to want to select this wallet?",
"details_no_signed_tx": "The selected file does not contain a transaction that can be imported.",
"details_no_maximum": "The selected wallet doesnt support automatic maximum balance calculation. Are you sure to want to select this wallet?",
"details_no_multiple": "The selected wallet doesnt support sending bitcoin to multiple recipients. Are you sure to want to select this wallet?",
"details_no_signed_tx": "The selected file doesnt contain a transaction that can be imported.",
"details_note_placeholder": "Note to Self",
"details_scan": "Scan",
"details_total_exceeds_balance": "The sending amount exceeds the available balance.",
@ -202,7 +202,7 @@
"fee_custom": "Custom",
"fee_fast": "Fast",
"fee_medium": "Medium",
"fee_replace_min": "The total fee rate (satoshi per byte) you want to pay should be higher than {min} sat/byte",
"fee_replace_min": "The total fee rate (satoshi per byte) you want to pay should be higher than {min} sat/byte.",
"fee_satbyte": "in sat/byte",
"fee_slow": "Slow",
"header": "Send",
@ -223,8 +223,8 @@
"no_tx_signing_in_progress": "There is no transaction signing in progress.",
"psbt_tx_open": "Open Signed Transaction",
"psbt_tx_scan": "Scan Signed Transaction",
"qr_error_no_qrcode": "The selected image does not contain a QR Code.",
"qr_error_no_wallet": "The selected file does not contain a wallet that can be imported.",
"qr_error_no_qrcode": "The selected image doesnt contain a QR Code.",
"qr_error_no_wallet": "The selected file doesnt contain a wallet that can be imported.",
"success_done": "Done",
"txSaved": "The transaction file ({filePath}) has been saved in your Downloads folder.",
"problem_with_psbt": "Problem with PSBT"
@ -256,15 +256,15 @@
"default_wallets": "View All Wallets",
"electrum_connected": "Connected",
"electrum_connected_not": "Not Connected",
"electrum_error_connect": "Can't connect to provided Electrum server",
"electrum_host": "Host, for example {example}",
"electrum_error_connect": "Cant connect to the provided Electrum server",
"electrum_host": "Host, for example, {example}",
"electrum_port": "TCP port, usually {example}",
"electrum_port_ssl": "SSL port, usually {example}",
"electrum_saved": "Your changes have been saved successfully. Restart may be required for changes to take effect.",
"set_electrum_server_as_default": "Set {server} as default electrum server?",
"set_lndhub_as_default": "Set {url} as default LNDHub server?",
"electrum_saved": "Your changes have been saved successfully. Restarting BlueWallet may be required for the changes to take effect.",
"set_electrum_server_as_default": "Set {server} as the default Electrum server?",
"set_lndhub_as_default": "Set {url} as the default LNDHub server?",
"electrum_settings": "Electrum Settings",
"electrum_settings_explain": "Set to blank to use default",
"electrum_settings_explain": "Leave blank to use the default settings.",
"electrum_status": "Status",
"electrum_clear_alert_title": "Clear history?",
"electrum_clear_alert_message": "Do you want to clear electrum servers history?",
@ -284,17 +284,17 @@
"encrypt_use_expl": "{type} will be used to confirm your identity prior to making a transaction, unlocking, exporting, or deleting a wallet. {type} will not be used to unlock an encrypted storage.",
"general": "General",
"general_adv_mode": "Advanced Mode",
"general_adv_mode_e": "When enabled, you will see advanced options such as different wallet types, the ability to specify the LNDHub instance you wish to connect to and custom entropy during wallet creation.",
"general_adv_mode_e": "When enabled, you will see advanced options such as different wallet types, the ability to specify the LNDHub instance you wish to connect to, and custom entropy during wallet creation.",
"general_continuity": "Continuity",
"general_continuity_e": "When enabled, you will be able to view selected wallets, and transactions, using your other Apple iCloud connected devices.",
"groundcontrol_explanation": "GroundControl is a free opensource push notifications server for Bitcoin wallets. You can install your own GroundControl server and put its URL here to not rely on BlueWallet's infrastructure. Leave blank to use default",
"groundcontrol_explanation": "GroundControl is a free, open-source push notifications server for Bitcoin wallets. You can install your own GroundControl server and put its URL here to not rely on BlueWallets infrastructure. Leave blank to use GroundControls default server.",
"header": "Settings",
"language": "Language",
"language_restart": "When selecting a new language, restarting BlueWallet may be required for the change to take effect.",
"lightning_error_lndhub_uri": "Not a valid LNDHub URI",
"lightning_saved": "Your changes have been saved successfully",
"lightning_saved": "Your changes have been saved successfully.",
"lightning_settings": "Lightning Settings",
"lightning_settings_explain": "To connect to your own LND node please install LNDHub and put its URL here in settings. Leave blank to use BlueWallet's LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.",
"lightning_settings_explain": "To connect to your own LND node, please install LNDHub and put its URL here in settings. Leave blank to use BlueWallets LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.",
"network": "Network",
"network_broadcast": "Broadcast Transaction",
"network_electrum": "Electrum Server",
@ -302,16 +302,16 @@
"notifications": "Notifications",
"open_link_in_explorer" : "Open link in explorer",
"password": "Password",
"password_explain": "Create the password you will use to decrypt the storage",
"passwords_do_not_match": "Passwords do not match",
"password_explain": "Create the password you will use to decrypt the storage.",
"passwords_do_not_match": "Passwords do not match.",
"plausible_deniability": "Plausible Deniability",
"privacy": "Privacy",
"privacy_read_clipboard": "Read Clipboard",
"privacy_read_clipboard_alert": "BlueWallet will display shortcuts for handling an invoice or address found in your clipboard.",
"privacy_system_settings": "System Settings",
"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_explanation": "Touch and hold the BlueWallet app icon on your Home Screen to quickly view your wallets balance.",
"privacy_clipboard_explanation": "Provide shortcuts if an address or invoice is found in your clipboard.",
"push_notifications": "Push Notifications",
"retype_password": "Re-type password",
"save": "Save",
@ -323,7 +323,7 @@
},
"notifications": {
"would_you_like_to_receive_notifications": "Would you like to receive notifications when you get incoming payments?",
"no_and_dont_ask": "No, and don't ask me again",
"no_and_dont_ask": "No, and dont ask me again",
"ask_me_later": "Ask me later"
},
"transactions": {
@ -332,8 +332,8 @@
"cancel_title": "Cancel this transaction (RBF)",
"confirmations_lowercase": "{confirmations} confirmations",
"cpfp_create": "Create",
"cpfp_exp": "We will create another transaction that spends your unconfirmed transaction. The total fee will be higher than the original transaction fee, so it should be mined faster. This is called CPFP - Child Pays For Parent.",
"cpfp_no_bump": "This transaction is not bumpable",
"cpfp_exp": "We will create another transaction that spends your unconfirmed transaction. The total fee will be higher than the original transaction fee, so it should be mined faster. This is called CPFP—Child Pays for Parent.",
"cpfp_no_bump": "This transaction is not bumpable.",
"cpfp_title": "Bump Fee (CPFP)",
"details_balance_hide": "Hide Balance",
"details_balance_show": "Show Balance",
@ -352,7 +352,7 @@
"list_conf": "Conf: {number}",
"pending": "Pending",
"list_title": "Transactions",
"rbf_explain": "We will replace this transaction with the one with a higher fee, so it should be mined faster. This is called RBF - Replace By Fee.",
"rbf_explain": "We will replace this transaction with one with a higher fee, so it should be mined faster. This is called RBF—Replace by Fee.",
"rbf_title": "Bump Fee (RBF)",
"status_bump": "Bump Fee",
"status_cancel": "Cancel Transaction",
@ -371,7 +371,7 @@
"add_lightning": "Lightning",
"add_lightning_explain": "For spending with instant transactions",
"add_lndhub": "Connect to your LNDHub",
"add_lndhub_error": "The provided node address is not valid LNDHub node.",
"add_lndhub_error": "The provided node address is not a valid LNDHub node.",
"add_lndhub_placeholder": "Your Node Address",
"add_or": "or",
"add_title": "Add Wallet",
@ -384,13 +384,13 @@
"details_are_you_sure": "Are you sure?",
"details_connected_to": "Connected to",
"details_del_wb": "Wallet Balance",
"details_del_wb_err": "The provided balance amount does not match this wallet's balance. Please try again.",
"details_del_wb_q": "This wallet has a balance. Before proceeding, please be aware that you will not be able to recover the funds without this wallet's seed phrase. In order to avoid accidental removal this wallet, please enter your wallet's balance of {balance} satoshis.",
"details_del_wb_err": "The provided balance amount doesnt match this wallets balance. Please try again.",
"details_del_wb_q": "This wallet has a balance. Before proceeding, please be aware that you will not be able to recover the funds without this wallets seed phrase. In order to avoid accidental removal this wallet, please enter your wallets balance of {balance} satoshis.",
"details_delete": "Delete",
"details_delete_wallet": "Delete Wallet",
"details_derivation_path": "derivation path",
"details_display": "Display in Wallets List",
"details_export_backup": "Export / Backup",
"details_export_backup": "Export/Backup",
"details_marketplace": "Marketplace",
"details_master_fingerprint": "Master Fingerprint",
"details_ms_l": "{m} of {n} legacy (p2sh)",
@ -409,7 +409,7 @@
"export_title": "Wallet Export",
"import_do_import": "Import",
"import_error": "Failed to import. Please make sure that the provided data is valid.",
"import_explanation": "Write here your mnemonic, private key, WIF, or anything you've got. BlueWallet will do its best to guess the correct format and import your wallet.",
"import_explanation": "Write here your mnemonic, private key, WIF, or anything youve got. BlueWallet will do its best to guess the correct format and import your wallet.",
"import_file": "Import File",
"import_imported": "Imported",
"import_placeholder_fail": "Wallet Import",
@ -419,14 +419,14 @@
"import_title": "Import",
"list_create_a_button": "Add now",
"list_create_a_wallet": "Add a wallet",
"list_create_a_wallet_text": "It's free and you can create \nas many as you like.",
"list_empty_txs1": "Your transactions will appear here",
"list_create_a_wallet_text": "Its free and you can create \nas many as you like.",
"list_empty_txs1": "Your transactions will appear here.",
"list_empty_txs1_lightning": "Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and the speed is blazing fast.",
"list_empty_txs2": "Start with your wallet",
"list_empty_txs2_lightning": "\nTo start using it tap on “manage funds” and topup your balance.",
"list_header": "A wallet represents a pair of keys, one private and one you can share to receive coins.",
"list_empty_txs2_lightning": "\nTo start using it, tap on Manage Funds and topup your balance.",
"list_header": "A wallet represents a pair of keys: one private and one you can share to receive coins.",
"list_import_error": "An error was encountered when attempting to import this wallet.",
"list_import_problem": "There was a problem importing this wallet",
"list_import_problem": "There was a problem importing this wallet.",
"list_latest_transaction": "Latest Transaction",
"list_ln_browser": "LApp Browser",
"list_long_choose": "Choose Photo",
@ -437,9 +437,9 @@
"list_title": "Wallets",
"list_tryagain": "Try again",
"no_ln_wallet_error": "Before paying a Lightning invoice, you must first add a Lightning wallet.",
"looks_like_bip38": "This looks like a password-protected private key (BIP38)",
"reorder_title": "Reorder Wallets",
"please_continue_scanning": "Please continue scanning",
"looks_like_bip38": "This looks like a password-protected private key (BIP38).",
"reorder_title": "Re-order Wallets",
"please_continue_scanning": "Please continue scanning.",
"scan_error": "Scan Error",
"select_no_bitcoin": "There are currently no Bitcoin wallets available.",
"select_no_bitcoin_exp": "A Bitcoin wallet is required to refill Lightning wallets. Please create or import one.",
@ -447,7 +447,7 @@
"take_photo": "Take Photo",
"xpub_copiedToClipboard": "Copied to clipboard.",
"pull_to_refresh": "Pull to Refresh",
"warning_do_not_disclose": "Warning! Do not disclose",
"warning_do_not_disclose": "Warning! Do not disclose.",
"add_ln_wallet_first": "You must first add a Lightning wallet.",
"identity_pubkey": "Identity Pubkey",
"xpub_title": "Wallet XPUB"
@ -457,7 +457,7 @@
"default_label": "Multisig Vault",
"multisig_vault_explain": "Best security for large amounts",
"provide_signature": "Provide signature",
"vault_key": "Vault key {number}",
"vault_key": "Vault Key {number}",
"required_keys_out_of_total": "Required keys out of the total",
"fee": "Fee: {number}",
"fee_btc": "{number} BTC",
@ -472,7 +472,7 @@
"scan_or_import_file": "Scan or import file",
"export_coordination_setup": "Export Coordination Setup",
"cosign_this_transaction": "Co-sign this transaction?",
"lets_start": "Let's start",
"lets_start": "Lets start",
"create": "Create",
"provide_key": "Provide key",
"native_segwit_title": "Best practice",
@ -492,41 +492,41 @@
"of": "of",
"wallet_type": "Wallet Type",
"view_key": "View",
"invalid_mnemonics": "This mnemonic phrase doesnt seem to be valid",
"invalid_mnemonics": "This mnemonic phrase doesnt seem to be valid.",
"invalid_cosigner": "Not a valid cosigner data",
"not_a_multisignature_xpub": "This is not an xpub from multisignature wallet!",
"invalid_cosigner_format": "Incorrect cosigner: this is not a cosigner for {format} format",
"not_a_multisignature_xpub": "This is not an XPUB from a multisignature wallet!",
"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 the cosigner's XPUB, ready to be imported into another 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",
"invalid_fingerprint": "Fingerprint for this seed doesnt match this cosigners fingerprint",
"view_edit_cosigners": "View/edit cosigners",
"i_have_mnemonics": "I have a seed for this key.",
"please_write_down_mnemonics": "Please write down this mnemonic phrase on paper. Dont 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 the cosigners XPUB—ready to be imported into another 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 the 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",
"input_fp": "Enter fingerprint",
"input_fp_explain": "Skip to use the default one (00000000)",
"input_path": "Input derivation path",
"input_path": "Insert Derivation Path",
"input_path_explain": "Skip to use the default one ({default})",
"ms_help": "Help",
"ms_help_title": "How Multisig Vaults work. Tips and tricks",
"ms_help_text": "A wallet with multiple keys, to exponentially increase security or for shared custody.",
"ms_help_title1": "Multiple devices are advised",
"ms_help_1": "The Vault will work with other BlueWallet apps and PSBT compatible wallets, like Electrum, Specter, Coldcard, Cobo vault, etc.",
"ms_help_title": "How Multisig Vaults Work: Tips and Tricks",
"ms_help_text": "A wallet with multiple keys, for increased security or shared custody",
"ms_help_title1": "Multiple devices are advised.",
"ms_help_1": "The Vault will work with other BlueWallet apps and PSBT compatible wallets, such as Electrum, Specter, Coldcard, Cobo Vault, etc.",
"ms_help_title2": "Editing Keys",
"ms_help_2": "You can create all Vault keys in this device, and remove or edit these keys later. Having all keys on the same device has the equivalent security of a regular Bitcoin wallet.",
"ms_help_2": "You can create all Vault keys in this device and remove or edit them keys later. Having all keys on the same device has the equivalent security of a regular Bitcoin wallet.",
"ms_help_title3": "Vault Backups",
"ms_help_3": "On the wallet options you will find your Vault backup and watch-only backup. This backup is like a map to your wallet. It is essential for wallet recovery in case you lose one of your seeds.",
"ms_help_title4": "Importing Vaults",
"ms_help_4": "To import a Multisig, use your multisig backup file and use the import feature. If you only have extended keys and seeds, you can use the individual import fields on the Add Vault flow.",
"ms_help_title5": "Advanced options",
"ms_help_5": "By default BlueWallet will generate a 2of3 Vault. To create a different quorum or to change the address type, activate the advanced options in the Settings."
"ms_help_4": "To import a multisig, use your backup file and the Import feature. If you only have seeds and XPUBs, you can use the individual Import button when creating Vault keys.",
"ms_help_title5": "Advanced Mode",
"ms_help_5": "By default, BlueWallet will generate a 2-of-3 Vault. To create a different quorum or change the address type, activate Advanced Mode in the Settings."
},
"is_it_my_address": {
"title": "Is it my address?",
@ -538,18 +538,18 @@
"cc": {
"change": "Change",
"coins_selected": "Coins Selected ({number})",
"empty": "This wallet doesn't have any coins at the moment",
"empty": "This wallet doesnt have any coins at the moment.",
"freeze": "Freeze",
"freezeLabel": "Freeze",
"freezeLabel_un": "Unfreeze",
"header": "Coin Control",
"use_coin": "Use Coin",
"use_coins": "Use Coins",
"tip": "Allows you to see, label, freeze or select coins for improved wallet management. You can select multiple coins by tapping on the colored circles."
"tip": "This feature allows you to see, label, freeze or select coins for improved wallet management. You can select multiple coins by tapping on the colored circles."
},
"units": {
"BTC": "BTC",
"MAX": "MAX",
"MAX": "Max",
"sat_byte": "sat/byte",
"sats": "sats"
}

73
package-lock.json generated
View file

@ -8338,6 +8338,25 @@
"node-int64": "^0.4.0"
}
},
"bson": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/bson/-/bson-4.2.2.tgz",
"integrity": "sha512-9fX257PVHAUpiRGmY3356RVWKQxLA73BgjA/x5MGuJkTEMeG7yzjuBrsiFB67EXRJnFVKrbJY9t/M+oElKYktQ==",
"requires": {
"buffer": "^5.6.0"
},
"dependencies": {
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
}
}
},
"buffer": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz",
@ -17413,9 +17432,9 @@
"optional": true
},
"needle": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz",
"integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
"integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
@ -19671,22 +19690,24 @@
}
},
"realm": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/realm/-/realm-6.1.4.tgz",
"integrity": "sha512-5EWKlxYa0JZMl2EnqEz8S5NIFZJswLQ1FPMbOqDWVHbkAZfcrCyGCQdbWwWvyhaa+KK0qg8Q39EY0VXLYuWbqw==",
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/realm/-/realm-10.2.0.tgz",
"integrity": "sha512-MR2oWV4QtYd/aRhNYdniFqXom1hVzXeS2FsYv9JDgkYcxWJlq2cFsI2x3094i+LwNFRJZZtSxahc3xFuRCZcHg==",
"requires": {
"bson": "^4.2.0",
"command-line-args": "^4.0.6",
"deepmerge": "2.1.0",
"deprecated-react-native-listview": "0.0.6",
"fs-extra": "^4.0.3",
"https-proxy-agent": "^2.2.4",
"ini": "^1.3.5",
"node-addon-api": "^3.0.0",
"node-fetch": "^1.7.3",
"ini": "^1.3.7",
"node-addon-api": "^3.1.0",
"node-fetch": "^2.6.1",
"node-machine-id": "^1.1.10",
"node-pre-gyp": "^0.15.0",
"progress": "^2.0.3",
"prop-types": "^15.6.2",
"realm-network-transport": "^0.7.0",
"request": "^2.88.0",
"stream-counter": "^1.0.0",
"sync-request": "^3.0.1",
@ -19724,17 +19745,27 @@
"debug": "^3.1.0"
}
},
"ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
},
"node-fetch": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
"requires": {
"encoding": "^0.1.11",
"is-stream": "^1.0.1"
}
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
}
}
},
"realm-network-transport": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/realm-network-transport/-/realm-network-transport-0.7.0.tgz",
"integrity": "sha512-w81+N+YrFBkWZWFlspDPrpot50xCkfr+AB+NCQjsTI6OfVF0igqhLfl3frwrSS61fQiL5XrZrFYFV6BWU0F+iA==",
"requires": {
"abort-controller": "^3.0.0",
"node-fetch": "^2.6.0"
}
},
"regenerate": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
@ -20149,6 +20180,10 @@
"object-assign": "^4.1.1"
}
},
"scryptsy": {
"version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz",
"integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w=="
},
"secp256k1": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz",
@ -20903,9 +20938,9 @@
"integrity": "sha512-QqUMtWlnzArTvGyjVnAE5fAiXEm2Psvk/BlE7vWx2/dIEWMsAhcNPz7iW6WTiSM8h1fjtCkRMsaWBS1j6rpGBg=="
},
"tar": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
"integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
"integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",

View file

@ -166,7 +166,7 @@
"react-native-widget-center": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001",
"react-test-render": "1.1.2",
"readable-stream": "3.6.0",
"realm": "6.1.4",
"realm": "10.2.0",
"rn-nodeify": "10.2.0",
"scryptsy": "file:blue_modules/scryptsy",
"secure-random": "1.1.2",

View file

@ -1,4 +1,4 @@
import React, { useContext, useEffect, useRef, useState } from 'react';
import React, { useContext, useEffect, useState } from 'react';
import { View, ActivityIndicator, Text, TouchableOpacity, StyleSheet, StatusBar } from 'react-native';
import { Icon } from 'react-native-elements';
import { useNavigation, useRoute, useTheme } from '@react-navigation/native';
@ -28,16 +28,16 @@ const buttonStatus = Object.freeze({
notPossible: 3,
});
const TransactionsStatus = () => {
const TransactionStatus = () => {
const { setSelectedWallet, wallets, txMetadata, getTransactions } = useContext(BlueStorageContext);
const { hash } = useRoute().params;
const { hash, walletID } = useRoute().params;
const { navigate, setOptions } = useNavigation();
const { colors } = useTheme();
const wallet = useRef();
const wallet = wallets.find(w => w.getID() === walletID);
const [isCPFPPossible, setIsCPFPPossible] = useState();
const [isRBFBumpFeePossible, setIsRBFBumpFeePossible] = useState();
const [isRBFCancelPossible, setIsRBFCancelPossible] = useState();
const [tx, setTX] = useState();
const tx = getTransactions(null, Infinity, true).find(transactionHash => transactionHash.hash === hash);
const [isLoading, setIsLoading] = useState(true);
const stylesHook = StyleSheet.create({
root: {
@ -76,27 +76,6 @@ const TransactionsStatus = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [colors]);
useEffect(() => {
for (const w of wallets) {
for (const t of w.getTransactions()) {
if (t.hash === hash) {
console.log('tx', hash, 'belongs to', w.getLabel());
wallet.current = w;
break;
}
}
}
for (const tx of getTransactions(null, Infinity, true)) {
if (tx.hash === hash) {
setTX(tx);
break;
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hash]);
const initialState = async () => {
try {
await checkPossibilityOfCPFP();
@ -118,7 +97,7 @@ const TransactionsStatus = () => {
useEffect(() => {
if (wallet) {
setSelectedWallet(wallet.current.getID());
setSelectedWallet(wallet.getID());
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [wallet]);
@ -128,11 +107,11 @@ const TransactionsStatus = () => {
}, []);
const checkPossibilityOfCPFP = async () => {
if (!wallet.current.allowRBF()) {
if (!wallet.allowRBF()) {
return setIsCPFPPossible(buttonStatus.notPossible);
}
const cpfbTx = new HDSegwitBech32Transaction(null, tx.hash, wallet.current);
const cpfbTx = new HDSegwitBech32Transaction(null, tx.hash, wallet);
if ((await cpfbTx.isToUsTransaction()) && (await cpfbTx.getRemoteConfirmationsNum()) === 0) {
return setIsCPFPPossible(buttonStatus.possible);
} else {
@ -141,11 +120,11 @@ const TransactionsStatus = () => {
};
const checkPossibilityOfRBFBumpFee = async () => {
if (!wallet.current.allowRBF()) {
if (!wallet.allowRBF()) {
return setIsRBFBumpFeePossible(buttonStatus.notPossible);
}
const rbfTx = new HDSegwitBech32Transaction(null, tx.hash, wallet.current);
const rbfTx = new HDSegwitBech32Transaction(null, tx.hash, wallet);
if (
(await rbfTx.isOurTransaction()) &&
(await rbfTx.getRemoteConfirmationsNum()) === 0 &&
@ -159,11 +138,11 @@ const TransactionsStatus = () => {
};
const checkPossibilityOfRBFCancel = async () => {
if (!wallet.current.allowRBF()) {
if (!wallet.allowRBF()) {
return setIsRBFCancelPossible(buttonStatus.notPossible);
}
const rbfTx = new HDSegwitBech32Transaction(null, tx.hash, wallet.current);
const rbfTx = new HDSegwitBech32Transaction(null, tx.hash, wallet);
if (
(await rbfTx.isOurTransaction()) &&
(await rbfTx.getRemoteConfirmationsNum()) === 0 &&
@ -179,21 +158,21 @@ const TransactionsStatus = () => {
const navigateToRBFBumpFee = () => {
navigate('RBFBumpFee', {
txid: tx.hash,
wallet: wallet.current,
wallet: wallet,
});
};
const navigateToRBFCancel = () => {
navigate('RBFCancel', {
txid: tx.hash,
wallet: wallet.current,
wallet: wallet,
});
};
const navigateToCPFP = () => {
navigate('CPFP', {
txid: tx.hash,
wallet: wallet.current,
wallet: wallet,
});
};
const navigateToTransactionDetials = () => {
@ -290,9 +269,9 @@ const TransactionsStatus = () => {
<BlueCard>
<View style={styles.center}>
<Text style={[styles.value, stylesHook.value]}>
{formatBalanceWithoutSuffix(tx.value, wallet.current.preferredBalanceUnit, true)}{' '}
{wallet.current.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && (
<Text style={[styles.valueUnit, stylesHook.valueUnit]}>{loc.units[wallet.current.preferredBalanceUnit]}</Text>
{formatBalanceWithoutSuffix(tx.value, wallet.preferredBalanceUnit, true)}{' '}
{wallet.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && (
<Text style={[styles.valueUnit, stylesHook.valueUnit]}>{loc.units[wallet.preferredBalanceUnit]}</Text>
)}
</Text>
</View>
@ -331,8 +310,8 @@ const TransactionsStatus = () => {
{tx.fee && (
<View style={styles.fee}>
<BlueText style={styles.feeText}>
{loc.send.create_fee.toLowerCase()} {formatBalanceWithoutSuffix(tx.fee, wallet.current.preferredBalanceUnit, true)}{' '}
{wallet.current.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && wallet.current.preferredBalanceUnit}
{loc.send.create_fee.toLowerCase()} {formatBalanceWithoutSuffix(tx.fee, wallet.preferredBalanceUnit, true)}{' '}
{wallet.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && wallet.preferredBalanceUnit}
</BlueText>
</View>
)}
@ -360,7 +339,7 @@ const TransactionsStatus = () => {
);
};
export default TransactionsStatus;
export default TransactionStatus;
const styles = StyleSheet.create({
root: {
flex: 1,
@ -460,6 +439,6 @@ const styles = StyleSheet.create({
},
});
TransactionsStatus.navigationOptions = navigationStyle({
TransactionStatus.navigationOptions = navigationStyle({
title: '',
});

View file

@ -41,7 +41,7 @@ const ButtonSelected = Object.freeze({
const WalletsAdd = () => {
const { colors } = useTheme();
const { addWallet, saveToDisk, setNewWalletAdded, isAdancedModeEnabled } = useContext(BlueStorageContext);
const { addWallet, saveToDisk, isAdancedModeEnabled } = useContext(BlueStorageContext);
const [isLoading, setIsLoading] = useState(true);
const [walletBaseURI, setWalletBaseURI] = useState();
const [selectedIndex, setSelectedIndex] = useState(0);
@ -139,7 +139,6 @@ const WalletsAdd = () => {
}
addWallet(w);
await saveToDisk();
setNewWalletAdded(true);
A(A.ENUM.CREATED_WALLET);
ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false });
if (w.type === HDSegwitP2SHWallet.type || w.type === HDSegwitBech32Wallet.type) {
@ -184,7 +183,6 @@ const WalletsAdd = () => {
addWallet(wallet);
await saveToDisk();
setNewWalletAdded(true);
A(A.ENUM.CREATED_WALLET);
ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false });
navigate('PleaseBackupLNDHub', {

View file

@ -50,7 +50,7 @@ const isDesktop = getSystemName() === 'Mac OS X';
const staticCache = {};
const WalletsAddMultisigStep2 = () => {
const { addWallet, saveToDisk, setNewWalletAdded } = useContext(BlueStorageContext);
const { addWallet, saveToDisk } = useContext(BlueStorageContext);
const { colors } = useTheme();
const navigation = useNavigation();
@ -195,7 +195,6 @@ const WalletsAddMultisigStep2 = () => {
addWallet(w);
await saveToDisk();
setNewWalletAdded(true);
A(A.ENUM.CREATED_WALLET);
ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false });
navigation.dangerouslyGetParent().goBack();

View file

@ -17,12 +17,11 @@ import { BlurView } from '@react-native-community/blur';
const DrawerList = props => {
console.log('drawerList rendering...');
const walletsCarousel = useRef();
const { wallets, selectedWallet, pendingWallets, newWalletAdded, setNewWalletAdded, isDrawerListBlurred } = useContext(
BlueStorageContext,
);
const { wallets, selectedWallet, pendingWallets, isDrawerListBlurred } = useContext(BlueStorageContext);
const [carouselData, setCarouselData] = useState([]);
const height = useWindowDimensions().height;
const { colors } = useTheme();
const walletsCount = useRef(wallets.length);
const stylesHook = StyleSheet.create({
root: {
backgroundColor: colors.brandingColor,
@ -38,12 +37,18 @@ const DrawerList = props => {
}, [wallets, pendingWallets]);
useEffect(() => {
if (newWalletAdded) {
walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length - 2);
setNewWalletAdded(false);
if (walletsCount.current < wallets.length) {
walletsCarousel.current?.snapToItem(walletsCount.current);
}
walletsCount.current = wallets.length;
}, [wallets]);
useEffect(() => {
if (pendingWallets.length > 0) {
walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [newWalletAdded]);
}, [pendingWallets]);
const handleClick = index => {
console.log('click', index);

View file

@ -141,7 +141,6 @@ const WalletsImport = () => {
<BlueDoneAndDismissKeyboardInputAccessory
onClearTapped={() => {
setImportText('');
Keyboard.dismiss();
}}
onPasteTapped={text => {
setImportText(text);

View file

@ -35,16 +35,9 @@ const WalletsListSections = { CAROUSEL: 'CAROUSEL', LOCALTRADER: 'LOCALTRADER',
const WalletsList = () => {
const walletsCarousel = useRef();
const {
wallets,
pendingWallets,
getTransactions,
getBalance,
refreshAllWalletTransactions,
newWalletAdded,
setNewWalletAdded,
setSelectedWallet,
} = useContext(BlueStorageContext);
const { wallets, pendingWallets, getTransactions, getBalance, refreshAllWalletTransactions, setSelectedWallet } = useContext(
BlueStorageContext,
);
const { width } = useWindowDimensions();
const { colors, scanImage } = useTheme();
const { navigate, setOptions } = useNavigation();
@ -56,6 +49,7 @@ const WalletsList = () => {
);
const [carouselData, setCarouselData] = useState([]);
const dataSource = getTransactions(null, 10);
const walletsCount = useRef(wallets.length);
const stylesHook = StyleSheet.create({
walletsListWrapper: {
@ -96,12 +90,18 @@ const WalletsList = () => {
}, [wallets, pendingWallets]);
useEffect(() => {
if (newWalletAdded) {
walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length - 2);
setNewWalletAdded(false);
if (walletsCount.current < wallets.length) {
walletsCarousel.current?.snapToItem(walletsCount.current);
}
walletsCount.current = wallets.length;
}, [wallets]);
useEffect(() => {
if (pendingWallets.length > 0) {
walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [newWalletAdded]);
}, [pendingWallets]);
const verifyBalance = () => {
if (getBalance() !== 0) {
@ -225,7 +225,7 @@ const WalletsList = () => {
const renderTransactionListsRow = data => {
return (
<View style={styles.transaction}>
<BlueTransactionListItem item={data.item} itemPriceUnit={data.item.walletPreferredBalanceUnit} />
<BlueTransactionListItem item={data.item} itemPriceUnit={data.item.walletPreferredBalanceUnit} walletID={data.item.walletID} />
</View>
);
};

View file

@ -437,7 +437,9 @@ const WalletTransactions = () => {
});
};
const renderItem = item => <BlueTransactionListItem item={item.item} itemPriceUnit={itemPriceUnit} timeElapsed={timeElapsed} />;
const renderItem = item => (
<BlueTransactionListItem item={item.item} itemPriceUnit={itemPriceUnit} timeElapsed={timeElapsed} walletID={walletID} />
);
const onBarCodeRead = ret => {
if (!isLoading) {

View file

@ -50,7 +50,7 @@ describe('BlueWallet UI Tests', () => {
try {
// in case emulator has no google services and doesnt support pushes
// we just dont show this popup
await element(by.text(`No, and don't ask me again`)).tap();
await element(by.text(`No, and dont ask me again`)).tap();
} catch (_) {}
await yo('BitcoinAddressQRCodeContainer');
await yo('BlueCopyTextToClipboard');
@ -100,7 +100,7 @@ describe('BlueWallet UI Tests', () => {
await element(by.text('OK')).tap();
await element(by.type('android.widget.EditText')).typeText('666');
await element(by.text('OK')).tap();
await expect(element(by.text('Passwords do not match'))).toBeVisible();
await expect(element(by.text('Passwords do not match.'))).toBeVisible();
await element(by.text('OK')).tap();
// now, lets put correct passwords and encrypt the storage
@ -142,7 +142,7 @@ describe('BlueWallet UI Tests', () => {
// trying to enable plausible denability
await element(by.id('CreateFakeStorageButton')).tap();
await expect(element(by.text('Password for fake storage should not match the password for your main storage.'))).toBeVisible();
await expect(element(by.text('Password for the fake storage should not match the password for your main storage.'))).toBeVisible();
// trying MAIN password: should fail, obviously
await element(by.type('android.widget.EditText')).typeText('qqq');
@ -516,7 +516,7 @@ describe('BlueWallet UI Tests', () => {
try {
// in case emulator has no google services and doesnt support pushes
// we just dont show this popup
await element(by.text(`No, and don't ask me again`)).tap();
await element(by.text(`No, and dont ask me again`)).tap();
} catch (_) {}
await expect(element(by.id('BitcoinAddressQRCodeContainer'))).toBeVisible();
await expect(element(by.text('bc1qtc9zquvq7lgq87kzsgltvv4etwm9uxphfkvkay'))).toBeVisible();

File diff suppressed because one or more lines are too long