Merge remote-tracking branch 'origin/master' into abhiShandy-feat-bip47

This commit is contained in:
overtorment 2023-03-15 20:55:27 +00:00
commit f9205eb3d6
88 changed files with 13104 additions and 18064 deletions

View file

@ -1,3 +0,0 @@
{
"presets": ["module:metro-react-native-babel-preset"]
}

View file

@ -1,9 +0,0 @@
[android]
target = Google Inc.:Google APIs:23
[download]
max_number_of_retries = 3
[maven_repositories]
central = https://repo1.maven.org/maven2

View file

@ -54,6 +54,8 @@ jobs:
working_directory: ~/repo
resource_class: large
steps:
- checkout

View file

@ -1,7 +1,11 @@
{
"testRunner": "jest",
"runnerConfig": "tests/e2e/config.json",
"skipLegacyWorkersInjection": true,
"testRunner": {
"$0": "jest",
"args": {
"config": "tests/e2e/jest.config.js",
"_": ["e2e"]
}
},
"apps": {
"ios": {
"type": "ios.app",

View file

@ -95,7 +95,7 @@ jobs:
avd-name: Pixel_API_29_AOSP
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none -partition-size 2047
arch: x86_64
script: npm run e2e:release-test || npm run e2e:release-test || npm run e2e:release-test
script: npm run e2e:release-test || npm run e2e:release-test || npm run e2e:release-test || npm run e2e:release-test
env:
TRAVIS: 1
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}

11
.gitignore vendored
View file

@ -20,7 +20,11 @@ DerivedData
*.hmap
*.ipa
*.xcuserstate
ios/.xcode.env.local
*.hprof
.cxx/
*.keystore
!debug.keystore
# Android/IntelliJ
#
@ -52,6 +56,7 @@ buck-out/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots
**/fastlane/test_output
# Bundle artifact
*.jsbundle
@ -61,8 +66,12 @@ release-notes.json
release-notes.txt
current-branch.json
ios/Pods/
# Ruby / CocoaPods
/ios/Pods/
/vendor/bundle/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
artifacts/
# Editors

View file

@ -1 +1 @@
2.7.4
2.7.6

13
.xcode-env Normal file
View file

@ -0,0 +1,13 @@
# This `.xcode.env` file is versioned and is used to source the
environment
# used when running script phases inside Xcode.
# To customize your local environment, you can create an
`.xcode.env.local`
# file that is not versioned.
# NODE_BINARY variable contains the PATH to the node executable.
#
# Customize the NODE_BINARY variable here.
# For example, to use nvm with brew, add the following line
# . "$(brew --prefix nvm)/nvm.sh" --no-use
export NODE_BINARY=$(command -v node)

View file

@ -1,6 +1,6 @@
source 'https://rubygems.org'
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby '2.7.4'
ruby File.read(File.join(__dir__, '.ruby-version')).strip
gem 'cocoapods', '~> 1.11', '>= 1.11.2'
gem 'cocoapods', '~> 1.11', '>= 1.11.3'

View file

@ -1,173 +1,124 @@
apply plugin: "com.android.application"
apply plugin: "kotlin-android"
apply plugin: "com.facebook.react"
import com.android.build.OutputFile
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets).
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
* and their defaults. If you decide to add a configuration block, make sure to add it before the
* `apply from: "../../node_modules/react-native/react.gradle"` line.
*
* project.ext.react = [
* // the name of the generated asset file containing your JS bundle
* bundleAssetName: "index.android.bundle",
*
* // the entry file for bundle generation. If none specified and
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
* // default. Can be overridden with ENTRY_FILE environment variable.
* entryFile: "index.android.js",
*
* // https://reactnative.dev/docs/performance#enable-the-ram-format
* bundleCommand: "ram-bundle",
*
* // whether to bundle JS and assets in debug mode
* bundleInDebug: false,
*
* // whether to bundle JS and assets in release mode
* bundleInRelease: true,
*
* // whether to bundle JS and assets in another build variant (if configured).
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
* // The configuration property can be in the following formats
* // 'bundleIn${productFlavor}${buildType}'
* // 'bundleIn${buildType}'
* // bundleInFreeDebug: true,
* // bundleInPaidRelease: true,
* // bundleInBeta: true,
*
* // whether to disable dev mode in custom build variants (by default only disabled in release)
* // for example: to disable dev mode in the staging build type (if configured)
* devDisabledInStaging: true,
* // The configuration property can be in the following formats
* // 'devDisabledIn${productFlavor}${buildType}'
* // 'devDisabledIn${buildType}'
*
* // the root of your project, i.e. where "package.json" lives
* root: "../../",
*
* // where to put the JS bundle asset in debug mode
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
*
* // where to put the JS bundle asset in release mode
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in debug mode
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in release mode
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
*
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
* // for example, you might want to remove it from here.
* inputExcludes: ["android/**", "ios/**"],
*
* // override which node gets called and with what additional arguments
* nodeExecutableAndArgs: ["node"],
*
* // supply additional arguments to the packager
* extraPackagerArgs: []
* ]
* This is the configuration block to customize your React Native Android app.
* By default you don't need to apply any configuration, just uncomment the lines you need.
*/
react {
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '..'
// root = file("../")
// The folder where the react-native NPM package is. Default is ../node_modules/react-native
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen
// codegenDir = file("../node_modules/react-native-codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
project.ext.react = [
enableHermes: true, // clean and rebuild if changing
]
/* Variants */
// The list of variants to that are debuggable. For those we're going to
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
// debuggableVariants = ["liteDebug", "prodDebug"]
apply from: "../../node_modules/react-native/react.gradle"
apply plugin: "com.bugsnag.android.gradle"
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
// nodeExecutableAndArgs = ["node"]
//
// The command to run when bundling. By default is 'bundle'
// bundleCommand = "ram-bundle"
//
// The path to the CLI configuration file. Default is empty.
// bundleConfig = file(../rn-cli.config.js)
//
// The name of the generated asset file containing your JS bundle
// bundleAssetName = "MyApplication.android.bundle"
//
// The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
// entryFile = file("../js/MyApplication.android.js")
//
// A list of extra flags to pass to the 'bundle' commands.
// See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
// extraPackagerArgs = []
/* Hermes Commands */
// The hermes compiler command to run. By default it is 'hermesc'
// hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]
}
/**
* Set this to true to create two separate APKs instead of one:
* - An APK that only works on ARM devices
* - An APK that only works on x86 devices
* The advantage is the size of the APK is reduced by about 4MB.
* Upload all the APKs to the Play Store and people will download
* the correct one based on the CPU architecture of their device.
* Set this to true to create four separate APKs instead of one,
* one for each native architecture. This is useful if you don't
* use App Bundles (https://developer.android.com/guide/app-bundle/)
* and want to have separate APKs to upload to the Play Store.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Run Proguard to shrink the Java bytecode in release builds.
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
*/
def enableProguardInReleaseBuilds = false
/**
* The preferred build flavor of JavaScriptCore.
* The preferred build flavor of JavaScriptCore (JSC)
*
* For example, to use the international variant, you can use:
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
*
* The international variant includes ICU i18n library and necessary data
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
* give correct results when using with locales other than en-US. Note that
* give correct results when using with locales other than en-US. Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc-intl:+'
/**
* Whether to enable the Hermes VM.
*
* This should be set on project.ext.react and mirrored here. If it is not set
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
* and the benefits of using Hermes will therefore be sharply reduced.
* Private function to get the list of Native Architectures you want to build.
* This reads the value from reactNativeArchitectures in your gradle.properties
* file and works together with the --active-arch-only flag of react-native run-android.
*/
def enableHermes = project.ext.react.get("enableHermes", false);
def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
}
defaultConfig {
applicationId "io.bluewallet.bluewallet"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "6.3.3"
multiDexEnabled true
testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
ndk {
abiFilters 'arm64-v8a', 'x86_64', 'x86', 'armeabi-v7a'
}
testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
missingDimensionStrategy 'detox', 'full'
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
include (*reactNativeArchitectures())
}
}
buildTypes {
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
}
}
@ -180,7 +131,8 @@ android {
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
@ -188,47 +140,20 @@ android {
}
dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
implementation files("../../node_modules/rn-ldk/android/libs/LDK-release.aar")
implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
implementation files("../../node_modules/react-native-tor/android/libs/sifir_android.aar")
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
exclude group:'com.facebook.fbjni'
}
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {
implementation jscFlavor
}
androidTestImplementation(project(path: ":detox"))
androidTestImplementation('com.wix:detox:+')
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation fileTree(dir: "libs", include: ["*.jar"])
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.implementation
into 'libs'
}
apply plugin: 'com.google.gms.google-services' // Google Services plugin
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
bugsnag {
uploadReactNativeMappings = true
}

View file

@ -1,19 +0,0 @@
"""Helper definitions to glob .aar and .jar targets"""
def create_aar_targets(aarfiles):
for aarfile in aarfiles:
name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
lib_deps.append(":" + name)
android_prebuilt_aar(
name = name,
aar = aarfile,
)
def create_jar_targets(jarfiles):
for jarfile in jarfiles:
name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
lib_deps.append(":" + name)
prebuilt_jar(
name = name,
binary_jar = jarfile,
)

View file

@ -1,72 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package io.bluewallet.bluewallet;
import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.android.utils.FlipperUtils;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
import okhttp3.OkHttpClient;
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
client.addPlugin(new ReactFlipperPlugin());
client.addPlugin(new DatabasesFlipperPlugin(context));
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
client.addPlugin(CrashReporterPlugin.getInstance());
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
NetworkingModule.setCustomClientBuilder(
new NetworkingModule.CustomClientBuilder() {
@Override
public void apply(OkHttpClient.Builder builder) {
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
}
});
client.addPlugin(networkFlipperPlugin);
client.start();
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
// Hence we run if after all native modules have been initialized
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
new ReactInstanceManager.ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
reactContext.runOnNativeModulesQueueThread(
new Runnable() {
@Override
public void run() {
client.addPlugin(new FrescoFlipperPlugin());
}
});
}
});
} else {
client.addPlugin(new FrescoFlipperPlugin());
}
}
}
}

View file

@ -8,6 +8,10 @@ import androidx.annotation.Nullable;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactActivityDelegate;
public class MainActivity extends ReactActivity {
/**
@ -20,10 +24,27 @@ public class MainActivity extends ReactActivity {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
if (getResources().getBoolean(R.bool.portrait_only)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
if (getResources().getBoolean(R.bool.portrait_only)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
}
/**
* Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link
* DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React
* (aka React 18) with two boolean flags.
*/
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new DefaultReactActivityDelegate(
this,
getMainComponentName(),
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled
// If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18).
DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled
);
}
}

View file

@ -7,6 +7,8 @@ import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import java.lang.reflect.InvocationTargetException;
import com.facebook.react.modules.i18nmanager.I18nUtil;
@ -16,7 +18,7 @@ import com.bugsnag.android.Bugsnag;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new ReactNativeHost(this) {
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
@ -35,6 +37,16 @@ public class MainApplication extends Application implements ReactApplication {
protected String getJSMainModuleName() {
return "index";
}
@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
};
@Override
@ -49,37 +61,9 @@ public class MainApplication extends Application implements ReactApplication {
I18nUtil sharedI18nUtilInstance = I18nUtil.getInstance();
sharedI18nUtilInstance.allowRTL(getApplicationContext(), true);
SoLoader.init(this, /* native exopackage */ false);
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
/**
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
*
* @param context
* @param reactInstanceManager
*/
private static void initializeFlipper(
Context context, ReactInstanceManager reactInstanceManager) {
if (BuildConfig.DEBUG) {
try {
/*
We use reflection here to pick up the class that initializes Flipper,
since Flipper library is not available in release mode
*/
Class<?> aClass = Class.forName("com.rndiffapp.ReactNativeFlipper");
aClass
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
.invoke(null, context, reactInstanceManager);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
}
}
}

View file

@ -4,14 +4,16 @@ buildscript {
ext {
minSdkVersion = 28
supportLibVersion = "28.0.0"
buildToolsVersion = "30.0.3"
compileSdkVersion = 31
targetSdkVersion = 31
buildToolsVersion = "33.0.0"
compileSdkVersion = 33
targetSdkVersion = 33
googlePlayServicesVersion = "16.+"
googlePlayServicesIidVersion = "16.0.1"
firebaseVersion = "17.3.4"
firebaseMessagingVersion = "21.1.0"
ndkVersion = "23.0.7599858"
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
ndkVersion = "23.1.7779620"
kotlin_version = '1.8.0'
}
repositories {
@ -19,19 +21,20 @@ buildscript {
mavenCentral()
}
dependencies {
classpath('com.android.tools.build:gradle:4.2.2')
classpath("com.android.tools.build:gradle:7.3.1")
classpath("com.bugsnag:bugsnag-android-gradle-plugin:5.+")
classpath 'com.google.gms:google-services:4.3.14' // Google Services plugin
classpath("com.facebook.react:react-native-gradle-plugin")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven {
url("$rootDir/../node_modules/detox/Detox-android")
}
jcenter() {
content {
includeModule("com.facebook.yoga", "proguard-annotations")
@ -83,3 +86,9 @@ subprojects {
}
}
}
subprojects { subproject ->
if(project['name'] == 'react-native-widget-center') {
project.configurations { compile { } }
}
}

View file

@ -9,8 +9,8 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
@ -24,12 +24,18 @@ android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# added when build failed because of memory:
# https://stackoverflow.com/questions/56075455/expiring-daemon-because-jvm-heap-space-is-exhausted
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
# ./gradlew <task> -PreactNativeArchitectures=x86_64
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.127.0
org.gradle.jvmargs=-XX\:MaxHeapSize\=2999m -Xmx4608m
# Use this property to enable support to the new architecture.
# This will allow you to use TurboModules and the Fabric render in
# your application. You should enable this flag either if you want
# to write custom TurboModules/Fabric components OR use libraries that
# are providing them.
newArchEnabled=false
# Use this property to enable or disable the Hermes JS engine.
# If set to false, you will be using JSC instead.
hermesEnabled=true

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip

269
android/gradlew vendored
View file

@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -17,78 +17,113 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@ -105,79 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View file

@ -1,6 +1,6 @@
rootProject.name = 'BlueWallet'
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
include ':app'
includeBuild('../node_modules/react-native-gradle-plugin')
include ':detox'
project(':detox').projectDir = new File(rootProject.projectDir, '../node_modules/detox/android/detox')

View file

@ -820,9 +820,15 @@ module.exports.calcEstimateFeeFromFeeHistorgam = function (numberOfBlocks, feeHi
module.exports.estimateFees = async function () {
let histogram;
let timeoutId;
try {
histogram = await Promise.race([mainClient.mempool_getFeeHistogram(), new Promise(resolve => setTimeout(resolve, 29000))]);
} catch (_) {}
histogram = await Promise.race([
mainClient.mempool_getFeeHistogram(),
new Promise(resolve => (timeoutId = setTimeout(resolve, 15000))),
]);
} finally {
clearTimeout(timeoutId);
}
if (!histogram) throw new Error('timeout while getting mempool_getFeeHistogram');

View file

@ -203,7 +203,7 @@ export const BlueStorageProvider = ({ children }) => {
let txMetadata = BlueApp.tx_metadata || {};
const getTransactions = BlueApp.getTransactions;
const isAdancedModeEnabled = BlueApp.isAdancedModeEnabled;
const isAdvancedModeEnabled = BlueApp.isAdvancedModeEnabled;
const fetchSenderPaymentCodes = BlueApp.fetchSenderPaymentCodes;
const fetchWalletBalances = BlueApp.fetchWalletBalances;
@ -219,7 +219,7 @@ export const BlueStorageProvider = ({ children }) => {
const decryptStorage = BlueApp.decryptStorage;
const isPasswordInUse = BlueApp.isPasswordInUse;
const cachedPassword = BlueApp.cachedPassword;
const setIsAdancedModeEnabled = BlueApp.setIsAdancedModeEnabled;
const setisAdvancedModeEnabled = BlueApp.setisAdvancedModeEnabled;
const getHodlHodlSignatureKey = BlueApp.getHodlHodlSignatureKey;
const addHodlHodlContract = BlueApp.addHodlHodlContract;
const getHodlHodlContracts = BlueApp.getHodlHodlContracts;
@ -244,7 +244,7 @@ export const BlueStorageProvider = ({ children }) => {
setItem,
getItem,
getHodlHodlContracts,
isAdancedModeEnabled,
isAdvancedModeEnabled,
fetchWalletBalances,
fetchWalletTransactions,
fetchAndSaveWalletTransactions,
@ -265,7 +265,7 @@ export const BlueStorageProvider = ({ children }) => {
getHodlHodlApiKey,
decryptStorage,
isPasswordInUse,
setIsAdancedModeEnabled,
setisAdvancedModeEnabled,
setPreferredFiatCurrency,
preferredFiatCurrency,
setLanguage,

View file

@ -811,14 +811,14 @@ export class AppStorage {
return finalBalance;
};
isAdancedModeEnabled = async () => {
isAdvancedModeEnabled = async () => {
try {
return !!(await AsyncStorage.getItem(AppStorage.ADVANCED_MODE_ENABLED));
} catch (_) {}
return false;
};
setIsAdancedModeEnabled = async value => {
setIsAdvancedModeEnabled = async value => {
await AsyncStorage.setItem(AppStorage.ADVANCED_MODE_ENABLED, value ? '1' : '');
};

View file

@ -48,6 +48,8 @@ export const ArrowPicker = (props: ArrowPickerProps) => {
styles.wrapperCustom,
]}
>
{/*
// @ts-ignore: Ignore */}
<Icon size={24} name="chevron-left" type="ionicons" tvParallaxProperties={undefined} />
</Pressable>
<View style={{ width: 200 }}>
@ -72,6 +74,8 @@ export const ArrowPicker = (props: ArrowPickerProps) => {
styles.wrapperCustom,
]}
>
{/*
// @ts-ignore: Ignore */}
<Icon size={24} name="chevron-right" type="ionicons" tvParallaxProperties={undefined} />
</Pressable>
</View>

1
ios/.xcode.env Normal file
View file

@ -0,0 +1 @@
export NODE_BINARY=$(command -v node)

View file

@ -7,7 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
32002D9D236FAA9F00B93396 /* TodayDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32002D9C236FAA9F00B93396 /* TodayDataStore.swift */; };
@ -76,6 +75,7 @@
B43D037B225847C500FBAA95 /* TransactionTableRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0375225847C500FBAA95 /* TransactionTableRow.swift */; };
B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; };
B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; };
B461B852299599F800E431AA /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = B461B851299599F800E431AA /* AppDelegate.mm */; };
B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; };
E5D4794B26781FC0007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; };
E5D4794C26781FC1007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; };
@ -170,8 +170,6 @@
00E356F21AD99517003FC87E /* BlueWalletTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BlueWalletTests.m; sourceTree = "<group>"; };
04466491BA2D4876A71222FC /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = BlueWallet/AppDelegate.h; sourceTree = "<group>"; };
13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = BlueWallet/AppDelegate.m; sourceTree = "<group>"; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = BlueWallet/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = BlueWallet/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = BlueWallet/main.m; sourceTree = "<group>"; };
@ -332,6 +330,8 @@
B43D0377225847C500FBAA95 /* WalletInformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletInformation.swift; sourceTree = "<group>"; };
B43D046E22584C1B00FBAA95 /* libRNWatch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRNWatch.a; sourceTree = BUILT_PRODUCTS_DIR; };
B459EE96941AE09BCB547DC0 /* Pods-BlueWallet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.release.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWallet/Pods-BlueWallet.release.xcconfig"; sourceTree = "<group>"; };
B461B850299599F800E431AA /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = BlueWallet/AppDelegate.h; sourceTree = "<group>"; };
B461B851299599F800E431AA /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = BlueWallet/AppDelegate.mm; sourceTree = "<group>"; };
B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = "<group>"; };
B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTQRCodeLocalImage.a; sourceTree = "<group>"; };
B9D9B3A7B2CB4255876B67AF /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
@ -426,11 +426,11 @@
13B07FAE1A68108700A75B9A /* BlueWallet */ = {
isa = PBXGroup;
children = (
B461B850299599F800E431AA /* AppDelegate.h */,
B461B851299599F800E431AA /* AppDelegate.mm */,
32C7944323B8879D00BE2AFA /* BlueWalletRelease.entitlements */,
32F0A2502310B0910095C559 /* BlueWallet.entitlements */,
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
13B07FB01A68108700A75B9A /* AppDelegate.m */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB71A68108700A75B9A /* main.m */,
@ -1063,12 +1063,12 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/LDKFramework/LDKFramework.framework/LDKFramework",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/rn-ldk/LDKFramework.framework/LDKFramework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LDKFramework.framework",
);
runOnlyForDeploymentPostprocessing = 0;
@ -1190,9 +1190,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
6D32C5C62596CE3A008C077C /* EventEmitter.m in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
B461B852299599F800E431AA /* AppDelegate.mm in Sources */,
32B5A32A2334450100F8D608 /* Bridge.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -1390,6 +1390,7 @@
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(inherited)",
"$(PROJECT_DIR)",
);
@ -1433,6 +1434,7 @@
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(inherited)",
"$(PROJECT_DIR)",
);
@ -1682,7 +1684,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@ -1709,7 +1711,7 @@
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@ -1726,9 +1728,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.2;
LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_VERSION = 4.2;
};
@ -1739,7 +1742,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@ -1766,7 +1769,7 @@
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -1776,8 +1779,9 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.2;
LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = NO;
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_VERSION = 4.2;

View file

@ -52,7 +52,7 @@
<key>WidgetsExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
<integer>88</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>

View file

@ -1,15 +1,8 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import <RCTAppDelegate.h>
#import <UIKit/UIKit.h>
#import <UserNotifications/UNUserNotificationCenter.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@property (nonatomic, strong) UIWindow *window;
@interface AppDelegate : RCTAppDelegate <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@end

View file

@ -1,47 +1,23 @@
#import <Bugsnag/Bugsnag.h>
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import "AppDelegate.h"
#import <React/RCTLinkingManager.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTI18nUtil.h>
#import <React/RCTRootView.h>
#import <React/RCTBundleURLProvider.h>
#import "RNQuickActionManager.h"
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>
#import "EventEmitter.h"
@import WatchConnectivity;
#if !TARGET_OS_MACCATALYST
#ifdef FB_SONARKIT_ENABLED
#import <FlipperKit/FlipperClient.h>
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>
#import <React/RCTRootView.h>
#import <WatchConnectivity/WatchConnectivity.h>
static void InitializeFlipper(UIApplication *application) {
FlipperClient *client = [FlipperClient sharedClient];
SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
[client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
[client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
[client addPlugin:[FlipperKitReactPlugin new]];
[client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
[client start];
}
#endif
#endif
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Bugsnag start];
[Bugsnag start];
[self copyDeviceUID];
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"deviceUID"
@ -51,16 +27,15 @@ static void InitializeFlipper(UIApplication *application) {
forKeyPath:@"deviceUIDCopy"
options:NSKeyValueObservingOptionNew
context:NULL];
self.moduleName = @"BlueWallet";
// You can add your custom initial props in the dictionary below.
// They will be passed down to the ViewController used by React Native.
self.initialProps = @{};
#if !TARGET_OS_MACCATALYST
#ifdef FB_SONARKIT_ENABLED
InitializeFlipper(application);
#endif
#endif
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"BlueWallet"
initialProperties:nil];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"RNWatchExample"
initialProperties:nil];
if (@available(iOS 13.0, *)) {
rootView.backgroundColor = [UIColor systemBackgroundColor];
@ -68,26 +43,34 @@ static void InitializeFlipper(UIApplication *application) {
rootView.backgroundColor = [UIColor clearColor];
}
[[RCTI18nUtil sharedInstance] allowRTL:YES];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
UIView* launchScreenView = [[UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil] instantiateInitialViewController].view;
launchScreenView.frame = self.window.bounds;
rootView.loadingView = launchScreenView;
// Define UNUserNotificationCenter
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
return [super application:application didFinishLaunchingWithOptions:launchOptions];
/* For debugging purposes since iOS Simulator does not support handoff
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.io.bluewallet.bluewallet"];
[defaults setValue:@{@"activityType": @"io.bluewallet.bluewallet.receiveonchain", @"userInfo": @{@"address": @""}} forKey:@"onUserActivityOpen"];
*/
return YES;
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
///
/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`.
- (BOOL)concurrentRootEnabled
{
return true;
}
- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
if([keyPath isEqual:@"deviceUID"] || [keyPath isEqual:@"deviceUIDCopy"])
@ -103,15 +86,6 @@ static void InitializeFlipper(UIApplication *application) {
}
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
@ -225,4 +199,5 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response
}
}
@end

View file

@ -1,26 +1,59 @@
platform :ios, '13.0'
workspace 'BlueWallet'
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
workspace 'BlueWallet'
platform :ios, '13.0'
prepare_react_native_project!
# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set.
# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded
#
# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js`
# ```js
# module.exports = {
# dependencies: {
# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}),
# ```
# flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled
flipper_config = FlipperConfiguration.disabled
linkage = ENV['USE_FRAMEWORKS']
if linkage != nil
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
use_frameworks! :linkage => linkage.to_sym
end
target 'BlueWallet' do
config = use_native_modules!
# Flags change depending on the env values.
flags = get_default_flags()
use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => false
# Hermes is now enabled by default. Disable by setting this flag to false.
# Upcoming versions of React Native may rely on get_default_flags(), but
# we make it explicit here to aid in the React Native upgrade process.
:hermes_enabled => true,
:fabric_enabled => flags[:fabric_enabled],
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable the next line.
#:flipper_configuration => flipper_config,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
)
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
use_flipper!({ "Flipper-DoubleConversion" => "1.1.7" })
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
pod 'Bugsnag'
react_native_post_install(
installer,
# Set `mac_catalyst_enabled` to `true` in order to apply patches
# necessary for Mac Catalyst builds
:mac_catalyst_enabled => false
)
pod 'Bugsnag'
plugin 'cocoapods-bugsnag'
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
@ -31,6 +64,7 @@ target 'BlueWallet' do
config.build_settings['DEVELOPMENT_TEAM'] = "A7W54YZ4WU"
end
end
__apply_Xcode_12_5_M1_post_install_workaround(installer)
end
end

File diff suppressed because it is too large Load diff

View file

@ -1,14 +1,14 @@
محفظة Bitcoin تتيح لك تخزين عملات Bitcoin وإرسالها واستلامها وشراءها، مع التركيز على الأمان والبساطة.
محفظة بتكوين تتيح لك تخزين البتكوين، ارساله واستقباله مع اهتمام خاص بالأمان العالي والبساطة المتناهية.
في BlueWallet ستمتلك المفاتيح الخاصة لعملات Bitcoin. محفظة الـ Bitcoin هذه أنشأها مستخدمو Bitcoin من أجل المجتمع.
في BlueWallet ستمتلك المفاتيح الخاصة للبتكوين الذي تقرر الاحتفاظ به فيها. هذه المحفظة أنشأها مستخدمو البتكوين من أجل المجتمع.
يمكنك إجراء المعاملات مع أي شخص في العالم على الفور، وتغيير النظام المالي من جيبك مباشرةً.
يمكنك إجراء المعاملات مع أي شخص في العالم على الفور والمشاركة في تطوير النظام المالي العالمي من جيبك مباشرةً.
يمكنك إنشاء عدد غير محدود من محافظ Bitcoin مجانًا أو استيراد محفظتك الحالية. الأمر بسيط وسريع.
يمكنك إنشاء عدد غير محدود من محافظ البتكوين مجانًا أو استيراد محفظتك الحالية. الأمر سريع بسيط.
_____
إليك ما تحصل عليه:
إليك ما ستحصل عليه:
1 - الأمان من خلال التصميم
@ -22,32 +22,25 @@ _____
التشفير الكامل
علاوةً على التشفير متعدد الطبقات لنظام iOS، فإننا نقوم بتشفير كل شيء بكلمات مرور مضافة
العقدة الكاملة
اتصل بمحفظة Bitcoin باستخدام العقدة الكاملة عن طريق برنامج Electrum
النود التام
اربط محفظة البتكوين بنود تام خاص بك عن طريق برنامج Electrum
التخزين البارد
اتصل بمحفظة جهاز واحتفظ بعملاتك في وحدة "التخزين البارد"
اتصل بمحفظة خارجية لتخزين البتكوين في وحدة تخزين بارد
2 - التركيز على تجربتك
كن متحكمًا
لا تغادر المفاتيح الخاصة جهازك أبدًا.
أنت من يتحكم في مفاتيحك الخاصة
Private keys never leave your device.You control your private keys
مرونة الرسوم
بدايةً من ساتوشي واحد. تحددها أنت؛ أي المستخدم بنفسك
رسوم مرنة
بدايةً من ساتوشي واحد. تحددها أنت أيها المستخدم بنفسك
الاستبدال بالرسوم (RBF)
(RBF) عزز سرعة معاملاتك بزيادة الرسوم (BIP125)
محافظ للتحقق من الرصيد فقط
تتيح لك محافظ التحقق من الرصيد متابعة وحدة التخزين البارد دون لمس الجهاز.
محافظ لمراقبة الرصيد فقط
تتيح لك محافظ مراقبة الرصيد من متابعة وحدة التخزين البارد دون الحاجة للمس المحفظة الخارجية.
شبكة Lightning
محفظة Lightning دون الحاجة إلى إعدادها. معاملات رخيصة جدًا وسريعة مع توفير أفضل تجربة لمستخدمي Bitcoin.
شراء Bitcoin
ادخل في أغوار الثورة المالية المفتوحة مع القدرة على شراء Bitcoin مباشرة من محفظتك.
متداول محلي
منصة تداول Bitcoin من نظير إلى نظير، والتي تتيح لك شراء عملات Bitcoin وبيعها مباشرةً إلى المستخدمين الآخرين دون الاستعانة بأطراف خارجية.
شبكة البرق
محفظة البرق دون الحاجة إلى إعدادها. معاملات رخيصة جدًا وسريعة مع توفير أفضل تجربة لمستخدمي البتكوين.

View file

@ -0,0 +1,46 @@
ビットコインを送る・受け取る・保存することができる、セキュリティとシンプルさを重視したウォレットです。
BlueWalletは、秘密鍵をあなたが所有するビットコインウォレット。ビットコインユーザーが作った、コミュニティのためのビットコインウォレット。
世界中の誰とでもすぐに取引ができ、あなたのポケットからファイナンスの仕組みを変革します。
無料で数の制限なくビットコインウォレットを作ることも、お持ちのウォレットをインポートすることもできます。シンプルでスピーディです。
_____
特長:
1 - デザインによるセキュリティ
オープンソース
MITライセンスにより、あなた自身でビルド・実行可能 ReactNative製。
もっともらしい否認
アクセスの開示を強要された時でも、フェイクのビットコインウォレットを復号できるパスワード
完全な暗号化
iOSのマルチレイヤー暗号化に加え、追加のパスワードですべてを暗号化
フルノード
Electrumを通じてビットコインフルードに接続
コールドストレージ
ハードウェアウォレットに接続し、コインをコールドストレージに保存
2 - ユーザーエクスペリエンス重視
思いのままに
秘密鍵はずっとあなたのデバイスの中に。あなたが秘密鍵をコントロールします
柔軟な手数料
1 Satoshiから。ユーザーのあなた自身が決定します
Replace-By-Fee
(RBF) 手数料を増やして取引をスピードアップ (BIP125)
閲覧専用ウォレット
閲覧専用ウォレットにより、ハードウェアに触れることなくコールドストレージを監視できます。
ライトニングネットワーク
設定の要らないライトニングウォレット。有り得ないほど安く、速い取引で最高のビットコイン体験を。

View file

@ -0,0 +1 @@
ビットコイン,ウォレット,ビットコインウォレット,ブロックチェーン,btc,仮想通貨,暗号通貨,electrum,イーサリアム

View file

@ -0,0 +1 @@
BlueWallet - ビットコインウォレット

View file

@ -0,0 +1,10 @@
特長
* オープンソース
* 完全な暗号化
* もっともらしい否認
* 柔軟な手数料
* Replace-By-Fee (RBF)
* SegWit
* 閲覧専用(Sentinel)ウォレット
* ライトニングネットワーク

View file

@ -2,7 +2,7 @@ Uma carteira Bitcoin que permite armazenar, enviar e receber Bitcoins. Focada em
BlueWallet, uma carteira de bitcoin onde você detém a posse das chaves privadas. Uma carteira Bitcoin criada para a comunidade por usuários do Bitcoin.
Você pode fazer transações instantaneamente com qualquer pessoa no mundo e transformar o sistema financeiro direto do seu bolso.
Você pode fazer transações instantaneamente com qualquer pessoa no mundo e transformar o sistema financeiro direto do seu bolso.
Crie um número ilimitado de carteiras de Bitcoin gratuitamente ou importe sua carteira existente. É simples e rápido.
@ -13,7 +13,7 @@ Entenda o que oferecemos:
1 - Designada para ser segura
De Código Aberto
Código Aberto
Licenciado pelo MIT, você pode compilar e rodar a sua própria versão! Feita com ReactNative
Negação plausível
@ -26,21 +26,21 @@ Nó completo
Conecte-se ao seu nó completo Bitcoin através da Electrum
Armazenamento Frio
Conecte com sua carteira hardware e mantenha suas moedas em armazenamento frio
Conecte-se a sua carteira hardware e mantenha suas moedas em armazenamento frio
2 - Foco na sua experiência
2 - Focada na sua experiência
Tenha o controle
Chaves privadas nunca saem do seu dispositivo. Você detém o controle delas.
Taxas flexíveis
A partir de 1 satoshi. Você decide
A partir de 1 Satoshi. Definidas por você, o usuário
Replace-By-Fee
(RBF) Acelere suas transações aumentando a taxa depois de enviar (BIP125)
Carteiras somente leitura
Carteiras somente leitura permitem a você ficar de olho no seu armazenamento frio sem tocar na hardwallet.
Carteiras somente leitura permitem a você ficar de olho no seu armazenamento frio sem tocar na sua carteira hardware.
Lightning Network
Rede Lightning
Carteira Lightning sem precisar configurar nada. Transações muito baratas e rápidas para ter a melhor experiência com o Bitcoin.

View file

@ -281,7 +281,7 @@
"lightning_saved": "تم حفظ تغييراتك بنجاح",
"lightning_settings": "إعدادات البرق (Lightning)",
"tor_settings": "اعدادات tor",
"lightning_settings_explain": "للاتصال بنود LND الخاصة بك، يُرجى تثبيت LNDHub ثم وضع رابطه هنا في الإعدادات. اترك الحقل فارغًا لاستخدام (lndhub.io) المشغل من قبل BlueWallet. تذكر: فقط المحافظ التي يتم إنشاؤها بعد حفظ التغييرات ستتصل بنود LNDHub التي قمت بإضافتها.",
"lightning_settings_explain": "للاتصال بنود LND الخاص بك، يُرجى تثبيت LNDHub ثم وضع رابطه هنا في الإعدادات. تذكر: فقط المحافظ التي يتم إنشاؤها بعد حفظ التغييرات ستتصل بنود LNDHub التي قمت بإضافتها.",
"network": "الشبكة",
"network_broadcast": "بث العملية",
"network_electrum": "خادم Electrum",

View file

@ -3,6 +3,7 @@
"bad_password": "Contrasenya incorrecta. Torna-ho a provar.",
"cancel": "Cancel·lar",
"continue": "Continuar",
"clipboard": "Porta-retalls",
"enter_password": "Introduïu la contrasenya",
"never": "mai",
"disabled": "Desactivat",
@ -45,6 +46,7 @@
"inactive": "Inactiu",
"channels": "Canals",
"no_channels": "No hi ha canals",
"claim_balance": "Reclamar el saldo {balance}",
"close_channel": "Tancar el canal",
"new_channel": "Nou canal",
"errorInvoiceExpired": "La factura ha caducat",
@ -60,7 +62,9 @@
"refill_external": "Recarregar amb un moneder extern",
"refill_lnd_balance": "Recarregar el balanç del moneder Lightning",
"sameWalletAsInvoiceError": "No pots pagar una factura amb el mateix moneder que l'ha creat.",
"title": "gestionar fons"
"title": "gestionar fons",
"can_send": "Pots enviar",
"can_receive": "Pots rebre"
},
"lndViewInvoice": {
"additional_info": "Informació addicional",
@ -112,6 +116,7 @@
"create_details": "Detalls",
"create_fee": "Comissió",
"create_memo": "Comentari",
"create_satoshi_per_vbyte": "Satoshis per vByte",
"create_this_is_hex": "Això és la representació en hexadecimal (hex) de la transacció, firmada i llesta per ser enviada a la xarxa. ¿Continuar?",
"create_to": "A",
"create_tx_size": "Mida de TX",
@ -124,10 +129,12 @@
"details_adv_full": "Utilitzeu tot el saldo",
"details_adv_full_sure": "Esteu segur que voleu utilitzar el saldo complet del moneder per a aquesta transacció?",
"details_adv_import": "Importar transacció",
"details_adv_import_qr": "Importar transacció (QR)",
"details_amount_field_is_not_valid": "Quantitat invalida",
"details_amount_field_is_less_than_minimum_amount_sat": "La quantitat especificada és massa petita. Introduïu una quantitat superior a 500 sats.",
"details_create": "Crear",
"details_fee_field_is_not_valid": "Comissió invalida",
"details_frozen": "{amount} BTC està bloquejat",
"details_next": "Següent",
"details_note_placeholder": "comentari (útil per tu)",
"details_scan": "Escanejar",
@ -145,6 +152,7 @@
"fee_custom": "Personalitzada",
"fee_fast": "Ràpid",
"fee_medium": "Mitjà",
"fee_satvbyte": "en sat/vByte",
"fee_slow": "Lent",
"header": "enviar",
"input_clear": "Netejar",
@ -152,7 +160,6 @@
"input_paste": "Enganxar",
"input_total": "Total:",
"permission_camera_message": "Necessitem el vostre permís per usar la vostra càmera.",
"permission_camera_title": "Permís per usar la càmera",
"psbt_sign": "Signar una transacció",
"open_settings": "Obre configuració",
"permission_storage_later": "Pregunta'm després",
@ -181,6 +188,7 @@
"default_wallets": "Veure tots els moneders",
"electrum_connected": "Conectat",
"electrum_connected_not": "No conectat",
"use_ssl": "Utilitza SSL",
"electrum_settings_server": "Servidor Electrum",
"electrum_settings_explain": "Deixa-ho buit per usar el valor per defecte",
"electrum_status": "estat",
@ -190,15 +198,21 @@
"electrum_select": "selecciona",
"electrum_reset": "Restableix la configuració predeterminada",
"electrum_clear": "Neteja",
"tor_supported": "Tor suportat",
"tor_unsupported": "Les conexions Tor no estan suportades",
"encrypt_title": "Seguretat",
"encrypt_use": "Utilitza {type}",
"general": "General",
"general_adv_mode": "Habilitar el mode avançat",
"header": "Configuració",
"language": "Idioma",
"last_updated": "Última actualització",
"lightning_error_lndhub_uri": "LNDHub URI no vàlid",
"lightning_settings": "Configuració Lightning",
"tor_settings": "Configuració de Tor",
"network": "Xarxa",
"network_electrum": "Servidor Electrum",
"not_a_valid_uri": "URI no vàlid",
"notifications": "Notificacions",
"open_link_in_explorer": "Obre l'enllaç a l'explorador",
"password": "Contrasenya",
@ -211,6 +225,7 @@
"retype_password": "Introdueix de nou la contrasenya contrasenya",
"save": "guardar",
"saved": "Desat",
"total_balance": "Saldo total",
"tools": "Eines"
},
"notifications": {
@ -220,14 +235,17 @@
"transactions": {
"cancel_title": "Cancel·lar aquesta transacció (RBF)",
"confirmations_lowercase": "{confirmations} confirmacions",
"copy_link": "Còpia l'enllaç",
"cpfp_create": "Crear",
"details_balance_hide": "Amaga el saldo",
"details_balance_show": "Mostra el saldo",
"details_block": "Altura del bloc",
"details_copy": "Copiar",
"details_copy_amount": "Còpia la quantitat",
"details_from": "De",
"details_inputs": "Entrades",
"details_outputs": "Sortides",
"date": "Data",
"details_received": "Rebut",
"transaction_note_saved": "La nota de transacció s'ha desat correctament.",
"details_show_in_block_explorer": "Mostrar en l'explorador de blocs",
@ -235,8 +253,10 @@
"details_to": "A",
"list_conf": "Conf: {number}",
"pending": "Pendent",
"view_wallet": "Veure {walletLabel}",
"list_title": "transaccions",
"status_cancel": "Cancel·lar la Transacció",
"txid": "ID de la transacció",
"updating": "Actualitzant..."
},
"wallets": {
@ -271,6 +291,8 @@
"import_scan_qr": "o escanejar codi QR?",
"import_success": "Èxit",
"import_title": "importar",
"import_derivation_found": "trobat",
"import_derivation_found_not": "No trobat",
"list_create_a_button": "Afegir ara",
"list_create_a_wallet": "Afegeix un moneder",
"list_empty_txs1": "Les seves transaccions apareixeran aquí,",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Vaše změny byly úspěšně uloženy",
"lightning_settings": "Lightning settings",
"tor_settings": "Nastavení Tor",
"lightning_settings_explain": "Chcete-li se připojit k vlastnímu uzlu LND, nainstalujte si LNDHub a v nastavení zadejte jeho adresu URL. Pokud chcete používat LNDHub společnosti BlueWallet (lndhub.io), ponechte prázdné pole. Upozorňujeme, že k zadanému LNDHubu se připojí pouze peněženky vytvořené po uložení změn.",
"lightning_settings_explain": "Chcete-li se připojit k vlastnímu uzlu LND, nainstalujte si LNDHub a v nastavení zadejte jeho adresu URL. Upozorňujeme, že k zadanému LNDHubu se připojí pouze peněženky vytvořené po uložení změn.",
"network": "Síť",
"network_broadcast": "Vyslat transakci",
"network_electrum": "Electrum server",

View file

@ -57,7 +57,7 @@
"header": "indstillinger",
"language": "Sprog",
"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 default ndHub\n (lndhub.io)",
"lightning_settings_explain": "To connect to your own LND node please install LndHub and put its URL here in settings. ",
"password": "Adgangskode",
"password_explain": "Indtast den adgangskode du vil bruge til at kryptere lageret",
"passwords_do_not_match": "Adgangskoden er ikke den samme",

View file

@ -279,7 +279,7 @@
"lightning_saved": "Deine Änderungen wurden gespeichert.",
"lightning_settings": "Lightning-Einstellungen",
"tor_settings": "Tor Einstellungen",
"lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten LNDHub installieren und dessen URL hier eingeben. Das Feld leer lassen, um den LNDHub (lndhub.io) von BlueWallet zur verwenden. Nach dem Speichern werden sich neu erstellte Wallets mit dem angegebenen LNDHub verbinden.",
"lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten LNDHub installieren und dessen URL hier eingeben. Das Feld leer lassen, um den LNDHub von BlueWallet zur verwenden. Nach dem Speichern werden sich neu erstellte Wallets mit dem angegebenen LNDHub verbinden.",
"network": "Netzwerk",
"network_broadcast": "Transaktion publizieren",
"network_electrum": "Electrum Server",

View file

@ -65,7 +65,7 @@
"header": "ρυθμίσεις",
"language": "Γλώσσα",
"lightning_settings": "Ρυθμίσεις Lightning",
"lightning_settings_explain": "Για να συνδεθείτε στον δικό σας κόμβο LND παρακαλούμε εγκαταστήστε το LndHub και βάλτε το URL του εδώ. Αφήστε το κενό για να χρησιμοποιήσετε το LNDHub της BlueWallet (lndhub.io). Αφού σώσετε τις ρυθμίσεις τυχόν νέα πορτοφόλια που θα δημιουργήσετε θα συνδεθούν στο LNDHub που επιλέξατε.",
"lightning_settings_explain": "Για να συνδεθείτε στον δικό σας κόμβο LND παρακαλούμε εγκαταστήστε το LndHub και βάλτε το URL του εδώ. Αφήστε το κενό για να χρησιμοποιήσετε το LNDHub της BlueWallet . Αφού σώσετε τις ρυθμίσεις τυχόν νέα πορτοφόλια που θα δημιουργήσετε θα συνδεθούν στο LNDHub που επιλέξατε.",
"password": "Κωδικός",
"password_explain": "Δώσε ένα κωδικό για την κρυπτογράφηση του αρχείου",
"passwords_do_not_match": "Οι κωδικοί δεν είναι ίδιοι",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Your changes have been saved successfully.",
"lightning_settings": "Lightning Settings",
"tor_settings": "Tor 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 BlueWallets LNDHub (lndhub.io). Please note that only 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. Please note that only wallets created after saving changes will connect to the specified LNDHub.",
"network": "Network",
"network_broadcast": "Broadcast Transaction",
"network_electrum": "Electrum Server",

View file

@ -279,7 +279,7 @@
"lightning_saved": "Tus cambios se han guardado correctamente",
"lightning_settings": "Configuración de Lightning",
"tor_settings": "Configuración de Tor",
"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.",
"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. Las carteras creadas tras guardar los cambios se conectarán al LNDHub especificado.",
"network": "Red",
"network_broadcast": "Emitir transacción",
"network_electrum": "Servidor Electrum",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Tus cambios han sido guardados correctamente.",
"lightning_settings": "Configuración de Lightning",
"tor_settings": "Configuración de Tor",
"lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Déjalo en blanco para usar LNDHub de BlueWallet (lndhub.io). Ten en cuenta que solo las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.",
"lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Ten en cuenta que solo las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.",
"network": "Red",
"network_broadcast": "Publicar transacción",
"network_electrum": "Servidor Electrum",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Muutoksesi on tallennettu onnistuneesti",
"lightning_settings": "Salama-asetukset",
"tor_settings": "Tor-asetukset",
"lightning_settings_explain": "Oman LND-solmun käyttö edellyttää että, siihen on asennettu LNDHub-ohjelmisto ja sen URL on määritelty tähän. Kentän ollessa tyhjä on käytössä BleaWallet:in oma LNDHub (lndhub.io). Huomaathan että asetusten tallettamisen jälkeen luodut lompakot yhdistäytyvät määriteltyyn solmuun.",
"lightning_settings_explain": "Jos haluat muodostaa yhteyden omaan LND-solmuun, asenna LNDHub ja laita sen URL-osoite tähän asetuksiin. Huomaa, että vain muutosten tallentamisen jälkeen luodut lompakot muodostavat yhteyden määritettyyn LNDHubiin.",
"network": "Verkko",
"network_broadcast": "Lähetä siirtotapahtuma",
"network_electrum": "Electrum-palvelin",

View file

@ -279,7 +279,7 @@
"lightning_saved": "Les changements ont bien été enregistrés",
"lightning_settings": "Paramètres Lightning",
"tor_settings": "Paramètres Tor",
"lightning_settings_explain": "Pour vous connecter à votre propre nœud LND, veuillez installer LNDHub et mettre son URL ici dans les paramètres. Laissez ce champ vide pour utiliser le LNDHub de BlueWallet (lndhub.io). Veuillez noter que seuls les portefeuilles créés après l'enregistrement des modifications se connecteront au LNDHub spécifié.",
"lightning_settings_explain": "Pour vous connecter à votre propre nœud LND, veuillez installer LNDHub et mettre son URL ici dans les paramètres. Laissez ce champ vide pour utiliser le LNDHub de BlueWallet . Veuillez noter que seuls les portefeuilles créés après l'enregistrement des modifications se connecteront au LNDHub spécifié.",
"network": "Réseau",
"network_broadcast": "Diffuser une transaction",
"network_electrum": "Serveur Electrum",

View file

@ -275,7 +275,7 @@
"lightning_saved": "השינויים נשמרו בהצלחה",
"lightning_settings": "הגדרות ברק",
"tor_settings": "הגדרות Tor",
"lightning_settings_explain": "כדי להתחבר לצומת LND אישי, אנא התקינו LNDHub והכניסו את כתובת ה- URL שלו כאן בהגדרות. השאירו ריק כדי להשתמש ב- LNDHub של BlueWallet (lndhub.io). שימו לב שרק ארנקים שנוצרו אחרי שמירת השינויים יתחברו ל- LNDHub שהוגדר.",
"lightning_settings_explain": "כדי להתחבר לצומת LND אישי, אנא התקינו LNDHub והכניסו את כתובת ה- URL שלו כאן בהגדרות. השאירו ריק כדי להשתמש ב- LNDHub של BlueWallet . שימו לב שרק ארנקים שנוצרו אחרי שמירת השינויים יתחברו ל- LNDHub שהוגדר.",
"network": "רשת",
"network_broadcast": "שידור פעולה",
"network_electrum": "שרת אלקטרום",

View file

@ -70,7 +70,7 @@
"header": "Postavke",
"language": "Jezik",
"lightning_settings": "Lightning postavke",
"lightning_settings_explain": "Za spajanje na tvoj vlastiti LND čvor trebaš instalirati LndHub i upisati njegov URL ovdje. Ostavi prazno za standardni ndHub\n (lndhub.io)",
"lightning_settings_explain": "Za spajanje na tvoj vlastiti LND čvor trebaš instalirati LndHub i upisati njegov URL ovdje. Ostavi prazno za standardni ndHub\n ",
"password": "Lozinka",
"password_explain": "Upiši lozinku koja će dekriptirati spremnik.",
"passwords_do_not_match": "Lozinke su različite",

View file

@ -271,7 +271,7 @@
"lightning_saved": "A változtatások sikeresen elmentve",
"lightning_settings": "Lightning Beállítások",
"tor_settings": "Tor Beállítások",
"lightning_settings_explain": "Ha saját LND node-hoz szeretne csatlakozni, telepítse az LNDHub alkalmazást, és adja meg az URL-címét a beállításokban. Hagyja üresen a BlueWallet LNDHub (lndhub.io) használatát. Kérjük, vegye figyelembe, hogy csak a módosítások mentése után létrehozott pénztárcák csatlakoznak a megadott LNDHub-hoz.",
"lightning_settings_explain": "Ha saját LND node-hoz szeretne csatlakozni, telepítse az LNDHub alkalmazást, és adja meg az URL-címét a beállításokban. Hagyja üresen a BlueWallet LNDHub használatát. Kérjük, vegye figyelembe, hogy csak a módosítások mentése után létrehozott pénztárcák csatlakoznak a megadott LNDHub-hoz.",
"network": "Hálózat",
"network_broadcast": "Tranzakció továbbitása",
"network_electrum": "Electrum szerver",

View file

@ -270,7 +270,7 @@
"lightning_saved": "I cambiamenti sono stati registrati con successo.",
"lightning_settings": "Impostazioni Lightning",
"tor_settings": "Impostazioni Tor",
"lightning_settings_explain": "Per connetterti al tuo nodo LND, installa LNDHub e inserisci il suo URL qui nelle impostazioni. Lascia vuoto per utilizzare l'LNDHub di BlueWallet (lndhub.io). Per favore, tieni presente che solo i wallet creati dopo il salvataggio delle modifiche si collegheranno al'LNDHub specificato.",
"lightning_settings_explain": "Per connetterti al tuo nodo LND, installa LNDHub e inserisci il suo URL qui nelle impostazioni. Lascia vuoto per utilizzare l'LNDHub di BlueWallet . Per favore, tieni presente che solo i wallet creati dopo il salvataggio delle modifiche si collegheranno al'LNDHub specificato.",
"network": "Rete",
"network_broadcast": "Trasmetti transazione",
"network_electrum": "Server Electrum",

View file

@ -281,7 +281,7 @@
"lightning_saved": "変更は正常に保存されました",
"lightning_settings": "Lightning 設定",
"tor_settings": "Tor設定",
"lightning_settings_explain": "他の LND ノードへ接続するには LndHub をインストール後、URL を入力してください。BlueWallet の既定の LNDHub (lndhub.io) を使用するには空欄にします。設定を保存した後に作成したウォレットのみが指定した LNDHub に接続しますので注意してください。",
"lightning_settings_explain": "他の LND ノードへ接続するには LNDHub をインストール後、URL を入力してください。指定した LNDHub へ接続するのは変更保存後に作成されたウォレットのみですので注意してください。",
"network": "ネットワーク",
"network_broadcast": "ブロードキャストトランザクション",
"network_electrum": "Electrum サーバー",

View file

@ -279,7 +279,7 @@
"lightning_saved": "변경된 사항이 성공적으로 저장되었습니다.",
"lightning_settings": "라이트닝 설정",
"tor_settings": "토르 설정",
"lightning_settings_explain": "자신이 직접운영하는 LND 노드에 연결하기위해선 LNDHub를 설치하고 그 URL을 여기 설정에 넣어십시요. 블루월렛에서 제공하는 LNDHub(lndhub.io)를 사용하실 경우는 공란으로 남겨주세요. 변경사항이 저장된 후 생선된 지갑들 만이 지정된 LNDHub에 연결됨을 주의하시기 바랍니다.",
"lightning_settings_explain": "자신이 직접운영하는 LND 노드에 연결하기위해선 LNDHub를 설치하고 그 URL을 여기 설정에 넣어십시요. 블루월렛에서 제공하는 LNDHub를 사용하실 경우는 공란으로 남겨주세요. 변경사항이 저장된 후 생선된 지갑들 만이 지정된 LNDHub에 연결됨을 주의하시기 바랍니다.",
"network": "네트워크",
"network_broadcast": "거래내역 송출",
"network_electrum": "일렉트럼 서버",

View file

@ -263,7 +263,7 @@
"lightning_saved": "Pengubahan oleh anda berjaya disimpan.",
"lightning_settings": "Tetapan Lightning",
"tor_settings": "Tetapan Tor",
"lightning_settings_explain": "Untuk menghubungkan nod LND anda sendiri, sila pasang LNDHub dan letakkan URL LNDHub dalam tetapan ini. Kosongkan untuk menggunakan LNDHub BlueWallet (lndhub.io). Sila ambil perhatian hanya dompet yang dicipta setelah perubahan disimpan akan dihubungkan kepada LNDHub tersebut.",
"lightning_settings_explain": "Untuk menghubungkan nod LND anda sendiri, sila pasang LNDHub dan letakkan URL LNDHub dalam tetapan ini. Kosongkan untuk menggunakan LNDHub BlueWallet . Sila ambil perhatian hanya dompet yang dicipta setelah perubahan disimpan akan dihubungkan kepada LNDHub tersebut.",
"network": "Rangkaian",
"network_broadcast": "Siarkan Urus Niaga",
"network_electrum": "Pelayan Electrum",

View file

@ -279,7 +279,7 @@
"lightning_saved": "Endringene dine er lagret.",
"lightning_settings": "Lightning Innstillinger",
"tor_settings": "Tor Innstillinger",
"lightning_settings_explain": "For å koble til din egen LND-node, installer LNDHub og legg inn URL-adressen her i innstillingene. La feltet stå tomt for å bruke BlueWallet sin LNDHub (lndhub.io). Vær oppmerksom på at bare lommebøker opprettet etter lagring av endringer vil koble til den angitte LNDHub.",
"lightning_settings_explain": "For å koble til din egen LND-node, installer LNDHub og legg inn URL-adressen her i innstillingene. La feltet stå tomt for å bruke BlueWallet sin LNDHub . Vær oppmerksom på at bare lommebøker opprettet etter lagring av endringer vil koble til den angitte LNDHub.",
"network": "Nettverk",
"network_broadcast": "Kringkast Transaksjon",
"network_electrum": "Electrum Server",

View file

@ -270,7 +270,7 @@
"lightning_saved": "Uw wijzigingen zijn succesvol opgeslagen",
"lightning_settings": "Lightning-instellingen",
"tor_settings": "Tor instellingen",
"lightning_settings_explain": "Om uw eigen LND node te verbinden, installeer LNDHub en voer de URL hier in bij instellingen. Laat open om de BlueWallet LNDHub (lndhub.io) te gebruiken. Let op dat enkel wallets die gecreëerd zijn na het opslaan van wijzigingen zullen verbinden met de aangegeven LNDHub.",
"lightning_settings_explain": "Om uw eigen LND node te verbinden, installeer LNDHub en voer de URL hier in bij instellingen. Laat open om de BlueWallet LNDHub te gebruiken. Let op dat enkel wallets die gecreëerd zijn na het opslaan van wijzigingen zullen verbinden met de aangegeven LNDHub.",
"network": "Netwerk",
"network_broadcast": "Verzend transactie",
"network_electrum": "Electrum server",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Wprowadzone przez ciebie zmiany zostały pomyślnie zachowane.",
"lightning_settings": "Ustawienia Lightning",
"tor_settings": "Ustawienia sieci Tor",
"lightning_settings_explain": "Aby podłączyć się do własnego węzła LND, zainstaluj najpierw LNDHub i podaj jego URL poniżej. Zostaw puste by użyć LNDhuba należącego do BlueWallet (lndhub.io). Portfele utworzone po zapisaniu zmian połączą się do wskazanego LNDHub.",
"lightning_settings_explain": "Aby połączyć się z własnym węzłem LND, zainstaluj LNDHub i wpisz jego adres URL w ustawieniach. Pamiętaj, że portfele utworzone po tej zmianie będą łączyć się z podanym serwerem LNDHub.",
"network": "Sieć",
"network_broadcast": "Rozgłoś transakcję",
"network_electrum": "Serwer Electrum",

View file

@ -281,7 +281,7 @@
"lightning_saved": "Suas alterações foram salvas com sucesso.",
"lightning_settings": "Configurações Lightning",
"tor_settings": "Configurações Tor",
"lightning_settings_explain": "Para conectar-se ao seu próprio nó LND, instale a LNDHub e copie o URL para cá. Deixe em branco para usar a LNDHub padrão fornecida pela BlueWallet (lndhub.io). Apenas carteiras criadas após mudanças nestas preferências ficarão ligadas ao LNDHub especificado.",
"lightning_settings_explain": "Para conectar-se ao seu próprio nó LND, instale a LNDHub e copie o URL para cá. Deixe em branco para usar a LNDHub padrão fornecida pela BlueWallet . Apenas carteiras criadas após mudanças nestas preferências ficarão ligadas ao LNDHub especificado.",
"network": "Rede",
"network_broadcast": "Transmitir Transação",
"network_electrum": "Servidor Electrum",

View file

@ -277,7 +277,7 @@
"lightning_saved": "Ваши изменения были успешно сохранены",
"lightning_settings": "Настройки Lightning",
"tor_settings": "Настройки Tor",
"lightning_settings_explain": "Чтобы подключиться к собственному LND, установите LNDHub и укажите его URL в настройках. Оставьте поле пустым, чтобы использовать LNDHub BlueWallet (lndhub.io). Обратите внимание, что только кошельки, созданные после сохранения изменений, будут подключаться к указанному LNDHub.",
"lightning_settings_explain": "Чтобы подключиться к собственному LND, установите LNDHub и укажите его URL в настройках. Оставьте поле пустым, чтобы использовать LNDHub BlueWallet . Обратите внимание, что только кошельки, созданные после сохранения изменений, будут подключаться к указанному LNDHub.",
"network": "Сеть",
"network_broadcast": "Отправить транзакцию",
"network_electrum": "Electrum сервер",

View file

@ -277,7 +277,7 @@
"lightning_saved": "ඔබේ වෙනස්කම් සාර්ථකව සුරැකී ඇත.",
"lightning_settings": "ලයිට්නින් සැකසුම්",
"tor_settings": "ටෝර් සැකසුම්",
"lightning_settings_explain": "ඔබේම එල්එන්ඩී නෝඩයට සම්බන්ධ වීමට කරුණාකර එල්.එන්.ඩී.හබ් ස්ථාපනය කර එහි යූආර්එල් සැකසුම් තුළට දමන්න. බ්ලූවොලට් හි එල්.එන්.ඩී.හබ් (lndhub.io) භාවිතා කිරීමට හිස්ව තබන්න. වෙනස්කම් සුරැකීමෙන් පසු සාදන ලද පසුම්බි පමණක් නිශ්චිත එල්.එන්.ඩී.හබ් වෙත සම්බන්ධ වන බව කරුණාවෙන් සලකන්න.",
"lightning_settings_explain": "ඔබේම එල්එන්ඩී නෝඩයට සම්බන්ධ වීමට කරුණාකර එල්.එන්.ඩී.හබ් ස්ථාපනය කර එහි යූආර්එල් සැකසුම් තුළට දමන්න. බ්ලූවොලට් හි එල්.එන්.ඩී.හබ් භාවිතා කිරීමට හිස්ව තබන්න. වෙනස්කම් සුරැකීමෙන් පසු සාදන ලද පසුම්බි පමණක් නිශ්චිත එල්.එන්.ඩී.හබ් වෙත සම්බන්ධ වන බව කරුණාවෙන් සලකන්න.",
"network": "ජාල",
"network_broadcast": "විකාශන ගනුදෙනුව",
"network_electrum": "ඉලෙක්ට්‍රම් සේවාදායකය",

View file

@ -278,7 +278,7 @@
"lightning_saved": "Spremembe so bile uspešno shranjene",
"lightning_settings": "Lightning Nastavitve",
"tor_settings": "Tor Nastavitve",
"lightning_settings_explain": "Za povezavo z lastnim LND vozliščem, prosimo namestite LndHub in tukaj vnesite URL vozlišča. Pustite prazno za uporabo BlueWallet LNDHub (lndhub.io). Z novim LNDHub-om bodo povezane samo denarnice ustvarjene po potrditvi sprememb.",
"lightning_settings_explain": "Za povezavo z lastnim LND vozliščem, prosimo namestite LndHub in tukaj vnesite URL vozlišča. Pustite prazno za uporabo BlueWallet LNDHub . Z novim LNDHub-om bodo povezane samo denarnice ustvarjene po potrditvi sprememb.",
"network": "Omrežje",
"network_broadcast": "Objavi transakcijo",
"network_electrum": "Electrum Strežnik",

View file

@ -127,7 +127,7 @@
"header": "instellings",
"language": "Taal",
"lightning_settings": "Lightning Instellings",
"lightning_settings_explain": "Om jou eie LND knoop-punt te konnekteer, installeer asseblief LndHub en pos die URL hier in verstellings. Los leeg om die standaard LndHub (lndhub.io) te gebruik. Beursies geskep na verstellings geberg is sal koppel aan die gespesifiseerde LNDHub.",
"lightning_settings_explain": "Om jou eie LND knoop-punt te konnekteer, installeer asseblief LndHub en pos die URL hier in verstellings. Los leeg om die standaard LndHub te gebruik. Beursies geskep na verstellings geberg is sal koppel aan die gespesifiseerde LNDHub.",
"password": "Wagwoord",
"password_explain": "Skep die wagwoord wat jy sal gebruik om jou berging te de-enkripteer",
"passwords_do_not_match": "Wagwoorde stem nie oor een nie",

View file

@ -3,8 +3,10 @@
"bad_password": "密码无效,请重试。",
"cancel": "取消",
"continue": "继续",
"clipboard": "剪贴板",
"enter_password": "输入密码",
"never": "永不",
"disabled": "禁用",
"of": "{total}其中之{number}",
"ok": "好的",
"storage_is_encrypted": "你的储存资料已经被加密, 请输入密码解密。",
@ -15,7 +17,8 @@
"success": "成功",
"wallet_key": "钱包密钥",
"invalid_animated_qr_code_fragment": "无效的动态二维码,请重试。",
"file_saved": "文件已保存"
"file_saved": "文件已保存",
"downloads_folder": "下载文件夹"
},
"alert": {
"default": "提示"
@ -40,6 +43,8 @@
"network": "网络错误"
},
"lnd": {
"active": "激活",
"inactive": "无效",
"errorInvoiceExpired": "账单已过期",
"expired": "已过期",
"payButton": "支付",
@ -143,7 +148,6 @@
"input_paste": "粘贴",
"input_total": "总计:",
"permission_camera_message": "我们需要您的授权许可才能使用您的相机。",
"permission_camera_title": "授权允许使用相机",
"psbt_sign": "签署一笔交易",
"open_settings": "打开设置",
"permission_storage_later": "等会问我",

View file

@ -3,7 +3,7 @@
"bad_password": "密碼無效,請重試。",
"cancel": "取消",
"continue": "繼續",
"clipboard": "剪貼",
"clipboard": "剪貼簿",
"enter_password": "輸入密碼",
"never": "永不",
"of": "{total}其中之{number}",
@ -143,7 +143,6 @@
"input_paste": "貼上",
"input_total": "總計:",
"permission_camera_message": "我們需要您的授權許可才能使用您的相機。",
"permission_camera_title": "授權允許使用相機",
"psbt_sign": "簽署一單交易",
"open_settings": "開啟設定",
"permission_storage_later": "稍後問我",
@ -326,7 +325,6 @@
"import_do_import": "匯入",
"import_error": "匯入失敗,請確認所提供的資訊是有效的",
"import_explanation": "輸入你的種子短語、公鑰、WIF或者任何你擁有的東西。BlueWallet將盡可能猜測正確的格式並匯入您的錢包",
"import_file": "匯入檔案",
"import_imported": "已經匯入",
"import_scan_qr": "掃描或匯入檔案",
"import_success": "成功",
@ -436,7 +434,7 @@
"enter_address": "輸入地址",
"check_address": "檢查地址",
"no_wallet_owns_address": "沒有可用的錢包擁有提供的地址。",
"view_qrcode": "檢視二維碼"
"view_qrcode": "檢視二維碼"
},
"cc": {
"change": "更變。",

View file

@ -4,10 +4,10 @@ export const BitcoinUnit = {
LOCAL_CURRENCY: 'local_currency',
MAX: 'MAX',
} as const;
export type BitcoinUnit = typeof BitcoinUnit[keyof typeof BitcoinUnit];
export type BitcoinUnit = (typeof BitcoinUnit)[keyof typeof BitcoinUnit];
export const Chain = {
ONCHAIN: 'ONCHAIN',
OFFCHAIN: 'OFFCHAIN',
} as const;
export type Chain = typeof Chain[keyof typeof Chain];
export type Chain = (typeof Chain)[keyof typeof Chain];

28764
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -7,21 +7,22 @@
"url": "https://github.com/BlueWallet/BlueWallet.git"
},
"devDependencies": {
"@babel/core": "^7.17.9",
"@babel/runtime": "^7.17.9",
"@babel/core": "^7.20.0",
"@babel/runtime": "^7.20.0",
"@jest/reporters": "^27.5.1",
"@react-native-community/eslint-config": "^3.1.0",
"@react-native-community/eslint-config": "^3.2.0",
"@tsconfig/react-native": "^2.0.2",
"@types/bs58check": "^2.1.0",
"@types/create-hash": "^1.2.2",
"@types/jest": "^27.5.1",
"@types/react": "^17.0.39",
"@types/react-native": "^0.67.6",
"@types/react-test-renderer": "^17.0.1",
"@types/jest": "^29.4.0",
"@types/react": "^18.0.24",
"@types/react-native": "^0.71.0",
"@types/react-test-renderer": "^18.0.0",
"@typescript-eslint/eslint-plugin": "^5.41.0",
"@typescript-eslint/parser": "^5.41.0",
"babel-cli": "^6.26.0",
"babel-eslint": "^10.1.0",
"babel-jest": "^27.5.1",
"babel-jest": "^29.4.3",
"eslint": "^8.26.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0",
@ -34,10 +35,11 @@
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-react": "^7.31.10",
"eslint-plugin-react-native": "^4.0.0",
"jest": "^27.5.1",
"jest": "^29.4.2",
"node-fetch": "^2.6.7",
"prettier": "^2.7.1",
"react-test-renderer": "17.0.2",
"react-test-renderer": "18.2.0",
"ts-jest": "^29.0.5",
"typescript": "^4.8.4"
},
"engines": {
@ -54,7 +56,8 @@
"android": "react-native run-android",
"android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android",
"ios": "react-native run-ios",
"postinstall": "rn-nodeify --install buffer,events,process,stream,inherits,path,assert,crypto --hack; npm run releasenotes2json; npm run branch2json; npm run podinstall",
"postinstall": "rn-nodeify --install buffer,events,process,stream,inherits,path,assert,crypto --hack; npm run releasenotes2json; npm run branch2json; npm run podinstall; npm run patches",
"patches": "patch -p1 < scripts/react-native-tor.patch; patch -p1 < scripts/rn-ldk.patch",
"test": "npm run tslint && npm run lint && npm run unit && npm run jest",
"jest": "jest -b tests/integration/*",
"windowspatches": "./scripts/windows-patches.sh",
@ -63,7 +66,7 @@
"e2e:debug-test": "detox test -c android.debug -d 200000 -l info",
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test",
"e2e:release-build": "detox build -c android.release",
"e2e:release-test": "detox test -c android.release --record-videos all --record-logs all --take-screenshots all --headless -d 200000",
"e2e:release-test": "detox test -c android.release --record-videos all --record-logs all --take-screenshots all --headless -d 200000 -R 3",
"tslint": "tsc",
"lint": "eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components && npm run tslint && node scripts/find-unused-loc.js",
"lint:fix": "npm run lint -- --fix",
@ -74,7 +77,7 @@
"jest": {
"preset": "react-native",
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js"
"^.+\\.(ts|tsx)$": "ts-jest"
},
"moduleFileExtensions": [
"js",
@ -96,13 +99,13 @@
]
},
"dependencies": {
"@babel/preset-env": "7.19.4",
"@bugsnag/react-native": "7.18.2",
"@babel/preset-env": "^7.20.0",
"@bugsnag/react-native": "7.19.0",
"@bugsnag/source-maps": "2.3.1",
"@keystonehq/bc-ur-registry": "0.5.4",
"@ngraveio/bc-ur": "1.1.6",
"@react-native-async-storage/async-storage": "1.17.10",
"@react-native-clipboard/clipboard": "1.10.0",
"@react-native-async-storage/async-storage": "1.17.11",
"@react-native-clipboard/clipboard": "1.11.2",
"@react-native-community/push-notification-ios": "1.10.1",
"@react-navigation/drawer": "5.12.9",
"@react-navigation/native": "5.9.8",
@ -126,7 +129,7 @@
"coinselect": "3.1.13",
"crypto-js": "4.1.1",
"dayjs": "1.11.7",
"detox": "19.12.5",
"detox": "20.5.0",
"ecpair": "2.0.1",
"ecurve": "1.0.6",
"electrum-client": "https://github.com/BlueWallet/rn-electrum-client#76c0ea35e1a50c47f3a7f818d529ebd100161496",
@ -135,33 +138,33 @@
"frisbee": "3.1.4",
"junderw-crc32c": "1.2.0",
"lottie-ios": "3.4.4",
"lottie-react-native": "5.1.4",
"metro-react-native-babel-preset": "0.74.1",
"lottie-react-native": "5.1.5",
"metro-react-native-babel-preset": "0.76.0",
"path-browserify": "1.0.1",
"payjoin-client": "1.0.1",
"process": "0.11.10",
"prop-types": "15.8.1",
"react": "17.0.2",
"react": "18.2.0",
"react-localization": "github:BlueWallet/react-localization#ae7969a",
"react-native": "0.67.5",
"react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto#e9b60605dbdb24de720e923f740912a4930383ff",
"react-native": "0.71.3",
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442",
"react-native-camera-kit": "13.0.0",
"react-native-crypto": "2.2.0",
"react-native-default-preference": "1.4.4",
"react-native-device-info": "8.7.1",
"react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#c52e7a6d2a08f5506c23de86c1401775419f772c",
"react-native-elements": "3.4.2",
"react-native-elements": "3.4.3",
"react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e",
"react-native-fs": "2.19.0",
"react-native-gesture-handler": "2.8.0",
"react-native-fs": "2.20.0",
"react-native-gesture-handler": "2.9.0",
"react-native-handoff": "https://github.com/BlueWallet/react-native-handoff#31d005f93d31099d0e564590a3bbd052b8a02b39",
"react-native-haptic-feedback": "1.14.0",
"react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b",
"react-native-image-picker": "4.8.5",
"react-native-ios-context-menu": "https://github.com/BlueWallet/react-native-ios-context-menu.git#v1.12.2",
"react-native-keychain": "8.0.0",
"react-native-ios-context-menu": "github:BlueWallet/react-native-ios-context-menu#v1.15.3",
"react-native-keychain": "8.1.1",
"react-native-linear-gradient": "2.6.2",
"react-native-localize": "2.2.4",
"react-native-localize": "2.2.5",
"react-native-modal": "13.0.1",
"react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#3b2894ae62fbce99a3bd24105f0921cebaef5c94",
"react-native-obscure": "https://github.com/BlueWallet/react-native-obscure.git#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb",
@ -173,21 +176,21 @@
"react-native-quick-actions": "0.3.13",
"react-native-randombytes": "3.6.1",
"react-native-rate": "1.2.12",
"react-native-reanimated": "2.13.0",
"react-native-reanimated": "2.14.4",
"react-native-safe-area-context": "3.4.1",
"react-native-screens": "3.19.0",
"react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9",
"react-native-share": "7.9.1",
"react-native-svg": "12.4.4",
"react-native-screens": "3.20.0",
"react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#2076b48",
"react-native-share": "8.2.1",
"react-native-svg": "13.8.0",
"react-native-tcp-socket": "5.6.2",
"react-native-tor": "0.1.8",
"react-native-vector-icons": "9.2.0",
"react-native-watch-connectivity": "1.1.0",
"react-native-webview": "11.26.1",
"react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#b80630cc8894ce479275d6dd3a5183f41f220237",
"react-native-windows": "0.70.10",
"react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#a128c38",
"react-native-windows": "0.71.2",
"readable-stream": "3.6.0",
"realm": "^10.20.0-beta.5",
"realm": "11.5.1",
"rn-ldk": "github:BlueWallet/rn-ldk#v0.8.4",
"rn-nodeify": "10.3.0",
"scryptsy": "2.1.0",

View file

@ -15,16 +15,16 @@ const styles = StyleSheet.create({
});
const GeneralSettings = () => {
const { isAdancedModeEnabled, setIsAdancedModeEnabled, wallets, isHandOffUseEnabled, setIsHandOffUseEnabledAsyncStorage } =
const { isAdvancedModeEnabled, setisAdvancedModeEnabled, wallets, isHandOffUseEnabled, setIsHandOffUseEnabledAsyncStorage } =
useContext(BlueStorageContext);
const [isLoading, setIsLoading] = useState(true);
const [isAdancedModeSwitchEnabled, setIsAdancedModeSwitchEnabled] = useState(false);
const [isAdvancedModeSwitchEnabled, setIsAdvancedModeSwitchEnabled] = useState(false);
const [isURv1SwitchEnabled, setIsURv1SwitchEnabled] = useState(false);
const { navigate } = useNavigation();
const { colors } = useTheme();
const onAdvancedModeSwitch = async value => {
await setIsAdancedModeEnabled(value);
setIsAdancedModeSwitchEnabled(value);
await setisAdvancedModeEnabled(value);
setIsAdvancedModeSwitchEnabled(value);
};
const onLegacyURv1Switch = async value => {
setIsURv1SwitchEnabled(value);
@ -33,7 +33,7 @@ const GeneralSettings = () => {
useEffect(() => {
(async () => {
setIsAdancedModeSwitchEnabled(await isAdancedModeEnabled());
setIsAdvancedModeSwitchEnabled(await isAdvancedModeEnabled());
setIsURv1SwitchEnabled(await isURv1Enabled());
setIsLoading(false);
})();
@ -85,7 +85,7 @@ const GeneralSettings = () => {
<BlueListItem
Component={TouchableWithoutFeedback}
title={loc.settings.general_adv_mode}
switch={{ onValueChange: onAdvancedModeSwitch, value: isAdancedModeSwitchEnabled, testID: 'AdvancedMode' }}
switch={{ onValueChange: onAdvancedModeSwitch, value: isAdvancedModeSwitchEnabled, testID: 'AdvancedMode' }}
/>
<BlueCard>
<BlueText>{loc.settings.general_adv_mode_e}</BlueText>

View file

@ -51,7 +51,7 @@ const ButtonSelected = Object.freeze({
const WalletsAdd = () => {
const { colors } = useTheme();
const { addWallet, saveToDisk, isAdancedModeEnabled, wallets } = useContext(BlueStorageContext);
const { addWallet, saveToDisk, isAdvancedModeEnabled, wallets } = useContext(BlueStorageContext);
const [isLoading, setIsLoading] = useState(true);
const [walletBaseURI, setWalletBaseURI] = useState('');
const [selectedIndex, setSelectedIndex] = useState(0);
@ -86,9 +86,9 @@ const WalletsAdd = () => {
useEffect(() => {
AsyncStorage.getItem(AppStorage.LNDHUB)
.then(url => setWalletBaseURI(url || 'https://lndhub.io'))
.then(url => setWalletBaseURI(url))
.catch(() => setWalletBaseURI(''));
isAdancedModeEnabled()
isAdvancedModeEnabled()
.then(setIsAdvancedOptionsEnabled)
.finally(() => setIsLoading(false));
// eslint-disable-next-line react-hooks/exhaustive-deps

View file

@ -21,7 +21,7 @@ const WalletsAddMultisig = () => {
const [n, setN] = useState(3);
const [isModalVisible, setIsModalVisible] = useState(false);
const [format, setFormat] = useState(MultisigHDWallet.FORMAT_P2WSH);
const { isAdancedModeEnabled } = useContext(BlueStorageContext);
const { isAdvancedModeEnabled } = useContext(BlueStorageContext);
const [isAdvancedModeEnabledRender, setIsAdvancedModeEnabledRender] = useState(false);
const stylesHook = StyleSheet.create({
@ -64,7 +64,7 @@ const WalletsAddMultisig = () => {
}, []);
useEffect(() => {
isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender);
isAdvancedModeEnabled().then(setIsAdvancedModeEnabledRender);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

View file

@ -49,7 +49,7 @@ const isDesktop = getSystemName() === 'Mac OS X';
const staticCache = {};
const WalletsAddMultisigStep2 = () => {
const { addWallet, saveToDisk, isElectrumDisabled, isAdancedModeEnabled, sleep } = useContext(BlueStorageContext);
const { addWallet, saveToDisk, isElectrumDisabled, isAdvancedModeEnabled, sleep } = useContext(BlueStorageContext);
const { colors } = useTheme();
const navigation = useNavigation();
@ -71,7 +71,7 @@ const WalletsAddMultisigStep2 = () => {
const data = useRef(new Array(n));
useEffect(() => {
isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender);
isAdvancedModeEnabled().then(setIsAdvancedModeEnabledRender);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

View file

@ -126,7 +126,7 @@ const WalletDetails = () => {
const wallet = useRef(wallets.find(w => w.getID() === walletID)).current;
const [walletName, setWalletName] = useState(wallet.getLabel());
const [useWithHardwareWallet, setUseWithHardwareWallet] = useState(wallet.useWithHardwareWalletEnabled());
const { isAdancedModeEnabled } = useContext(BlueStorageContext);
const { isAdvancedModeEnabled } = useContext(BlueStorageContext);
const [isAdvancedModeEnabledRender, setIsAdvancedModeEnabledRender] = useState(false);
const [isBIP47Enabled, setIsBIP47Enabled] = useState(wallet.isBIP47Enabled());
const [hideTransactionsInWalletsList, setHideTransactionsInWalletsList] = useState(!wallet.getHideTransactionsInWalletsList());
@ -202,7 +202,7 @@ const WalletDetails = () => {
};
useLayoutEffect(() => {
isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender);
isAdvancedModeEnabled().then(setIsAdvancedModeEnabledRender);
// eslint-disable-next-line react-hooks/exhaustive-deps
setOptions({
headerRight: () => (

View file

@ -23,7 +23,7 @@ const WalletsImport = () => {
const route = useRoute();
const label = route?.params?.label ?? '';
const triggerImport = route?.params?.triggerImport ?? false;
const { isAdancedModeEnabled } = useContext(BlueStorageContext);
const { isAdvancedModeEnabled } = useContext(BlueStorageContext);
const [importText, setImportText] = useState(label);
const [isToolbarVisibleForAndroid, setIsToolbarVisibleForAndroid] = useState(false);
const [, setSpeedBackdoor] = useState(0);
@ -68,7 +68,7 @@ const WalletsImport = () => {
}, []);
useEffect(() => {
isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender);
isAdvancedModeEnabled().then(setIsAdvancedModeEnabledRender);
if (triggerImport) importButtonPressed();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

View file

@ -49,7 +49,7 @@ const prompt = require('../../helpers/prompt');
const ViewEditMultisigCosigners = () => {
const hasLoaded = useRef(false);
const { colors } = useTheme();
const { wallets, setWalletsWithNewOrder, isElectrumDisabled, isAdancedModeEnabled } = useContext(BlueStorageContext);
const { wallets, setWalletsWithNewOrder, isElectrumDisabled, isAdvancedModeEnabled } = useContext(BlueStorageContext);
const { navigate, goBack } = useNavigation();
const route = useRoute();
const openScannerButtonRef = useRef();
@ -103,7 +103,7 @@ const ViewEditMultisigCosigners = () => {
});
useEffect(() => {
isAdancedModeEnabled().then(setIsAdvancedModeEnabledRender);
isAdvancedModeEnabled().then(setIsAdvancedModeEnabledRender);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

View file

@ -0,0 +1,8 @@
--- ../node_modules/react-native-tor/android/gradle.properties
+++ ../node_modules/react-native-tor/android/gradle.properties
@@ -1,4 +1,4 @@
-Tor_kotlinVersion=1.3.50
+Tor_kotlinVersion=1.6.0
Tor_compileSdkVersion=30
Tor_buildToolsVersion=30.0.1
Tor_targetSdkVersion=30

8
scripts/rn-ldk.patch Normal file
View file

@ -0,0 +1,8 @@
--- ../node_modules/rn-ldk/android/gradle.properties
+++ ../node_modules/rn-ldk/android/gradle.properties
@@ -1,4 +1,4 @@
-RnLdk_kotlinVersion=1.3.50
+RnLdk_kotlinVersion=1.6.0
RnLdk_compileSdkVersion=29
RnLdk_buildToolsVersion=29.0.2
RnLdk_targetSdkVersion=29

View file

@ -12,12 +12,22 @@ import {
const bitcoin = require('bitcoinjs-lib');
const assert = require('assert');
/**
* this testsuite is for test cases that require no wallets to be present
*/
beforeAll(async () => {
// reinstalling the app just for any case to clean up app's storage
await device.launchApp({ delete: true });
}, 300_000);
describe('BlueWallet UI Tests - no wallets', () => {
it('selftest passes', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t1');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t1'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await waitFor(element(by.id('WalletsList')))
.toBeVisible()
.withTimeout(300 * 1000);
@ -41,6 +51,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t2'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
// go to settings, press SelfTest and wait for OK
@ -176,6 +187,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t3'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
await helperCreateWallet();
@ -212,6 +224,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t4'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
// lets create a wallet
@ -365,6 +378,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t5'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
await helperCreateWallet();
await element(by.id('SettingsButton')).tap();
@ -441,7 +455,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t6'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
await element(by.id('WalletsList')).swipe('left', 'fast', 1); // in case emu screen is small and it doesnt fit
// going to Import Wallet screen and importing mnemonic
@ -568,7 +582,7 @@ describe('BlueWallet UI Tests - no wallets', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t6'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await yo('WalletsList');
// enable AdvancedMode to see derivation path in wallet details

View file

@ -1,31 +1,31 @@
import { helperDeleteWallet, sleep, hashIt, sup, helperImportWallet, yo, extractTextFromElementById } from './helperz';
import { extractTextFromElementById, hashIt, helperImportWallet, sleep, sup, yo } from './helperz';
const bitcoin = require('bitcoinjs-lib');
const assert = require('assert');
/**
* in this suite each test requires that there is one specific wallet present, thus, we import it
* before anything else.
* we dont clean it up as we expect other test suites to do clean install of the app
*/
beforeAll(async () => {
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
// reinstalling the app just for any case to clean up app's storage
await device.launchApp({ delete: true });
console.log('before all - importing bip48');
console.log('before all - importing bip48...');
await helperImportWallet(process.env.HD_MNEMONIC_BIP84, 'HDsegwitBech32', 'Imported HD SegWit (BIP84 Bech32 Native)', '0.00105526 BTC');
console.log('...imported!');
await device.pressBack();
await sleep(15000);
}, 1200000);
afterAll(async () => {
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
console.log('after all - deleting bip84');
await helperDeleteWallet('Imported HD SegWit (BIP84 Bech32 Native)', '105526');
});
}, 1200_000);
describe('BlueWallet UI Tests - import BIP84 wallet', () => {
it('can import BIP84 mnemonic, fetch balance & transactions, then create a transaction; then cosign', async () => {
it('can create a transaction; can scanQR with bip21; can switch units', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t21');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t21'), 'as it previously passed on Travis');
@ -34,6 +34,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
@ -170,16 +171,41 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
assert.strictEqual(transaction.outs.length, 2);
assert.strictEqual(transaction.outs[0].value, 50000);
// now, testing send many feature
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
await device.pressBack();
await device.pressBack();
// we already have one output, lest add another two
it('can batch send', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t_batch_send');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis');
}
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
await element(by.id('SendButton')).tap();
// lets create real transaction:
await element(by.id('AddressInput')).replaceText('bc1qnapskphjnwzw2w3dk4anpxntunc77v6qrua0f7');
await element(by.id('BitcoinAmountInput')).replaceText('0.0001\n');
// setting fee rate:
const feeRate = 2;
await element(by.id('chooseFee')).tap();
await element(by.id('feeCustom')).tap();
await element(by.type('android.widget.EditText')).replaceText(feeRate + '');
await element(by.text('OK')).tap();
// lest add another two outputs
await element(by.id('advancedOptionsMenuButton')).tap();
await element(by.id('AddRecipient')).tap();
await yo('Transaction1'); // adding a recipient autoscrolls it to the last one
await element(by.id('AddressInput').withAncestor(by.id('Transaction1'))).replaceText('bc1q063ctu6jhe5k4v8ka99qac8rcm2tzjjnuktyrl');
await element(by.id('BitcoinAmountInput').withAncestor(by.id('Transaction1'))).typeText('0.0002\n');
await element(by.id('BitcoinAmountInput').withAncestor(by.id('Transaction1'))).replaceText('0.0002\n');
await element(by.id('advancedOptionsMenuButton')).tap();
await element(by.id('AddRecipient')).tap();
@ -194,11 +220,12 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
await element(by.id('advancedOptionsMenuButton')).tap();
await element(by.id('AddRecipient')).tap();
await yo('Transaction2'); // adding a recipient autoscrolls it to the last one
await element(by.id('AddressInput').withAncestor(by.id('Transaction2'))).replaceText('bc1q063ctu6jhe5k4v8ka99qac8rcm2tzjjnuktyrl');
await element(by.id('BitcoinAmountInput').withAncestor(by.id('Transaction2'))).typeText('0.0003\n');
await element(by.id('AddressInput').withAncestor(by.id('Transaction2'))).replaceText('bc1qh6tf004ty7z7un2v5ntu4mkf630545gvhs45u7');
await element(by.id('BitcoinAmountInput').withAncestor(by.id('Transaction2'))).replaceText('0.0003\n');
// remove second output
await element(by.id('Transaction2')).swipe('right', 'fast', NaN, 0.2);
await sleep(5000);
await element(by.id('advancedOptionsMenuButton')).tap();
await element(by.id('RemoveRecipient')).tap();
@ -209,22 +236,35 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
} catch (_) {}
await element(by.id('TransactionDetailsButton')).tap();
txhex = await extractTextFromElementById('TxhexInput');
transaction = bitcoin.Transaction.fromHex(txhex);
const txhex = await extractTextFromElementById('TxhexInput');
const transaction = bitcoin.Transaction.fromHex(txhex);
assert.strictEqual(transaction.outs.length, 3);
assert.strictEqual(bitcoin.address.fromOutputScript(transaction.outs[0].script), 'bc1qnapskphjnwzw2w3dk4anpxntunc77v6qrua0f7');
assert.strictEqual(transaction.outs[0].value, 50000);
assert.strictEqual(bitcoin.address.fromOutputScript(transaction.outs[1].script), 'bc1q063ctu6jhe5k4v8ka99qac8rcm2tzjjnuktyrl');
assert.strictEqual(transaction.outs[1].value, 30000);
assert.strictEqual(transaction.outs[0].value, 10000);
assert.strictEqual(bitcoin.address.fromOutputScript(transaction.outs[1].script), 'bc1qh6tf004ty7z7un2v5ntu4mkf630545gvhs45u7');
assert.strictEqual(transaction.outs[1].value, 30000, `got txhex ${txhex}`);
// now, testing sendMAX feature:
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
it('can sendMAX', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t_sendMAX');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis');
}
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
await device.pressBack();
await device.pressBack();
await device.pressBack(); // go back to wallet tx list to reset the form
await element(by.id('SendButton')).tap();
// set fee rate
const feeRate = 2;
await element(by.id('chooseFee')).tap();
await element(by.id('feeCustom')).tap();
await element(by.type('android.widget.EditText')).typeText(feeRate + '');
@ -244,8 +284,8 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
// created. verifying:
await yo('TransactionDetailsButton');
await element(by.id('TransactionDetailsButton')).tap();
txhex = await extractTextFromElementById('TxhexInput');
transaction = bitcoin.Transaction.fromHex(txhex);
let txhex = await extractTextFromElementById('TxhexInput');
let transaction = bitcoin.Transaction.fromHex(txhex);
assert.strictEqual(transaction.outs.length, 1, 'should be single output, no change');
assert.ok(transaction.outs[0].value > 100000);
@ -273,12 +313,24 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
assert.strictEqual(bitcoin.address.fromOutputScript(transaction.outs[1].script), 'bc1q063ctu6jhe5k4v8ka99qac8rcm2tzjjnuktyrl');
assert.strictEqual(transaction.outs[1].value, 10000);
// now, testing cosign psbt:
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
await device.pressBack();
await device.pressBack();
await device.pressBack();
it('can cosign psbt', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t_cosign');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis');
}
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
await element(by.id('SendButton')).tap();
await element(by.id('advancedOptionsMenuButton')).tap();
await element(by.id('PsbtSign')).tap();
@ -295,8 +347,31 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
// this is fully-signed tx, "this is tx hex" help text should appear
await yo('DynamicCode');
await device.pressBack();
await device.pressBack();
const txhex = await extractTextFromElementById('TxhexInput');
console.warn(txhex);
const transaction = bitcoin.Transaction.fromHex(txhex);
assert.strictEqual(transaction.ins.length, 1);
assert.strictEqual(transaction.outs.length, 1);
assert.strictEqual(bitcoin.address.fromOutputScript(transaction.outs[0].script), 'bc1qffcl35r05wyf06meu3dalfevawx559n0ufrxcw'); // to address
assert.strictEqual(transaction.outs[0].value, 1000);
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
it('can do basic wallet-details operations', async () => {
const lockFile = '/tmp/travislock.' + hashIt('t_walletdetails');
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis');
}
if (!process.env.HD_MNEMONIC_BIP84) {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
// let's test wallet details screens
await element(by.id('WalletDetails')).tap();
@ -330,10 +405,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
await expect(element(by.id('BlueCopyTextToClipboard'))).toBeVisible();
await device.pressBack();
// Delete
await device.pressBack();
await device.pressBack();
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
@ -346,6 +417,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
await device.launchApp({
newInstance: true,
@ -369,10 +441,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
await expect(element(by.id('TransactionValue'))).toHaveText('0.0001');
await expect(element(by.id('TransactionAddress'))).toHaveText('BC1QH6TF004TY7Z7UN2V5NTU4MKF630545GVHS45U7');
await device.pressBack();
await device.pressBack();
// await helperDeleteWallet('Imported HD SegWit (BIP84 Bech32 Native)', '105526');
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
@ -385,7 +453,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
return;
}
await device.launchApp({ newInstance: true });
// go inside the wallet
await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap();
@ -479,12 +547,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
assert.strictEqual(tx2.ins[0].hash.toString('hex'), 'd479264875a0f7c4a84e47141be005404531a8655f2388ae21e89a9701f14c10');
assert.strictEqual(tx2.ins[0].index, 0);
await device.pressBack();
await device.pressBack();
await device.pressBack();
await device.pressBack();
// await helperDeleteWallet('Imported HD SegWit (BIP84 Bech32 Native)', '105526');
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
});
});

View file

@ -1,5 +1,10 @@
import { helperDeleteWallet, sleep, hashIt, sup, helperImportWallet, yo } from './helperz';
beforeAll(async () => {
// reinstalling the app just for any case to clean up app's storage
await device.launchApp({ delete: true });
}, 300_000);
describe('BlueWallet UI Tests - import Watch-only wallet (zpub)', () => {
/**
* test plan:
@ -15,12 +20,14 @@ describe('BlueWallet UI Tests - import Watch-only wallet (zpub)', () => {
if (process.env.TRAVIS) {
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t31'), 'as it previously passed on Travis');
}
await device.launchApp({ newInstance: true });
await helperImportWallet(
'zpub6rDWXE4wbwefeCrHWehXJheXnti5F9PbpamDUeB5eFbqaY89x3jq86JADBuXpnJnSvRVwqkaTnyMaZERUg4BpxD9V4tSZfKeYh1ozPdL1xK',
'watchOnly',
'Imported Watch-only',
'0 BTC', // it used to be 0.00030666 till someone stole it from git history kek
);
await sleep(15000);
await element(by.id('ReceiveButton')).tap();
try {

View file

@ -1,10 +0,0 @@
{
"maxWorkers": 1,
"testEnvironment": "./environment",
"testRunner": "jest-circus/runner",
"testTimeout": 321000,
"testRegex": "\\.spec\\.js$",
"setupFilesAfterEnv": ["./init.js"],
"reporters": ["detox/runners/jest/streamlineReporter"],
"verbose": true
}

View file

@ -1,19 +0,0 @@
const { DetoxCircusEnvironment, SpecReporter, WorkerAssignReporter } = require('detox/runners/jest-circus');
class CustomDetoxEnvironment extends DetoxCircusEnvironment {
constructor(config, context) {
super(config, context);
// Can be safely removed, if you are content with the default value (=300000ms)
this.initTimeout = 300000;
// This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
// This is strictly optional.
this.registerListeners({
SpecReporter,
WorkerAssignReporter,
});
}
}
module.exports = CustomDetoxEnvironment;

View file

@ -1,3 +0,0 @@
beforeAll(async () => {
await device.launchApp();
});

14
tests/e2e/jest.config.js Normal file
View file

@ -0,0 +1,14 @@
module.exports = {
maxWorkers: 1,
testTimeout: 333_000,
verbose: true,
reporters: ['detox/runners/jest/reporter'],
globalSetup: 'detox/runners/jest/globalSetup',
globalTeardown: 'detox/runners/jest/globalTeardown',
testEnvironment: 'detox/runners/jest/testEnvironment',
rootDir: '..',
testMatch: ['<rootDir>/e2e/**/*.spec.js'],
transform: {
'\\.[jt]sx?$': ['ts-jest'],
},
};

View file

@ -4,21 +4,11 @@ import TestRenderer from 'react-test-renderer';
import Settings from '../../screen/settings/settings';
import Selftest from '../../screen/selftest';
import { BlueHeaderDefaultSub } from '../../BlueComponents';
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
jest.mock('react-native-qrcode-svg', () => 'Video');
beforeAll(async () => {
// awaiting for Electrum to be connected. For RN Electrum would naturally connect
// while app starts up, but for tests we need to wait for it
await BlueElectrum.connectMain();
jest.useFakeTimers();
});
afterAll(() => {
jest.useRealTimers();
// after all tests we close socket so the test suite can actually terminate
BlueElectrum.forceDisconnect();
jest.mock('../../blue_modules/BlueElectrum', () => {
return {
connectMain: jest.fn(),
};
});
it('BlueHeaderDefaultSub works', () => {

View file

@ -3,7 +3,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage';
import { FiatUnit } from '../../models/fiatUnit';
jest.setTimeout(15 * 1000);
jest.setTimeout(30 * 1000);
describe('currency', () => {
it('fetches exchange rate and saves to AsyncStorage', async () => {

View file

@ -155,6 +155,10 @@ jest.mock('react-native-idle-timer', () => {
};
});
jest.mock('react-native-ios-context-menu', () => {
return {};
});
jest.mock('react-native-haptic-feedback', () => {
return {
trigger: jest.fn(),
@ -179,7 +183,7 @@ jest.mock('../blue_modules/WidgetCommunication', () => {
};
});
const keychainMock = {
const mockKeychain = {
SECURITY_LEVEL_ANY: 'MOCK_SECURITY_LEVEL_ANY',
SECURITY_LEVEL_SECURE_SOFTWARE: 'MOCK_SECURITY_LEVEL_SECURE_SOFTWARE',
SECURITY_LEVEL_SECURE_HARDWARE: 'MOCK_SECURITY_LEVEL_SECURE_HARDWARE',
@ -187,6 +191,6 @@ const keychainMock = {
getGenericPassword: jest.fn().mockResolvedValue(),
resetGenericPassword: jest.fn().mockResolvedValue(),
};
jest.mock('react-native-keychain', () => keychainMock);
jest.mock('react-native-keychain', () => mockKeychain);
global.alert = () => {};

View file

@ -2,6 +2,18 @@ import assert from 'assert';
import { getAddress, sortByAddressIndex, totalBalance, filterByAddressType } from '../../screen/wallets/addresses';
import { TABS } from '../../components/addresses/AddressTypeTabs';
jest.mock('../../blue_modules/currency', () => {
return {
init: jest.fn(),
};
});
jest.mock('../../blue_modules/BlueElectrum', () => {
return {
connectMain: jest.fn(),
};
});
const mockAddressesList = [
{ index: 2, isInternal: false, key: 'third_external_address' },
{ index: 0, isInternal: true, key: 'first_internal_address' },

View file

@ -13,5 +13,6 @@
"skipLibCheck": true,
"resolveJsonModule": true
},
"extends": "@tsconfig/react-native/tsconfig.json",
"exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js", "components/react-native-draggable-flatlist"],
}