mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-02-22 06:52:41 +01:00
Merge remote-tracking branch 'origin/master' into abhiShandy-feat-bip47
This commit is contained in:
commit
f9205eb3d6
88 changed files with 13104 additions and 18064 deletions
3
.babelrc
3
.babelrc
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"presets": ["module:metro-react-native-babel-preset"]
|
||||
}
|
|
@ -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
|
|
@ -54,6 +54,8 @@ jobs:
|
|||
|
||||
working_directory: ~/repo
|
||||
|
||||
resource_class: large
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -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
11
.gitignore
vendored
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.7.4
|
||||
2.7.6
|
||||
|
|
13
.xcode-env
Normal file
13
.xcode-env
Normal 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)
|
4
Gemfile
4
Gemfile
|
@ -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'
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
)
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 { } }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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
269
android/gradlew
vendored
|
@ -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" "$@"
|
|
@ -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')
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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' : '');
|
||||
};
|
||||
|
||||
|
|
|
@ -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
1
ios/.xcode.env
Normal file
|
@ -0,0 +1 @@
|
|||
export NODE_BINARY=$(command -v node)
|
|
@ -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;
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
<key>WidgetsExtension.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>6</integer>
|
||||
<integer>88</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
58
ios/Podfile
58
ios/Podfile
|
@ -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
|
||||
|
||||
|
|
778
ios/Podfile.lock
778
ios/Podfile.lock
File diff suppressed because it is too large
Load diff
|
@ -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 وبيعها مباشرةً إلى المستخدمين الآخرين دون الاستعانة بأطراف خارجية.
|
||||
شبكة البرق
|
||||
محفظة البرق دون الحاجة إلى إعدادها. معاملات رخيصة جدًا وسريعة مع توفير أفضل تجربة لمستخدمي البتكوين.
|
46
ios/fastlane/metadata/ja/description.txt
Normal file
46
ios/fastlane/metadata/ja/description.txt
Normal file
|
@ -0,0 +1,46 @@
|
|||
ビットコインを送る・受け取る・保存することができる、セキュリティとシンプルさを重視したウォレットです。
|
||||
|
||||
BlueWalletは、秘密鍵をあなたが所有するビットコインウォレット。ビットコインユーザーが作った、コミュニティのためのビットコインウォレット。
|
||||
|
||||
世界中の誰とでもすぐに取引ができ、あなたのポケットからファイナンスの仕組みを変革します。
|
||||
|
||||
無料で数の制限なくビットコインウォレットを作ることも、お持ちのウォレットをインポートすることもできます。シンプルでスピーディです。
|
||||
|
||||
_____
|
||||
|
||||
特長:
|
||||
|
||||
|
||||
1 - デザインによるセキュリティ
|
||||
|
||||
オープンソース
|
||||
MITライセンスにより、あなた自身でビルド・実行可能! ReactNative製。
|
||||
|
||||
もっともらしい否認
|
||||
アクセスの開示を強要された時でも、フェイクのビットコインウォレットを復号できるパスワード
|
||||
|
||||
完全な暗号化
|
||||
iOSのマルチレイヤー暗号化に加え、追加のパスワードですべてを暗号化
|
||||
|
||||
フルノード
|
||||
Electrumを通じてビットコインフルノードに接続
|
||||
|
||||
コールドストレージ
|
||||
ハードウェアウォレットに接続し、コインをコールドストレージに保存
|
||||
|
||||
2 - ユーザーエクスペリエンス重視
|
||||
|
||||
思いのままに
|
||||
秘密鍵はずっとあなたのデバイスの中に。あなたが秘密鍵をコントロールします
|
||||
|
||||
柔軟な手数料
|
||||
1 Satoshiから。ユーザーのあなた自身が決定します
|
||||
|
||||
Replace-By-Fee
|
||||
(RBF) 手数料を増やして取引をスピードアップ (BIP125)
|
||||
|
||||
閲覧専用ウォレット
|
||||
閲覧専用ウォレットにより、ハードウェアに触れることなくコールドストレージを監視できます。
|
||||
|
||||
ライトニングネットワーク
|
||||
設定の要らないライトニングウォレット。有り得ないほど安く、速い取引で最高のビットコイン体験を。
|
1
ios/fastlane/metadata/ja/keywords.txt
Normal file
1
ios/fastlane/metadata/ja/keywords.txt
Normal file
|
@ -0,0 +1 @@
|
|||
ビットコイン,ウォレット,ビットコインウォレット,ブロックチェーン,btc,仮想通貨,暗号通貨,electrum,イーサリアム
|
1
ios/fastlane/metadata/ja/name.txt
Normal file
1
ios/fastlane/metadata/ja/name.txt
Normal file
|
@ -0,0 +1 @@
|
|||
BlueWallet - ビットコインウォレット
|
10
ios/fastlane/metadata/ja/promotional_text.txt
Normal file
10
ios/fastlane/metadata/ja/promotional_text.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
特長
|
||||
|
||||
* オープンソース
|
||||
* 完全な暗号化
|
||||
* もっともらしい否認
|
||||
* 柔軟な手数料
|
||||
* Replace-By-Fee (RBF)
|
||||
* SegWit
|
||||
* 閲覧専用(Sentinel)ウォレット
|
||||
* ライトニングネットワーク
|
|
@ -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.
|
|
@ -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",
|
||||
|
|
26
loc/ca.json
26
loc/ca.json
|
@ -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í,",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "Οι κωδικοί δεν είναι ίδιοι",
|
||||
|
|
|
@ -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 BlueWallet’s 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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "שרת אלקטרום",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 サーバー",
|
||||
|
|
|
@ -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": "일렉트럼 서버",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 сервер",
|
||||
|
|
|
@ -277,7 +277,7 @@
|
|||
"lightning_saved": "ඔබේ වෙනස්කම් සාර්ථකව සුරැකී ඇත.",
|
||||
"lightning_settings": "ලයිට්නින් සැකසුම්",
|
||||
"tor_settings": "ටෝර් සැකසුම්",
|
||||
"lightning_settings_explain": "ඔබේම එල්එන්ඩී නෝඩයට සම්බන්ධ වීමට කරුණාකර එල්.එන්.ඩී.හබ් ස්ථාපනය කර එහි යූආර්එල් සැකසුම් තුළට දමන්න. බ්ලූවොලට් හි එල්.එන්.ඩී.හබ් (lndhub.io) භාවිතා කිරීමට හිස්ව තබන්න. වෙනස්කම් සුරැකීමෙන් පසු සාදන ලද පසුම්බි පමණක් නිශ්චිත එල්.එන්.ඩී.හබ් වෙත සම්බන්ධ වන බව කරුණාවෙන් සලකන්න.",
|
||||
"lightning_settings_explain": "ඔබේම එල්එන්ඩී නෝඩයට සම්බන්ධ වීමට කරුණාකර එල්.එන්.ඩී.හබ් ස්ථාපනය කර එහි යූආර්එල් සැකසුම් තුළට දමන්න. බ්ලූවොලට් හි එල්.එන්.ඩී.හබ් භාවිතා කිරීමට හිස්ව තබන්න. වෙනස්කම් සුරැකීමෙන් පසු සාදන ලද පසුම්බි පමණක් නිශ්චිත එල්.එන්.ඩී.හබ් වෙත සම්බන්ධ වන බව කරුණාවෙන් සලකන්න.",
|
||||
"network": "ජාල",
|
||||
"network_broadcast": "විකාශන ගනුදෙනුව",
|
||||
"network_electrum": "ඉලෙක්ට්රම් සේවාදායකය",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "等会问我",
|
||||
|
|
|
@ -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": "更變。",
|
||||
|
|
|
@ -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
28764
package-lock.json
generated
File diff suppressed because it is too large
Load diff
77
package.json
77
package.json
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}, []);
|
||||
|
||||
|
|
|
@ -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
|
||||
}, []);
|
||||
|
||||
|
|
|
@ -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: () => (
|
||||
|
|
|
@ -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
|
||||
}, []);
|
||||
|
|
|
@ -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
|
||||
}, []);
|
||||
|
||||
|
|
8
scripts/react-native-tor.patch
Normal file
8
scripts/react-native-tor.patch
Normal 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
8
scripts/rn-ldk.patch
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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;
|
|
@ -1,3 +0,0 @@
|
|||
beforeAll(async () => {
|
||||
await device.launchApp();
|
||||
});
|
14
tests/e2e/jest.config.js
Normal file
14
tests/e2e/jest.config.js
Normal 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'],
|
||||
},
|
||||
};
|
|
@ -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', () => {
|
||||
|
|
|
@ -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 () => {
|
||||
|
|
|
@ -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 = () => {};
|
||||
|
|
|
@ -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' },
|
||||
|
|
|
@ -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"],
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue