mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2024-11-19 01:40:12 +01:00
Merge branch 'master' into inputacc
This commit is contained in:
commit
922a253ad1
@ -19,6 +19,7 @@
|
||||
"react/display-name": "off",
|
||||
"react-native/no-inline-styles": "error",
|
||||
"react-native/no-unused-styles": "error",
|
||||
"react/no-is-mounted": "off",
|
||||
"react-native/no-single-element-style-arrays": "error",
|
||||
"prettier/prettier": [
|
||||
"warn",
|
||||
|
@ -48,13 +48,13 @@ jobs:
|
||||
bundle install --jobs 4 --retry 3 --quiet
|
||||
|
||||
- name: Install node_modules
|
||||
run: npm install --production
|
||||
run: npm install --omit=dev --yes
|
||||
|
||||
- name: Install CocoaPods Dependencies
|
||||
run: |
|
||||
bundle exec fastlane ios install_pods
|
||||
- name: Cache CocoaPods Pods
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ios/Pods
|
||||
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
|
||||
@ -88,7 +88,7 @@ jobs:
|
||||
bundle exec fastlane ios setup_provisioning_profiles
|
||||
- name: Cache Provisioning Profiles
|
||||
id: cache_provisioning_profiles
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/Library/MobileDevice/Provisioning Profiles
|
||||
key: ${{ runner.os }}-provisioning-profiles-${{ github.sha }}
|
||||
@ -131,14 +131,14 @@ jobs:
|
||||
- name: Build App
|
||||
run: bundle exec fastlane ios build_app_lane
|
||||
- name: Upload IPA as Artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa
|
||||
path: ./ios/build/BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa
|
||||
path: ./build/BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa
|
||||
|
||||
testflight-upload:
|
||||
needs: build
|
||||
runs-on: macos-14
|
||||
runs-on: macos-latest
|
||||
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'testflight')
|
||||
env:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
@ -154,7 +154,7 @@ jobs:
|
||||
ruby-version: 3.1.6
|
||||
bundler-cache: true
|
||||
- name: Cache Ruby Gems
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: vendor/bundle
|
||||
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
||||
@ -165,15 +165,15 @@ jobs:
|
||||
bundle config path vendor/bundle
|
||||
bundle install --jobs 4 --retry 3 --quiet
|
||||
- name: Download IPA from Artifact
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: BlueWallet.${{ needs.build.outputs.project_version }}(${{ needs.build.outputs.new_build_number }}).ipa
|
||||
path: ./ios/build
|
||||
path: ./
|
||||
- name: Create App Store Connect API Key JSON
|
||||
run: echo '${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}' > ./ios/appstore_api_key.json
|
||||
run: echo '${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}' > ./appstore_api_key.json
|
||||
- name: Upload to TestFlight
|
||||
env:
|
||||
APP_STORE_CONNECT_API_KEY_PATH: $(pwd)/ios/appstore_api_key.p8
|
||||
APP_STORE_CONNECT_API_KEY_PATH: $(pwd)/appstore_api_key.p8
|
||||
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
|
||||
GIT_ACCESS_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }}
|
||||
GIT_URL: ${{ secrets.GIT_URL }}
|
||||
|
17
.github/workflows/build-release-apk.yml
vendored
17
.github/workflows/build-release-apk.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
node-version: 20
|
||||
|
||||
- name: Use npm caches
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
|
||||
@ -40,7 +40,7 @@ jobs:
|
||||
cache: 'gradle'
|
||||
|
||||
- name: Install node_modules
|
||||
run: npm install --production
|
||||
run: npm install --omit=dev --yes
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
@ -49,7 +49,7 @@ jobs:
|
||||
bundler-cache: true
|
||||
|
||||
- name: Cache Ruby Gems
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: vendor/bundle
|
||||
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
||||
@ -79,18 +79,21 @@ jobs:
|
||||
id: determine_apk_path
|
||||
run: |
|
||||
VERSION_NAME=$(grep versionName android/app/build.gradle | awk '{print $2}' | tr -d '"')
|
||||
BRANCH_NAME=$(echo ${{ github.head_ref || github.ref_name }} | sed 's/[^a-zA-Z0-9_-]/-/g')
|
||||
if [ "$BRANCH_NAME" != "master" ]; then
|
||||
BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF_NAME}}
|
||||
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9_-]/-/g')
|
||||
|
||||
if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
|
||||
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${NEW_BUILD_NUMBER}-${BRANCH_NAME}.apk"
|
||||
else
|
||||
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${NEW_BUILD_NUMBER}.apk"
|
||||
fi
|
||||
|
||||
APK_PATH="android/app/build/outputs/apk/release/${EXPECTED_FILENAME}"
|
||||
echo "EXPECTED_FILENAME=${EXPECTED_FILENAME}" >> $GITHUB_ENV
|
||||
echo "APK_PATH=${APK_PATH}" >> $GITHUB_ENV
|
||||
|
||||
- name: Upload APK as artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: signed-apk
|
||||
path: ${{ env.APK_PATH }}
|
||||
@ -114,7 +117,7 @@ jobs:
|
||||
run: bundle install --jobs 4 --retry 3
|
||||
|
||||
- name: Download APK artifact
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: signed-apk
|
||||
|
||||
|
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
@ -30,16 +30,9 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-npm-
|
||||
|
||||
- name: Use node_modules caches
|
||||
id: cache-nm
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: node_modules
|
||||
key: ${{ runner.os }}-nm-${{ hashFiles('package-lock.json') }}
|
||||
|
||||
- name: Install node_modules
|
||||
if: steps.cache-nm.outputs.cache-hit != 'true'
|
||||
run: npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Run tests
|
||||
run: npm test || npm test || npm test || npm test
|
||||
@ -55,6 +48,9 @@ jobs:
|
||||
MNEMONICS_COLDCARD: ${{ secrets.MNEMONICS_COLDCARD }}
|
||||
RETRY: 1
|
||||
|
||||
- name: Prune devDependencies
|
||||
run: npm prune --omit=dev
|
||||
|
||||
e2e:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
@ -24,8 +24,8 @@ export const BlueButtonLink = forwardRef((props, ref) => {
|
||||
<TouchableOpacity
|
||||
accessibilityRole="button"
|
||||
style={{
|
||||
minHeight: 60,
|
||||
minWidth: 100,
|
||||
minHeight: 36,
|
||||
justifyContent: 'center',
|
||||
}}
|
||||
{...props}
|
||||
|
18
Gemfile.lock
18
Gemfile.lock
@ -24,17 +24,17 @@ GEM
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.970.0)
|
||||
aws-sdk-core (3.202.2)
|
||||
aws-partitions (1.973.0)
|
||||
aws-sdk-core (3.204.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.88.0)
|
||||
aws-sdk-core (~> 3, >= 3.201.0)
|
||||
aws-sdk-kms (1.90.0)
|
||||
aws-sdk-core (~> 3, >= 3.203.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.159.0)
|
||||
aws-sdk-core (~> 3, >= 3.201.0)
|
||||
aws-sdk-s3 (1.161.0)
|
||||
aws-sdk-core (~> 3, >= 3.203.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.9.1)
|
||||
@ -223,7 +223,7 @@ GEM
|
||||
logger (1.6.1)
|
||||
mime-types (3.5.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2024.0820)
|
||||
mime-types-data (3.2024.0903)
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
minitest (5.25.1)
|
||||
@ -250,8 +250,7 @@ GEM
|
||||
mime-types (>= 1.16, < 4.0)
|
||||
netrc (~> 0.8)
|
||||
retriable (3.1.2)
|
||||
rexml (3.3.6)
|
||||
strscan
|
||||
rexml (3.3.7)
|
||||
rouge (2.0.7)
|
||||
ruby-macho (2.5.1)
|
||||
ruby2_keywords (0.0.5)
|
||||
@ -266,7 +265,6 @@ GEM
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
strscan (3.1.0)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
|
@ -83,7 +83,7 @@ android {
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 1
|
||||
versionName "7.0.4"
|
||||
versionName "7.0.5"
|
||||
testBuildType System.getProperty('testBuildType', 'debug')
|
||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||
}
|
||||
|
@ -52,6 +52,12 @@
|
||||
<meta-data
|
||||
android:name="com.dieam.reactnativepushnotification.notification_color"
|
||||
android:resource="@color/white" />
|
||||
<meta-data
|
||||
android:name="firebase_messaging_auto_init_enabled"
|
||||
android:value="false" />
|
||||
<meta-data
|
||||
android:name="firebase_analytics_collection_enabled"
|
||||
android:value="false" />
|
||||
|
||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationActions" />
|
||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
|
||||
|
@ -28,8 +28,8 @@ class BitcoinPriceWidget : AppWidgetProvider() {
|
||||
}
|
||||
|
||||
private fun clearCache(context: Context) {
|
||||
val sharedPref = context.getSharedPreferences("widget_prefs", Context.MODE_PRIVATE)
|
||||
sharedPref.edit().clear().apply()
|
||||
Log.d("BitcoinPriceWidget", "Cache cleared")
|
||||
val sharedPref = context.getSharedPreferences("group.io.bluewallet.bluewallet", Context.MODE_PRIVATE)
|
||||
sharedPref.edit().clear().apply() // Clear all preferences in the group
|
||||
Log.d("BitcoinPriceWidget", "Cache cleared from group.io.bluewallet.bluewallet")
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import androidx.work.*
|
||||
import java.text.DecimalFormatSymbols
|
||||
import java.text.NumberFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
@ -33,17 +34,22 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
}
|
||||
}
|
||||
|
||||
private lateinit var sharedPref: SharedPreferences
|
||||
private lateinit var preferenceChangeListener: SharedPreferences.OnSharedPreferenceChangeListener
|
||||
|
||||
override fun doWork(): Result {
|
||||
Log.d(TAG, "Widget update worker running")
|
||||
|
||||
sharedPref = applicationContext.getSharedPreferences("group.io.bluewallet.bluewallet", Context.MODE_PRIVATE)
|
||||
registerPreferenceChangeListener()
|
||||
|
||||
val appWidgetManager = AppWidgetManager.getInstance(applicationContext)
|
||||
val thisWidget = ComponentName(applicationContext, BitcoinPriceWidget::class.java)
|
||||
val appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget)
|
||||
val views = RemoteViews(applicationContext.packageName, R.layout.widget_layout)
|
||||
|
||||
val sharedPref = applicationContext.getSharedPreferences("widget_prefs", Context.MODE_PRIVATE)
|
||||
val preferredCurrency = sharedPref.getString("preferredCurrency", "USD")
|
||||
val preferredCurrencyLocale = sharedPref.getString("preferredCurrencyLocale", "en-US")
|
||||
val preferredCurrency = sharedPref.getString("preferredCurrency", null) ?: "USD"
|
||||
val preferredCurrencyLocale = sharedPref.getString("preferredCurrencyLocale", null) ?: "en-US"
|
||||
val previousPrice = sharedPref.getString("previous_price", null)
|
||||
|
||||
val currentTime = SimpleDateFormat("hh:mm a", Locale.getDefault()).format(Date())
|
||||
@ -51,13 +57,47 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
fetchPrice(preferredCurrency) { fetchedPrice, error ->
|
||||
handlePriceResult(
|
||||
appWidgetManager, appWidgetIds, views, sharedPref,
|
||||
fetchedPrice, previousPrice, currentTime, preferredCurrencyLocale, error
|
||||
fetchedPrice, previousPrice, currentTime, preferredCurrency, preferredCurrencyLocale, error
|
||||
)
|
||||
}
|
||||
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
private fun registerPreferenceChangeListener() {
|
||||
preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
|
||||
if (key == "preferredCurrency" || key == "preferredCurrencyLocale" || key == "previous_price") {
|
||||
Log.d(TAG, "Preference changed: $key")
|
||||
updateWidgetOnPreferenceChange()
|
||||
}
|
||||
}
|
||||
sharedPref.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
|
||||
}
|
||||
|
||||
override fun onStopped() {
|
||||
super.onStopped()
|
||||
sharedPref.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
|
||||
}
|
||||
|
||||
private fun updateWidgetOnPreferenceChange() {
|
||||
val appWidgetManager = AppWidgetManager.getInstance(applicationContext)
|
||||
val thisWidget = ComponentName(applicationContext, BitcoinPriceWidget::class.java)
|
||||
val appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget)
|
||||
val views = RemoteViews(applicationContext.packageName, R.layout.widget_layout)
|
||||
|
||||
val preferredCurrency = sharedPref.getString("preferredCurrency", null) ?: "USD"
|
||||
val preferredCurrencyLocale = sharedPref.getString("preferredCurrencyLocale", null) ?: "en-US"
|
||||
val previousPrice = sharedPref.getString("previous_price", null)
|
||||
val currentTime = SimpleDateFormat("hh:mm a", Locale.getDefault()).format(Date())
|
||||
|
||||
fetchPrice(preferredCurrency) { fetchedPrice, error ->
|
||||
handlePriceResult(
|
||||
appWidgetManager, appWidgetIds, views, sharedPref,
|
||||
fetchedPrice, previousPrice, currentTime, preferredCurrency, preferredCurrencyLocale, error
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handlePriceResult(
|
||||
appWidgetManager: AppWidgetManager,
|
||||
appWidgetIds: IntArray,
|
||||
@ -66,6 +106,7 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
fetchedPrice: String?,
|
||||
previousPrice: String?,
|
||||
currentTime: String,
|
||||
preferredCurrency: String?,
|
||||
preferredCurrencyLocale: String?,
|
||||
error: String?
|
||||
) {
|
||||
@ -77,11 +118,11 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
if (!isPriceCached) {
|
||||
showLoadingError(views)
|
||||
} else {
|
||||
displayCachedPrice(views, previousPrice, currentTime, preferredCurrencyLocale)
|
||||
displayCachedPrice(views, previousPrice, currentTime, preferredCurrency, preferredCurrencyLocale)
|
||||
}
|
||||
} else {
|
||||
displayFetchedPrice(
|
||||
views, fetchedPrice!!, previousPrice, currentTime, preferredCurrencyLocale
|
||||
views, fetchedPrice!!, previousPrice, currentTime, preferredCurrency, preferredCurrencyLocale
|
||||
)
|
||||
savePrice(sharedPref, fetchedPrice)
|
||||
}
|
||||
@ -103,11 +144,10 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
views: RemoteViews,
|
||||
previousPrice: String?,
|
||||
currentTime: String,
|
||||
preferredCurrency: String?,
|
||||
preferredCurrencyLocale: String?
|
||||
) {
|
||||
val currencyFormat = NumberFormat.getCurrencyInstance(Locale.forLanguageTag(preferredCurrencyLocale!!)).apply {
|
||||
maximumFractionDigits = 0
|
||||
}
|
||||
val currencyFormat = getCurrencyFormat(preferredCurrency, preferredCurrencyLocale)
|
||||
|
||||
views.apply {
|
||||
setViewVisibility(R.id.loading_indicator, View.GONE)
|
||||
@ -125,12 +165,11 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
fetchedPrice: String,
|
||||
previousPrice: String?,
|
||||
currentTime: String,
|
||||
preferredCurrency: String?,
|
||||
preferredCurrencyLocale: String?
|
||||
) {
|
||||
val currentPrice = fetchedPrice.toDouble().let { it.toInt() } // Remove cents
|
||||
val currencyFormat = NumberFormat.getCurrencyInstance(Locale.forLanguageTag(preferredCurrencyLocale!!)).apply {
|
||||
maximumFractionDigits = 0
|
||||
}
|
||||
val currentPrice = fetchedPrice.toDouble().toInt() // Remove cents
|
||||
val currencyFormat = getCurrencyFormat(preferredCurrency, preferredCurrencyLocale)
|
||||
|
||||
views.apply {
|
||||
setViewVisibility(R.id.loading_indicator, View.GONE)
|
||||
@ -153,6 +192,30 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Wor
|
||||
}
|
||||
}
|
||||
|
||||
private fun getCurrencyFormat(currencyCode: String?, localeString: String?): NumberFormat {
|
||||
val localeParts = localeString?.split("-") ?: listOf("en", "US")
|
||||
val locale = if (localeParts.size == 2) {
|
||||
Locale(localeParts[0], localeParts[1])
|
||||
} else {
|
||||
Locale.getDefault()
|
||||
}
|
||||
val currencyFormat = NumberFormat.getCurrencyInstance(locale)
|
||||
val currency = try {
|
||||
Currency.getInstance(currencyCode ?: "USD")
|
||||
} catch (e: IllegalArgumentException) {
|
||||
Currency.getInstance("USD") // Default to USD if an invalid code is provided
|
||||
}
|
||||
currencyFormat.currency = currency
|
||||
currencyFormat.maximumFractionDigits = 0 // No cents
|
||||
|
||||
// Remove the ISO country code and keep only the symbol
|
||||
val decimalFormatSymbols = (currencyFormat as java.text.DecimalFormat).decimalFormatSymbols
|
||||
decimalFormatSymbols.currencySymbol = currency.symbol
|
||||
currencyFormat.decimalFormatSymbols = decimalFormatSymbols
|
||||
|
||||
return currencyFormat
|
||||
}
|
||||
|
||||
private fun fetchPrice(currency: String?, callback: (String?, String?) -> Unit) {
|
||||
val price = MarketAPI.fetchPrice(applicationContext, currency ?: "USD")
|
||||
if (price == null) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:initialLayout="@layout/widget_layout"
|
||||
android:minWidth="160dp"
|
||||
android:minHeight="80dp"
|
||||
android:minHeight="100dp"
|
||||
android:updatePeriodMillis="0"
|
||||
android:widgetCategory="home_screen"
|
||||
android:previewImage="@drawable/widget_preview"
|
||||
|
@ -93,7 +93,10 @@ export const writeFileAndExport = async function (fileName: string, contents: st
|
||||
export const openSignedTransaction = async function (): Promise<string | false> {
|
||||
try {
|
||||
const res = await DocumentPicker.pickSingle({
|
||||
type: Platform.OS === 'ios' ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn'] : [DocumentPicker.types.allFiles],
|
||||
type:
|
||||
Platform.OS === 'ios'
|
||||
? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', DocumentPicker.types.json]
|
||||
: [DocumentPicker.types.allFiles],
|
||||
});
|
||||
|
||||
return await _readPsbtFileIntoBase64(res.uri);
|
||||
@ -160,7 +163,7 @@ export const showFilePickerAndReadFile = async function (): Promise<{ data: stri
|
||||
'io.bluewallet.psbt.txn',
|
||||
'io.bluewallet.backup',
|
||||
DocumentPicker.types.plainText,
|
||||
'public.json',
|
||||
DocumentPicker.types.json,
|
||||
DocumentPicker.types.images,
|
||||
]
|
||||
: [DocumentPicker.types.allFiles],
|
||||
|
@ -109,7 +109,7 @@ function Notifications(props) {
|
||||
* - if you are not using remote notification or do not have Firebase installed, use this:
|
||||
* requestPermissions: Platform.OS === 'ios'
|
||||
*/
|
||||
requestPermissions: true,
|
||||
requestPermissions: Platform.OS === 'ios',
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -67,13 +67,12 @@ const isReactNative = typeof navigator !== 'undefined' && navigator?.product ===
|
||||
export class BlueApp {
|
||||
static FLAG_ENCRYPTED = 'data_encrypted';
|
||||
static LNDHUB = 'lndhub';
|
||||
static ADVANCED_MODE_ENABLED = 'advancedmodeenabled';
|
||||
static DO_NOT_TRACK = 'donottrack';
|
||||
static HANDOFF_STORAGE_KEY = 'HandOff';
|
||||
|
||||
private static _instance: BlueApp | null = null;
|
||||
|
||||
static keys2migrate = [BlueApp.HANDOFF_STORAGE_KEY, BlueApp.DO_NOT_TRACK, BlueApp.ADVANCED_MODE_ENABLED];
|
||||
static keys2migrate = [BlueApp.HANDOFF_STORAGE_KEY, BlueApp.DO_NOT_TRACK];
|
||||
|
||||
public cachedPassword?: false | string;
|
||||
public tx_metadata: TTXMetadata;
|
||||
@ -882,17 +881,6 @@ export class BlueApp {
|
||||
return finalBalance;
|
||||
};
|
||||
|
||||
isAdvancedModeEnabled = async (): Promise<boolean> => {
|
||||
try {
|
||||
return !!(await AsyncStorage.getItem(BlueApp.ADVANCED_MODE_ENABLED));
|
||||
} catch (_) {}
|
||||
return false;
|
||||
};
|
||||
|
||||
setIsAdvancedModeEnabled = async (value: boolean) => {
|
||||
await AsyncStorage.setItem(BlueApp.ADVANCED_MODE_ENABLED, value ? '1' : '');
|
||||
};
|
||||
|
||||
isHandoffEnabled = async (): Promise<boolean> => {
|
||||
try {
|
||||
return !!(await AsyncStorage.getItem(BlueApp.HANDOFF_STORAGE_KEY));
|
||||
|
@ -3,11 +3,51 @@ import bolt11 from 'bolt11';
|
||||
import createHash from 'create-hash';
|
||||
import { createHmac } from 'crypto';
|
||||
import CryptoJS from 'crypto-js';
|
||||
// @ts-ignore theres no types for secp256k1
|
||||
import secp256k1 from 'secp256k1';
|
||||
import { parse } from 'url'; // eslint-disable-line n/no-deprecated-api
|
||||
|
||||
const ONION_REGEX = /^(http:\/\/[^/:@]+\.onion(?::\d{1,5})?)(\/.*)?$/; // regex for onion URL
|
||||
|
||||
interface LnurlPayServicePayload {
|
||||
callback: string;
|
||||
fixed: boolean;
|
||||
min: number;
|
||||
max: number;
|
||||
domain: string;
|
||||
metadata: string;
|
||||
description?: string;
|
||||
image?: string;
|
||||
amount: number;
|
||||
commentAllowed?: number;
|
||||
}
|
||||
|
||||
interface LnurlPayServiceBolt11Payload {
|
||||
pr: string;
|
||||
successAction?: any;
|
||||
disposable?: boolean;
|
||||
tag: string;
|
||||
metadata: any;
|
||||
minSendable: number;
|
||||
maxSendable: number;
|
||||
callback: string;
|
||||
commentAllowed: number;
|
||||
}
|
||||
|
||||
interface DecodedInvoice {
|
||||
destination: string;
|
||||
num_satoshis: string;
|
||||
num_millisatoshis: string;
|
||||
timestamp: string;
|
||||
fallback_addr: string;
|
||||
route_hints: any[];
|
||||
payment_hash?: string;
|
||||
description_hash?: string;
|
||||
cltv_expiry?: string;
|
||||
expiry?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://github.com/btcontract/lnurl-rfc/blob/master/lnurl-pay.md
|
||||
*/
|
||||
@ -16,15 +56,21 @@ export default class Lnurl {
|
||||
static TAG_WITHDRAW_REQUEST = 'withdrawRequest'; // type of LNURL
|
||||
static TAG_LOGIN_REQUEST = 'login'; // type of LNURL
|
||||
|
||||
constructor(url, AsyncStorage) {
|
||||
this._lnurl = url;
|
||||
private _lnurl: string;
|
||||
private _lnurlPayServiceBolt11Payload: LnurlPayServiceBolt11Payload | false;
|
||||
private _lnurlPayServicePayload: LnurlPayServicePayload | false;
|
||||
private _AsyncStorage: any;
|
||||
private _preimage: string | false;
|
||||
|
||||
constructor(url: string | false, AsyncStorage?: any) {
|
||||
this._lnurl = url || '';
|
||||
this._lnurlPayServiceBolt11Payload = false;
|
||||
this._lnurlPayServicePayload = false;
|
||||
this._AsyncStorage = AsyncStorage;
|
||||
this._preimage = false;
|
||||
}
|
||||
|
||||
static findlnurl(bodyOfText) {
|
||||
static findlnurl(bodyOfText: string): string | null {
|
||||
const res = /^(?:http.*[&?]lightning=|lightning:)?(lnurl1[02-9ac-hj-np-z]+)/.exec(bodyOfText.toLowerCase());
|
||||
if (res) {
|
||||
return res[1];
|
||||
@ -32,7 +78,7 @@ export default class Lnurl {
|
||||
return null;
|
||||
}
|
||||
|
||||
static getUrlFromLnurl(lnurlExample) {
|
||||
static getUrlFromLnurl(lnurlExample: string): string | false {
|
||||
const found = Lnurl.findlnurl(lnurlExample);
|
||||
if (!found) {
|
||||
if (Lnurl.isLightningAddress(lnurlExample)) {
|
||||
@ -49,22 +95,22 @@ export default class Lnurl {
|
||||
return Buffer.from(bech32.fromWords(decoded.words)).toString();
|
||||
}
|
||||
|
||||
static isLnurl(url) {
|
||||
static isLnurl(url: string): boolean {
|
||||
return Lnurl.findlnurl(url) !== null;
|
||||
}
|
||||
|
||||
static isOnionUrl(url) {
|
||||
static isOnionUrl(url: string): boolean {
|
||||
return Lnurl.parseOnionUrl(url) !== null;
|
||||
}
|
||||
|
||||
static parseOnionUrl(url) {
|
||||
static parseOnionUrl(url: string): [string, string] | null {
|
||||
const match = url.match(ONION_REGEX);
|
||||
if (match === null) return null;
|
||||
const [, baseURI, path] = match;
|
||||
return [baseURI, path];
|
||||
}
|
||||
|
||||
async fetchGet(url) {
|
||||
async fetchGet(url: string): Promise<any> {
|
||||
const resp = await fetch(url, { method: 'GET' });
|
||||
if (resp.status >= 300) {
|
||||
throw new Error('Bad response from server');
|
||||
@ -76,14 +122,14 @@ export default class Lnurl {
|
||||
return reply;
|
||||
}
|
||||
|
||||
decodeInvoice(invoice) {
|
||||
decodeInvoice(invoice: string): DecodedInvoice {
|
||||
const { payeeNodeKey, tags, satoshis, millisatoshis, timestamp } = bolt11.decode(invoice);
|
||||
|
||||
const decoded = {
|
||||
destination: payeeNodeKey,
|
||||
const decoded: DecodedInvoice = {
|
||||
destination: payeeNodeKey ?? '',
|
||||
num_satoshis: satoshis ? satoshis.toString() : '0',
|
||||
num_millisatoshis: millisatoshis ? millisatoshis.toString() : '0',
|
||||
timestamp: timestamp.toString(),
|
||||
timestamp: timestamp?.toString() ?? '',
|
||||
fallback_addr: '',
|
||||
route_hints: [],
|
||||
};
|
||||
@ -92,10 +138,10 @@ export default class Lnurl {
|
||||
const { tagName, data } = tags[i];
|
||||
switch (tagName) {
|
||||
case 'payment_hash':
|
||||
decoded.payment_hash = data;
|
||||
decoded.payment_hash = String(data);
|
||||
break;
|
||||
case 'purpose_commit_hash':
|
||||
decoded.description_hash = data;
|
||||
decoded.description_hash = String(data);
|
||||
break;
|
||||
case 'min_final_cltv_expiry':
|
||||
decoded.cltv_expiry = data.toString();
|
||||
@ -104,21 +150,21 @@ export default class Lnurl {
|
||||
decoded.expiry = data.toString();
|
||||
break;
|
||||
case 'description':
|
||||
decoded.description = data;
|
||||
decoded.description = String(data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!decoded.expiry) decoded.expiry = '3600'; // default
|
||||
|
||||
if (parseInt(decoded.num_satoshis, 10) === 0 && decoded.num_millisatoshis > 0) {
|
||||
decoded.num_satoshis = (decoded.num_millisatoshis / 1000).toString();
|
||||
if (parseInt(decoded.num_satoshis, 10) === 0 && parseInt(decoded.num_millisatoshis, 10) > 0) {
|
||||
decoded.num_satoshis = (parseInt(decoded.num_millisatoshis, 10) / 1000).toString();
|
||||
}
|
||||
|
||||
return decoded;
|
||||
}
|
||||
|
||||
async requestBolt11FromLnurlPayService(amountSat, comment = '') {
|
||||
async requestBolt11FromLnurlPayService(amountSat: number, comment: string = ''): Promise<LnurlPayServiceBolt11Payload> {
|
||||
if (!this._lnurlPayServicePayload) throw new Error('this._lnurlPayServicePayload is not set');
|
||||
if (!this._lnurlPayServicePayload.callback) throw new Error('this._lnurlPayServicePayload.callback is not set');
|
||||
if (amountSat < this._lnurlPayServicePayload.min || amountSat > this._lnurlPayServicePayload.max)
|
||||
@ -132,15 +178,13 @@ export default class Lnurl {
|
||||
);
|
||||
const nonce = Math.floor(Math.random() * 2e16).toString(16);
|
||||
const separator = this._lnurlPayServicePayload.callback.indexOf('?') === -1 ? '?' : '&';
|
||||
if (this.getCommentAllowed() && comment && comment.length > this.getCommentAllowed()) {
|
||||
comment = comment.substr(0, this.getCommentAllowed());
|
||||
if (this.getCommentAllowed() && comment && comment.length > (this.getCommentAllowed() as number)) {
|
||||
comment = comment.substr(0, this.getCommentAllowed() as number);
|
||||
}
|
||||
if (comment) comment = `&comment=${encodeURIComponent(comment)}`;
|
||||
const urlToFetch =
|
||||
this._lnurlPayServicePayload.callback + separator + 'amount=' + Math.floor(amountSat * 1000) + '&nonce=' + nonce + comment;
|
||||
this._lnurlPayServiceBolt11Payload = await this.fetchGet(urlToFetch);
|
||||
if (this._lnurlPayServiceBolt11Payload.status === 'ERROR')
|
||||
throw new Error(this._lnurlPayServiceBolt11Payload.reason || 'requestBolt11FromLnurlPayService() error');
|
||||
this._lnurlPayServiceBolt11Payload = (await this.fetchGet(urlToFetch)) as LnurlPayServiceBolt11Payload;
|
||||
|
||||
// check pr description_hash, amount etc:
|
||||
const decoded = this.decodeInvoice(this._lnurlPayServiceBolt11Payload.pr);
|
||||
@ -155,11 +199,12 @@ export default class Lnurl {
|
||||
return this._lnurlPayServiceBolt11Payload;
|
||||
}
|
||||
|
||||
async callLnurlPayService() {
|
||||
async callLnurlPayService(): Promise<LnurlPayServicePayload> {
|
||||
if (!this._lnurl) throw new Error('this._lnurl is not set');
|
||||
const url = Lnurl.getUrlFromLnurl(this._lnurl);
|
||||
if (!url) throw new Error('Invalid LNURL');
|
||||
// calling the url
|
||||
const reply = await this.fetchGet(url);
|
||||
const reply = (await this.fetchGet(url)) as LnurlPayServiceBolt11Payload;
|
||||
|
||||
if (reply.tag !== Lnurl.TAG_PAY_REQUEST) {
|
||||
throw new Error('lnurl-pay expected, found tag ' + reply.tag);
|
||||
@ -168,8 +213,8 @@ export default class Lnurl {
|
||||
const data = reply;
|
||||
|
||||
// parse metadata and extract things from it
|
||||
let image;
|
||||
let description;
|
||||
let image: string | undefined;
|
||||
let description: string | undefined;
|
||||
const kvs = JSON.parse(data.metadata);
|
||||
for (let i = 0; i < kvs.length; i++) {
|
||||
const [k, v] = kvs[i];
|
||||
@ -185,14 +230,15 @@ export default class Lnurl {
|
||||
}
|
||||
|
||||
// setting the payment screen with the parameters
|
||||
const min = Math.ceil((data.minSendable || 0) / 1000);
|
||||
const max = Math.floor(data.maxSendable / 1000);
|
||||
const min = Math.ceil((data.minSendable ?? 0) / 1000);
|
||||
const max = Math.floor((data.maxSendable ?? 0) / 1000);
|
||||
|
||||
this._lnurlPayServicePayload = {
|
||||
callback: data.callback,
|
||||
fixed: min === max,
|
||||
min,
|
||||
max,
|
||||
// @ts-ignore idk
|
||||
domain: data.callback.match(/^(https|http):\/\/([^/]+)\//)[2],
|
||||
metadata: data.metadata,
|
||||
description,
|
||||
@ -204,7 +250,7 @@ export default class Lnurl {
|
||||
return this._lnurlPayServicePayload;
|
||||
}
|
||||
|
||||
async loadSuccessfulPayment(paymentHash) {
|
||||
async loadSuccessfulPayment(paymentHash: string): Promise<boolean> {
|
||||
if (!paymentHash) throw new Error('No paymentHash provided');
|
||||
let data;
|
||||
try {
|
||||
@ -224,7 +270,7 @@ export default class Lnurl {
|
||||
return true;
|
||||
}
|
||||
|
||||
async storeSuccess(paymentHash, preimage) {
|
||||
async storeSuccess(paymentHash: string, preimage: string | { data: Buffer }): Promise<void> {
|
||||
if (typeof preimage === 'object') {
|
||||
preimage = Buffer.from(preimage.data).toString('hex');
|
||||
}
|
||||
@ -241,35 +287,39 @@ export default class Lnurl {
|
||||
);
|
||||
}
|
||||
|
||||
getSuccessAction() {
|
||||
return this._lnurlPayServiceBolt11Payload.successAction;
|
||||
getSuccessAction(): any | undefined {
|
||||
return this._lnurlPayServiceBolt11Payload && 'successAction' in this._lnurlPayServiceBolt11Payload
|
||||
? this._lnurlPayServiceBolt11Payload.successAction
|
||||
: undefined;
|
||||
}
|
||||
|
||||
getDomain() {
|
||||
return this._lnurlPayServicePayload.domain;
|
||||
getDomain(): string | undefined {
|
||||
return this._lnurlPayServicePayload ? this._lnurlPayServicePayload.domain : undefined;
|
||||
}
|
||||
|
||||
getDescription() {
|
||||
return this._lnurlPayServicePayload.description;
|
||||
getDescription(): string | undefined {
|
||||
return this._lnurlPayServicePayload ? this._lnurlPayServicePayload.description : undefined;
|
||||
}
|
||||
|
||||
getImage() {
|
||||
return this._lnurlPayServicePayload.image;
|
||||
getImage(): string | undefined {
|
||||
return this._lnurlPayServicePayload ? this._lnurlPayServicePayload.image : undefined;
|
||||
}
|
||||
|
||||
getLnurl() {
|
||||
getLnurl(): string {
|
||||
return this._lnurl;
|
||||
}
|
||||
|
||||
getDisposable() {
|
||||
return this._lnurlPayServiceBolt11Payload.disposable;
|
||||
getDisposable(): boolean | undefined {
|
||||
return this._lnurlPayServiceBolt11Payload && 'disposable' in this._lnurlPayServiceBolt11Payload
|
||||
? this._lnurlPayServiceBolt11Payload.disposable
|
||||
: undefined;
|
||||
}
|
||||
|
||||
getPreimage() {
|
||||
getPreimage(): string | false {
|
||||
return this._preimage;
|
||||
}
|
||||
|
||||
static decipherAES(ciphertextBase64, preimageHex, ivBase64) {
|
||||
static decipherAES(ciphertextBase64: string, preimageHex: string, ivBase64: string): string {
|
||||
const iv = CryptoJS.enc.Base64.parse(ivBase64);
|
||||
const key = CryptoJS.enc.Hex.parse(preimageHex);
|
||||
return CryptoJS.AES.decrypt(Buffer.from(ciphertextBase64, 'base64').toString('hex'), key, {
|
||||
@ -279,27 +329,30 @@ export default class Lnurl {
|
||||
}).toString(CryptoJS.enc.Utf8);
|
||||
}
|
||||
|
||||
getCommentAllowed() {
|
||||
return this?._lnurlPayServicePayload?.commentAllowed ? parseInt(this._lnurlPayServicePayload.commentAllowed, 10) : false;
|
||||
getCommentAllowed(): number | false {
|
||||
if (!this._lnurlPayServicePayload) return false;
|
||||
return this._lnurlPayServicePayload.commentAllowed ? parseInt(this._lnurlPayServicePayload.commentAllowed.toString(), 10) : false;
|
||||
}
|
||||
|
||||
getMin() {
|
||||
return this?._lnurlPayServicePayload?.min ? parseInt(this._lnurlPayServicePayload.min, 10) : false;
|
||||
getMin(): number | false {
|
||||
if (!this._lnurlPayServicePayload) return false;
|
||||
return this._lnurlPayServicePayload.min ? parseInt(this._lnurlPayServicePayload.min.toString(), 10) : false;
|
||||
}
|
||||
|
||||
getMax() {
|
||||
return this?._lnurlPayServicePayload?.max ? parseInt(this._lnurlPayServicePayload.max, 10) : false;
|
||||
getMax(): number | false {
|
||||
if (!this._lnurlPayServicePayload) return false;
|
||||
return this._lnurlPayServicePayload.max ? parseInt(this._lnurlPayServicePayload.max.toString(), 10) : false;
|
||||
}
|
||||
|
||||
getAmount() {
|
||||
getAmount(): number | false {
|
||||
return this.getMin();
|
||||
}
|
||||
|
||||
authenticate(secret) {
|
||||
authenticate(secret: string): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this._lnurl) throw new Error('this._lnurl is not set');
|
||||
|
||||
const url = parse(Lnurl.getUrlFromLnurl(this._lnurl), true);
|
||||
const url = parse(Lnurl.getUrlFromLnurl(this._lnurl) || '', true);
|
||||
|
||||
const hmac = createHmac('sha256', secret);
|
||||
hmac.on('readable', async () => {
|
||||
@ -308,7 +361,7 @@ export default class Lnurl {
|
||||
if (!privateKey) return;
|
||||
const privateKeyBuf = Buffer.from(privateKey, 'hex');
|
||||
const publicKey = secp256k1.publicKeyCreate(privateKeyBuf);
|
||||
const signatureObj = secp256k1.sign(Buffer.from(url.query.k1, 'hex'), privateKeyBuf);
|
||||
const signatureObj = secp256k1.sign(Buffer.from(url.query.k1 as string, 'hex'), privateKeyBuf);
|
||||
const derSignature = secp256k1.signatureExport(signatureObj.signature);
|
||||
|
||||
const reply = await this.fetchGet(`${url.href}&sig=${derSignature.toString('hex')}&key=${publicKey.toString('hex')}`);
|
||||
@ -326,7 +379,7 @@ export default class Lnurl {
|
||||
});
|
||||
}
|
||||
|
||||
static isLightningAddress(address) {
|
||||
static isLightningAddress(address: string) {
|
||||
// ensure only 1 `@` present:
|
||||
if (address.split('@').length !== 2) return false;
|
||||
const splitted = address.split('@');
|
@ -5,6 +5,7 @@ import { LegacyWallet } from './legacy-wallet';
|
||||
export class LightningCustodianWallet extends LegacyWallet {
|
||||
static readonly type = 'lightningCustodianWallet';
|
||||
static readonly typeReadable = 'Lightning';
|
||||
static readonly subtitleReadable = 'LNDhub';
|
||||
// @ts-ignore: override
|
||||
public readonly type = LightningCustodianWallet.type;
|
||||
// @ts-ignore: override
|
||||
|
@ -69,8 +69,6 @@ interface SettingsContextType {
|
||||
setIsHandOffUseEnabledAsyncStorage: (value: boolean) => Promise<void>;
|
||||
isPrivacyBlurEnabled: boolean;
|
||||
setIsPrivacyBlurEnabledState: (value: boolean) => void;
|
||||
isAdvancedModeEnabled: boolean;
|
||||
setIsAdvancedModeEnabledStorage: (value: boolean) => Promise<void>;
|
||||
isDoNotTrackEnabled: boolean;
|
||||
setDoNotTrackStorage: (value: boolean) => Promise<void>;
|
||||
isWidgetBalanceDisplayAllowed: boolean;
|
||||
@ -96,8 +94,6 @@ const defaultSettingsContext: SettingsContextType = {
|
||||
setIsHandOffUseEnabledAsyncStorage: async () => {},
|
||||
isPrivacyBlurEnabled: true,
|
||||
setIsPrivacyBlurEnabledState: () => {},
|
||||
isAdvancedModeEnabled: false,
|
||||
setIsAdvancedModeEnabledStorage: async () => {},
|
||||
isDoNotTrackEnabled: false,
|
||||
setDoNotTrackStorage: async () => {},
|
||||
isWidgetBalanceDisplayAllowed: true,
|
||||
@ -125,8 +121,6 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
const [isHandOffUseEnabled, setHandOffUseEnabled] = useState<boolean>(false);
|
||||
// PrivacyBlur
|
||||
const [isPrivacyBlurEnabled, setIsPrivacyBlurEnabled] = useState<boolean>(true);
|
||||
// AdvancedMode
|
||||
const [isAdvancedModeEnabled, setIsAdvancedModeEnabled] = useState<boolean>(false);
|
||||
// DoNotTrack
|
||||
const [isDoNotTrackEnabled, setIsDoNotTrackEnabled] = useState<boolean>(false);
|
||||
// WidgetCommunication
|
||||
@ -141,19 +135,10 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
const [isTotalBalanceEnabled, setIsTotalBalanceEnabled] = useState<boolean>(true);
|
||||
const [totalBalancePreferredUnit, setTotalBalancePreferredUnitState] = useState<BitcoinUnit>(BitcoinUnit.BTC);
|
||||
|
||||
const advancedModeStorage = useAsyncStorage(BlueApp.ADVANCED_MODE_ENABLED);
|
||||
const languageStorage = useAsyncStorage(STORAGE_KEY);
|
||||
const { walletsInitialized } = useStorage();
|
||||
|
||||
useEffect(() => {
|
||||
advancedModeStorage
|
||||
.getItem()
|
||||
.then(advMode => {
|
||||
console.debug('SettingsContext advMode:', advMode);
|
||||
setIsAdvancedModeEnabled(advMode ? JSON.parse(advMode) : false);
|
||||
})
|
||||
.catch(error => console.error('Error fetching advanced mode settings:', error));
|
||||
|
||||
getIsHandOffUseEnabled()
|
||||
.then(handOff => {
|
||||
console.debug('SettingsContext handOff:', handOff);
|
||||
@ -216,7 +201,7 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
getTotalBalancePreferredUnit()
|
||||
.then(unit => {
|
||||
console.debug('SettingsContext totalBalancePreferredUnit:', unit);
|
||||
setTotalBalancePreferredUnit(unit);
|
||||
setTotalBalancePreferredUnitState(unit);
|
||||
})
|
||||
.catch(error => console.error('Error fetching total balance preferred unit:', error));
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
@ -243,14 +228,6 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
setLanguage(newLanguage);
|
||||
}, []);
|
||||
|
||||
const setIsAdvancedModeEnabledStorage = useCallback(
|
||||
async (value: boolean) => {
|
||||
await advancedModeStorage.setItem(JSON.stringify(value));
|
||||
setIsAdvancedModeEnabled(value);
|
||||
},
|
||||
[advancedModeStorage],
|
||||
);
|
||||
|
||||
const setDoNotTrackStorage = useCallback(async (value: boolean) => {
|
||||
await DefaultPreference.setName(GROUP_IO_BLUEWALLET);
|
||||
if (value) {
|
||||
@ -321,8 +298,6 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
setIsHandOffUseEnabledAsyncStorage,
|
||||
isPrivacyBlurEnabled,
|
||||
setIsPrivacyBlurEnabledState,
|
||||
isAdvancedModeEnabled,
|
||||
setIsAdvancedModeEnabledStorage,
|
||||
isDoNotTrackEnabled,
|
||||
setDoNotTrackStorage,
|
||||
isWidgetBalanceDisplayAllowed,
|
||||
@ -347,8 +322,6 @@ export const SettingsProvider: React.FC<{ children: React.ReactNode }> = ({ chil
|
||||
setIsHandOffUseEnabledAsyncStorage,
|
||||
isPrivacyBlurEnabled,
|
||||
setIsPrivacyBlurEnabledState,
|
||||
isAdvancedModeEnabled,
|
||||
setIsAdvancedModeEnabledStorage,
|
||||
isDoNotTrackEnabled,
|
||||
setDoNotTrackStorage,
|
||||
isWidgetBalanceDisplayAllowed,
|
||||
|
@ -1,5 +1,6 @@
|
||||
import React, { Ref, useCallback, useMemo } from 'react';
|
||||
import { Platform, Pressable, TouchableOpacity } from 'react-native';
|
||||
import { MenuView, MenuAction, NativeActionEvent } from '@react-native-menu/menu';
|
||||
import {
|
||||
ContextMenuView,
|
||||
RenderItem,
|
||||
@ -8,7 +9,6 @@ import {
|
||||
IconConfig,
|
||||
MenuElementConfig,
|
||||
} from 'react-native-ios-context-menu';
|
||||
import { MenuView, MenuAction, NativeActionEvent } from '@react-native-menu/menu';
|
||||
import { ToolTipMenuProps, Action } from './types';
|
||||
import { useSettings } from '../hooks/context/useSettings';
|
||||
|
||||
@ -30,6 +30,7 @@ const ToolTipMenu = React.memo((props: ToolTipMenuProps, ref?: Ref<any>) => {
|
||||
|
||||
const { language } = useSettings();
|
||||
|
||||
// Map Menu Items for iOS Context Menu
|
||||
const mapMenuItemForContextMenuView = useCallback((action: Action) => {
|
||||
if (!action.id) return null;
|
||||
return {
|
||||
@ -41,14 +42,30 @@ const ToolTipMenu = React.memo((props: ToolTipMenuProps, ref?: Ref<any>) => {
|
||||
};
|
||||
}, []);
|
||||
|
||||
// Map Menu Items for RN Menu (supports subactions and displayInline)
|
||||
const mapMenuItemForMenuView = useCallback((action: Action): MenuAction | null => {
|
||||
if (!action.id) return null;
|
||||
|
||||
// Check for subactions
|
||||
const subactions =
|
||||
action.subactions?.map(subaction => ({
|
||||
id: subaction.id.toString(),
|
||||
title: subaction.text,
|
||||
subtitle: subaction.subtitle,
|
||||
image: subaction.icon?.iconValue ? subaction.icon.iconValue : undefined,
|
||||
state: subaction.menuState === undefined ? undefined : ((subaction.menuState ? 'on' : 'off') as MenuState),
|
||||
attributes: { disabled: subaction.disabled, destructive: subaction.destructive, hidden: subaction.hidden },
|
||||
})) || [];
|
||||
|
||||
return {
|
||||
id: action.id.toString(),
|
||||
title: action.text,
|
||||
subtitle: action.subtitle,
|
||||
image: action.icon?.iconValue ? action.icon.iconValue : undefined,
|
||||
state: action.menuState === undefined ? undefined : ((action.menuState ? 'on' : 'off') as MenuState),
|
||||
attributes: { disabled: action.disabled },
|
||||
attributes: { disabled: action.disabled, destructive: action.destructive, hidden: action.hidden },
|
||||
subactions: subactions.length > 0 ? subactions : undefined,
|
||||
displayInline: action.displayInline || false,
|
||||
};
|
||||
}, []);
|
||||
|
||||
@ -98,7 +115,6 @@ const ToolTipMenu = React.memo((props: ToolTipMenuProps, ref?: Ref<any>) => {
|
||||
);
|
||||
|
||||
const renderContextMenuView = () => {
|
||||
console.debug('ToolTipMenu.tsx rendering: renderContextMenuView');
|
||||
return (
|
||||
<ContextMenuView
|
||||
lazyPreview
|
||||
@ -139,7 +155,6 @@ const ToolTipMenu = React.memo((props: ToolTipMenuProps, ref?: Ref<any>) => {
|
||||
};
|
||||
|
||||
const renderMenuView = () => {
|
||||
console.debug('ToolTipMenu.tsx rendering: renderMenuView');
|
||||
return (
|
||||
<MenuView
|
||||
title={title}
|
||||
@ -147,7 +162,7 @@ const ToolTipMenu = React.memo((props: ToolTipMenuProps, ref?: Ref<any>) => {
|
||||
onPressAction={handlePressMenuItemForMenuView}
|
||||
actions={Platform.OS === 'ios' ? menuViewItemsIOS : menuViewItemsAndroid}
|
||||
shouldOpenOnLongPress={!isMenuPrimaryAction}
|
||||
// @ts-ignore: its not in the types but it works
|
||||
// @ts-ignore: Not exposed in types
|
||||
accessibilityLabel={props.accessibilityLabel}
|
||||
accessibilityHint={props.accessibilityHint}
|
||||
accessibilityRole={props.accessibilityRole}
|
||||
|
@ -289,7 +289,7 @@ export const TransactionListItem: React.FC<TransactionListItemProps> = React.mem
|
||||
handleOnViewOnBlockExplorer,
|
||||
],
|
||||
);
|
||||
const toolTipActions = useMemo((): Action[] | Action[][] => {
|
||||
const toolTipActions = useMemo((): Action[] => {
|
||||
const actions: (Action | Action[])[] = [];
|
||||
|
||||
if (rowTitle !== loc.lnd.expired) {
|
||||
@ -308,7 +308,7 @@ export const TransactionListItem: React.FC<TransactionListItemProps> = React.mem
|
||||
actions.push([CommonToolTipActions.ExpandNote]);
|
||||
}
|
||||
|
||||
return actions as Action[] | Action[][];
|
||||
return actions as Action[];
|
||||
}, [item.hash, subtitle, rowTitle, subtitleNumberOfLines]);
|
||||
|
||||
const accessibilityState = useMemo(() => {
|
||||
|
@ -38,13 +38,15 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
|
||||
.allowOnchainAddress()
|
||||
.then((value: boolean) => setAllowOnchainAddress(value))
|
||||
.catch((e: Error) => {
|
||||
console.log('This Lndhub wallet does not have an onchain address API.');
|
||||
console.log('This LNDhub wallet does not have an onchain address API.');
|
||||
setAllowOnchainAddress(false);
|
||||
});
|
||||
}
|
||||
}, [wallet]);
|
||||
|
||||
useEffect(() => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
|
||||
setWallet(initialWallet);
|
||||
}, [initialWallet]);
|
||||
|
||||
@ -82,9 +84,9 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
|
||||
newWalletPreferredUnit = BitcoinUnit.BTC;
|
||||
}
|
||||
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
|
||||
const updatedWallet = updateWalletWithNewUnit(wallet, newWalletPreferredUnit);
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
setWallet(updatedWallet);
|
||||
onWalletUnitChange?.(updatedWallet);
|
||||
};
|
||||
@ -132,8 +134,7 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
|
||||
? formatBalance(wallet.getBalance(), balanceUnit, true)
|
||||
: formatBalanceWithoutSuffix(wallet.getBalance(), balanceUnit, true);
|
||||
return !hideBalance && balanceFormatted;
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [wallet.hideBalance, wallet.getPreferredBalanceUnit()]);
|
||||
}, [wallet]);
|
||||
|
||||
const toolTipWalletBalanceActions = useMemo(() => {
|
||||
return wallet.hideBalance
|
||||
|
@ -209,7 +209,7 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
});
|
||||
|
||||
const getAvailableActions = ({ allowSignVerifyMessage }: { allowSignVerifyMessage: boolean }): Action[] | Action[][] => {
|
||||
const getAvailableActions = ({ allowSignVerifyMessage }: { allowSignVerifyMessage: boolean }): Action[] => {
|
||||
const actions = [
|
||||
{
|
||||
id: actionKeys.CopyToClipboard,
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { AccessibilityRole, ViewStyle } from 'react-native';
|
||||
import { AccessibilityRole, ViewStyle, ColorValue } from 'react-native';
|
||||
|
||||
export interface Action {
|
||||
id: string | number;
|
||||
@ -7,13 +7,19 @@ export interface Action {
|
||||
iconValue: string;
|
||||
};
|
||||
menuTitle?: string;
|
||||
subtitle?: string;
|
||||
menuState?: 'mixed' | boolean | undefined;
|
||||
displayInline?: boolean; // Indicates if subactions should be displayed inline or nested (iOS only)
|
||||
image?: string;
|
||||
imageColor?: ColorValue;
|
||||
destructive?: boolean;
|
||||
hidden?: boolean;
|
||||
disabled?: boolean;
|
||||
displayInline?: boolean;
|
||||
subactions?: Action[]; // Nested/Inline actions (subactions) within an action
|
||||
}
|
||||
|
||||
export interface ToolTipMenuProps {
|
||||
actions: Action[] | Action[][];
|
||||
actions: Action[];
|
||||
children: React.ReactNode;
|
||||
enableAndroidRipple?: boolean;
|
||||
dismissMenu?: () => void;
|
||||
|
@ -28,7 +28,6 @@ platform :android do
|
||||
end
|
||||
end
|
||||
|
||||
desc "Update version code, build, and sign the APK"
|
||||
lane :update_version_build_and_sign_apk do
|
||||
Dir.chdir(project_root) do
|
||||
build_number = ENV['BUILD_NUMBER']
|
||||
@ -37,24 +36,34 @@ platform :android do
|
||||
# Get the version name from build.gradle
|
||||
version_name = sh("grep versionName android/app/build.gradle | awk '{print $2}' | tr -d '\"'").strip
|
||||
|
||||
# Get the branch name
|
||||
branch_name = ENV['GITHUB_HEAD_REF'] || `git rev-parse --abbrev-ref HEAD`.strip.gsub('/', '-')
|
||||
# Manually update the versionCode in build.gradle
|
||||
UI.message("Updating versionCode in build.gradle to #{build_number}...")
|
||||
build_gradle_path = "android/app/build.gradle"
|
||||
build_gradle_contents = File.read(build_gradle_path)
|
||||
new_build_gradle_contents = build_gradle_contents.gsub(/versionCode\s+\d+/, "versionCode #{build_number}")
|
||||
File.write(build_gradle_path, new_build_gradle_contents)
|
||||
|
||||
# Get the branch name and default to 'master' if empty
|
||||
branch_name = ENV['GITHUB_HEAD_REF'] || `git rev-parse --abbrev-ref HEAD`.strip.gsub(/[\/\\:?*"<>|]/, '_')
|
||||
if branch_name.nil? || branch_name.empty?
|
||||
branch_name = 'master'
|
||||
end
|
||||
|
||||
# Append branch name only if it's not 'master'
|
||||
if branch_name != 'master'
|
||||
signed_apk_name = "BlueWallet-#{version_name}-#{build_number}-#{branch_name}.apk"
|
||||
else
|
||||
signed_apk_name = "BlueWallet-#{version_name}-#{build_number}-.apk"
|
||||
signed_apk_name = "BlueWallet-#{version_name}-#{build_number}.apk"
|
||||
end
|
||||
|
||||
# Continue with the build process
|
||||
Dir.chdir("android") do
|
||||
UI.message("Updating version code in build.gradle...")
|
||||
UI.message("Building APK...")
|
||||
gradle(
|
||||
task: "assembleRelease",
|
||||
properties: { "versionCode" => build_number },
|
||||
project_dir: "android"
|
||||
)
|
||||
UI.message("Version code updated to #{build_number} and APK build completed.")
|
||||
UI.message("APK build completed.")
|
||||
|
||||
# Define the output paths
|
||||
unsigned_apk_path = "app/build/outputs/apk/release/app-release-unsigned.apk"
|
||||
@ -70,7 +79,7 @@ platform :android do
|
||||
next
|
||||
end
|
||||
|
||||
# Sign the APK using apksigner directly since we don't have an alias
|
||||
# Sign the APK using apksigner
|
||||
UI.message("Signing APK with apksigner...")
|
||||
apksigner_path = "#{ENV['ANDROID_HOME']}/build-tools/34.0.0/apksigner"
|
||||
sh("#{apksigner_path} sign --ks ./bluewallet-release-key.keystore --ks-pass=pass:#{ENV['KEYSTORE_PASSWORD']} #{signed_apk_path}")
|
||||
@ -79,7 +88,6 @@ platform :android do
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
desc "Upload APK to BrowserStack and post result as PR comment"
|
||||
lane :upload_to_browserstack_and_comment do
|
||||
Dir.chdir(project_root) do
|
||||
@ -167,7 +175,8 @@ platform :ios do
|
||||
type: "development",
|
||||
app_identifier: app_identifier,
|
||||
readonly: false, # This will regenerate the provisioning profile if needed
|
||||
force_for_new_devices: true # This forces match to add new devices to the profile
|
||||
force_for_new_devices: true,
|
||||
clone_branch_directly: true
|
||||
)
|
||||
end
|
||||
|
||||
@ -211,6 +220,7 @@ platform :ios do
|
||||
git_basic_authorization: ENV["GIT_ACCESS_TOKEN"],
|
||||
git_url: ENV["GIT_URL"],
|
||||
type: "appstore",
|
||||
clone_branch_directly: true, # Skip if the branch already exists (Exit 128 error)
|
||||
platform: platform,
|
||||
app_identifier: app_identifier,
|
||||
team_id: ENV["ITC_TEAM_ID"],
|
||||
@ -228,7 +238,8 @@ platform :ios do
|
||||
type: "development",
|
||||
platform: "catalyst",
|
||||
app_identifier: app_identifiers,
|
||||
readonly: true
|
||||
readonly: true,
|
||||
clone_branch_directly: true
|
||||
)
|
||||
end
|
||||
|
||||
@ -238,7 +249,9 @@ platform :ios do
|
||||
type: "appstore",
|
||||
platform: "catalyst",
|
||||
app_identifier: app_identifiers,
|
||||
readonly: true
|
||||
readonly: true,
|
||||
clone_branch_directly: true
|
||||
|
||||
)
|
||||
end
|
||||
|
||||
@ -250,14 +263,16 @@ platform :ios do
|
||||
platform: "catalyst",
|
||||
app_identifier: app_identifier,
|
||||
readonly: false,
|
||||
force_for_new_devices: true
|
||||
force_for_new_devices: true,
|
||||
clone_branch_directly: true
|
||||
)
|
||||
|
||||
match(
|
||||
type: "appstore",
|
||||
platform: "catalyst",
|
||||
app_identifier: app_identifier,
|
||||
readonly: false
|
||||
readonly: false,
|
||||
clone_branch_directly: true
|
||||
)
|
||||
end
|
||||
end
|
||||
@ -326,8 +341,8 @@ platform :ios do
|
||||
changelog = ENV["LATEST_COMMIT_MESSAGE"]
|
||||
|
||||
upload_to_testflight(
|
||||
api_key_path: "appstore_api_key.json",
|
||||
ipa: "./build/BlueWallet.#{ENV['PROJECT_VERSION']}(#{ENV['NEW_BUILD_NUMBER']}).ipa",
|
||||
api_key_path: "./appstore_api_key.json",
|
||||
ipa: "./BlueWallet.#{ENV['PROJECT_VERSION']}(#{ENV['NEW_BUILD_NUMBER']}).ipa",
|
||||
skip_waiting_for_build_processing: true, # Do not wait for processing
|
||||
changelog: changelog
|
||||
)
|
||||
|
@ -1049,7 +1049,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\"\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
|
||||
shellScript = "export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\"\nexport NODE_BINARY=$(which node)\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
|
||||
};
|
||||
1D93562AB5DF61839917DB14 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
@ -1360,7 +1360,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU;
|
||||
@ -1385,7 +1385,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-ObjC",
|
||||
@ -1420,7 +1420,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU;
|
||||
@ -1440,7 +1440,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-ObjC",
|
||||
@ -1476,7 +1476,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1489,7 +1489,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
@ -1519,7 +1519,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1532,7 +1532,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers;
|
||||
@ -1563,7 +1563,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1582,7 +1582,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
@ -1619,7 +1619,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1638,7 +1638,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget;
|
||||
@ -1802,7 +1802,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1819,7 +1819,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
@ -1852,7 +1852,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1869,7 +1869,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension;
|
||||
@ -1901,7 +1901,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1914,7 +1914,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
@ -1949,7 +1949,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1703136697;
|
||||
CURRENT_PROJECT_VERSION = 1703136699;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
@ -1962,7 +1962,7 @@
|
||||
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
);
|
||||
MARKETING_VERSION = 7.0.4;
|
||||
MARKETING_VERSION = 7.0.5;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch;
|
||||
|
@ -58,18 +58,6 @@
|
||||
<string>io.bluewallet.backup</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>JSON File</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Owner</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>public.json</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeIconFiles</key>
|
||||
<array/>
|
||||
@ -239,10 +227,6 @@
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.json</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>BW COSIGNER</string>
|
||||
<key>UTTypeIconFiles</key>
|
||||
@ -288,8 +272,6 @@
|
||||
<string>JSON File</string>
|
||||
<key>UTTypeIconFiles</key>
|
||||
<array/>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>public.json</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
@ -360,10 +342,6 @@
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.json</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>BW COSIGNER</string>
|
||||
<key>UTTypeIconFiles</key>
|
||||
@ -384,5 +362,9 @@
|
||||
<key>apiKey</key>
|
||||
<string>17ba9059f676f1cc4f45d98182388b01</string>
|
||||
</dict>
|
||||
<key>FIREBASE_ANALYTICS_COLLECTION_ENABLED</key>
|
||||
<false/>
|
||||
<key>FIREBASE_MESSAGING_AUTO_INIT_ENABLED</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -19,7 +19,6 @@ require Pod::Executable.execute_command('node', ['-p',
|
||||
)', __dir__]).strip
|
||||
|
||||
workspace 'BlueWallet'
|
||||
project 'BlueWallet.xcodeproj'
|
||||
platform :ios, min_ios_version_supported
|
||||
prepare_react_native_project!
|
||||
setup_permissions(['Camera', 'Notifications'])
|
||||
|
530
ios/Podfile.lock
530
ios/Podfile.lock
File diff suppressed because it is too large
Load Diff
@ -22,9 +22,10 @@ export CPPFLAGS="-I/usr/local/opt/node@20/include"
|
||||
echo "Configuration complete."
|
||||
|
||||
# Install dependencies using npm
|
||||
echo "===== Running npm install ====="
|
||||
npm install -y | tee npm-install-log.txt
|
||||
echo "npm install complete. Full log output in npm-install-log.txt"
|
||||
echo "===== Running npm ci ====="
|
||||
npm ci | tee npm-ci-log.txt
|
||||
npm prune --production | tee npm-prune-log.txt
|
||||
echo "npm ci complete. Full log output in npm-ci-log.txt and npm-prune-log.txt"
|
||||
|
||||
echo "===== Running pod install ====="
|
||||
cd ios
|
||||
|
10
loc/ar.json
10
loc/ar.json
@ -221,7 +221,7 @@
|
||||
"use_ssl": "استخدم SSL",
|
||||
"electrum_saved": "تم حفظ تغييراتك بنجاح. قد تحتاج إلى إعادة التشغيل لتصبح التغييرات سارية المفعول.",
|
||||
"set_electrum_server_as_default": "هل تريد تعيين {server} كخادم Electrum الافتراضي؟",
|
||||
"set_lndhub_as_default": "هل تريد تعيين {url} كخادم LNDHub الافتراضي؟",
|
||||
"set_lndhub_as_default": "هل تريد تعيين {url} كخادم LNDhub الافتراضي؟",
|
||||
"electrum_settings_server": "خادم Electrum",
|
||||
"electrum_settings_explain": "اتركه فارغا لاستخدام الاعدادات الافتراضية.",
|
||||
"electrum_status": "الحالة",
|
||||
@ -244,7 +244,7 @@
|
||||
"encrypt_use_expl": "سيتم استخدام {type} لتأكيد هويتك قبل إجراء معاملة أو فتح محفظة أو تصديرها أو حذفها. ولن يتم استخدام {type} لفتح وحدة تخزين مشفرة.",
|
||||
"general": "عام",
|
||||
"general_adv_mode": "الوضع المتقدم",
|
||||
"general_adv_mode_e": "عند تمكين هذا الإعداد، سترى خيارات متقدمة أثناء إنشاء المحفظة، مثل أنواع محافظ مختلفة، القدرة على الاتصال ب LNDHub محدد، وإنتروبيا (عشوائية) مخصصة.",
|
||||
"general_adv_mode_e": "عند تمكين هذا الإعداد، سترى خيارات متقدمة أثناء إنشاء المحفظة، مثل أنواع محافظ مختلفة، القدرة على الاتصال ب LNDhub محدد، وإنتروبيا (عشوائية) مخصصة.",
|
||||
"general_continuity": "الاتساق",
|
||||
"general_continuity_e": "عند تمكين هذا الإعداد، ستتمكن من عرض المحافظ والعمليات المحدَّدة باستخدام أجهزتك الأخرى المتصلة بنفس حساب Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl هو خادم إشعارات فورية مجاني مفتوح المصدر لمحافظ البتكوين. يمكنك تثبيت خادم GroundControl الخاص بك ووضع عنوان (URL) له هنا لعدم الاعتماد على البنية التحتية لمحفظة BlueWallet. اترك الحقل فارغًا لاستخدام الإعدادات الافتراضية",
|
||||
@ -252,10 +252,10 @@
|
||||
"language": "اللغة",
|
||||
"last_updated": "آخر تحديث",
|
||||
"language_isRTL": "يجب اعادة تشغيل BlueWallet حتى تظهر تعديلات تغيير اللغة.",
|
||||
"lightning_error_lndhub_uri": "معرِّف URI لبرنامج تضمين LndHub غير صالح",
|
||||
"lightning_error_lndhub_uri": "معرِّف URI لبرنامج تضمين LNDhub غير صالح",
|
||||
"lightning_saved": "تم حفظ تغييراتك بنجاح",
|
||||
"lightning_settings": "إعدادات البرق",
|
||||
"lightning_settings_explain": "للاتصال بنود LND الخاص بك، يُرجى تثبيت LNDHub ثم وضع رابطه هنا في الإعدادات. تذكر: فقط المحافظ التي يتم إنشاؤها بعد حفظ التغييرات ستتصل بنود LNDHub التي قمت بإضافتها.",
|
||||
"lightning_settings_explain": "للاتصال بنود LND الخاص بك، يُرجى تثبيت LNDhub ثم وضع رابطه هنا في الإعدادات. تذكر: فقط المحافظ التي يتم إنشاؤها بعد حفظ التغييرات ستتصل بنود LNDhub التي قمت بإضافتها.",
|
||||
"network": "الشبكة",
|
||||
"network_broadcast": "بث العملية",
|
||||
"network_electrum": "خادم Electrum",
|
||||
@ -345,7 +345,7 @@
|
||||
"add_import_wallet": "استيراد محفظة",
|
||||
"add_lightning": "البرق",
|
||||
"add_lightning_explain": "لإرسال المعاملات بشكل فوري عبر شبكة البرق",
|
||||
"add_lndhub": "اتصل ب LNDHub الخاص بك",
|
||||
"add_lndhub": "اتصل ب LNDhub الخاص بك",
|
||||
"add_lndhub_error": "عنوان النود المقدَّم غير صالح.",
|
||||
"add_lndhub_placeholder": "عنوان النود الخاص بك",
|
||||
"add_placeholder": "محفظتي الأولى",
|
||||
|
@ -174,7 +174,7 @@
|
||||
"electrum_connected_not": "Няма връзка",
|
||||
"electrum_saved": "Промените бяха запазени успешно. Моля, рестартирайте Блу Уолет за да видите промените.",
|
||||
"set_electrum_server_as_default": "Задайте {server} като Електрум сървър по подразбиране? ",
|
||||
"set_lndhub_as_default": "Задайте {url} като LNDHub сървър по подразбиране?",
|
||||
"set_lndhub_as_default": "Задайте {url} като LNDhub сървър по подразбиране?",
|
||||
"electrum_status": "Статус",
|
||||
"electrum_clear_alert_title": "Изчисти историята?",
|
||||
"electrum_clear_alert_message": "Искате ли да изтриете електрум сървър историята?",
|
||||
|
@ -199,7 +199,7 @@
|
||||
"electrum_offline_mode": "هالت آفلاین",
|
||||
"use_ssl": "SSL نه به کار بگر",
|
||||
"set_electrum_server_as_default": "{server} سی سرور پؽش فرز الکترام ساموو بۊوه؟",
|
||||
"set_lndhub_as_default": "{server} سی سرور پؽش فرز LNDHub ساموو بۊوه؟",
|
||||
"set_lndhub_as_default": "{server} سی سرور پؽش فرز LNDhub ساموو بۊوه؟",
|
||||
"electrum_settings_server": "سرور الکترام",
|
||||
"electrum_settings_explain": "سی استفاڌه زه سامووا پؽش فرز، بؽلین پتی بمهنه.",
|
||||
"electrum_status": "وزیت",
|
||||
@ -224,10 +224,10 @@
|
||||
"last_updated": "ورۊ رسۊوی دیندایی",
|
||||
"language_isRTL": "ره وندن دووارته BlueWallet سی انجوم آلشت کاریا ری زۉ الن وا انجوم بۊ.",
|
||||
"license": "موجوز",
|
||||
"lightning_error_lndhub_uri": "یۊآرآی LNDHub زبال نؽ",
|
||||
"lightning_error_lndhub_uri": "یۊآرآی LNDhub زبال نؽ",
|
||||
"lightning_saved": "آلشت کاریا ایسا وه خۊوی زفت وابین.",
|
||||
"lightning_settings": "سامووا لایتنینگ",
|
||||
"lightning_settings_explain": "سی منپیز وه گره LND خوت، LNDHub نه بپۊرن ۉ آدرسسه ایچونا منه سامووا بنه. ویرت بۊ که کیف پیلا وورکل وابیڌه دیندا زفت کردن آلشت کاریا وه LNDHub موشخس وابیڌه منپیز ابۊ.",
|
||||
"lightning_settings_explain": "سی منپیز وه گره LND خوت، LNDhub نه بپۊرن ۉ آدرسسه ایچونا منه سامووا بنه. ویرت بۊ که کیف پیلا وورکل وابیڌه دیندا زفت کردن آلشت کاریا وه LNDhub موشخس وابیڌه منپیز ابۊ.",
|
||||
"network": "شبکه",
|
||||
"network_electrum": "سرور الکترام",
|
||||
"notifications": "وارسۊویا",
|
||||
|
@ -194,7 +194,7 @@
|
||||
"header": "Configuració",
|
||||
"language": "Idioma",
|
||||
"last_updated": "Última actualització",
|
||||
"lightning_error_lndhub_uri": "LNDHub URI no vàlid",
|
||||
"lightning_error_lndhub_uri": "LNDhub URI no vàlid",
|
||||
"lightning_settings": "Configuració Lightning",
|
||||
"network": "Xarxa",
|
||||
"network_electrum": "Servidor Electrum",
|
||||
|
@ -247,7 +247,7 @@
|
||||
"use_ssl": "Použít protokol SSL",
|
||||
"electrum_saved": "Vaše změny byly úspěšně uloženy. Změny se projeví až po restartu aplikace BlueWallet.",
|
||||
"set_electrum_server_as_default": "Nastavit {server} jako výchozí Electrum server?",
|
||||
"set_lndhub_as_default": "Nastavit {url} jako výchozí LNDHub server?",
|
||||
"set_lndhub_as_default": "Nastavit {url} jako výchozí LNDhub server?",
|
||||
"electrum_settings_server": "Electrum server",
|
||||
"electrum_settings_explain": "Chcete-li použít výchozí nastavení, ponechte pole prázdné.",
|
||||
"electrum_status": "Stav",
|
||||
@ -272,7 +272,7 @@
|
||||
"biometrics_fail": "Pokud {type} není povolen, nebo selže při odemykání, můžete jako alternativu použít přístupový kód vašeho zařízení.",
|
||||
"general": "Obecné",
|
||||
"general_adv_mode": "Pokročilý režim",
|
||||
"general_adv_mode_e": "Pokud je povolen, uvidíte pokročilé možnosti, například různé typy peněženek, možnost určit instanci LNDHub, ke které se chcete připojit, a vlastní entropii během vytváření peněženky.",
|
||||
"general_adv_mode_e": "Pokud je povolen, uvidíte pokročilé možnosti, například různé typy peněženek, možnost určit instanci LNDhub, ke které se chcete připojit, a vlastní entropii během vytváření peněženky.",
|
||||
"general_continuity": "Kontinuita",
|
||||
"general_continuity_e": "Pokud je povolena, budete moci prohlížet vybrané peněženky a transakce pomocí ostatních zařízení připojených k Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl je bezplatný open source server push oznámení pro bitcoinové peněženky. Můžete si nainstalovat svůj vlastní server GroundControl a vložit sem jeho URL, abyste se nespoléhali na infrastrukturu BlueWallet. Chcete-li použít výchozí server, ponechte pole prázdné.",
|
||||
@ -281,10 +281,10 @@
|
||||
"last_updated": "Naposledy aktualizováno",
|
||||
"language_isRTL": "Aby se projevila změna nastavení jazyka, je nutné restartovat BlueWallet.",
|
||||
"license": "Licence",
|
||||
"lightning_error_lndhub_uri": "Neplatná LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Neplatná LNDhub URI",
|
||||
"lightning_saved": "Vaše změny byly úspěšně uloženy.",
|
||||
"lightning_settings": "Nastavení Lightning",
|
||||
"lightning_settings_explain": "Chcete-li se připojit k vlastnímu uzlu LND, nainstalujte si LNDHub a zde 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.",
|
||||
"lightning_settings_explain": "Chcete-li se připojit k vlastnímu uzlu LND, nainstalujte si LNDhub a zde 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": "Odeslat transakci",
|
||||
"network_electrum": "Electrum server",
|
||||
@ -389,8 +389,8 @@
|
||||
"add_import_wallet": "Importovat peněženku",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Pro utrácení s okamžitými transakcemi",
|
||||
"add_lndhub": "Připojte se k vašemu LNDHub",
|
||||
"add_lndhub_error": "Zadaná adresa uzlu je neplatný LNDHub uzel.",
|
||||
"add_lndhub": "Připojte se k vašemu LNDhub",
|
||||
"add_lndhub_error": "Zadaná adresa uzlu je neplatný LNDhub uzel.",
|
||||
"add_lndhub_placeholder": "Adresa vašeho uzlu",
|
||||
"add_placeholder": "moje první peněženka",
|
||||
"add_title": "Přidat peněženku",
|
||||
|
@ -245,7 +245,7 @@
|
||||
"use_ssl": "SSL verwenden",
|
||||
"electrum_saved": "Deine Änderungen wurden gespeichert. Zur Aktivierung ist ggf. ein Neustart von BlueWallet erforderlich.",
|
||||
"set_electrum_server_as_default": "{server} als Standard Electrum-Server setzten?",
|
||||
"set_lndhub_as_default": "{url} als Standard LNDHub-Server setzten?",
|
||||
"set_lndhub_as_default": "{url} als Standard LNDhub-Server setzten?",
|
||||
"electrum_settings_server": "Electrum Server",
|
||||
"electrum_settings_explain": "Leer lassen, um den Standard zu verwenden.",
|
||||
"electrum_status": "Status",
|
||||
@ -270,7 +270,7 @@
|
||||
"biometrics_fail": "Wenn {type} nicht aktiviert ist oder entsperrt werden kann, alternativ Ihren Gerätepasscode verwenden.",
|
||||
"general": "Allgemein",
|
||||
"general_adv_mode": "Erweiterter Modus",
|
||||
"general_adv_mode_e": "Erlaubt, wenn aktiviert, verschiedene Wallet-Typen anzulegen, dabei eine benutzerdefinierte Entropie zu verwenden und die LNDHub-Instanz der Lightning Wallet frei zu definieren.",
|
||||
"general_adv_mode_e": "Erlaubt, wenn aktiviert, verschiedene Wallet-Typen anzulegen, dabei eine benutzerdefinierte Entropie zu verwenden und die LNDhub-Instanz der Lightning Wallet frei zu definieren.",
|
||||
"general_continuity": "Kontinuität",
|
||||
"general_continuity_e": "Wenn aktiviert werden ausgewählte Wallets und deren Transaktionen auf deinen anderen Apple iCloud Geräten angezeigt.",
|
||||
"groundcontrol_explanation": "GroundControl ist ein kostenloser Open-Source Push-Benachrichtigungsdienst für Bitcoin-Wallets. Trage hier die URL eines selbst aufgesetzten GroundControl-Servers ein, um von BlueWallet unabhängig zu bleiben. Leer lassen, um die Standardeinstellung zu verwenden.",
|
||||
@ -279,10 +279,10 @@
|
||||
"last_updated": "Zuletzt aktualisiert",
|
||||
"language_isRTL": "BlueWallet zur Aktivierung der Änderung der Schriftrichtung neu starten.",
|
||||
"license": "Lizenz",
|
||||
"lightning_error_lndhub_uri": "Keine gültige LndHub URI",
|
||||
"lightning_error_lndhub_uri": "Keine gültige LNDhub URI",
|
||||
"lightning_saved": "Deine Änderungen wurden gespeichert.",
|
||||
"lightning_settings": "Lightning-Einstellungen",
|
||||
"lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten LNDHub installieren und dessen URL hier eingeben. Bitte beachte, dass nur Wallets, die nach dem Speichern der Änderungen erstellt werden, mit dem angegebenen LNDHub verbunden werden.",
|
||||
"lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten LNDhub installieren und dessen URL hier eingeben. Bitte beachte, dass nur Wallets, die nach dem Speichern der Änderungen erstellt werden, mit dem angegebenen LNDhub verbunden werden.",
|
||||
"network": "Netzwerk",
|
||||
"network_broadcast": "Transaktion publizieren",
|
||||
"network_electrum": "Electrum Server",
|
||||
@ -379,8 +379,8 @@
|
||||
"add_import_wallet": "Wallet importieren",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Für Ausgaben mit sofortigen Transaktionen",
|
||||
"add_lndhub": "LNDHub Verbindung",
|
||||
"add_lndhub_error": "Die eingegebene Adresse ist kein gültiger LNDHub Konten.",
|
||||
"add_lndhub": "LNDhub Verbindung",
|
||||
"add_lndhub_error": "Die eingegebene Adresse ist kein gültiger LNDhub Konten.",
|
||||
"add_lndhub_placeholder": "Bitcoin Knoten-Adresse",
|
||||
"add_placeholder": "Mein Wallet",
|
||||
"add_title": "Wallet hinzufügen",
|
||||
|
@ -196,7 +196,7 @@
|
||||
"language": "Γλώσσα",
|
||||
"last_updated": "Τελευταία ενημέρωση",
|
||||
"license": "Άδεια χρήσης",
|
||||
"lightning_error_lndhub_uri": "Μη έγκυρο LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Μη έγκυρο LNDhub URI",
|
||||
"lightning_saved": "Η αλλαγές σας αποθηκεύτηκαν με επιτυχία.",
|
||||
"lightning_settings": "Ρυθμίσεις Lightning",
|
||||
"network": "Δίκτυο",
|
||||
@ -255,7 +255,7 @@
|
||||
"add_entropy": "Εντροπία",
|
||||
"add_import_wallet": "Εισαγωγή πορτοφολιού",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lndhub": "Σύνδεση στο δικό σας LNDHub",
|
||||
"add_lndhub": "Σύνδεση στο δικό σας LNDhub",
|
||||
"add_lndhub_placeholder": "Η διεύθυνση του κόμβου σας",
|
||||
"add_placeholder": "το πρώτο μου πορτοφόλι",
|
||||
"add_title": "Προσθήκη πορτοφολιού",
|
||||
|
19
loc/en.json
19
loc/en.json
@ -219,7 +219,6 @@
|
||||
"about_sm_twitter": "Follow us on Twitter",
|
||||
"privacy_temporary_screenshots": "Allow Screenshots",
|
||||
"privacy_temporary_screenshots_instructions": "Screen capture protection will be turned off for this session, allowing you to take screenshots. Once you close and reopen the app, the protection will be automatically turned back on.",
|
||||
"advanced_options": "Advanced Options",
|
||||
"biometrics": "Biometrics",
|
||||
"biometrics_no_longer_available": "Your device settings have changed and no longer match the selected security settings in the app. Please re-enable biometrics or passcode, then restart the app to apply these changes.",
|
||||
"biom_10times": "You have attempted to enter your password 10 times. Would you like to reset your storage? This will remove all wallets and decrypt your storage.",
|
||||
@ -244,7 +243,7 @@
|
||||
"use_ssl": "Use SSL",
|
||||
"electrum_saved": "Your changes have been saved successfully. Restarting BlueWallet may be required for the changes to take effect.",
|
||||
"set_electrum_server_as_default": "Set {server} as the default Electrum server?",
|
||||
"set_lndhub_as_default": "Set {url} as the default LNDHub server?",
|
||||
"set_lndhub_as_default": "Set {url} as the default LNDhub server?",
|
||||
"electrum_settings_server": "Electrum Server",
|
||||
"electrum_settings_explain": "Leave blank to use the default.",
|
||||
"electrum_status": "Status",
|
||||
@ -272,8 +271,6 @@
|
||||
"encrypt_use_expl": "{type} will be used to confirm your identity before making a transaction, unlocking, exporting, or deleting a wallet. {type} will not be used to unlock encrypted storage.",
|
||||
"biometrics_fail": "If {type} is not enabled, or fails to unlock, you can use your device passcode as an alternative.",
|
||||
"general": "General",
|
||||
"general_adv_mode": "Advanced Mode",
|
||||
"general_adv_mode_e": "When enabled, you will see advanced options such as different wallet types, the ability to specify the LNDHub instance you wish to connect to, and custom entropy during wallet creation.",
|
||||
"general_continuity": "Continuity",
|
||||
"general_continuity_e": "When enabled, you will be able to view selected wallets, and transactions, using your other Apple iCloud connected devices.",
|
||||
"groundcontrol_explanation": "GroundControl is a free, open-source push notifications server for Bitcoin wallets. You can install your own GroundControl server and put its URL here to not rely on BlueWallet’s infrastructure. Leave blank to use GroundControl’s default server.",
|
||||
@ -282,10 +279,10 @@
|
||||
"last_updated": "Last Updated",
|
||||
"language_isRTL": "Restarting BlueWallet is required for the language orientation to take effect.",
|
||||
"license": "License",
|
||||
"lightning_error_lndhub_uri": "Invalid LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Invalid LNDhub URI",
|
||||
"lightning_saved": "Your changes have been saved successfully.",
|
||||
"lightning_settings": "Lightning Settings",
|
||||
"lightning_settings_explain": "To connect to your own LND node, please install LNDHub and put its URL here in settings. 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",
|
||||
@ -389,8 +386,8 @@
|
||||
"add_import_wallet": "Import wallet",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "For spending with instant transactions",
|
||||
"add_lndhub": "Connect to your LNDHub",
|
||||
"add_lndhub_error": "The provided node address is an invalid LNDHub node.",
|
||||
"add_lndhub": "Connect to your LNDhub",
|
||||
"add_lndhub_error": "The provided node address is an invalid LNDhub node.",
|
||||
"add_lndhub_placeholder": "Your Node Address",
|
||||
"add_placeholder": "my first wallet",
|
||||
"add_title": "Add Wallet",
|
||||
@ -440,6 +437,7 @@
|
||||
"import_success_watchonly": "Your wallet has been successfully imported. WARNING: This is a watch-only wallet, you can NOT spend from it.",
|
||||
"import_search_accounts": "Search accounts",
|
||||
"import_title": "Import",
|
||||
"learn_more": "Learn more",
|
||||
"import_discovery_title": "Discovery",
|
||||
"import_discovery_subtitle": "Choose a discovered wallet",
|
||||
"import_discovery_derivation": "Use custom derivation path",
|
||||
@ -479,7 +477,8 @@
|
||||
"add_ln_wallet_first": "You must first add a Lightning wallet.",
|
||||
"identity_pubkey": "Identity Pubkey",
|
||||
"xpub_title": "Wallet XPUB",
|
||||
"manage_wallets_search_placeholder": "Search wallets, memos"
|
||||
"manage_wallets_search_placeholder": "Search wallets, memos",
|
||||
"more_info": "More Info"
|
||||
},
|
||||
"total_balance_view": {
|
||||
"view_in_bitcoin": "View in Bitcoin",
|
||||
@ -489,7 +488,7 @@
|
||||
"explanation": "View the total balance of all your wallets in the overview screen."
|
||||
},
|
||||
"multisig": {
|
||||
"multisig_vault": "Vault",
|
||||
"multisig_vault": "Multisig Vault",
|
||||
"default_label": "Multisig Vault",
|
||||
"multisig_vault_explain": "Best security for large amounts",
|
||||
"provide_signature": "Provide signature",
|
||||
|
@ -210,7 +210,7 @@
|
||||
"use_ssl": "Utiliza SSL",
|
||||
"electrum_saved": "Los cambios se han guardado. Puede que se requiera reiniciar la aplicación para que tomen efecto.",
|
||||
"set_electrum_server_as_default": "¿Establecer {server} como servidor Electrum por defecto?",
|
||||
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDHub por defecto?",
|
||||
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDhub por defecto?",
|
||||
"electrum_settings_server": "Servidor Electrum",
|
||||
"electrum_settings_explain": "Déjalo en blanco para usar el predeterminado.",
|
||||
"electrum_status": "Estado",
|
||||
@ -233,7 +233,7 @@
|
||||
"encrypt_use_expl": "{type} se utilizará para confirmar tu identidad antes de realizar una transacción, desbloquear, exportar o eliminar una billetera. {type} no se utilizará para desbloquear el almacenamiento encriptado.",
|
||||
"general": "General",
|
||||
"general_adv_mode": "Modo avanzado",
|
||||
"general_adv_mode_e": "Al activarlo podrás ver opciones avanzadas, como varios tipos de carteras, la posibilidad de especificar el LNDHub al que quieres conectar y entropía personalizada al crear una cartera.",
|
||||
"general_adv_mode_e": "Al activarlo podrás ver opciones avanzadas, como varios tipos de carteras, la posibilidad de especificar el LNDhub al que quieres conectar y entropía personalizada al crear una cartera.",
|
||||
"general_continuity": "Continuidad",
|
||||
"general_continuity_e": "Al activarlo, podrá ver las transacciones y carteras seleccionadas usando cualquiera de sus dispositivos Apple conectados a iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl es un servidor gratuito y de código abierto de notificaciones push para carteras Bitcoin. Puedes instalar tu propio servidor de GroundControl y poner su URL aquí para no depender del de BlueWallet. Déjalo en blanco para usar el predeterminado.",
|
||||
@ -241,7 +241,7 @@
|
||||
"language": "Idioma",
|
||||
"last_updated": "Última actualización",
|
||||
"language_isRTL": "Al seleccionar otro idioma, será necesario reiniciar BlueWallet para mostrar los cambios.",
|
||||
"lightning_error_lndhub_uri": "LndHub URI no válida",
|
||||
"lightning_error_lndhub_uri": "LNDhub URI no válida",
|
||||
"lightning_saved": "Tus cambios se han guardado correctamente",
|
||||
"lightning_settings": "Configuración de Lightning",
|
||||
"network": "Red",
|
||||
@ -334,7 +334,7 @@
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Para pagos con transferencias instantáneas",
|
||||
"add_lndhub": "Conecta a tu LDNHub",
|
||||
"add_lndhub_error": "La dirección proporcionada no es válida para un nodo LNDHub.",
|
||||
"add_lndhub_error": "La dirección proporcionada no es válida para un nodo LNDhub.",
|
||||
"add_lndhub_placeholder": "La dirección de tu nodo",
|
||||
"add_placeholder": "Mi primera cartera",
|
||||
"add_title": "Añadir cartera",
|
||||
|
@ -219,7 +219,6 @@
|
||||
"about_sm_twitter": "Siguenos en Twitter",
|
||||
"privacy_temporary_screenshots": "Permitir capturas de pantalla",
|
||||
"privacy_temporary_screenshots_instructions": "La protección contra capturas de pantalla se desactivará para esta sesión, permitiéndote hacer capturas de pantalla. Cuando cierres y vuelvas a abrir la aplicación, la protección volverá a activarse automáticamente.",
|
||||
"advanced_options": "Opciones Avanzadas",
|
||||
"biometrics": "Biometría",
|
||||
"biometrics_no_longer_available": "La configuración de tu dispositivo cambió y ya no coincide con la configuración de seguridad seleccionada en la aplicación. Vuelve a habilitar los datos biométricos o el código de acceso, luego reinicia la aplicación para aplicar estos cambios.",
|
||||
"biom_10times": "Has intentado ingresar tu contraseña 10 veces. ¿Te gustaría restablecer tu almacenamiento? Esto eliminará todas las billeteras y descifrará tu almacenamiento.",
|
||||
@ -244,7 +243,7 @@
|
||||
"use_ssl": "Utiliza SSL",
|
||||
"electrum_saved": "Tus cambios se han guardado correctamente. Es necesario reiniciar para que los cambios surtan efecto.",
|
||||
"set_electrum_server_as_default": "Establecer {server} como el servidor Electrum predeterminado?",
|
||||
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDHub predeterminado?",
|
||||
"set_lndhub_as_default": "¿Establecer {url} como servidor LNDhub predeterminado?",
|
||||
"electrum_settings_server": "Servidor Electrum",
|
||||
"electrum_settings_explain": "Déjalo en blanco para usar el predeterminado.",
|
||||
"electrum_status": "Estado",
|
||||
@ -272,8 +271,6 @@
|
||||
"encrypt_use_expl": "{type} se utilizará para confirmar tu identidad antes de realizar una transacción, desbloquear, exportar o eliminar una billetera. {type} no se utilizará para desbloquear el almacenamiento encriptado.",
|
||||
"biometrics_fail": "Si {type} no está activado o no se desbloquea, puedes utilizar el código de acceso de tu dispositivo como alternativa.",
|
||||
"general": "General",
|
||||
"general_adv_mode": "Modo Avanzado",
|
||||
"general_adv_mode_e": "Cuando esté habilitado, verás opciones avanzadas como diferentes tipos de billetera, la capacidad de especificar la instancia de LNDHub a la que deseas conectarte y la entropía personalizada durante la creación de la billetera.",
|
||||
"general_continuity": "Continuidad",
|
||||
"general_continuity_e": "Cuando esté habilitado, podrás ver carteras seleccionadas y transacciones utilizando tus otros dispositivos conectados a Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl es un servidor de notificaciones push de código abierto gratuito para billeteras Bitcoin. Puedes instalar tu propio servidor GroundControl y poner tu URL aquí para no depender de la infraestructura de BlueWallet. Déjalo en blanco para usar el predeterminado.",
|
||||
@ -282,10 +279,10 @@
|
||||
"last_updated": "Última actualización",
|
||||
"language_isRTL": "Es necesario reiniciar BlueWallet para que la orientación del idioma surta efecto.",
|
||||
"license": "Licencia",
|
||||
"lightning_error_lndhub_uri": "URI de LNDHub inválido",
|
||||
"lightning_error_lndhub_uri": "URI de LNDhub no válido",
|
||||
"lightning_saved": "Tus cambios han sido guardados correctamente.",
|
||||
"lightning_settings": "Configuración de Lightning",
|
||||
"lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y coloca tu URL aquí en la configuración. Ten en cuenta que solo las billeteras 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 coloca su URL aquí en la configuración. Ten en cuenta que solo las billeteras creadas después de guardar los cambios se conectarán al LNDhub especificado.",
|
||||
"network": "Red",
|
||||
"network_broadcast": "Publicar transacción",
|
||||
"network_electrum": "Servidor Electrum",
|
||||
@ -389,8 +386,8 @@
|
||||
"add_import_wallet": "Importar billetera",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Para gastar con transacciones instantáneas",
|
||||
"add_lndhub": "Conectar a tu LNDHub",
|
||||
"add_lndhub_error": "La dirección de nodo proporcionada es un nodo LNDHub inválido.",
|
||||
"add_lndhub": "Conéctate a tu LNDhub",
|
||||
"add_lndhub_error": "La dirección de nodo proporcionada es un nodo LNDhub no válido.",
|
||||
"add_lndhub_placeholder": "Tu Dirección de Nodo",
|
||||
"add_placeholder": "mi primera billetera",
|
||||
"add_title": "Agregar Billetera",
|
||||
@ -440,6 +437,7 @@
|
||||
"import_success_watchonly": "Tu billetera se ha importado correctamente. ADVERTENCIA: Esta es una billetera de \"solo ver\", NO puedes gastar desde él.",
|
||||
"import_search_accounts": "Buscar cuentas",
|
||||
"import_title": "Importar",
|
||||
"learn_more": "Saber más",
|
||||
"import_discovery_title": "Descubrimiento",
|
||||
"import_discovery_subtitle": "Elige una billetera descubierta",
|
||||
"import_discovery_derivation": "Utilizar una ruta de derivación personalizada",
|
||||
@ -479,7 +477,8 @@
|
||||
"add_ln_wallet_first": "Primero debes agregar una billetera Lightning.",
|
||||
"identity_pubkey": "Identidad Pubkey",
|
||||
"xpub_title": "XPUB de la billetera",
|
||||
"manage_wallets_search_placeholder": "Buscar billeteras, notas"
|
||||
"manage_wallets_search_placeholder": "Buscar billeteras, notas",
|
||||
"more_info": "Más información"
|
||||
},
|
||||
"total_balance_view": {
|
||||
"view_in_bitcoin": "Ver en Bitcoin",
|
||||
@ -489,7 +488,7 @@
|
||||
"explanation": "Ve el saldo total de todas tus billeteras en la pantalla de descripción general."
|
||||
},
|
||||
"multisig": {
|
||||
"multisig_vault": "Bóveda",
|
||||
"multisig_vault": "Bóveda Multifirma",
|
||||
"default_label": "Bóveda Multifirma",
|
||||
"multisig_vault_explain": "La mejor seguridad para grandes cantidades",
|
||||
"provide_signature": "Proporcionar firma",
|
||||
|
12
loc/fa.json
12
loc/fa.json
@ -222,7 +222,7 @@
|
||||
"use_ssl": "از SSL استفاده کن",
|
||||
"electrum_saved": "تغییرات شما با موفقیت ذخیره شدند. ممکن است برای اعمال تغییرات به راهاندازی مجدد برنامه نیاز داشته باشید.",
|
||||
"set_electrum_server_as_default": "آیا {server} بهعنوان سرور پیشفرض الکترام تعیین شود؟",
|
||||
"set_lndhub_as_default": "آیا {url} بهعنوان سرور پیشفرض LNDHub تعیین شود؟",
|
||||
"set_lndhub_as_default": "آیا {url} بهعنوان سرور پیشفرض LNDhub تعیین شود؟",
|
||||
"electrum_settings_server": "سرور الکترام",
|
||||
"electrum_settings_explain": "برای استفاده از تنظیمات پیشفرض خالی بگذارید.",
|
||||
"electrum_status": "وضعیت",
|
||||
@ -245,7 +245,7 @@
|
||||
"encrypt_use_expl": "از {type} برای تأیید هویت شما قبل از انجام تراکنش، بازکردن قفل، صادرکردن، یا حذف کیف پول استفاده خواهد شد. از {type} برای بازکردن فضای ذخیرهسازی رمزگذاریشده استفاده نخواهد شد.",
|
||||
"general": "عمومی",
|
||||
"general_adv_mode": "حالت پیشرفته",
|
||||
"general_adv_mode_e": "درصورت فعالبودن، گزینههای پیشرفتهای مانند انواع مختلف کیف پول، امکان تعیین سرور LNDHub جهت اتصال، و آنتروپی سفارشی را در هنگام ایجاد کیف پول مشاهده خواهید کرد.",
|
||||
"general_adv_mode_e": "درصورت فعالبودن، گزینههای پیشرفتهای مانند انواع مختلف کیف پول، امکان تعیین سرور LNDhub جهت اتصال، و آنتروپی سفارشی را در هنگام ایجاد کیف پول مشاهده خواهید کرد.",
|
||||
"general_continuity": "پیوستگی",
|
||||
"general_continuity_e": "درصورت فعالبودن، میتوانید کیف پولهای انتخابشده و تراکنشها را با استفاده از سایر دستگاههای متصل به Apple iCloud خود مشاهده کنید.",
|
||||
"groundcontrol_explanation": "سرویس GroundControl یک سرور اعلانات متنباز و رایگان برای کیف پولهای بیتکوین است. شما میتوانید سرور GroundControl خود را نصب کرده و آدرس آن را اینجا قرار دهید تا به زیرساختهای BlueWallet متکی نباشید. برای استفاده از تنظیمات پیشفرض خالی بگذارید.",
|
||||
@ -254,10 +254,10 @@
|
||||
"last_updated": "آخرین بهروزرسانی",
|
||||
"language_isRTL": "راهاندازی مجدد BlueWallet جهت اعمال تغییرات چینش زبان ضروری است.",
|
||||
"license": "پروانه",
|
||||
"lightning_error_lndhub_uri": "یوآرآی LNDHub غیرمعتبر",
|
||||
"lightning_error_lndhub_uri": "یوآرآی LNDhub غیرمعتبر",
|
||||
"lightning_saved": "تغییرات شما با موفقیت ذخیره شدند.",
|
||||
"lightning_settings": "تنظیمات لایتنینگ",
|
||||
"lightning_settings_explain": "برای اتصال به گره LND خود، لطفاً LNDHub را نصب کرده و آدرس آن را اینجا در تنظیمات قرار دهید. توجه داشته باشید که کیف پولهای ایجادشده بعد از ذخیرهٔ تغییرات به LNDHub مشخصشده متصل خواهند شد.",
|
||||
"lightning_settings_explain": "برای اتصال به گره LND خود، لطفاً LNDhub را نصب کرده و آدرس آن را اینجا در تنظیمات قرار دهید. توجه داشته باشید که کیف پولهای ایجادشده بعد از ذخیرهٔ تغییرات به LNDhub مشخصشده متصل خواهند شد.",
|
||||
"network": "شبکه",
|
||||
"network_broadcast": "انتشار تراکنش",
|
||||
"network_electrum": "سرور الکترام",
|
||||
@ -348,8 +348,8 @@
|
||||
"add_import_wallet": "واردکردن کیف پول",
|
||||
"add_lightning": "لایتنینگ",
|
||||
"add_lightning_explain": "برای خرجکردن با تراکنشهای آنی",
|
||||
"add_lndhub": "به LNDHub خود متصل شوید",
|
||||
"add_lndhub_error": "آدرس گره ارائهشده گره LNDHub معتبری نیست.",
|
||||
"add_lndhub": "به LNDhub خود متصل شوید",
|
||||
"add_lndhub_error": "آدرس گره ارائهشده گره LNDhub معتبری نیست.",
|
||||
"add_lndhub_placeholder": "آدرس گره شما",
|
||||
"add_placeholder": "کیف پول اول من",
|
||||
"add_title": "افزودن کیف پول",
|
||||
|
@ -237,7 +237,7 @@
|
||||
"use_ssl": "Käytä SSL",
|
||||
"electrum_saved": "Muutoksesi on tallennettu onnistuneesti. Uudelleenkäynnistys voi olla tarpeen, jotta muutokset tulevat voimaan.",
|
||||
"set_electrum_server_as_default": "Asetetaanko {server} oletus Electrum-palvelimeksi?",
|
||||
"set_lndhub_as_default": "Asetetaanko {url} oletus LNDHub-palvelimeksi?",
|
||||
"set_lndhub_as_default": "Asetetaanko {url} oletus LNDhub-palvelimeksi?",
|
||||
"electrum_settings_server": "Electrum-palvelin",
|
||||
"electrum_settings_explain": "Jos haluat käyttää oletusta, jätä tämä tyhjäksi.",
|
||||
"electrum_status": "Tila",
|
||||
@ -260,7 +260,7 @@
|
||||
"encrypt_use_expl": "Ennen tapahtumia, avaamista vientiä tai lompakon poistoa identiteettis varmistetaan {type}:lla. {type} ei kuitenkaan voi käyttää salatun tallennustilan avaamiseen.",
|
||||
"general": "Yleinen",
|
||||
"general_adv_mode": "Lisäasetukset",
|
||||
"general_adv_mode_e": "Kun tämä asetus on käytössä, näet lisäasetukset, kuten erilaiset lompakkotyypit, kyvyn määrittää LNDHub-instanssi, johon haluat muodostaa yhteyden ja mukautetun entropian lompakon luomisen aikana.",
|
||||
"general_adv_mode_e": "Kun tämä asetus on käytössä, näet lisäasetukset, kuten erilaiset lompakkotyypit, kyvyn määrittää LNDhub-instanssi, johon haluat muodostaa yhteyden ja mukautetun entropian lompakon luomisen aikana.",
|
||||
"general_continuity": "Jatkuvuus",
|
||||
"general_continuity_e": "Kun tämä asetus on käytössä, voit tarkastella valittuja lompakoita ja siirtotapahtumia muilla Apple iCloud -laitteilla.",
|
||||
"groundcontrol_explanation": "GroundControl on ilmainen avoimen lähdekoodin push-ilmoituspalvelin bitcoin-lompakoille. Voit asentaa oman GroundControl-palvelimen ja laittaa sen URL-osoitteen tähän, jotta et luota BlueWallet-infrastruktuuriin. Jätä tyhjäksi käyttääksesi oletusasetusta",
|
||||
@ -269,10 +269,10 @@
|
||||
"last_updated": "Päivitetty viimeksi",
|
||||
"language_isRTL": "BlueWallet on käynnistettävä uudelleen, jotta kielisuuntaus tulee voimaan.",
|
||||
"license": "Lisenssi",
|
||||
"lightning_error_lndhub_uri": "Virheellinen LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Virheellinen LNDhub URI",
|
||||
"lightning_saved": "Muutoksesi on tallennettu onnistuneesti",
|
||||
"lightning_settings": "Salama-asetukset",
|
||||
"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.",
|
||||
"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",
|
||||
@ -368,8 +368,8 @@
|
||||
"add_import_wallet": "Tuo lompakko",
|
||||
"add_lightning": "Salama",
|
||||
"add_lightning_explain": "Käytetään välittömiin siirtotapahtumiin",
|
||||
"add_lndhub": "Yhdistä LNDHub:iisi",
|
||||
"add_lndhub_error": "Annettu solmun osoite ei ole kelvollinen LNDHub solmu",
|
||||
"add_lndhub": "Yhdistä LNDhub:iisi",
|
||||
"add_lndhub_error": "Annettu solmun osoite ei ole kelvollinen LNDhub solmu",
|
||||
"add_lndhub_placeholder": "solmusi osoite",
|
||||
"add_placeholder": "minun lompakkoni",
|
||||
"add_title": "lisää lompakko",
|
||||
|
@ -222,7 +222,7 @@
|
||||
"use_ssl": "Utiliser SSL",
|
||||
"electrum_saved": "Les changements ont bien été enregistrés. Un redémarrage sera peut-être nécessaires pour qu'ils prennent effet.",
|
||||
"set_electrum_server_as_default": "Mettre {server} come serveur electrum par défaut ?",
|
||||
"set_lndhub_as_default": "Mettre {url} comme serveur LNDHub par défaut?",
|
||||
"set_lndhub_as_default": "Mettre {url} comme serveur LNDhub par défaut?",
|
||||
"electrum_settings_server": "Serveur Electrum",
|
||||
"electrum_settings_explain": "Laisser blanc pour utiliser l'option par défaut",
|
||||
"electrum_status": "Statut",
|
||||
@ -245,7 +245,7 @@
|
||||
"encrypt_use_expl": "{type} sera utilisé pour confirmer votre identité avant d'effectuer une transaction, de déverrouiller, d'exporter ou de supprimer un portefeuille. {type} ne sera pas utilisé pour déverrouiller le stockage chiffré.",
|
||||
"general": "Général",
|
||||
"general_adv_mode": "Mode avancé",
|
||||
"general_adv_mode_e": "Si activé, vous aurez accès aux options avancées telles que la sélection parmi différents types de portefeuilles, la possibilité de spécifier une instance LNDHub de votre choix, et la création manuelle d'entropie lors de la création de portefeuille.",
|
||||
"general_adv_mode_e": "Si activé, vous aurez accès aux options avancées telles que la sélection parmi différents types de portefeuilles, la possibilité de spécifier une instance LNDhub de votre choix, et la création manuelle d'entropie lors de la création de portefeuille.",
|
||||
"general_continuity": "Continuité",
|
||||
"general_continuity_e": "Si activé, vous pourrez visualiser les portefeuilles sélectionnés ainsi que leurs transactions depuis vos autres appareils Apple iCloud connectés.",
|
||||
"groundcontrol_explanation": "GroundControl est un serveur de notifications push pour les portefeuilles Bitcoin gratuit et open source. Vous pouvez installer votre propre serveur GroundControl et insérer ici son URL pour ne pas reposer sur l'infrastructure de BlueWallet. Laissez vide pour conserver l'option par défaut.",
|
||||
@ -253,10 +253,10 @@
|
||||
"language": "Langue",
|
||||
"last_updated": "Dernière mise à jour",
|
||||
"language_isRTL": "Il est nécessaire de redémarrer BlueWallet pour que le changement de langue prenne effet.",
|
||||
"lightning_error_lndhub_uri": "LNDHub URI invalide",
|
||||
"lightning_error_lndhub_uri": "LNDhub URI invalide",
|
||||
"lightning_saved": "Les changements ont bien été enregistrés",
|
||||
"lightning_settings": "Paramètres Lightning",
|
||||
"lightning_settings_explain": "Pour connecter votre propre noeud LND, veuillez installer LNDHub et insérez l'URL ici dans les paramètres. Veillez noter que seul les porte-feuilles crées après avoir sauvegardé les changements se connecteront au LNDHub spécifié. ",
|
||||
"lightning_settings_explain": "Pour connecter votre propre noeud LND, veuillez installer LNDhub et insérez l'URL ici dans les paramètres. Veillez noter que seul les porte-feuilles crées après avoir sauvegardé les changements se connecteront au LNDhub spécifié. ",
|
||||
"network": "Réseau",
|
||||
"network_broadcast": "Diffuser une transaction",
|
||||
"network_electrum": "Serveur Electrum",
|
||||
@ -349,8 +349,8 @@
|
||||
"add_import_wallet": "Importer un portefeuille",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Pour payer avec des transactions instantanées",
|
||||
"add_lndhub": "Connexion à votre LNDHub",
|
||||
"add_lndhub_error": "L'adresse de nœud fournie est un nœud LNDHub non valide.",
|
||||
"add_lndhub": "Connexion à votre LNDhub",
|
||||
"add_lndhub_error": "L'adresse de nœud fournie est un nœud LNDhub non valide.",
|
||||
"add_lndhub_placeholder": "l'adresse de votre noeud",
|
||||
"add_placeholder": "mon premier portefeuille",
|
||||
"add_title": "ajouter un portefeuille",
|
||||
|
14
loc/he.json
14
loc/he.json
@ -94,7 +94,7 @@
|
||||
"ok": "אוקיי, רשמתי את זה",
|
||||
"ok_lnd": "אוקיי, שמרתי את זה.",
|
||||
"text": "אנא קחו רגע כדי לכתוב על דף נייר את מילות הגיבוי האלו. זה הגיבוי שלכם ואיתו תוכלו לשחזר את הארנק.",
|
||||
"text_lnd": "אנא קחו רגע כדי לשמור את אימות ה- LNDHub. זה הגיבוי איתו תוכלו לשחזר את הארנק על מכשיר אחר.",
|
||||
"text_lnd": "אנא קחו רגע כדי לשמור את אימות ה- LNDhub. זה הגיבוי איתו תוכלו לשחזר את הארנק על מכשיר אחר.",
|
||||
"title": "ארנקכם נוצר..."
|
||||
},
|
||||
"receive": {
|
||||
@ -243,7 +243,7 @@
|
||||
"use_ssl": "הפעלת SSL",
|
||||
"electrum_saved": "השינויים נשמרו בהצלחה. ייתכן ותדרש הפעלה מחדש כדי שהשינויים ייכנסו לתוקף.",
|
||||
"set_electrum_server_as_default": "הגדרת {server} כשרת אלקטרום ברירת מחדל?",
|
||||
"set_lndhub_as_default": "הגדרת {url} כשרת LNDHub ברירת מחדל?",
|
||||
"set_lndhub_as_default": "הגדרת {url} כשרת LNDhub ברירת מחדל?",
|
||||
"electrum_settings_server": "שרת אלקטרום",
|
||||
"electrum_settings_explain": "השאירו ריק כדי להשתמש בברירת מחדל",
|
||||
"electrum_status": "מצב",
|
||||
@ -268,7 +268,7 @@
|
||||
"biometrics_fail": "אם {type} לא מאופשר, או נכשל בפתיחה, תוכלו להשתמש בסיסמת המכשיר שלכם בתור חלופה.",
|
||||
"general": "כללי",
|
||||
"general_adv_mode": "מצב מתקדם",
|
||||
"general_adv_mode_e": "כאשר מופעל, אפשרויות מתקדמות יוצגו כגון סוגי ארנק שונים, אפשרות להתחבר לצומת LNDHub לפי רצונך ואנטרופיה מותאמת בתהליך יצירת ארנק.",
|
||||
"general_adv_mode_e": "כאשר מופעל, אפשרויות מתקדמות יוצגו כגון סוגי ארנק שונים, אפשרות להתחבר לצומת LNDhub לפי רצונך ואנטרופיה מותאמת בתהליך יצירת ארנק.",
|
||||
"general_continuity": "המשכיות",
|
||||
"general_continuity_e": "כאשר מופעל, תוכלו לצפות בארנקים ופעולות נבחרים, באמצעות מכשירי Apple iCloud מחוברים אחרים.",
|
||||
"groundcontrol_explanation": "שרת GroundControl הינו שרת התראות חופשי בקוד פתוח בשביל ארנקי ביטקוין. באפשרותך להתקין שרת GroundControl אישי ולהכניס את ה- URL שלו כאן, כדי לא להסתמך על התשתית של BlueWallet. השאירו ריק כדי להשתמש בברירת המחדל",
|
||||
@ -277,10 +277,10 @@
|
||||
"last_updated": "עודכן לאחרונה",
|
||||
"language_isRTL": "הפעלה מחדש של BlueWallet נדרשת לשינוי כיוון שפה.",
|
||||
"license": "רישיון",
|
||||
"lightning_error_lndhub_uri": " LNDHub URI לא תקני",
|
||||
"lightning_error_lndhub_uri": " LNDhub URI לא תקני",
|
||||
"lightning_saved": "השינויים נשמרו בהצלחה",
|
||||
"lightning_settings": "הגדרות ברק",
|
||||
"lightning_settings_explain": "כדי להתחבר לצומת LND אישי, אנא התקינו LNDHub והכניסו את כתובת ה- URL שלו כאן בהגדרות. שימו לב שרק ארנקים שנוצרו לאחר שמירת השינויים יתחברו לשרת LNDHub הספציפי.",
|
||||
"lightning_settings_explain": "כדי להתחבר לצומת LND אישי, אנא התקינו LNDhub והכניסו את כתובת ה- URL שלו כאן בהגדרות. שימו לב שרק ארנקים שנוצרו לאחר שמירת השינויים יתחברו לשרת LNDhub הספציפי.",
|
||||
"network": "רשת",
|
||||
"network_broadcast": "שידור פעולה",
|
||||
"network_electrum": "שרת אלקטרום",
|
||||
@ -377,8 +377,8 @@
|
||||
"add_import_wallet": "יבוא ארנק",
|
||||
"add_lightning": "ברק",
|
||||
"add_lightning_explain": "לבזבוז עם העברות מידיות",
|
||||
"add_lndhub": "התחברו ל- LNDHub אישי",
|
||||
"add_lndhub_error": "כתובת הצומת שסופקה אינה צומת LNDHub תקין.",
|
||||
"add_lndhub": "התחברו ל- LNDhub אישי",
|
||||
"add_lndhub_error": "כתובת הצומת שסופקה אינה צומת LNDhub תקין.",
|
||||
"add_lndhub_placeholder": "כתובת הצומת שלך",
|
||||
"add_placeholder": "הארנק הראשון שלי",
|
||||
"add_title": "הוספת ארנק",
|
||||
|
@ -84,7 +84,7 @@
|
||||
"ok": "Rendben, leírtam!",
|
||||
"ok_lnd": "OK, elmentettem.",
|
||||
"text": "Kérlek írd le az alábbi biztonsági szavakat egy papírlapra. \nEz egy biztonsági mentés, amellyel helyreállíthatod a tárcádat.",
|
||||
"text_lnd": "Készíts biztonsági másolatot erről az LNDHub hitelesítésről. Ezzel a biztonsági másolattal visszaállíthatod a tárcát más eszközön.",
|
||||
"text_lnd": "Készíts biztonsági másolatot erről az LNDhub hitelesítésről. Ezzel a biztonsági másolattal visszaállíthatod a tárcát más eszközön.",
|
||||
"title": "A tárcád elkészült..."
|
||||
},
|
||||
"receive": {
|
||||
@ -216,7 +216,7 @@
|
||||
"use_ssl": "SSL Használata",
|
||||
"electrum_saved": "A változtatás sikeresen elmentve. Az új beállítások aktiválásához űjraindításra lehet szükség.",
|
||||
"set_electrum_server_as_default": "{server} bállítása alapértelmezett Electrum szerverként?",
|
||||
"set_lndhub_as_default": "{url} bállítása alapértelmezett LNDHub szerverként?",
|
||||
"set_lndhub_as_default": "{url} bállítása alapértelmezett LNDhub szerverként?",
|
||||
"electrum_settings_server": "Electrum Szerver",
|
||||
"electrum_settings_explain": "Hagydja üresen ha az alapértelmezettet szerené használni.",
|
||||
"electrum_status": "Állapot",
|
||||
@ -239,7 +239,7 @@
|
||||
"encrypt_use_expl": "Igazolja személyazonosságát a {type} a tranzakció végrehajtása, a pénztárca feloldása, exportálása vagy törlése előtt. A {type} nem használható a titkosított tárolás feloldására.",
|
||||
"general": "Általános",
|
||||
"general_adv_mode": "Halandó mód bekapcsolása",
|
||||
"general_adv_mode_e": "Ha engedélyezve van, további opciók is elérhetőek, mint különböző tárca típusok, Lightning LNDHub beállítások és entrópia beállítások tárca készítésénél. ",
|
||||
"general_adv_mode_e": "Ha engedélyezve van, további opciók is elérhetőek, mint különböző tárca típusok, Lightning LNDhub beállítások és entrópia beállítások tárca készítésénél. ",
|
||||
"general_continuity": "Folytonosság",
|
||||
"general_continuity_e": "Ha engedélyezve van, láthatod a kiválasztott tárcákat és tranzakciókat más, csatlakoztatott Apple iCloud eszközökön.",
|
||||
"groundcontrol_explanation": "A GroundControl egy ingyenes, nyílt forráskodú, push üzenetküldő szerver Bitcoin tárcákhoz. Telepítheted a saját GroundControl szerveredet webcímed megadásával, ami függetlet lesz a BlueWallet infrastuktúrától. Hagyd üresen alapértelmezésben.",
|
||||
@ -247,7 +247,7 @@
|
||||
"language": "Nyelv",
|
||||
"last_updated": "Utoljára Frissítve",
|
||||
"language_isRTL": "Az új nyelv használatához újra kell indítanod a BlueWallet alkalmazást.",
|
||||
"lightning_error_lndhub_uri": "Nem megfelelő LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Nem megfelelő LNDhub URI",
|
||||
"lightning_saved": "A változtatások sikeresen elmentve",
|
||||
"lightning_settings": "Lightning Beállítások",
|
||||
"network": "Hálózat",
|
||||
@ -341,8 +341,8 @@
|
||||
"add_import_wallet": "Tárca importálása",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Költés azonnali tranzakcióval",
|
||||
"add_lndhub": "Kapcsolódj az LNDHub-hoz",
|
||||
"add_lndhub_error": "A megadott LNDHub node cím nem megfelelő.",
|
||||
"add_lndhub": "Kapcsolódj az LNDhub-hoz",
|
||||
"add_lndhub_error": "A megadott LNDhub node cím nem megfelelő.",
|
||||
"add_lndhub_placeholder": "a te node címed",
|
||||
"add_placeholder": "az első tárcám",
|
||||
"add_title": "új tárca",
|
||||
|
@ -85,7 +85,7 @@
|
||||
"ask": "Sudahkah Anda menyimpan frase cadangan dompet Anda? Frase cadangan ini diperlukan untuk mengakses dana Anda jika Anda kehilangan perangkat ini. Tanpa frase cadangan, dana Anda akan hilang secara permanen.",
|
||||
"ok_lnd": "Oke, saya sudah menyimpannya.",
|
||||
"text": "Silakan tulis frasa mnemonik ini di atas kertas.\nIni adalah cadangan Anda dan Anda bisa menggunakannya untuk memulihkan dompet Anda.",
|
||||
"text_lnd": "Harap luangkan waktu sejenak untuk menyimpan otentikasi LNDHub ini. Ini cadangan Anda yang dapat Anda gunakan untuk memulihkan dompet di perangkat lain.",
|
||||
"text_lnd": "Harap luangkan waktu sejenak untuk menyimpan otentikasi LNDhub ini. Ini cadangan Anda yang dapat Anda gunakan untuk memulihkan dompet di perangkat lain.",
|
||||
"title": "Dompet Anda telah dibuat ..."
|
||||
},
|
||||
"receive": {
|
||||
@ -234,7 +234,7 @@
|
||||
"header": "setting",
|
||||
"language": "Bahasa",
|
||||
"last_updated": "Terakhir Diperbaharui",
|
||||
"lightning_error_lndhub_uri": "LNDHub URI tidak valid",
|
||||
"lightning_error_lndhub_uri": "LNDhub URI tidak valid",
|
||||
"lightning_saved": "Perubahan Anda telah berhasil disimpan.",
|
||||
"lightning_settings": "Pengaturan Lightning",
|
||||
"network": "Jaringan",
|
||||
@ -295,7 +295,7 @@
|
||||
"add_create": "Buat",
|
||||
"add_entropy": "Entropi",
|
||||
"add_import_wallet": "Impor dompet",
|
||||
"add_lndhub": "Hubungan ke LNDHub Anda",
|
||||
"add_lndhub": "Hubungan ke LNDhub Anda",
|
||||
"add_placeholder": "dompet pertama saya",
|
||||
"add_title": "tambah dompet",
|
||||
"add_wallet_name": "nama dompet",
|
||||
|
12
loc/it.json
12
loc/it.json
@ -219,7 +219,7 @@
|
||||
"use_ssl": "Usa SSL",
|
||||
"electrum_saved": "Le tue modifiche sono state salvate con successo. Può essere necessario riavviare BlueWallet affinché le modifiche abbiano effetto.",
|
||||
"set_electrum_server_as_default": "Impostare {server} come server Electrum predefinito?",
|
||||
"set_lndhub_as_default": "Impostare {url} come server LNDHub predefinito?",
|
||||
"set_lndhub_as_default": "Impostare {url} come server LNDhub predefinito?",
|
||||
"electrum_settings_server": "Server Electrum",
|
||||
"electrum_settings_explain": "Lascia vuoto per usare il valore predefinito.",
|
||||
"electrum_status": "Stato",
|
||||
@ -242,7 +242,7 @@
|
||||
"encrypt_use_expl": "{type} verrà usato per confermare la tua identità prima di effettuare una transazione, sbloccare, esportare, o eliminare un wallet. {type} non sarà usato per sbloccare archivi cifrati.",
|
||||
"general": "Generali",
|
||||
"general_adv_mode": "Enable advanced mode",
|
||||
"general_adv_mode_e": "Una volta abilitato, vedrai opzioni avanzate come diversi tipi di portafoglio, la possibilità di specificare l'istanza di LNDHub a cui vuoi connetterti, e l'entropia personalizzata durante la creazione del portafoglio.",
|
||||
"general_adv_mode_e": "Una volta abilitato, vedrai opzioni avanzate come diversi tipi di portafoglio, la possibilità di specificare l'istanza di LNDhub a cui vuoi connetterti, e l'entropia personalizzata durante la creazione del portafoglio.",
|
||||
"general_continuity": "Continuity",
|
||||
"general_continuity_e": "Una volta abilitato, sarai in grado di visualizzare i portafogli selezionati e le transazioni, utilizzando i tuoi altri dispositivi collegati ad Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl è un server di notifiche push gratuito e open-source per i portafogli Bitcoin. Puoi installare il tuo server GroundControl e mettere il suo URL qui per non contare sull'infrastruttura di BlueWallet. Lascia il campo vuoto per usare il server predefinito di GroundControl.",
|
||||
@ -250,10 +250,10 @@
|
||||
"language": "Lingua",
|
||||
"last_updated": "Ultimo aggiornamento",
|
||||
"language_isRTL": "Il riavvio di BlueWallet è necessario affinché l'orientamento della lingua abbia effetto.",
|
||||
"lightning_error_lndhub_uri": "LNDHub URI non valido",
|
||||
"lightning_error_lndhub_uri": "LNDhub URI non valido",
|
||||
"lightning_saved": "I cambiamenti sono stati registrati con successo.",
|
||||
"lightning_settings": "Impostazioni Lightning",
|
||||
"lightning_settings_explain": "Per connetterti al tuo nodo LND, installa LNDHub e inserisci l'URL qui nelle impostazioni. Tieni presente che solo i portafogli che sono stati creati dopo aver salvato le modifiche saranno connessi all'LNDHub specificato.",
|
||||
"lightning_settings_explain": "Per connetterti al tuo nodo LND, installa LNDhub e inserisci l'URL qui nelle impostazioni. Tieni presente che solo i portafogli che sono stati creati dopo aver salvato le modifiche saranno connessi all'LNDhub specificato.",
|
||||
"network": "Rete",
|
||||
"network_broadcast": "Trasmetti transazione",
|
||||
"network_electrum": "Server Electrum",
|
||||
@ -343,8 +343,8 @@
|
||||
"add_import_wallet": "Importa Portafoglio",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Per invio con transazioni istantanee",
|
||||
"add_lndhub": "Connetti al tuo LNDHub",
|
||||
"add_lndhub_error": "L'indirizzo fornito è un nodo LNDHub invalido.",
|
||||
"add_lndhub": "Connetti al tuo LNDhub",
|
||||
"add_lndhub_error": "L'indirizzo fornito è un nodo LNDhub invalido.",
|
||||
"add_lndhub_placeholder": "L'indirizzo del tuo nodo",
|
||||
"add_placeholder": "Il mio primo wallet",
|
||||
"add_title": "Aggiungi Portafoglio",
|
||||
|
@ -247,7 +247,7 @@
|
||||
"use_ssl": "SSLを使用",
|
||||
"electrum_saved": "変更は正常に保存されました。変更の適用には、リスタートが必要な場合があります。",
|
||||
"set_electrum_server_as_default": "{server} をデフォルトの Electrum サーバーに設定しますか?",
|
||||
"set_lndhub_as_default": "{url} をデフォルトの LNDHub サーバーに設定しますか?",
|
||||
"set_lndhub_as_default": "{url} をデフォルトの LNDhub サーバーに設定しますか?",
|
||||
"electrum_settings_server": "Electrum サーバー",
|
||||
"electrum_settings_explain": "空欄の場合デフォルトを使用します。",
|
||||
"electrum_status": "ステータス",
|
||||
@ -272,7 +272,7 @@
|
||||
"biometrics_fail": "もし {type} が有効でない、または解除に失敗した場合、デバイスのパスコードを代わりに使うことができます。",
|
||||
"general": "一般情報",
|
||||
"general_adv_mode": "上級者モード",
|
||||
"general_adv_mode_e": "この機能を有効にすると、異なるウォレットタイプ、接続先の LNDHub インスタンスの指定、ウォレット作成時のカスタムエントロピーなどの高度なオプションが表示されます。",
|
||||
"general_adv_mode_e": "この機能を有効にすると、異なるウォレットタイプ、接続先の LNDhub インスタンスの指定、ウォレット作成時のカスタムエントロピーなどの高度なオプションが表示されます。",
|
||||
"general_continuity": "継続性",
|
||||
"general_continuity_e": "この機能を有効にすると、Apple iCloudに接続している他のデバイスを使用して、選択したウォレットやトランザクションを表示できるようになります。",
|
||||
"groundcontrol_explanation": "GroundControlはビットコインウォレットのための無料のオープンソースのプッシュ通知サーバーです。独自のGroundControlサーバーをインストールし、BlueWalletのインフラに依存しないようにURLをここに入力することができます。デフォルトを使用するには空白のままにしてください。",
|
||||
@ -284,7 +284,7 @@
|
||||
"lightning_error_lndhub_uri": "無効なLndHub URIです",
|
||||
"lightning_saved": "変更は正常に保存されました",
|
||||
"lightning_settings": "Lightning 設定",
|
||||
"lightning_settings_explain": "他の LND ノードへ接続するには LNDHub をインストール後、URL を入力してください。指定した LNDHub へ接続するのは変更保存後に作成されたウォレットのみですので注意してください。",
|
||||
"lightning_settings_explain": "他の LND ノードへ接続するには LNDhub をインストール後、URL を入力してください。指定した LNDhub へ接続するのは変更保存後に作成されたウォレットのみですので注意してください。",
|
||||
"network": "ネットワーク",
|
||||
"network_broadcast": "ブロードキャストトランザクション",
|
||||
"network_electrum": "Electrum サーバー",
|
||||
|
@ -204,7 +204,7 @@
|
||||
"use_ssl": "SSL 사용",
|
||||
"electrum_saved": "변경된 내용이 성공적으로 저장되었습니다. 변경사항이 적용되기 위해선 블루월렛의 재시동이 필요할 수도 있습니다.",
|
||||
"set_electrum_server_as_default": "{server}를 기본 일렉트럼 서버로 설정하시겠습니까?",
|
||||
"set_lndhub_as_default": "{url}을 기본 LNDHub 서버로 설정하시겠습니까?",
|
||||
"set_lndhub_as_default": "{url}을 기본 LNDhub 서버로 설정하시겠습니까?",
|
||||
"electrum_settings_server": "일렉트럼 서버",
|
||||
"electrum_settings_explain": "기본값을 사용하려면 공란으로 남겨주세요",
|
||||
"electrum_status": "상태",
|
||||
@ -227,7 +227,7 @@
|
||||
"encrypt_use_expl": "거래를 하거나 지갑을 해제, 내보내기, 또는 지우기 전에 신분확인을 위해 {type}이 사용될 것입니다. 암호화된 저장장치를 해제하는되는 사용되지 않을 것 입니다.",
|
||||
"general": "일반",
|
||||
"general_adv_mode": "고급 모드",
|
||||
"general_adv_mode_e": "사용가능으로 설정시, 다른 지갑 형태, 연결하고픈 LNDHub 인스턴스를 지정할 수 있는 능력, 그리고 지갑생성시 맞춤형 엔트로피등과 같은 고급 선택사항을 볼 수 있습니다.",
|
||||
"general_adv_mode_e": "사용가능으로 설정시, 다른 지갑 형태, 연결하고픈 LNDhub 인스턴스를 지정할 수 있는 능력, 그리고 지갑생성시 맞춤형 엔트로피등과 같은 고급 선택사항을 볼 수 있습니다.",
|
||||
"general_continuity": "연속성",
|
||||
"general_continuity_e": "사용가능으로 설정시, 애플 아이클라우드에 연결된 다른 기기을 사용하여 선택된 지갑들과 거래내역을 보실수 있습니다.",
|
||||
"groundcontrol_explanation": "그라운드콘트롤은 비트코인 지갑을 위한 무상, 원본공개형 알림장치 서버 입니다.",
|
||||
@ -325,8 +325,8 @@
|
||||
"add_import_wallet": "지갑 들여오기",
|
||||
"add_lightning": "라이트닝",
|
||||
"add_lightning_explain": "즉시 거래를 통한 지출",
|
||||
"add_lndhub": "사용자 LNDHub 연결",
|
||||
"add_lndhub_error": "제공된 노드 주소는 유효한 LNDHub 노드가 아닙니다.",
|
||||
"add_lndhub": "사용자 LNDhub 연결",
|
||||
"add_lndhub_error": "제공된 노드 주소는 유효한 LNDhub 노드가 아닙니다.",
|
||||
"add_lndhub_placeholder": "사용자 노드 주소",
|
||||
"add_placeholder": "내 첫 지갑",
|
||||
"add_title": "지갑 추가",
|
||||
|
@ -99,7 +99,7 @@
|
||||
"electrum_offline_mode": "هالت آفلاین",
|
||||
"use_ssl": "SSL نه وه کار بییر",
|
||||
"set_electrum_server_as_default": "{server} سی سرور پؽش فرز الکترام ساموݩ بۊئه؟",
|
||||
"set_lndhub_as_default": "{server} سی سرور پؽش فرز LNDHub ساموݩ بۊئه؟",
|
||||
"set_lndhub_as_default": "{server} سی سرور پؽش فرز LNDhub ساموݩ بۊئه؟",
|
||||
"electrum_settings_server": "سرور الکترام",
|
||||
"electrum_status": "وزیت",
|
||||
"electrum_clear_alert_title": "ویرگار پاک بۊئه؟",
|
||||
|
10
loc/ms.json
10
loc/ms.json
@ -190,7 +190,7 @@
|
||||
"use_ssl": "Guna SSL",
|
||||
"electrum_saved": "Pengubahan oleh anda berjaya disimpan. Pemulaan semula BlueWallet mungkin diperlukan untuk perubahan itu berlaku. ",
|
||||
"set_electrum_server_as_default": "Tetapkan {server} sebagai pelayan lalai Electrum?",
|
||||
"set_lndhub_as_default": "Tetapkan {url} sebagai pelayan lalai LNDHub?",
|
||||
"set_lndhub_as_default": "Tetapkan {url} sebagai pelayan lalai LNDhub?",
|
||||
"electrum_settings_server": "Pelayan Electrum",
|
||||
"electrum_settings_explain": "Kosongkan untuk mengguna nilai lalai.",
|
||||
"electrum_status": "Keadaan",
|
||||
@ -213,14 +213,14 @@
|
||||
"encrypt_use_expl": "{type} akan digunakan untuk memperakukan keperibadian anda sebelum melakukan urus niaga, penyahkuncian, pemindahan keluar, atau pemadaman sesuatu dompet. {type} tidak akan digunakan untuk menyahkunci simpanan sulit.",
|
||||
"general": "Umum",
|
||||
"general_adv_mode": "Mod Lanjut",
|
||||
"general_adv_mode_e": "Apabila dibolehkan, anda akan nampak pilihan lanjut seperti jenis dompet yang lain, kebolehan untuk memperincikan LNDHub yang anda mahu hubungkan, dan entropi tersendiri ketika penciptaan dompet.",
|
||||
"general_adv_mode_e": "Apabila dibolehkan, anda akan nampak pilihan lanjut seperti jenis dompet yang lain, kebolehan untuk memperincikan LNDhub yang anda mahu hubungkan, dan entropi tersendiri ketika penciptaan dompet.",
|
||||
"general_continuity": "Kesinambungan",
|
||||
"general_continuity_e": "Apabila dibolehkan, anda akan dapat melihat dompet terpilih dan urus niaga, menggunakan peranti lain yang terhubung dengan iCloud Apple.",
|
||||
"groundcontrol_explanation": "GroundControl ialah satu pelayan pemberitahuan percuma dan sumber terbuka untuk dompet Bitcoin. Anda boleh memasang pelayan GroundControl anda sendiri dan letakkan URL GrounControl di sini untuk tidak bergantung pada prasarana BlueWallet. Kosongkan untuk menggunakan pelayan lalai GroundControl.",
|
||||
"header": "Tetapan",
|
||||
"language": "Bahasa",
|
||||
"language_isRTL": "Pemulaan semula BlueWallet diperlukan untuk pengalihan bahasa berlaku.",
|
||||
"lightning_error_lndhub_uri": "URL LNDHub tidak sah",
|
||||
"lightning_error_lndhub_uri": "URL LNDhub tidak sah",
|
||||
"lightning_saved": "Pengubahan oleh anda berjaya disimpan.",
|
||||
"lightning_settings": "Tetapan Lightning",
|
||||
"network": "Rangkaian",
|
||||
@ -302,8 +302,8 @@
|
||||
"add_import_wallet": "Pindah masuk dompet",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Untuk perbelanjaan dengan urusan sepantas kilat",
|
||||
"add_lndhub": "Hubungkan ke LNDHub anda",
|
||||
"add_lndhub_error": "Alamat nod diberi ialah nod LNDHub yang tidak sah.",
|
||||
"add_lndhub": "Hubungkan ke LNDhub anda",
|
||||
"add_lndhub_error": "Alamat nod diberi ialah nod LNDhub yang tidak sah.",
|
||||
"add_lndhub_placeholder": "Alamat Nod Anda",
|
||||
"add_title": "Tambah Dompet",
|
||||
"add_wallet_name": "Nama",
|
||||
|
@ -206,7 +206,7 @@
|
||||
"use_ssl": "Bruk SSL",
|
||||
"electrum_saved": "Endringene dine er lagret. Det kan være nødvendig å starte BlueWallet på nytt for at endringene skal tre i kraft.",
|
||||
"set_electrum_server_as_default": "Vil du angi {server} som standard Electrum-server?",
|
||||
"set_lndhub_as_default": "Vil du angi {url} som standard LNDHub-server?",
|
||||
"set_lndhub_as_default": "Vil du angi {url} som standard LNDhub-server?",
|
||||
"electrum_settings_server": "Electrum Server",
|
||||
"electrum_settings_explain": "La feltet stå tomt for å bruke standard.",
|
||||
"electrum_status": "Status",
|
||||
@ -229,7 +229,7 @@
|
||||
"encrypt_use_expl": "{type} vil bli brukt til å bekrefte identiteten din før du foretar en transaksjon, låser opp, eksporterer eller sletter en lommebok. {type} vil ikke bli brukt til å låse opp kryptert lagring.",
|
||||
"general": "Generelt",
|
||||
"general_adv_mode": "Avansert Modus",
|
||||
"general_adv_mode_e": "Når den er aktivert, vil du se avanserte alternativer som forskjellige lommeboktyper, muligheten til å spesifisere hvilken LNDHub-instance du ønsker å koble til, og tilpasset entropi under oppretting av lommebok.",
|
||||
"general_adv_mode_e": "Når den er aktivert, vil du se avanserte alternativer som forskjellige lommeboktyper, muligheten til å spesifisere hvilken LNDhub-instance du ønsker å koble til, og tilpasset entropi under oppretting av lommebok.",
|
||||
"general_continuity": "Kontinuitet",
|
||||
"general_continuity_e": "Når den er aktivert, vil du kunne se utvalgte lommebøker og transaksjoner ved å bruke de andre Apple iCloud-tilkoblede enhetene dine.",
|
||||
"groundcontrol_explanation": "GroundControl er en gratis, åpen kildekode push-varslingsserver for Bitcoin-lommebøker. Du kan installere din egen GroundControl-server og legge dens URL her for ikke å stole på BlueWallet sin infrastruktur. La feltet stå tomt for å bruke GroundControl sin standardserver.",
|
||||
@ -237,7 +237,7 @@
|
||||
"language": "Språk",
|
||||
"last_updated": "Sist Oppdatert",
|
||||
"language_isRTL": "Å starte BlueWallet på nytt er nødvendig for at språkorienteringen skal tre i kraft.",
|
||||
"lightning_error_lndhub_uri": "Ugyldig LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Ugyldig LNDhub URI",
|
||||
"lightning_saved": "Endringene dine er lagret.",
|
||||
"lightning_settings": "Lightning Innstillinger",
|
||||
"network": "Nettverk",
|
||||
@ -328,8 +328,8 @@
|
||||
"add_import_wallet": "Importer lommebok",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "For betaling med umiddelbare transaksjoner",
|
||||
"add_lndhub": "Koble til din LNDHub",
|
||||
"add_lndhub_error": "Den oppgitte nodeadressen er en ugyldig LNDHub-node.",
|
||||
"add_lndhub": "Koble til din LNDhub",
|
||||
"add_lndhub_error": "Den oppgitte nodeadressen er en ugyldig LNDhub-node.",
|
||||
"add_lndhub_placeholder": "Din nodeadresse",
|
||||
"add_placeholder": "min første lommebok",
|
||||
"add_title": "Legg til lommebok",
|
||||
|
@ -213,7 +213,7 @@
|
||||
"use_ssl": "Gebruik SSL",
|
||||
"electrum_saved": "Uw veranderingen zijn succesvol opgeslagen. Opnieuw opstarten kan nodig zijn om de wijzigingen door te voeren.",
|
||||
"set_electrum_server_as_default": "{server} instellen als de standaard electrum server?",
|
||||
"set_lndhub_as_default": "{url} instellen als de standaard LNDHub server?",
|
||||
"set_lndhub_as_default": "{url} instellen als de standaard LNDhub server?",
|
||||
"electrum_settings_server": "Electrum Server",
|
||||
"electrum_settings_explain": "Laat leeg om de standaard te gebuiken.",
|
||||
"electrum_status": "Status",
|
||||
@ -236,7 +236,7 @@
|
||||
"encrypt_use_expl": "{type} wordt gebruikt om jouw identiteit te bevestigen voordat je een transactie uitvoert, een wallet ontgrendelt, exporteert of verwijdert. {type} wordt niet gebruikt om versleutelde opslag te ontgrendelen.",
|
||||
"general": "Algemeen",
|
||||
"general_adv_mode": "Geavanceerde modus",
|
||||
"general_adv_mode_e": "Indien ingeschakeld ziet u geavanceerde opties zoals verschillende wallettypes, de mogelijkheid om de LNDHub-instantie te specificeren waarmee u verbinding wilt maken en aangepaste entropie tijdens het aanmaken van een wallet.",
|
||||
"general_adv_mode_e": "Indien ingeschakeld ziet u geavanceerde opties zoals verschillende wallettypes, de mogelijkheid om de LNDhub-instantie te specificeren waarmee u verbinding wilt maken en aangepaste entropie tijdens het aanmaken van een wallet.",
|
||||
"general_continuity": "Continuïteit",
|
||||
"general_continuity_e": "Indien ingeschakeld, kunt u geselecteerde wallets en transacties bekijken met uw andere Apple iCloud-apparaten.",
|
||||
"groundcontrol_explanation": "GroundControl is een gratis opensource-server voor pushmeldingen voor bitcoin-wallets. U kunt uw eigen GroundControl-server installeren en de URL hier plaatsen om niet te vertrouwen op de infrastructuur van BlueWallet. Laat leeg om standaard te gebruiken",
|
||||
@ -244,7 +244,7 @@
|
||||
"language": "Taal",
|
||||
"last_updated": "Voor het laatst ge-update op",
|
||||
"language_isRTL": "Herstarten van BlueWallet is vereist voordat de taal oriëntatie van kracht wordt.",
|
||||
"lightning_error_lndhub_uri": "Ongeldige LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Ongeldige LNDhub URI",
|
||||
"lightning_saved": "Uw wijzigingen zijn succesvol opgeslagen",
|
||||
"lightning_settings": "Lightning-instellingen",
|
||||
"network": "Netwerk",
|
||||
@ -331,8 +331,8 @@
|
||||
"add_import_wallet": "Wallet importeren",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Voor uitgaven met directe transacties",
|
||||
"add_lndhub": "Verbind met uw LNDHub",
|
||||
"add_lndhub_error": "399\nHet ingevoerde node adres is een ongeldige LNDHub node.",
|
||||
"add_lndhub": "Verbind met uw LNDhub",
|
||||
"add_lndhub_error": "399\nHet ingevoerde node adres is een ongeldige LNDhub node.",
|
||||
"add_lndhub_placeholder": "Uw node adres",
|
||||
"add_placeholder": "Mijn eerste wallet",
|
||||
"add_title": "Wallet toevoegen",
|
||||
|
10
loc/pl.json
10
loc/pl.json
@ -244,7 +244,7 @@
|
||||
"use_ssl": "Użyj SSL",
|
||||
"electrum_saved": "Zmiany zostały zachowane pomyślnie. Żeby je zobaczyć zrestartuj aplikację.",
|
||||
"set_electrum_server_as_default": "Ustawić {server} jako domyślny serwer Electrum?",
|
||||
"set_lndhub_as_default": "Ustawić {url} jako domyślny serwer LNDHub?",
|
||||
"set_lndhub_as_default": "Ustawić {url} jako domyślny serwer LNDhub?",
|
||||
"electrum_settings_server": "Serwer Electrum",
|
||||
"electrum_settings_explain": "Pozostaw puste aby użyć wartości domyślnej",
|
||||
"electrum_status": "Status",
|
||||
@ -273,7 +273,7 @@
|
||||
"biometrics_fail": "Jeśli {type} nie jest włączony lub nie udaje się odblokować, możesz alternatywnie użyć kodu dostępu swojego urządzenia.",
|
||||
"general": "Ogólne",
|
||||
"general_adv_mode": "Tryb zaawansowany",
|
||||
"general_adv_mode_e": "Gdy włączone, zobaczysz zaawansowane ustawienia takie jak np. różne typy portfeli, zdolność do określenia instancji LNDHub, z którą chcesz się połączyć oraz niestandardowej entropii w trakcie tworzenia portfela.",
|
||||
"general_adv_mode_e": "Gdy włączone, zobaczysz zaawansowane ustawienia takie jak np. różne typy portfeli, zdolność do określenia instancji LNDhub, z którą chcesz się połączyć oraz niestandardowej entropii w trakcie tworzenia portfela.",
|
||||
"general_continuity": "Funkcja Continuity",
|
||||
"general_continuity_e": "Gdy włączone, będziesz miał podgląd do wybranych portfeli i transakcji przy użyciu swoich urządzeń zalogowanych do Apple iCloud. ",
|
||||
"groundcontrol_explanation": "GroundControl jest darmowym, open source'owym serwerem powiadomień push dla portfeli bitcoin. Możesz zainstalować swój własny serwer GroundControl i podać jego URL tutaj aby nie polegać na infrastrukturze BlueWallet. Zostaw puste by użyć domyślnej wartości.",
|
||||
@ -282,10 +282,10 @@
|
||||
"last_updated": "Ostatnia aktualizacja",
|
||||
"language_isRTL": "Aby ustawienia dotyczące kierunku pisma wybranego języka zaczęły obowiązywać, BlueWallet musi być zrestartowany.",
|
||||
"license": "Licencja",
|
||||
"lightning_error_lndhub_uri": "Nieprawidłowy adres LNDHub",
|
||||
"lightning_error_lndhub_uri": "Nieprawidłowy adres LNDhub",
|
||||
"lightning_saved": "Wprowadzone przez ciebie zmiany zostały pomyślnie zachowane.",
|
||||
"lightning_settings": "Ustawienia Lightning",
|
||||
"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.",
|
||||
"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",
|
||||
@ -390,7 +390,7 @@
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "W celu wydawania za pomocą natychmiastowych transakcji",
|
||||
"add_lndhub": "Podłącz do własnego LNDHuba",
|
||||
"add_lndhub_error": "Podany adres nie jest prawidłowym węzłem LNDHub.",
|
||||
"add_lndhub_error": "Podany adres nie jest prawidłowym węzłem LNDhub.",
|
||||
"add_lndhub_placeholder": "Adres twojego węzła",
|
||||
"add_placeholder": "mój pierwszy portfel",
|
||||
"add_title": "Dodaj portfel",
|
||||
|
@ -245,7 +245,7 @@
|
||||
"use_ssl": "Usar SSL",
|
||||
"electrum_saved": "Suas alterações foram salvas com sucesso. Pode ser necessário reiniciar para que as alterações tenham efeito.",
|
||||
"set_electrum_server_as_default": "Definir {server} como servidor Electrum padrão?",
|
||||
"set_lndhub_as_default": "Definir {server} como servidor LNDHub padrão?",
|
||||
"set_lndhub_as_default": "Definir {server} como servidor LNDhub padrão?",
|
||||
"electrum_settings_server": "Servidor Electrum",
|
||||
"electrum_settings_explain": "Deixe em branco para usar o padrão.",
|
||||
"electrum_status": "Status",
|
||||
@ -270,7 +270,7 @@
|
||||
"biometrics_fail": "Se {type} não estiver habilitado ou falhar ao desbloquear, você pode usar o código de acesso do seu dispositivo como alternativa.",
|
||||
"general": "Geral",
|
||||
"general_adv_mode": "Modo Avançado",
|
||||
"general_adv_mode_e": "Quando ativado, você verá opções avançadas, como diferentes tipos de carteira, a capacidade de especificar a instância do LNDHub à qual deseja se conectar e a entropia personalizada durante a criação da carteira.",
|
||||
"general_adv_mode_e": "Quando ativado, você verá opções avançadas, como diferentes tipos de carteira, a capacidade de especificar a instância do LNDhub à qual deseja se conectar e a entropia personalizada durante a criação da carteira.",
|
||||
"general_continuity": "Continuidade",
|
||||
"general_continuity_e": "Quando ativado, você poderá visualizar carteiras selecionadas e transações, usando seus outros dispositivos conectados ao Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl é um servidor de notificações push de código aberto gratuito para carteiras Bitcoin. Você pode instalar seu próprio servidor GroundControl e colocar sua URL aqui para não depender da infraestrutura da BlueWallet. Deixe em branco para usar o padrão",
|
||||
@ -279,10 +279,10 @@
|
||||
"last_updated": "Última Atualização",
|
||||
"language_isRTL": "É necessário reiniciar a BlueWallet para que a nova orientação linguística seja ativada.",
|
||||
"license": "Licença",
|
||||
"lightning_error_lndhub_uri": "URI LNDHub inválida",
|
||||
"lightning_error_lndhub_uri": "URI LNDhub inválida",
|
||||
"lightning_saved": "Suas alterações foram salvas com sucesso.",
|
||||
"lightning_settings": "Configurações Lightning",
|
||||
"lightning_settings_explain": "Para se conectar ao seu próprio node LND, instale LNDHub e copie seu URL para cá. Somente carteiras criadas após salvar as alterações se conectarão com a instância LNDHub especificada.",
|
||||
"lightning_settings_explain": "Para se conectar ao seu próprio node LND, instale LNDhub e copie seu URL para cá. Somente carteiras criadas após salvar as alterações se conectarão com a instância LNDhub especificada.",
|
||||
"network": "Rede",
|
||||
"network_broadcast": "Transmitir Transação",
|
||||
"network_electrum": "Servidor Electrum",
|
||||
@ -379,8 +379,8 @@
|
||||
"add_import_wallet": "Importar carteira",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Para gastar com transações instantâneas",
|
||||
"add_lndhub": "Conectar ao seu LNDHub",
|
||||
"add_lndhub_error": "O endereço do nó fornecido é um nó LNDHub inválido",
|
||||
"add_lndhub": "Conectar ao seu LNDhub",
|
||||
"add_lndhub_error": "O endereço do nó fornecido é um nó LNDhub inválido",
|
||||
"add_lndhub_placeholder": "Seu endereço de nó",
|
||||
"add_placeholder": "minha primeira carteira",
|
||||
"add_title": "Adicionar Carteira",
|
||||
|
@ -186,7 +186,7 @@
|
||||
"use_ssl": "Usar SSL",
|
||||
"electrum_saved": "As alterações foram guardadas com sucesso. Pode ser necessário reiniciar para que as alterações tenham efeito.",
|
||||
"set_electrum_server_as_default": "Definir {server} como servidor Electrum predefinido?",
|
||||
"set_lndhub_as_default": "Definir {url} como servidor LNDHub predefinido?",
|
||||
"set_lndhub_as_default": "Definir {url} como servidor LNDhub predefinido?",
|
||||
"electrum_settings_server": "Electrum server",
|
||||
"electrum_settings_explain": "Deixe em branco para usar a predefinição.",
|
||||
"electrum_status": "Estado",
|
||||
@ -207,7 +207,7 @@
|
||||
"encrypt_use": "Usar {type}",
|
||||
"general": "Geral",
|
||||
"general_adv_mode": "Ligar modo avançado",
|
||||
"general_adv_mode_e": "Quando activado, verá opções avançadas, como diferentes tipos de carteira, a capacidade de especificar a instância do LNDHub à qual se deseja conectar e a entropia personalizada durante a criação da carteira.",
|
||||
"general_adv_mode_e": "Quando activado, verá opções avançadas, como diferentes tipos de carteira, a capacidade de especificar a instância do LNDhub à qual se deseja conectar e a entropia personalizada durante a criação da carteira.",
|
||||
"general_continuity": "Continuidade",
|
||||
"general_continuity_e": "Quando activado, poderá visualizar carteiras seleccionadas e transacções, usando os seus outros dispositivos conectados ao Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl é um servidor de notificações push de código aberto gratuito para carteiras bitcoin. Pode instalar seu próprio servidor GroundControl e colocar sua URL aqui para não depender da infraestrutura da BlueWallet. Deixe em branco para usar o padrão",
|
||||
@ -215,7 +215,7 @@
|
||||
"language": "Idioma",
|
||||
"last_updated": "Última atualização",
|
||||
"language_isRTL": "É necessário reiniciar a BlueWallet para que a alteração de idioma tenha efeito.",
|
||||
"lightning_error_lndhub_uri": "URI de LNDHub inválido",
|
||||
"lightning_error_lndhub_uri": "URI de LNDhub inválido",
|
||||
"lightning_saved": "As alterações foram guardadas com sucesso",
|
||||
"lightning_settings": "Definições de Lightning",
|
||||
"network": "Rede",
|
||||
@ -292,8 +292,8 @@
|
||||
"add_import_wallet": "Importar wallet",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Para gastar com transações instantâneas",
|
||||
"add_lndhub": "Conecte-se ao seu LNDHub",
|
||||
"add_lndhub_error": "O endereço do nó fornecido é um nó LNDHub inválido.",
|
||||
"add_lndhub": "Conecte-se ao seu LNDhub",
|
||||
"add_lndhub_error": "O endereço do nó fornecido é um nó LNDhub inválido.",
|
||||
"add_lndhub_placeholder": "O endereço do seu nó",
|
||||
"add_placeholder": "a minha primeira carteira",
|
||||
"add_title": "Adicionar carteira",
|
||||
|
@ -218,7 +218,7 @@
|
||||
"encrypt_use_expl": "{type} va fi folosit pentru a confirma identitatea ta înainte de a face o tranzacție, de a debloca, de a exporta, sau de a șterge un portofel. {type} nu va fi folosit să deblocheze un spațiu de stocare criptat.",
|
||||
"general": "General",
|
||||
"general_adv_mode": "Mod avansat",
|
||||
"general_adv_mode_e": "Cînd e activat, vei vedea opțiuni avansate, precum tipuri diferite de portofele, abilitatea de a specifica instanța LNDHub la care vrei să te conectezi, și entropia personalizată la crearea portofelului.",
|
||||
"general_adv_mode_e": "Cînd e activat, vei vedea opțiuni avansate, precum tipuri diferite de portofele, abilitatea de a specifica instanța LNDhub la care vrei să te conectezi, și entropia personalizată la crearea portofelului.",
|
||||
"general_continuity": "Continuitate",
|
||||
"general_continuity_e": "Cînd e activat, vei vedea aici portofelele selectate, și tranzacțiile, folosind celelalte dispozitive ale tale Apple conectate la iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl este un server de notificări gratuit, open-source, pentru portofele Bitcoin. Poți instala propriul server GroundControl și să-i pui URL-ul aici pentru a nu te baza pe infrastructura BlueWallet. Lasă necompletat pentru a folosi serverul implicit al GroundControl.",
|
||||
@ -226,7 +226,7 @@
|
||||
"language": "Limbă",
|
||||
"last_updated": "Actualizat ultima dată",
|
||||
"language_isRTL": "E nevoie de restartarea BlueWallet pentru ca orientarea lingvistică să-și facă efectul.",
|
||||
"lightning_error_lndhub_uri": "URI LNDHub invalid",
|
||||
"lightning_error_lndhub_uri": "URI LNDhub invalid",
|
||||
"lightning_saved": "Modificările tale au fost salvate cu succes.",
|
||||
"lightning_settings": "Setări Lightning",
|
||||
"network": "Rețea",
|
||||
@ -311,7 +311,7 @@
|
||||
"add_import_wallet": "Import portofel",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Pentru cheltuirea cu tranzacții instante",
|
||||
"add_lndhub": "Conectează-te la propriul LNDHub",
|
||||
"add_lndhub": "Conectează-te la propriul LNDhub",
|
||||
"add_lndhub_placeholder": "Adresa nodului tău",
|
||||
"add_placeholder": "primul meu portofel",
|
||||
"add_title": "Adaugă portofel",
|
||||
|
12
loc/ru.json
12
loc/ru.json
@ -230,7 +230,7 @@
|
||||
"use_ssl": "Использовать SSL",
|
||||
"electrum_saved": "Ваши изменения были успешно сохранены. Для вступления изменений в силу может потребоваться перезагрузка.",
|
||||
"set_electrum_server_as_default": "Задать {server} как сервер Electrum по умолчанию?",
|
||||
"set_lndhub_as_default": "Задать {url} как сервер LNDHub по умолчанию?",
|
||||
"set_lndhub_as_default": "Задать {url} как сервер LNDhub по умолчанию?",
|
||||
"electrum_settings_server": "Сервер Electrum",
|
||||
"electrum_settings_explain": "Очистите, чтобы использовать по умолчанию.",
|
||||
"electrum_status": "Статус",
|
||||
@ -253,7 +253,7 @@
|
||||
"encrypt_use_expl": "{type} будет использоваться для подтверждения вашей личности перед совершением транзакции, разблокировкой, экспортом или удалением кошелька. {type} не будет использоваться для открытия зашифрованного хранилища.",
|
||||
"general": "Основные",
|
||||
"general_adv_mode": "Включить расширенный режим",
|
||||
"general_adv_mode_e": "При включении вы увидите расширенные параметры, такие как разные типы кошельков, возможность указать экземпляр LNDHub, к которому вы хотите подключиться, и пользовательскую энтропию при создании кошелька.",
|
||||
"general_adv_mode_e": "При включении вы увидите расширенные параметры, такие как разные типы кошельков, возможность указать экземпляр LNDhub, к которому вы хотите подключиться, и пользовательскую энтропию при создании кошелька.",
|
||||
"general_continuity": "Непрерывность",
|
||||
"general_continuity_e": "Когда эта функция включена, вы сможете просматривать выбранные кошельки и транзакции, используя другие устройства, подключенные к Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl - это бесплатный сервер push-уведомлений с открытым исходным кодом для биткойн-кошельков. Вы можете установить свой собственный сервер GroundControl и указать здесь его URL, чтобы не полагаться на инфраструктуру BlueWallet. Оставьте пустым, чтобы использовать по умолчанию",
|
||||
@ -261,10 +261,10 @@
|
||||
"language": "Язык",
|
||||
"last_updated": "Последнее обновление",
|
||||
"language_isRTL": "Перезапустите приложение для смены направления языка.",
|
||||
"lightning_error_lndhub_uri": "Неверный URI LNDHub",
|
||||
"lightning_error_lndhub_uri": "Неверный URI LNDhub",
|
||||
"lightning_saved": "Ваши изменения были успешно сохранены",
|
||||
"lightning_settings": "Настройки Lightning",
|
||||
"lightning_settings_explain": "Чтобы подключиться к собственному LND, установите LNDHub и укажите его URL в настройках. Оставьте поле пустым, чтобы использовать LNDHub BlueWallet. Обратите внимание, что только кошельки, созданные после сохранения изменений, будут подключаться к указанному LNDHub.",
|
||||
"lightning_settings_explain": "Чтобы подключиться к собственному LND, установите LNDhub и укажите его URL в настройках. Оставьте поле пустым, чтобы использовать LNDhub BlueWallet. Обратите внимание, что только кошельки, созданные после сохранения изменений, будут подключаться к указанному LNDhub.",
|
||||
"network": "Сеть",
|
||||
"network_broadcast": "Отправить транзакцию",
|
||||
"network_electrum": "Electrum сервер",
|
||||
@ -358,8 +358,8 @@
|
||||
"add_import_wallet": "Импортировать кошелёк",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Для мгновенных переводов",
|
||||
"add_lndhub": "Подключиться к своему LNDHub",
|
||||
"add_lndhub_error": "Неверный адрес LNDHub.",
|
||||
"add_lndhub": "Подключиться к своему LNDhub",
|
||||
"add_lndhub_error": "Неверный адрес LNDhub.",
|
||||
"add_lndhub_placeholder": "Адрес хоста",
|
||||
"add_placeholder": "мой первый кошелёк",
|
||||
"add_title": "Добавить кошелёк",
|
||||
|
@ -233,7 +233,7 @@
|
||||
"language": "භාෂාව",
|
||||
"last_updated": "අවසන් වරට යාවත්කාලීන කරන ලදී",
|
||||
"language_isRTL": "භාෂා දිශානතිය ක්රියාත්මක වීමට බ්ලූවොලට් නැවත ආරම්භ කිරීම අවශ්ය වේ.",
|
||||
"lightning_error_lndhub_uri": "වලංගු නොවන LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "වලංගු නොවන LNDhub URI",
|
||||
"lightning_saved": "ඔබේ වෙනස්කම් සාර්ථකව සුරැකී ඇත.",
|
||||
"lightning_settings": "ලයිට්නින් සැකසුම්",
|
||||
"network": "ජාල",
|
||||
@ -323,8 +323,8 @@
|
||||
"add_import_wallet": "මුදල් පසුම්බිය ආනයනය කරන්න",
|
||||
"add_lightning": "ලයිට්නින්",
|
||||
"add_lightning_explain": "ක්ෂණික ගනුදෙනු සමඟ වියදම් කිරීම සඳහා",
|
||||
"add_lndhub": "ඔබේ LNDHub වෙත සම්බන්ධ වන්න",
|
||||
"add_lndhub_error": "ලබා දී ඇති නෝඩ් ලිපිනය වලංගු නොවන LNDHub නෝඩයකි.",
|
||||
"add_lndhub": "ඔබේ LNDhub වෙත සම්බන්ධ වන්න",
|
||||
"add_lndhub_error": "ලබා දී ඇති නෝඩ් ලිපිනය වලංගු නොවන LNDhub නෝඩයකි.",
|
||||
"add_lndhub_placeholder": "ඔබේ නෝඩ් ලිපිනය",
|
||||
"add_placeholder": "මගේ පළමු මුදල් පසුම්බිය",
|
||||
"add_title": "පසුම්බිය එකතු කරන්න",
|
||||
|
@ -190,7 +190,7 @@
|
||||
"add_entropy_remain": "{gen} bytov vygenerovanej entropie. Zvyšných {rem} bytov sa získa zo systémového generátora náhodných čísel.",
|
||||
"add_import_wallet": "Importovať peňaženku",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lndhub": "Pripojiť sa na LNDHub",
|
||||
"add_lndhub": "Pripojiť sa na LNDhub",
|
||||
"add_lndhub_placeholder": "adresa uzla",
|
||||
"add_title": "pridať peňaženku",
|
||||
"add_wallet_name": "názov peňaženky",
|
||||
|
@ -210,7 +210,7 @@
|
||||
"use_ssl": "SSL",
|
||||
"electrum_saved": "Spremembe so bile uspešno shranjene. Da bodo spremembe začele veljati, bo morda potreben ponovni zagon.",
|
||||
"set_electrum_server_as_default": "Želite nastaviti {server} kot privzeti electrum strežnik?",
|
||||
"set_lndhub_as_default": "Želite nastaviti {url} kot privzeti LNDHub strežnik?",
|
||||
"set_lndhub_as_default": "Želite nastaviti {url} kot privzeti LNDhub strežnik?",
|
||||
"electrum_settings_server": "Electrum Strežnik",
|
||||
"electrum_settings_explain": "Pustite prazno za uporabo privzetih nastavitev.",
|
||||
"electrum_status": "Stanje",
|
||||
@ -233,7 +233,7 @@
|
||||
"encrypt_use_expl": "{type} bo uporabljen za potrditev vaše identitete pred izvedbo transakcije, odklepanjem, izvozom ali brisanjem denarnice. {type} ne bo uporabljen za odklepanje šifrirane shrambe.",
|
||||
"general": "Splošno",
|
||||
"general_adv_mode": "Napredni način",
|
||||
"general_adv_mode_e": "Ko je omogočen, boste videli napredne možnosti, kot so različni tipi denarnic, možnost določitve LNDHub strežnika, s katerim se želite povezati in entropija po meri pri ustvarjanju denarnice.",
|
||||
"general_adv_mode_e": "Ko je omogočen, boste videli napredne možnosti, kot so različni tipi denarnic, možnost določitve LNDhub strežnika, s katerim se želite povezati in entropija po meri pri ustvarjanju denarnice.",
|
||||
"general_continuity": "Neprekinjenost",
|
||||
"general_continuity_e": "Ko je omogočeno, si boste lahko ogledali izbrane denarnice in transakcije z uporabo vaših drugih naprav povezanih z Apple iCloud.",
|
||||
"groundcontrol_explanation": "GroundControl je brezplačen odprtokoden strežnik potisnih obvestil za bitcoin denarnice. Da se ne zanašate na BlueWallet infrastrukturo, lahko namestite svoj strežnik GroundControl in tukaj dodate njegov URL. Pustite prazno, za uporabo privzetega.",
|
||||
@ -241,7 +241,7 @@
|
||||
"language": "Jezik",
|
||||
"last_updated": "Posodobljeno",
|
||||
"language_isRTL": "Za spremembo orientacije pisave je potreben ponovni zagon aplikacije.",
|
||||
"lightning_error_lndhub_uri": "Neveljaven LNDHub URI",
|
||||
"lightning_error_lndhub_uri": "Neveljaven LNDhub URI",
|
||||
"lightning_saved": "Spremembe so bile uspešno shranjene",
|
||||
"lightning_settings": "Lightning Nastavitve",
|
||||
"network": "Omrežje",
|
||||
@ -332,8 +332,8 @@
|
||||
"add_import_wallet": "Uvozi denarnico",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Za hitre vsakodnevne transakcije",
|
||||
"add_lndhub": "Povežite se s svojim LNDHub-om",
|
||||
"add_lndhub_error": "Podan naslov vozlišča ni veljavno vozlišče LNDHub.",
|
||||
"add_lndhub": "Povežite se s svojim LNDhub-om",
|
||||
"add_lndhub_error": "Podan naslov vozlišča ni veljavno vozlišče LNDhub.",
|
||||
"add_lndhub_placeholder": "naslov vašega vozlišča",
|
||||
"add_placeholder": "moja prva denarnica",
|
||||
"add_title": "Dodajte denarnico",
|
||||
|
@ -219,7 +219,7 @@
|
||||
"use_ssl": "Använd SSL",
|
||||
"electrum_saved": "Dina ändringar har sparats. Starta om BlueWallet för att ändringarna ska träda i kraft.",
|
||||
"set_electrum_server_as_default": "Vill du ställa in {server} som standard Electrum-server?",
|
||||
"set_lndhub_as_default": "Vill du ställa in {url} som standard LNDHub-server?",
|
||||
"set_lndhub_as_default": "Vill du ställa in {url} som standard LNDhub-server?",
|
||||
"electrum_settings_server": "Electrum server",
|
||||
"electrum_settings_explain": "Lämna tomt för att använda standardinställningen.",
|
||||
"electrum_status": "Status",
|
||||
@ -242,7 +242,7 @@
|
||||
"encrypt_use_expl": "{type} kommer att användas för att bekräfta din identitet innan du gör en transaktion, låser upp, exporterar eller tar bort en plånbok. {type} kommer inte att användas för att låsa upp krypterad lagring.",
|
||||
"general": "Allmän",
|
||||
"general_adv_mode": "Enable advanced mode",
|
||||
"general_adv_mode_e": "När det är aktiverat kommer du att se avancerade alternativ som olika plånbokstyper, möjligheten att ange den LNDHub-instans du vill ansluta till och anpassad entropi under skapandet av plånboken. ",
|
||||
"general_adv_mode_e": "När det är aktiverat kommer du att se avancerade alternativ som olika plånbokstyper, möjligheten att ange den LNDhub-instans du vill ansluta till och anpassad entropi under skapandet av plånboken. ",
|
||||
"general_continuity": "Kontinuitet",
|
||||
"general_continuity_e": "När det är aktiverat kommer du att kunna se utvalda plånböcker och transaktioner med dina andra Apple iCloud-anslutna enheter.",
|
||||
"groundcontrol_explanation": "GroundControl är en gratis push-meddelandeserver med öppen källkod för Bitcoin-plånböcker. Du kan installera din egen GroundControl-server och lägga in dess URL här för att inte lita på BlueWallets infrastruktur. Lämna tomt för att använda GroundControls standardserver.",
|
||||
@ -250,10 +250,10 @@
|
||||
"language": "Språk",
|
||||
"last_updated": "Senast uppdaterad",
|
||||
"language_isRTL": "Att starta om BlueWallet krävs för att språkorienteringen ska träda i kraft.",
|
||||
"lightning_error_lndhub_uri": "Ogiltig LNDHub-URI",
|
||||
"lightning_error_lndhub_uri": "Ogiltig LNDhub-URI",
|
||||
"lightning_saved": "Dina ändringar har sparats.",
|
||||
"lightning_settings": "Lightning Network",
|
||||
"lightning_settings_explain": "För att ansluta till din egen LND-nod, installera LNDHub och ange dess URL här i inställningarna. Observera att endast plånböcker som skapas efter att ändringar har sparats kommer att ansluta till den angivna LNDHub.",
|
||||
"lightning_settings_explain": "För att ansluta till din egen LND-nod, installera LNDhub och ange dess URL här i inställningarna. Observera att endast plånböcker som skapas efter att ändringar har sparats kommer att ansluta till den angivna LNDhub.",
|
||||
"network": "Nätverk",
|
||||
"network_broadcast": "Broadcasta Transaktion",
|
||||
"network_electrum": "Electrum server",
|
||||
@ -344,8 +344,8 @@
|
||||
"add_import_wallet": "Importera plånbok",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "För utgifter med omedelbara transaktioner",
|
||||
"add_lndhub": "Anslut till din LNDHub",
|
||||
"add_lndhub_error": "Den angivna nodadressen är en ogiltig LNDHub-nod.",
|
||||
"add_lndhub": "Anslut till din LNDhub",
|
||||
"add_lndhub_error": "Den angivna nodadressen är en ogiltig LNDhub-nod.",
|
||||
"add_lndhub_placeholder": "Din nodadress",
|
||||
"add_placeholder": "Min första plånbok",
|
||||
"add_title": "ny plånbok",
|
||||
|
@ -231,7 +231,7 @@
|
||||
"add_entropy": "เอนโทรปี",
|
||||
"add_import_wallet": "นำเข้ากระเป๋าสตางค์",
|
||||
"add_lightning": "ไลท์นิง",
|
||||
"add_lndhub": "เชื่อมต่ปไปที่ LNDHub ของท่าน",
|
||||
"add_lndhub": "เชื่อมต่ปไปที่ LNDhub ของท่าน",
|
||||
"add_lndhub_placeholder": "แอดเดรสของโหนดของท่าน",
|
||||
"add_title": "เพิ่มกระเป๋าสตางค์",
|
||||
"add_wallet_name": "ชื่อกระเป๋าสตางค์",
|
||||
|
@ -243,7 +243,7 @@
|
||||
"add_entropy": "Ентропія",
|
||||
"add_import_wallet": "Імпортувати гаманець",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lndhub": "Підключитися до вашого LNDHub",
|
||||
"add_lndhub": "Підключитися до вашого LNDhub",
|
||||
"add_lndhub_placeholder": "Адреса Вашої Ноди",
|
||||
"add_placeholder": "мій перший гаманець",
|
||||
"add_title": "Додати Гаманець",
|
||||
|
@ -214,7 +214,7 @@
|
||||
"use_ssl": "Sử dụng SSL",
|
||||
"electrum_saved": "Những thay đổi của bạn đã được lưu thành công. Khởi động lại Bluewallet có thể được yêu cầu cho các thay đổi có hiệu lực.",
|
||||
"set_electrum_server_as_default": "Đặt làm {server} máy chủ Electrum mặc định không?",
|
||||
"set_lndhub_as_default": "Đặt làm {server} máy chủ LNDHub mặc định không?",
|
||||
"set_lndhub_as_default": "Đặt làm {server} máy chủ LNDhub mặc định không?",
|
||||
"electrum_settings_server": "Máy chủ Electrum",
|
||||
"electrum_settings_explain": "Để trống để sử dụng mặc định.",
|
||||
"electrum_status": " Trạng thái",
|
||||
@ -237,7 +237,7 @@
|
||||
"encrypt_use_expl": "{type} sẽ được dùng để xác nhận danh tính của bạn trước khi thực hiện giao dịch, mở khoá ví, xuất ví, hoặc xoá ví. {type} sẽ không được dùng để mở khoá lưu trữ được mã hoá.",
|
||||
"general": "Cài đặt chung",
|
||||
"general_adv_mode": "Chế độ nâng cao",
|
||||
"general_adv_mode_e": "Nếu kích hoạt, bạn sẽ xem tùy chọn nâng cao như loại khác ví, khả năng xác định thể hiện LNDHub nào để kết nối, và entropy tuỳ chỉnh khi tạo ví. ",
|
||||
"general_adv_mode_e": "Nếu kích hoạt, bạn sẽ xem tùy chọn nâng cao như loại khác ví, khả năng xác định thể hiện LNDhub nào để kết nối, và entropy tuỳ chỉnh khi tạo ví. ",
|
||||
"general_continuity": "Sự liên tục",
|
||||
"general_continuity_e": "Nếu kích hoạt, bạn sẽ xem những ví và giao dịch đã chọn trên các thiết bị Apple khác kết nối đến iCloud. ",
|
||||
"groundcontrol_explanation": "GroundControl là một máy chủ đẩy thông báo có tự do và nguồn mở cho ví Bitcoin. Bạn có thể cài đặt máy chủ GroundControl riêng của mình và nhập URL của nó tại đây để không dựa vào hạ tầng của BlueWallet. Để trống để sử dụng máy chủ GroundControl mặc định.",
|
||||
@ -245,10 +245,10 @@
|
||||
"language": "Ngôn ngữ",
|
||||
"last_updated": "Cập nhật cuối ",
|
||||
"language_isRTL": "Khởi động lại BlueWallet để định hướng ngôn ngữ có hiệu lực.",
|
||||
"lightning_error_lndhub_uri": "URI LNDHub không hợp lệ",
|
||||
"lightning_error_lndhub_uri": "URI LNDhub không hợp lệ",
|
||||
"lightning_saved": "Những thay đổi của bạn đã được lưu thành công.",
|
||||
"lightning_settings": "Cài đặt Lightning",
|
||||
"lightning_settings_explain": "Để kết nối node LND riêng của bạn, vui lòng cài đặt LNDHub va nhập URL của nó vào cài đặt tại đây. Xin lưu ý rằng chỉ các ví được tạo sau khi lưu các thay đổi sẽ kết nối với LNDHub được chỉ định.",
|
||||
"lightning_settings_explain": "Để kết nối node LND riêng của bạn, vui lòng cài đặt LNDhub va nhập URL của nó vào cài đặt tại đây. Xin lưu ý rằng chỉ các ví được tạo sau khi lưu các thay đổi sẽ kết nối với LNDhub được chỉ định.",
|
||||
"network": "Mạng",
|
||||
"network_broadcast": "Phát sóng giao dịch",
|
||||
"network_electrum": "Máy chủ Electrum",
|
||||
@ -338,8 +338,8 @@
|
||||
"add_import_wallet": "Nhập ví",
|
||||
"add_lightning": "Lightning",
|
||||
"add_lightning_explain": "Để chi tiêu với các giao dịch tức thời ",
|
||||
"add_lndhub": "Kết nối với LNDHub của bạn",
|
||||
"add_lndhub_error": "Địa chỉ cung cấp là một node LNDHub không hợp lệ.",
|
||||
"add_lndhub": "Kết nối với LNDhub của bạn",
|
||||
"add_lndhub_error": "Địa chỉ cung cấp là một node LNDhub không hợp lệ.",
|
||||
"add_lndhub_placeholder": "Địa chỉ node của bạn",
|
||||
"add_placeholder": "Ví đầu tiên của tôi",
|
||||
"add_title": "Thêm ví",
|
||||
|
@ -178,7 +178,7 @@
|
||||
"add_create": "Skep",
|
||||
"add_entropy": "Entropie",
|
||||
"add_import_wallet": "Beursie Invoer",
|
||||
"add_lndhub_error": "Die voorgestelde knoop-punt se adres is 'n ongeldige LNDHub knoop-punt.",
|
||||
"add_lndhub_error": "Die voorgestelde knoop-punt se adres is 'n ongeldige LNDhub knoop-punt.",
|
||||
"add_lndhub_placeholder": "Jou Knoop-punt Adres",
|
||||
"add_title": "skep beursie",
|
||||
"add_wallet_name": "beursie naam",
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
||||
import React from 'react';
|
||||
|
||||
import navigationStyle from '../components/navigationStyle';
|
||||
import navigationStyle, { CloseButtonPosition } from '../components/navigationStyle';
|
||||
import { useTheme } from '../components/themes';
|
||||
import loc from '../loc';
|
||||
import {
|
||||
@ -49,7 +49,7 @@ const AddWalletStack = () => {
|
||||
name="AddWallet"
|
||||
component={AddComponent}
|
||||
options={navigationStyle({
|
||||
headerBackVisible: false,
|
||||
closeButtonPosition: CloseButtonPosition.Left,
|
||||
title: loc.wallets.add_title,
|
||||
})(theme)}
|
||||
/>
|
||||
|
@ -73,7 +73,6 @@ const DetailViewStackScreensStack = () => {
|
||||
const { wallets } = useStorage();
|
||||
const { isTotalBalanceEnabled } = useSettings();
|
||||
|
||||
const SaveButton = useMemo(() => <HeaderRightButton testID="SaveButton" disabled={true} title={loc.wallets.details_save} />, []);
|
||||
const DetailButton = useMemo(() => <HeaderRightButton testID="DetailButton" disabled={true} title={loc.send.create_details} />, []);
|
||||
|
||||
const navigateToAddWallet = useCallback(() => {
|
||||
@ -122,7 +121,6 @@ const DetailViewStackScreensStack = () => {
|
||||
options={navigationStyle({
|
||||
headerTitle: loc.wallets.details_title,
|
||||
statusBarStyle: 'auto',
|
||||
headerRight: () => SaveButton,
|
||||
})(theme)}
|
||||
/>
|
||||
<DetailViewStack.Screen
|
||||
@ -247,7 +245,11 @@ const DetailViewStackScreensStack = () => {
|
||||
options={navigationStyle({ title: loc.addresses.addresses_title, statusBarStyle: 'auto' })(theme)}
|
||||
/>
|
||||
|
||||
<DetailViewStack.Screen name="AddWalletRoot" component={AddWalletStack} options={NavigationFormModalOptions} />
|
||||
<DetailViewStack.Screen
|
||||
name="AddWalletRoot"
|
||||
component={AddWalletStack}
|
||||
options={navigationStyle({ closeButtonPosition: CloseButtonPosition.Left, ...NavigationFormModalOptions })(theme)}
|
||||
/>
|
||||
<DetailViewStack.Screen name="SendDetailsRoot" component={SendDetailsStack} options={NavigationDefaultOptions} />
|
||||
<DetailViewStack.Screen name="LNDCreateInvoiceRoot" component={LNDCreateInvoiceRoot} options={NavigationDefaultOptions} />
|
||||
<DetailViewStack.Screen name="ScanLndInvoiceRoot" component={ScanLndInvoiceRoot} options={NavigationDefaultOptions} />
|
||||
|
11853
package-lock.json
generated
11853
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
28
package.json
28
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bluewallet",
|
||||
"version": "7.0.4",
|
||||
"version": "7.0.5",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -10,11 +10,11 @@
|
||||
"@babel/core": "^7.20.0",
|
||||
"@babel/runtime": "^7.20.0",
|
||||
"@jest/reporters": "^27.5.1",
|
||||
"@react-native/babel-preset": "^0.75.2",
|
||||
"@react-native/eslint-config": "^0.75.2",
|
||||
"@react-native/js-polyfills": "^0.75.2",
|
||||
"@react-native/metro-babel-transformer": "^0.75.2",
|
||||
"@react-native/typescript-config": "^0.75.2",
|
||||
"@react-native/babel-preset": "^0.75.3",
|
||||
"@react-native/eslint-config": "^0.75.3",
|
||||
"@react-native/js-polyfills": "^0.75.3",
|
||||
"@react-native/metro-babel-transformer": "^0.75.3",
|
||||
"@react-native/typescript-config": "^0.75.3",
|
||||
"@types/bip38": "^3.1.2",
|
||||
"@types/bs58check": "^2.1.0",
|
||||
"@types/create-hash": "^1.2.2",
|
||||
@ -59,7 +59,7 @@
|
||||
"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 patches",
|
||||
"patches": "patch -p1 < scripts/react-native-camera-kit.patch;",
|
||||
"patches": "patch -p1 < scripts/react-native-camera-kit.patch; npx patch-package",
|
||||
"test": "npm run tslint && npm run lint && npm run unit && npm run jest",
|
||||
"jest": "jest tests/integration/*",
|
||||
"e2e:debug-build": "detox build -c android.debug",
|
||||
@ -75,7 +75,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/preset-env": "7.25.3",
|
||||
"@bugsnag/react-native": "7.25.1",
|
||||
"@bugsnag/react-native": "8.0.0",
|
||||
"@bugsnag/source-maps": "2.3.3",
|
||||
"@keystonehq/bc-ur-registry": "0.7.0",
|
||||
"@lodev09/react-native-true-sheet": "github:BlueWallet/react-native-true-sheet#839f2966cee77c0ad99d09609dadb61a338e7f54",
|
||||
@ -84,8 +84,9 @@
|
||||
"@react-native-async-storage/async-storage": "1.24.0",
|
||||
"@react-native-clipboard/clipboard": "1.14.1",
|
||||
"@react-native-community/push-notification-ios": "1.11.0",
|
||||
"@react-native-menu/menu": "https://github.com/BlueWallet/menu.git#958fac3d40811f38b53042ada9168175e321b99f",
|
||||
"@react-native/gradle-plugin": "^0.75.2",
|
||||
"@react-native-menu/menu": "https://github.com/BlueWallet/menu.git#a149bbf",
|
||||
"@react-native/gradle-plugin": "^0.75.3",
|
||||
"@react-native/metro-config": "0.75.3",
|
||||
"@react-navigation/drawer": "6.7.2",
|
||||
"@react-navigation/native": "6.1.18",
|
||||
"@react-navigation/native-stack": "6.11.0",
|
||||
@ -124,7 +125,7 @@
|
||||
"prop-types": "15.8.1",
|
||||
"react": "18.3.1",
|
||||
"react-localization": "github:BlueWallet/react-localization#ae7969a",
|
||||
"react-native": "0.75.2",
|
||||
"react-native": "0.75.3",
|
||||
"react-native-biometrics": "3.0.1",
|
||||
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442",
|
||||
"react-native-camera-kit": "13.0.0",
|
||||
@ -152,9 +153,8 @@
|
||||
"react-native-quick-actions": "0.3.13",
|
||||
"react-native-randombytes": "3.6.1",
|
||||
"react-native-rate": "1.2.12",
|
||||
"react-native-reanimated": "3.15.1",
|
||||
"@react-native/metro-config": "0.75.2",
|
||||
"react-native-safe-area-context": "4.10.9",
|
||||
"react-native-reanimated": "3.15.2",
|
||||
"react-native-safe-area-context": "4.11.0",
|
||||
"react-native-screens": "3.34.0",
|
||||
"react-native-secure-key-store": "github:BlueWallet/react-native-secure-key-store#2076b4849e88aa0a78e08bfbb4ce3923e0925cbc",
|
||||
"react-native-share": "10.2.1",
|
||||
|
16
patches/react-native-vector-icons+10.1.0.patch
Normal file
16
patches/react-native-vector-icons+10.1.0.patch
Normal file
@ -0,0 +1,16 @@
|
||||
diff --git a/node_modules/react-native-vector-icons/.DS_Store b/node_modules/react-native-vector-icons/.DS_Store
|
||||
new file mode 100644
|
||||
index 0000000..747936a
|
||||
Binary files /dev/null and b/node_modules/react-native-vector-icons/.DS_Store differ
|
||||
diff --git a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf b/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf
|
||||
deleted file mode 100644
|
||||
index 30f55b7..0000000
|
||||
Binary files a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf and /dev/null differ
|
||||
diff --git a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf b/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf
|
||||
deleted file mode 100644
|
||||
index c79589d..0000000
|
||||
Binary files a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf and /dev/null differ
|
||||
diff --git a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf b/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf
|
||||
deleted file mode 100644
|
||||
index e479fb2..0000000
|
||||
Binary files a/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf and /dev/null differ
|
@ -1,5 +1,5 @@
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { useRoute } from '@react-navigation/native';
|
||||
import { RouteProp, useRoute } from '@react-navigation/native';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { I18nManager, Image, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
||||
import { Icon } from '@rneui/themed';
|
||||
@ -13,39 +13,41 @@ import Button from '../../components/Button';
|
||||
import SafeArea from '../../components/SafeArea';
|
||||
import { useTheme } from '../../components/themes';
|
||||
import prompt from '../../helpers/prompt';
|
||||
import { useBiometrics, unlockWithBiometrics } from '../../hooks/useBiometrics';
|
||||
import { unlockWithBiometrics, useBiometrics } from '../../hooks/useBiometrics';
|
||||
import loc, { formatBalance, formatBalanceWithoutSuffix } from '../../loc';
|
||||
import { BitcoinUnit, Chain } from '../../models/bitcoinUnits';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
import { DismissKeyboardInputAccessory, DismissKeyboardInputAccessoryViewID } from '../../components/DismissKeyboardInputAccessory';
|
||||
import { LightningCustodianWallet } from '../../class/wallets/lightning-custodian-wallet';
|
||||
import { TWallet } from '../../class/wallets/types';
|
||||
import { pop } from '../../NavigationService';
|
||||
|
||||
/**
|
||||
* if user has default currency - fiat, attempting to pay will trigger conversion from entered in input field fiat value
|
||||
* to satoshi, and attempt to pay this satoshi value, which might be a little bit off from `min` & `max` values
|
||||
* provided by LnUrl. thats why we cache initial precise conversion rate so the reverse conversion wont be off.
|
||||
*/
|
||||
const _cacheFiatToSat = {};
|
||||
type RouteParams = {
|
||||
walletID: string;
|
||||
lnurl: string;
|
||||
};
|
||||
|
||||
const LnurlPay = () => {
|
||||
const _cacheFiatToSat: Record<string, string> = {};
|
||||
|
||||
const LnurlPay: React.FC = () => {
|
||||
const { wallets } = useStorage();
|
||||
const { isBiometricUseCapableAndEnabled } = useBiometrics();
|
||||
const { walletID, lnurl } = useRoute().params;
|
||||
/** @type {LightningCustodianWallet} */
|
||||
const wallet = wallets.find(w => w.getID() === walletID);
|
||||
const [unit, setUnit] = useState(wallet.getPreferredBalanceUnit());
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const [_LN, setLN] = useState();
|
||||
const [payButtonDisabled, setPayButtonDisabled] = useState(true);
|
||||
const [payload, setPayload] = useState();
|
||||
const { setParams, pop, navigate } = useExtendedNavigation();
|
||||
const [amount, setAmount] = useState();
|
||||
const route = useRoute<RouteProp<Record<string, RouteParams>, string>>();
|
||||
const { walletID, lnurl } = route.params;
|
||||
const wallet = wallets.find(w => w.getID() === walletID) as LightningCustodianWallet;
|
||||
const [unit, setUnit] = useState<BitcoinUnit>(wallet?.getPreferredBalanceUnit() ?? BitcoinUnit.BTC);
|
||||
const [isLoading, setIsLoading] = useState<boolean>(true);
|
||||
const [_LN, setLN] = useState<Lnurl | undefined>();
|
||||
const [payButtonDisabled, setPayButtonDisabled] = useState<boolean>(true);
|
||||
const [payload, setPayload] = useState<any>();
|
||||
const { setParams, navigate } = useExtendedNavigation();
|
||||
const [amount, setAmount] = useState<string | undefined>();
|
||||
const { colors } = useTheme();
|
||||
const stylesHook = StyleSheet.create({
|
||||
root: {
|
||||
backgroundColor: colors.background,
|
||||
},
|
||||
|
||||
walletWrapLabel: {
|
||||
color: colors.buttonAlternativeTextColor,
|
||||
},
|
||||
@ -69,18 +71,16 @@ const LnurlPay = () => {
|
||||
setLN(ln);
|
||||
setIsLoading(false);
|
||||
}
|
||||
}, [lnurl, pop]);
|
||||
}, [lnurl]);
|
||||
|
||||
useEffect(() => {
|
||||
setPayButtonDisabled(isLoading);
|
||||
}, [isLoading]);
|
||||
|
||||
useEffect(() => {
|
||||
if (payload) {
|
||||
/** @type {Lnurl} */
|
||||
const LN = _LN;
|
||||
let originalSatAmount;
|
||||
let newAmount = (originalSatAmount = LN.getMin());
|
||||
if (payload && _LN) {
|
||||
let originalSatAmount: number | false;
|
||||
let newAmount: number | boolean | string = (originalSatAmount = _LN.getMin());
|
||||
if (!newAmount) {
|
||||
presentAlert({ message: 'Internal error: incorrect LNURL amount' });
|
||||
return;
|
||||
@ -91,22 +91,21 @@ const LnurlPay = () => {
|
||||
break;
|
||||
case BitcoinUnit.LOCAL_CURRENCY:
|
||||
newAmount = satoshiToLocalCurrency(newAmount, false);
|
||||
_cacheFiatToSat[newAmount] = originalSatAmount;
|
||||
_cacheFiatToSat[newAmount] = String(originalSatAmount);
|
||||
break;
|
||||
}
|
||||
setAmount(newAmount);
|
||||
setAmount(newAmount.toString());
|
||||
}
|
||||
}, [payload]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
}, [payload, _LN, unit]);
|
||||
|
||||
const onWalletSelect = w => {
|
||||
const onWalletSelect = (w: TWallet) => {
|
||||
setParams({ walletID: w.getID() });
|
||||
pop();
|
||||
};
|
||||
|
||||
const pay = async () => {
|
||||
setPayButtonDisabled(true);
|
||||
/** @type {Lnurl} */
|
||||
const LN = _LN;
|
||||
if (!_LN || !amount) return;
|
||||
|
||||
const isBiometricsEnabled = await isBiometricUseCapableAndEnabled();
|
||||
if (isBiometricsEnabled) {
|
||||
@ -115,39 +114,41 @@ const LnurlPay = () => {
|
||||
}
|
||||
}
|
||||
|
||||
let amountSats = amount;
|
||||
let amountSats: number | false;
|
||||
switch (unit) {
|
||||
case BitcoinUnit.SATS:
|
||||
amountSats = parseInt(amountSats, 10); // nop
|
||||
amountSats = parseInt(amount, 10);
|
||||
break;
|
||||
case BitcoinUnit.BTC:
|
||||
amountSats = btcToSatoshi(amountSats);
|
||||
amountSats = btcToSatoshi(amount);
|
||||
break;
|
||||
case BitcoinUnit.LOCAL_CURRENCY:
|
||||
if (_cacheFiatToSat[amount]) {
|
||||
amountSats = _cacheFiatToSat[amount];
|
||||
if (_cacheFiatToSat[String(amount)]) {
|
||||
amountSats = parseInt(_cacheFiatToSat[amount], 10);
|
||||
} else {
|
||||
amountSats = btcToSatoshi(fiatToBTC(amountSats));
|
||||
amountSats = btcToSatoshi(fiatToBTC(parseFloat(amount)));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unknown unit type');
|
||||
}
|
||||
|
||||
let bolt11payload;
|
||||
try {
|
||||
let comment;
|
||||
if (LN.getCommentAllowed()) {
|
||||
let comment: string | undefined;
|
||||
if (_LN.getCommentAllowed()) {
|
||||
comment = await prompt('Comment', '', false, 'plain-text');
|
||||
}
|
||||
|
||||
bolt11payload = await LN.requestBolt11FromLnurlPayService(amountSats, comment);
|
||||
const bolt11payload = await _LN.requestBolt11FromLnurlPayService(amountSats, comment);
|
||||
// @ts-ignore fixme after lnurl.js converted to ts
|
||||
await wallet.payInvoice(bolt11payload.pr);
|
||||
// @ts-ignore fixme after lnurl.js converted to ts
|
||||
const decoded = wallet.decodeInvoice(bolt11payload.pr);
|
||||
setPayButtonDisabled(false);
|
||||
|
||||
// success, probably
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
|
||||
if (wallet.last_paid_invoice_result && wallet.last_paid_invoice_result.payment_preimage) {
|
||||
await LN.storeSuccess(decoded.payment_hash, wallet.last_paid_invoice_result.payment_preimage);
|
||||
await _LN.storeSuccess(decoded.payment_hash, wallet.last_paid_invoice_result.payment_preimage);
|
||||
}
|
||||
|
||||
navigate('ScanLndInvoiceRoot', {
|
||||
@ -159,12 +160,12 @@ const LnurlPay = () => {
|
||||
},
|
||||
});
|
||||
setIsLoading(false);
|
||||
} catch (Err) {
|
||||
console.log(Err.message);
|
||||
} catch (err) {
|
||||
console.log((err as Error).message);
|
||||
setIsLoading(false);
|
||||
setPayButtonDisabled(false);
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
|
||||
return presentAlert({ message: Err.message });
|
||||
return presentAlert({ message: (err as Error).message });
|
||||
}
|
||||
};
|
||||
|
||||
@ -199,11 +200,11 @@ const LnurlPay = () => {
|
||||
const renderGotPayload = () => {
|
||||
return (
|
||||
<SafeArea>
|
||||
<ScrollView contentContainertyle={{ justifyContent: 'space-around' }}>
|
||||
<ScrollView contentContainerStyle={styles.scrollviewContainer}>
|
||||
<BlueCard>
|
||||
<AmountInput
|
||||
isLoading={isLoading}
|
||||
amount={amount && amount.toString()}
|
||||
amount={amount}
|
||||
onAmountUnitChange={setUnit}
|
||||
onChangeText={setAmount}
|
||||
disabled={payload && payload.fixed}
|
||||
@ -236,7 +237,7 @@ const LnurlPay = () => {
|
||||
);
|
||||
};
|
||||
|
||||
return isLoading || wallet === undefined || amount === undefined ? (
|
||||
return isLoading || !wallet || amount === undefined ? (
|
||||
<View style={[styles.root, stylesHook.root]}>
|
||||
<BlueLoading />
|
||||
</View>
|
||||
@ -248,6 +249,7 @@ const LnurlPay = () => {
|
||||
export default LnurlPay;
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
scrollviewContainer: { justifyContent: 'space-around' },
|
||||
img: { width: 200, height: 200, alignSelf: 'center' },
|
||||
alignSelfCenter: {
|
||||
alignSelf: 'center',
|
@ -43,6 +43,9 @@ const LnurlPaySuccess: React.FC = () => {
|
||||
switch (successAction.tag) {
|
||||
case 'aes': {
|
||||
const preimage = lnurl.getPreimage();
|
||||
if (!preimage) {
|
||||
break;
|
||||
}
|
||||
setMessage(Lnurl.decipherAES(successAction.ciphertext, preimage, successAction.iv));
|
||||
setPreamble(successAction.description);
|
||||
break;
|
||||
|
@ -1,6 +1,17 @@
|
||||
import { useFocusEffect, useRoute } from '@react-navigation/native';
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { BackHandler, InteractionManager, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import {
|
||||
BackHandler,
|
||||
Image,
|
||||
InteractionManager,
|
||||
LayoutAnimation,
|
||||
ScrollView,
|
||||
StyleSheet,
|
||||
Text,
|
||||
TextInput,
|
||||
TouchableOpacity,
|
||||
View,
|
||||
} from 'react-native';
|
||||
import Share from 'react-native-share';
|
||||
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
@ -24,6 +35,9 @@ import { SuccessView } from '../send/success';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { HandOffActivityType } from '../../components/types';
|
||||
import SegmentedControl from '../../components/SegmentControl';
|
||||
import ToolTipMenu from '../../components/TooltipMenu';
|
||||
import { Icon } from '@rneui/themed';
|
||||
import { CommonToolTipActions } from '../../typings/CommonToolTipActions';
|
||||
|
||||
const segmentControlValues = [loc.wallets.details_address, loc.bip47.payment_code];
|
||||
|
||||
@ -43,9 +57,9 @@ const ReceiveDetails = () => {
|
||||
const [showConfirmedBalance, setShowConfirmedBalance] = useState(false);
|
||||
const [showAddress, setShowAddress] = useState(false);
|
||||
const [currentTab, setCurrentTab] = useState(segmentControlValues[0]);
|
||||
const { goBack, setParams } = useExtendedNavigation();
|
||||
const { goBack, setParams, setOptions } = useExtendedNavigation();
|
||||
const bottomModalRef = useRef(null);
|
||||
const { colors } = useTheme();
|
||||
const { colors, closeImage } = useTheme();
|
||||
const [intervalMs, setIntervalMs] = useState(5000);
|
||||
const [eta, setEta] = useState('');
|
||||
const [initialConfirmed, setInitialConfirmed] = useState(0);
|
||||
@ -79,15 +93,119 @@ const ReceiveDetails = () => {
|
||||
},
|
||||
});
|
||||
|
||||
const setAddressBIP21Encoded = useCallback(
|
||||
addr => {
|
||||
const newBip21encoded = DeeplinkSchemaMatch.bip21encode(addr);
|
||||
setParams({ address: addr });
|
||||
setBip21encoded(newBip21encoded);
|
||||
setShowAddress(true);
|
||||
},
|
||||
[setParams],
|
||||
);
|
||||
|
||||
const obtainWalletAddress = useCallback(async () => {
|
||||
console.debug('receive/details - componentDidMount');
|
||||
let newAddress;
|
||||
if (address) {
|
||||
setAddressBIP21Encoded(address);
|
||||
await Notifications.tryToObtainPermissions(receiveAddressButton);
|
||||
Notifications.majorTomToGroundControl([address], [], []);
|
||||
} else {
|
||||
if (wallet.chain === Chain.ONCHAIN) {
|
||||
try {
|
||||
if (!isElectrumDisabled) newAddress = await Promise.race([wallet.getAddressAsync(), sleep(1000)]);
|
||||
} catch (_) {}
|
||||
if (newAddress === undefined) {
|
||||
// either sleep expired or getAddressAsync threw an exception
|
||||
console.warn('either sleep expired or getAddressAsync threw an exception');
|
||||
newAddress = wallet._getExternalAddressByIndex(wallet.getNextFreeAddressIndex());
|
||||
} else {
|
||||
saveToDisk(); // caching whatever getAddressAsync() generated internally
|
||||
}
|
||||
} else if (wallet.chain === Chain.OFFCHAIN) {
|
||||
try {
|
||||
await Promise.race([wallet.getAddressAsync(), sleep(1000)]);
|
||||
newAddress = wallet.getAddress();
|
||||
} catch (_) {}
|
||||
if (newAddress === undefined) {
|
||||
// either sleep expired or getAddressAsync threw an exception
|
||||
console.warn('either sleep expired or getAddressAsync threw an exception');
|
||||
newAddress = wallet.getAddress();
|
||||
} else {
|
||||
saveToDisk(); // caching whatever getAddressAsync() generated internally
|
||||
}
|
||||
}
|
||||
setAddressBIP21Encoded(newAddress);
|
||||
await Notifications.tryToObtainPermissions(receiveAddressButton);
|
||||
Notifications.majorTomToGroundControl([newAddress], [], []);
|
||||
}
|
||||
}, [wallet, saveToDisk, address, setAddressBIP21Encoded, isElectrumDisabled, sleep]);
|
||||
|
||||
const onEnablePaymentsCodeSwitchValue = useCallback(() => {
|
||||
if (wallet.allowBIP47()) {
|
||||
wallet.switchBIP47(!wallet.isBIP47Enabled());
|
||||
}
|
||||
saveToDisk();
|
||||
obtainWalletAddress();
|
||||
}, [wallet, saveToDisk, obtainWalletAddress]);
|
||||
|
||||
useEffect(() => {
|
||||
if (showConfirmedBalance) {
|
||||
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
|
||||
}
|
||||
}, [showConfirmedBalance]);
|
||||
|
||||
const toolTipActions = useMemo(() => {
|
||||
const action = CommonToolTipActions.PaymentCode;
|
||||
action.menuState = wallet.isBIP47Enabled();
|
||||
return [action];
|
||||
}, [wallet]);
|
||||
|
||||
const onPressMenuItem = useCallback(() => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
onEnablePaymentsCodeSwitchValue();
|
||||
}, [onEnablePaymentsCodeSwitchValue]);
|
||||
|
||||
const HeaderRight = useMemo(
|
||||
() => (
|
||||
<ToolTipMenu isButton isMenuPrimaryAction onPressMenuItem={onPressMenuItem} actions={[toolTipActions]}>
|
||||
<Icon size={22} name="more-horiz" type="material" color={colors.foregroundColor} />
|
||||
</ToolTipMenu>
|
||||
),
|
||||
[colors.foregroundColor, onPressMenuItem, toolTipActions],
|
||||
);
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
goBack();
|
||||
}, [goBack]);
|
||||
|
||||
const HeaderLeft = useMemo(
|
||||
() => (
|
||||
<TouchableOpacity
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={loc._.close}
|
||||
style={styles.button}
|
||||
onPress={handleClose}
|
||||
testID="NavigationCloseButton"
|
||||
>
|
||||
<Image source={closeImage} />
|
||||
</TouchableOpacity>
|
||||
),
|
||||
[closeImage, handleClose],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
wallet.allowBIP47() &&
|
||||
!wallet.isBIP47Enabled() &&
|
||||
setOptions({
|
||||
headerLeft: () => (wallet.isBIP47Enabled() ? null : HeaderLeft),
|
||||
headerRight: () => (wallet.isBIP47Enabled() ? HeaderLeft : HeaderRight),
|
||||
});
|
||||
}, [HeaderLeft, HeaderRight, colors.foregroundColor, setOptions, wallet]);
|
||||
|
||||
// re-fetching address balance periodically
|
||||
useEffect(() => {
|
||||
console.log('receive/details - useEffect');
|
||||
console.debug('receive/details - useEffect');
|
||||
|
||||
const intervalId = setInterval(async () => {
|
||||
try {
|
||||
@ -95,9 +213,9 @@ const ReceiveDetails = () => {
|
||||
const addressToUse = address || decoded.address;
|
||||
if (!addressToUse) return;
|
||||
|
||||
console.log('checking address', addressToUse, 'for balance...');
|
||||
console.debug('checking address', addressToUse, 'for balance...');
|
||||
const balance = await BlueElectrum.getBalanceByAddress(addressToUse);
|
||||
console.log('...got', balance);
|
||||
console.debug('...got', balance);
|
||||
|
||||
if (balance.unconfirmed > 0) {
|
||||
if (initialConfirmed === 0 && initialUnconfirmed === 0) {
|
||||
@ -157,7 +275,7 @@ const ReceiveDetails = () => {
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.debug(error);
|
||||
}
|
||||
}, intervalMs);
|
||||
|
||||
@ -209,16 +327,6 @@ const ReceiveDetails = () => {
|
||||
return true;
|
||||
};
|
||||
|
||||
const setAddressBIP21Encoded = useCallback(
|
||||
addr => {
|
||||
const newBip21encoded = DeeplinkSchemaMatch.bip21encode(addr);
|
||||
setParams({ address: addr });
|
||||
setBip21encoded(newBip21encoded);
|
||||
setShowAddress(true);
|
||||
},
|
||||
[setParams],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
BackHandler.addEventListener('hardwareBackPress', handleBackButton);
|
||||
|
||||
@ -256,44 +364,6 @@ const ReceiveDetails = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const obtainWalletAddress = useCallback(async () => {
|
||||
console.log('receive/details - componentDidMount');
|
||||
let newAddress;
|
||||
if (address) {
|
||||
setAddressBIP21Encoded(address);
|
||||
await Notifications.tryToObtainPermissions(receiveAddressButton);
|
||||
Notifications.majorTomToGroundControl([address], [], []);
|
||||
} else {
|
||||
if (wallet.chain === Chain.ONCHAIN) {
|
||||
try {
|
||||
if (!isElectrumDisabled) newAddress = await Promise.race([wallet.getAddressAsync(), sleep(1000)]);
|
||||
} catch (_) {}
|
||||
if (newAddress === undefined) {
|
||||
// either sleep expired or getAddressAsync threw an exception
|
||||
console.warn('either sleep expired or getAddressAsync threw an exception');
|
||||
newAddress = wallet._getExternalAddressByIndex(wallet.getNextFreeAddressIndex());
|
||||
} else {
|
||||
saveToDisk(); // caching whatever getAddressAsync() generated internally
|
||||
}
|
||||
} else if (wallet.chain === Chain.OFFCHAIN) {
|
||||
try {
|
||||
await Promise.race([wallet.getAddressAsync(), sleep(1000)]);
|
||||
newAddress = wallet.getAddress();
|
||||
} catch (_) {}
|
||||
if (newAddress === undefined) {
|
||||
// either sleep expired or getAddressAsync threw an exception
|
||||
console.warn('either sleep expired or getAddressAsync threw an exception');
|
||||
newAddress = wallet.getAddress();
|
||||
} else {
|
||||
saveToDisk(); // caching whatever getAddressAsync() generated internally
|
||||
}
|
||||
}
|
||||
setAddressBIP21Encoded(newAddress);
|
||||
await Notifications.tryToObtainPermissions(receiveAddressButton);
|
||||
Notifications.majorTomToGroundControl([newAddress], [], []);
|
||||
}
|
||||
}, [wallet, saveToDisk, address, setAddressBIP21Encoded, isElectrumDisabled, sleep]);
|
||||
|
||||
useFocusEffect(
|
||||
useCallback(() => {
|
||||
const task = InteractionManager.runAfterInteractions(async () => {
|
||||
@ -357,7 +427,7 @@ const ReceiveDetails = () => {
|
||||
|
||||
const handleShareButtonPressed = () => {
|
||||
Share.open({ message: currentTab === loc.wallets.details_address ? bip21encoded : wallet.getBIP47PaymentCode() }).catch(error =>
|
||||
console.log(error),
|
||||
console.debug(error),
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -742,7 +742,7 @@ const SendDetails = () => {
|
||||
const res = await DocumentPicker.pickSingle({
|
||||
type:
|
||||
Platform.OS === 'ios'
|
||||
? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', DocumentPicker.types.plainText, 'public.json']
|
||||
? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', DocumentPicker.types.plainText, DocumentPicker.types.json]
|
||||
: [DocumentPicker.types.allFiles],
|
||||
});
|
||||
|
||||
|
@ -196,7 +196,10 @@ const PsbtWithHardwareWallet = () => {
|
||||
const openSignedTransaction = async () => {
|
||||
try {
|
||||
const res = await DocumentPicker.pickSingle({
|
||||
type: Platform.OS === 'ios' ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn'] : [DocumentPicker.types.allFiles],
|
||||
type:
|
||||
Platform.OS === 'ios'
|
||||
? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', DocumentPicker.types.json]
|
||||
: [DocumentPicker.types.allFiles],
|
||||
});
|
||||
const file = await RNFS.readFile(res.uri);
|
||||
if (file) {
|
||||
|
@ -16,14 +16,7 @@ const styles = StyleSheet.create({
|
||||
|
||||
const GeneralSettings: React.FC = () => {
|
||||
const { wallets } = useStorage();
|
||||
const {
|
||||
isAdvancedModeEnabled,
|
||||
setIsAdvancedModeEnabledStorage,
|
||||
isHandOffUseEnabled,
|
||||
setIsHandOffUseEnabledAsyncStorage,
|
||||
isLegacyURv1Enabled,
|
||||
setIsLegacyURv1EnabledStorage,
|
||||
} = useSettings();
|
||||
const { isHandOffUseEnabled, setIsHandOffUseEnabledAsyncStorage, isLegacyURv1Enabled, setIsLegacyURv1EnabledStorage } = useSettings();
|
||||
const { navigate } = useNavigation();
|
||||
const { colors } = useTheme();
|
||||
|
||||
@ -64,14 +57,6 @@ const GeneralSettings: React.FC = () => {
|
||||
<BlueSpacing20 />
|
||||
</>
|
||||
) : null}
|
||||
<ListItem
|
||||
Component={PressableWrapper}
|
||||
title={loc.settings.general_adv_mode}
|
||||
switch={{ onValueChange: setIsAdvancedModeEnabledStorage, value: isAdvancedModeEnabled, testID: 'AdvancedMode' }}
|
||||
/>
|
||||
<BlueCard>
|
||||
<BlueText>{loc.settings.general_adv_mode_e}</BlueText>
|
||||
</BlueCard>
|
||||
<BlueSpacing20 />
|
||||
<ListItem
|
||||
Component={PressableWrapper}
|
||||
|
@ -1,15 +1,15 @@
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import React, { useEffect, useReducer } from 'react';
|
||||
import React, { useCallback, useEffect, useMemo, useReducer } from 'react';
|
||||
import {
|
||||
ActivityIndicator,
|
||||
Alert,
|
||||
Keyboard,
|
||||
LayoutAnimation,
|
||||
Linking,
|
||||
Platform,
|
||||
ScrollView,
|
||||
StyleSheet,
|
||||
Text,
|
||||
TextInput,
|
||||
useColorScheme,
|
||||
View,
|
||||
@ -21,13 +21,15 @@ import { BlueButtonLink, BlueFormLabel, BlueSpacing20, BlueSpacing40, BlueText }
|
||||
import { BlueApp, HDSegwitBech32Wallet, HDSegwitP2SHWallet, LightningCustodianWallet, SegwitP2SHWallet } from '../../class';
|
||||
import presentAlert from '../../components/Alert';
|
||||
import Button from '../../components/Button';
|
||||
import ListItem from '../../components/ListItem';
|
||||
import { useTheme } from '../../components/themes';
|
||||
import WalletButton from '../../components/WalletButton';
|
||||
import loc from '../../loc';
|
||||
import { Chain } from '../../models/bitcoinUnits';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import ToolTipMenu from '../../components/TooltipMenu';
|
||||
import { Icon } from '@rneui/themed';
|
||||
import { CommonToolTipActions } from '../../typings/CommonToolTipActions';
|
||||
import { Action } from '../../components/types';
|
||||
|
||||
enum ButtonSelected {
|
||||
// @ts-ignore: Return later to update
|
||||
@ -43,7 +45,6 @@ interface State {
|
||||
selectedIndex: number;
|
||||
label: string;
|
||||
selectedWalletType: ButtonSelected;
|
||||
backdoorPressed: number;
|
||||
entropy: Buffer | undefined;
|
||||
entropyButtonText: string;
|
||||
}
|
||||
@ -54,13 +55,12 @@ const ActionTypes = {
|
||||
SET_SELECTED_INDEX: 'SET_SELECTED_INDEX',
|
||||
SET_LABEL: 'SET_LABEL',
|
||||
SET_SELECTED_WALLET_TYPE: 'SET_SELECTED_WALLET_TYPE',
|
||||
INCREMENT_BACKDOOR_PRESSED: 'INCREMENT_BACKDOOR_PRESSED',
|
||||
SET_ENTROPY: 'SET_ENTROPY',
|
||||
SET_ENTROPY_BUTTON_TEXT: 'SET_ENTROPY_BUTTON_TEXT',
|
||||
} as const;
|
||||
type ActionTypes = (typeof ActionTypes)[keyof typeof ActionTypes];
|
||||
|
||||
interface Action {
|
||||
interface TAction {
|
||||
type: ActionTypes;
|
||||
payload?: any;
|
||||
}
|
||||
@ -71,25 +71,22 @@ const initialState: State = {
|
||||
selectedIndex: 0,
|
||||
label: '',
|
||||
selectedWalletType: ButtonSelected.ONCHAIN,
|
||||
backdoorPressed: 1,
|
||||
entropy: undefined,
|
||||
entropyButtonText: loc.wallets.add_entropy_provide,
|
||||
};
|
||||
|
||||
const walletReducer = (state: State, action: Action): State => {
|
||||
const walletReducer = (state: State, action: TAction): State => {
|
||||
switch (action.type) {
|
||||
case ActionTypes.SET_LOADING:
|
||||
return { ...state, isLoading: action.payload };
|
||||
case ActionTypes.SET_WALLET_BASE_URI:
|
||||
return { ...state, walletBaseURI: action.payload };
|
||||
case ActionTypes.SET_SELECTED_INDEX:
|
||||
return { ...state, selectedIndex: action.payload };
|
||||
return { ...state, selectedIndex: action.payload, selectedWalletType: ButtonSelected.ONCHAIN };
|
||||
case ActionTypes.SET_LABEL:
|
||||
return { ...state, label: action.payload };
|
||||
case ActionTypes.SET_SELECTED_WALLET_TYPE:
|
||||
return { ...state, selectedWalletType: action.payload };
|
||||
case ActionTypes.INCREMENT_BACKDOOR_PRESSED:
|
||||
return { ...state, backdoorPressed: state.backdoorPressed + 1 };
|
||||
case ActionTypes.SET_ENTROPY:
|
||||
return { ...state, entropy: action.payload };
|
||||
case ActionTypes.SET_ENTROPY_BUTTON_TEXT:
|
||||
@ -111,10 +108,9 @@ const WalletsAdd: React.FC = () => {
|
||||
const selectedWalletType = state.selectedWalletType;
|
||||
const entropy = state.entropy;
|
||||
const entropyButtonText = state.entropyButtonText;
|
||||
//
|
||||
const colorScheme = useColorScheme();
|
||||
//
|
||||
const { addWallet, saveToDisk } = useStorage();
|
||||
const { isAdvancedModeEnabled } = useSettings();
|
||||
const { navigate, goBack, setOptions } = useNavigation();
|
||||
const stylesHook = {
|
||||
advancedText: {
|
||||
@ -138,20 +134,7 @@ const WalletsAdd: React.FC = () => {
|
||||
},
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
AsyncStorage.getItem(BlueApp.LNDHUB)
|
||||
.then(url => (url ? setWalletBaseURI(url) : setWalletBaseURI('')))
|
||||
.catch(() => setWalletBaseURI(''))
|
||||
.finally(() => setIsLoading(false));
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
setOptions({
|
||||
statusBarStyle: Platform.select({ ios: 'light', default: colorScheme === 'dark' ? 'light' : 'dark' }),
|
||||
});
|
||||
}, [colorScheme, setOptions]);
|
||||
|
||||
const entropyGenerated = (newEntropy: Buffer) => {
|
||||
const entropyGenerated = useCallback((newEntropy: Buffer) => {
|
||||
let entropyTitle;
|
||||
if (!newEntropy) {
|
||||
entropyTitle = loc.wallets.add_entropy_provide;
|
||||
@ -162,8 +145,128 @@ const WalletsAdd: React.FC = () => {
|
||||
}
|
||||
setEntropy(newEntropy);
|
||||
setEntropyButtonText(entropyTitle);
|
||||
}, []);
|
||||
|
||||
const navigateToEntropy = useCallback(() => {
|
||||
Alert.alert(
|
||||
loc.wallets.add_wallet_seed_length,
|
||||
loc.wallets.add_wallet_seed_length_message,
|
||||
[
|
||||
{
|
||||
text: loc._.cancel,
|
||||
onPress: () => {},
|
||||
style: 'default',
|
||||
},
|
||||
{
|
||||
text: loc.wallets.add_wallet_seed_length_12,
|
||||
onPress: () => {
|
||||
// @ts-ignore: Return later to update
|
||||
navigate('ProvideEntropy', { onGenerated: entropyGenerated, words: 12 });
|
||||
},
|
||||
style: 'default',
|
||||
},
|
||||
{
|
||||
text: loc.wallets.add_wallet_seed_length_24,
|
||||
onPress: () => {
|
||||
// @ts-ignore: Return later to update
|
||||
navigate('ProvideEntropy', { onGenerated: entropyGenerated, words: 24 });
|
||||
},
|
||||
style: 'default',
|
||||
},
|
||||
],
|
||||
{ cancelable: true },
|
||||
);
|
||||
}, [entropyGenerated, navigate]);
|
||||
|
||||
const toolTipActions = useMemo(() => {
|
||||
const walletSubactions: Action[] = [
|
||||
{
|
||||
id: HDSegwitBech32Wallet.type,
|
||||
text: `${loc.multisig.native_segwit_title}`,
|
||||
subtitle: 'p2wsh/HD',
|
||||
menuState: selectedIndex === 0 && selectedWalletType === ButtonSelected.ONCHAIN,
|
||||
},
|
||||
{
|
||||
id: SegwitP2SHWallet.type,
|
||||
text: `${loc.multisig.wrapped_segwit_title}`,
|
||||
subtitle: 'p2sh-p2wsh/HD',
|
||||
menuState: selectedIndex === 1 && selectedWalletType === ButtonSelected.ONCHAIN,
|
||||
},
|
||||
{
|
||||
id: HDSegwitP2SHWallet.type,
|
||||
text: `${loc.multisig.legacy_title}`,
|
||||
subtitle: 'p2sh/non-HD',
|
||||
menuState: selectedIndex === 2 && selectedWalletType === ButtonSelected.ONCHAIN,
|
||||
},
|
||||
{
|
||||
id: LightningCustodianWallet.type,
|
||||
text: LightningCustodianWallet.typeReadable,
|
||||
subtitle: LightningCustodianWallet.subtitleReadable,
|
||||
menuState: selectedWalletType === ButtonSelected.OFFCHAIN,
|
||||
},
|
||||
];
|
||||
|
||||
const walletAction: Action = {
|
||||
id: 'wallets',
|
||||
text: loc.multisig.wallet_type,
|
||||
subactions: walletSubactions,
|
||||
displayInline: true,
|
||||
};
|
||||
|
||||
const entropyAction = {
|
||||
...CommonToolTipActions.Entropy,
|
||||
text: entropyButtonText,
|
||||
};
|
||||
|
||||
return [walletAction, entropyAction];
|
||||
}, [entropyButtonText, selectedIndex, selectedWalletType]);
|
||||
|
||||
const handleOnLightningButtonPressed = useCallback(() => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
setSelectedWalletType(ButtonSelected.OFFCHAIN);
|
||||
}, []);
|
||||
|
||||
const HeaderRight = useMemo(
|
||||
() => (
|
||||
<ToolTipMenu
|
||||
isButton
|
||||
isMenuPrimaryAction
|
||||
onPressMenuItem={(id: string) => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
if (id === HDSegwitBech32Wallet.type) {
|
||||
setSelectedIndex(0);
|
||||
} else if (id === SegwitP2SHWallet.type) {
|
||||
setSelectedIndex(1);
|
||||
} else if (id === HDSegwitP2SHWallet.type) {
|
||||
setSelectedIndex(2);
|
||||
} else if (id === LightningCustodianWallet.type) {
|
||||
handleOnLightningButtonPressed();
|
||||
} else if (id === CommonToolTipActions.Entropy.id) {
|
||||
navigateToEntropy();
|
||||
}
|
||||
}}
|
||||
actions={toolTipActions}
|
||||
>
|
||||
<Icon size={22} name="more-horiz" type="material" color={colors.foregroundColor} />
|
||||
</ToolTipMenu>
|
||||
),
|
||||
[colors.foregroundColor, handleOnLightningButtonPressed, navigateToEntropy, toolTipActions],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setOptions({
|
||||
headerRight: () => HeaderRight,
|
||||
statusBarStyle: Platform.select({ ios: 'light', default: colorScheme === 'dark' ? 'light' : 'dark' }),
|
||||
});
|
||||
}, [HeaderRight, colorScheme, colors.foregroundColor, navigateToEntropy, setOptions, toolTipActions]);
|
||||
|
||||
useEffect(() => {
|
||||
AsyncStorage.getItem(BlueApp.LNDHUB)
|
||||
.then(url => (url ? setWalletBaseURI(url) : setWalletBaseURI('')))
|
||||
.catch(() => setWalletBaseURI(''))
|
||||
.finally(() => setIsLoading(false));
|
||||
}, []);
|
||||
|
||||
const setIsLoading = (value: boolean) => {
|
||||
dispatch({ type: 'SET_LOADING', payload: value });
|
||||
};
|
||||
@ -184,10 +287,6 @@ const WalletsAdd: React.FC = () => {
|
||||
dispatch({ type: 'SET_SELECTED_WALLET_TYPE', payload: value });
|
||||
};
|
||||
|
||||
const setBackdoorPressed = (value: number) => {
|
||||
dispatch({ type: 'INCREMENT_BACKDOOR_PRESSED', payload: value });
|
||||
};
|
||||
|
||||
const setEntropy = (value: Buffer) => {
|
||||
dispatch({ type: 'SET_ENTROPY', payload: value });
|
||||
};
|
||||
@ -225,7 +324,6 @@ const WalletsAdd: React.FC = () => {
|
||||
} catch (e: any) {
|
||||
console.log(e.toString());
|
||||
presentAlert({ message: e.toString() });
|
||||
goBack();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@ -291,37 +389,6 @@ const WalletsAdd: React.FC = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const navigateToEntropy = () => {
|
||||
Alert.alert(
|
||||
loc.wallets.add_wallet_seed_length,
|
||||
loc.wallets.add_wallet_seed_length_message,
|
||||
[
|
||||
{
|
||||
text: loc._.cancel,
|
||||
onPress: () => {},
|
||||
style: 'default',
|
||||
},
|
||||
{
|
||||
text: loc.wallets.add_wallet_seed_length_12,
|
||||
onPress: () => {
|
||||
// @ts-ignore: Return later to update
|
||||
navigate('ProvideEntropy', { onGenerated: entropyGenerated, words: 12 });
|
||||
},
|
||||
style: 'default',
|
||||
},
|
||||
{
|
||||
text: loc.wallets.add_wallet_seed_length_24,
|
||||
onPress: () => {
|
||||
// @ts-ignore: Return later to update
|
||||
navigate('ProvideEntropy', { onGenerated: entropyGenerated, words: 24 });
|
||||
},
|
||||
style: 'default',
|
||||
},
|
||||
],
|
||||
{ cancelable: true },
|
||||
);
|
||||
};
|
||||
|
||||
const navigateToImportWallet = () => {
|
||||
// @ts-ignore: Return later to update
|
||||
navigate('ImportWallet');
|
||||
@ -339,14 +406,8 @@ const WalletsAdd: React.FC = () => {
|
||||
setSelectedWalletType(ButtonSelected.ONCHAIN);
|
||||
};
|
||||
|
||||
const handleOnLightningButtonPressed = () => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
// @ts-ignore: Return later to update
|
||||
setBackdoorPressed((prevState: number) => {
|
||||
return prevState + 1;
|
||||
});
|
||||
Keyboard.dismiss();
|
||||
setSelectedWalletType(ButtonSelected.OFFCHAIN);
|
||||
const onLearnMorePressed = () => {
|
||||
Linking.openURL('https://bluewallet.io/lightning/');
|
||||
};
|
||||
|
||||
return (
|
||||
@ -374,12 +435,6 @@ const WalletsAdd: React.FC = () => {
|
||||
onPress={handleOnBitcoinButtonPressed}
|
||||
size={styles.button}
|
||||
/>
|
||||
<WalletButton
|
||||
buttonType="Lightning"
|
||||
active={selectedWalletType === ButtonSelected.OFFCHAIN}
|
||||
onPress={handleOnLightningButtonPressed}
|
||||
size={styles.button}
|
||||
/>
|
||||
<WalletButton
|
||||
buttonType="Vault"
|
||||
testID="ActivateVaultButton"
|
||||
@ -390,42 +445,14 @@ const WalletsAdd: React.FC = () => {
|
||||
</View>
|
||||
|
||||
<View style={styles.advanced}>
|
||||
{(() => {
|
||||
if (selectedWalletType === ButtonSelected.ONCHAIN && isAdvancedModeEnabled) {
|
||||
return (
|
||||
<View>
|
||||
<BlueSpacing20 />
|
||||
<Text style={[styles.advancedText, stylesHook.advancedText]}>{loc.settings.advanced_options}</Text>
|
||||
<ListItem
|
||||
containerStyle={[styles.noPadding, stylesHook.noPadding]}
|
||||
bottomDivider={false}
|
||||
onPress={() => setSelectedIndex(0)}
|
||||
title={HDSegwitBech32Wallet.typeReadable}
|
||||
checkmark={selectedIndex === 0}
|
||||
/>
|
||||
<ListItem
|
||||
containerStyle={[styles.noPadding, stylesHook.noPadding]}
|
||||
bottomDivider={false}
|
||||
onPress={() => setSelectedIndex(1)}
|
||||
title={SegwitP2SHWallet.typeReadable}
|
||||
checkmark={selectedIndex === 1}
|
||||
/>
|
||||
<ListItem
|
||||
containerStyle={[styles.noPadding, stylesHook.noPadding]}
|
||||
bottomDivider={false}
|
||||
onPress={() => setSelectedIndex(2)}
|
||||
title={HDSegwitP2SHWallet.typeReadable}
|
||||
checkmark={selectedIndex === 2}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
} else if (selectedWalletType === ButtonSelected.OFFCHAIN) {
|
||||
return (
|
||||
{selectedWalletType === ButtonSelected.OFFCHAIN && (
|
||||
<>
|
||||
<BlueSpacing20 />
|
||||
<Text style={[styles.advancedText, stylesHook.advancedText]}>{loc.settings.advanced_options}</Text>
|
||||
<BlueSpacing20 />
|
||||
<View style={styles.lndhubTitle}>
|
||||
<BlueText>{loc.wallets.add_lndhub}</BlueText>
|
||||
<BlueButtonLink title={loc.wallets.learn_more} onPress={onLearnMorePressed} />
|
||||
</View>
|
||||
|
||||
<View style={[styles.lndUri, stylesHook.lndUri]}>
|
||||
<TextInput
|
||||
value={walletBaseURI}
|
||||
@ -443,12 +470,8 @@ const WalletsAdd: React.FC = () => {
|
||||
/>
|
||||
</View>
|
||||
</>
|
||||
);
|
||||
}
|
||||
})()}
|
||||
{isAdvancedModeEnabled === true && selectedWalletType === ButtonSelected.ONCHAIN && !isLoading && (
|
||||
<BlueButtonLink style={styles.import} title={entropyButtonText} onPress={navigateToEntropy} />
|
||||
)}
|
||||
|
||||
<BlueSpacing20 />
|
||||
{!isLoading ? (
|
||||
<>
|
||||
@ -508,9 +531,6 @@ const styles = StyleSheet.create({
|
||||
advanced: {
|
||||
marginHorizontal: 20,
|
||||
},
|
||||
advancedText: {
|
||||
fontWeight: '500',
|
||||
},
|
||||
lndUri: {
|
||||
flexDirection: 'row',
|
||||
borderWidth: 1,
|
||||
@ -524,8 +544,10 @@ const styles = StyleSheet.create({
|
||||
import: {
|
||||
marginVertical: 24,
|
||||
},
|
||||
noPadding: {
|
||||
paddingHorizontal: 0,
|
||||
lndhubTitle: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import React, { useEffect, useState, useRef, useCallback } from 'react';
|
||||
import { useNavigationState, useRoute, RouteProp } from '@react-navigation/native';
|
||||
import { ActivityIndicator, StyleSheet, View } from 'react-native';
|
||||
import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback';
|
||||
@ -39,16 +39,6 @@ const SelectWallet: React.FC = () => {
|
||||
const walletsCarousel = useRef(null);
|
||||
const previousRouteName = useNavigationState(state => state.routes[state.routes.length - 2]?.name);
|
||||
|
||||
let data = !onChainRequireSend
|
||||
? wallets.filter(item => item.chain === Chain.ONCHAIN)
|
||||
: chainType
|
||||
? wallets.filter(item => item.chain === chainType && item.allowSend())
|
||||
: wallets.filter(item => item.allowSend());
|
||||
|
||||
if (availableWallets && availableWallets.length > 0) {
|
||||
data = availableWallets;
|
||||
}
|
||||
|
||||
const stylesHook = StyleSheet.create({
|
||||
loading: {
|
||||
backgroundColor: colors.background,
|
||||
@ -60,11 +50,27 @@ const SelectWallet: React.FC = () => {
|
||||
setIsLoading(false);
|
||||
}, []);
|
||||
|
||||
const filterWallets = useCallback(() => {
|
||||
if (availableWallets && availableWallets.length > 0) {
|
||||
return availableWallets;
|
||||
}
|
||||
|
||||
if (!onChainRequireSend && chainType === Chain.ONCHAIN) {
|
||||
return wallets.filter(item => item.chain === Chain.ONCHAIN);
|
||||
}
|
||||
|
||||
if (chainType) {
|
||||
return wallets.filter(item => item.chain === chainType && item.allowSend());
|
||||
}
|
||||
|
||||
return wallets.filter(item => item.allowSend());
|
||||
}, [availableWallets, chainType, onChainRequireSend, wallets]);
|
||||
|
||||
useEffect(() => {
|
||||
setOptions({
|
||||
statusBarStyle: isLoading || data.length === 0 ? 'light' : 'auto',
|
||||
statusBarStyle: isLoading || (availableWallets || filterWallets()).length === 0 ? 'light' : 'auto',
|
||||
});
|
||||
}, [isLoading, data.length, setOptions]);
|
||||
}, [isLoading, availableWallets, setOptions, filterWallets]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isModal) {
|
||||
@ -87,7 +93,11 @@ const SelectWallet: React.FC = () => {
|
||||
<ActivityIndicator />
|
||||
</View>
|
||||
);
|
||||
} else if (data.length <= 0) {
|
||||
}
|
||||
|
||||
const filteredWallets = filterWallets();
|
||||
|
||||
if (filteredWallets.length <= 0) {
|
||||
return (
|
||||
<SafeArea>
|
||||
<View style={styles.noWallets}>
|
||||
@ -97,13 +107,20 @@ const SelectWallet: React.FC = () => {
|
||||
</View>
|
||||
</SafeArea>
|
||||
);
|
||||
} else {
|
||||
}
|
||||
|
||||
return (
|
||||
<View style={styles.walletsCarousel}>
|
||||
<WalletsCarousel data={data} scrollEnabled onPress={onPress} ref={walletsCarousel} testID="WalletsList" horizontal={false} />
|
||||
<WalletsCarousel
|
||||
data={filteredWallets}
|
||||
scrollEnabled
|
||||
onPress={onPress}
|
||||
ref={walletsCarousel}
|
||||
testID="WalletsList"
|
||||
horizontal={false}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default SelectWallet;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import React, { useCallback, useRef, useState } from 'react';
|
||||
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
||||
import { useFocusEffect, useRoute } from '@react-navigation/native';
|
||||
import {
|
||||
ActivityIndicator,
|
||||
@ -11,7 +11,6 @@ import {
|
||||
ListRenderItemInfo,
|
||||
Platform,
|
||||
StyleSheet,
|
||||
Switch,
|
||||
Text,
|
||||
View,
|
||||
} from 'react-native';
|
||||
@ -20,12 +19,11 @@ import { isDesktop } from '../../blue_modules/environment';
|
||||
import { encodeUR } from '../../blue_modules/ur';
|
||||
import {
|
||||
BlueButtonLink,
|
||||
BlueCard,
|
||||
BlueFormMultiInput,
|
||||
BlueLoading,
|
||||
BlueSpacing10,
|
||||
BlueSpacing20,
|
||||
BlueSpacing40,
|
||||
BlueText,
|
||||
BlueTextCentered,
|
||||
} from '../../BlueComponents';
|
||||
import { HDSegwitBech32Wallet, MultisigCosigner, MultisigHDWallet } from '../../class';
|
||||
@ -49,14 +47,14 @@ import usePrivacy from '../../hooks/usePrivacy';
|
||||
import loc from '../../loc';
|
||||
import ActionSheet from '../ActionSheet';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import ToolTipMenu from '../../components/TooltipMenu';
|
||||
import { CommonToolTipActions } from '../../typings/CommonToolTipActions';
|
||||
|
||||
const ViewEditMultisigCosigners: React.FC = () => {
|
||||
const hasLoaded = useRef(false);
|
||||
const { colors } = useTheme();
|
||||
const { wallets, setWalletsWithNewOrder, isElectrumDisabled } = useStorage();
|
||||
const { isBiometricUseCapableAndEnabled } = useBiometrics();
|
||||
const { isAdvancedModeEnabled } = useSettings();
|
||||
const { navigate, dispatch, addListener } = useExtendedNavigation();
|
||||
const openScannerButtonRef = useRef();
|
||||
const route = useRoute();
|
||||
@ -97,6 +95,9 @@ const ViewEditMultisigCosigners: React.FC = () => {
|
||||
vaultKeyText: {
|
||||
color: colors.alternativeTextColor,
|
||||
},
|
||||
askPassphrase: {
|
||||
backgroundColor: colors.lightButton,
|
||||
},
|
||||
vaultKeyCircleSuccess: {
|
||||
backgroundColor: colors.msSuccessBG,
|
||||
},
|
||||
@ -523,6 +524,12 @@ const ViewEditMultisigCosigners: React.FC = () => {
|
||||
|
||||
const hideShareModal = () => {};
|
||||
|
||||
const toolTipActions = useMemo(() => {
|
||||
const passphrase = CommonToolTipActions.Passphrase;
|
||||
passphrase.menuState = askPassphrase;
|
||||
return [passphrase];
|
||||
}, [askPassphrase]);
|
||||
|
||||
const renderProvideMnemonicsModal = () => {
|
||||
return (
|
||||
<BottomModal
|
||||
@ -545,18 +552,24 @@ const ViewEditMultisigCosigners: React.FC = () => {
|
||||
</>
|
||||
}
|
||||
>
|
||||
<>
|
||||
<ToolTipMenu
|
||||
isButton
|
||||
isMenuPrimaryAction
|
||||
onPressMenuItem={(id: string) => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
setAskPassphrase(!askPassphrase);
|
||||
}}
|
||||
actions={toolTipActions}
|
||||
style={[styles.askPassprase, stylesHook.askPassphrase]}
|
||||
>
|
||||
<Icon size={22} name="more-horiz" type="material" color={colors.foregroundColor} />
|
||||
</ToolTipMenu>
|
||||
|
||||
<BlueTextCentered>{loc.multisig.type_your_mnemonics}</BlueTextCentered>
|
||||
<BlueSpacing20 />
|
||||
<BlueFormMultiInput value={importText} onChangeText={setImportText} />
|
||||
{isAdvancedModeEnabled && (
|
||||
<>
|
||||
<BlueSpacing10 />
|
||||
<View style={styles.row}>
|
||||
<BlueText>{loc.wallets.import_passphrase}</BlueText>
|
||||
<Switch testID="AskPassphrase" value={askPassphrase} onValueChange={setAskPassphrase} />
|
||||
</View>
|
||||
</>
|
||||
)}
|
||||
</BottomModal>
|
||||
);
|
||||
};
|
||||
@ -639,10 +652,11 @@ const ViewEditMultisigCosigners: React.FC = () => {
|
||||
contentInsetAdjustmentBehavior="automatic"
|
||||
automaticallyAdjustContentInsets
|
||||
keyExtractor={(_item, index) => `${index}`}
|
||||
contentContainerStyle={styles.contentContainerStyle}
|
||||
/>
|
||||
<BlueSpacing10 />
|
||||
{footer}
|
||||
<BlueSpacing40 />
|
||||
<BlueCard>{footer}</BlueCard>
|
||||
<BlueSpacing20 />
|
||||
|
||||
{renderProvideMnemonicsModal()}
|
||||
|
||||
@ -665,6 +679,7 @@ const styles = StyleSheet.create({
|
||||
paddingTop: 32,
|
||||
minHeight: 370,
|
||||
},
|
||||
contentContainerStyle: { padding: 16 },
|
||||
modalContent: {
|
||||
padding: 22,
|
||||
justifyContent: 'center',
|
||||
@ -700,12 +715,8 @@ const styles = StyleSheet.create({
|
||||
tipLabelText: {
|
||||
fontWeight: '500',
|
||||
},
|
||||
row: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
marginHorizontal: 16,
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
|
||||
askPassprase: { top: 0, left: 0, justifyContent: 'center', width: 33, height: 33, borderRadius: 33 / 2 },
|
||||
});
|
||||
|
||||
export default ViewEditMultisigCosigners;
|
||||
|
@ -11,7 +11,6 @@ import ListItem from '../../components/ListItem';
|
||||
import SafeArea from '../../components/SafeArea';
|
||||
import { useTheme } from '../../components/themes';
|
||||
import loc from '../../loc';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
import { AddWalletStackParamList } from '../../navigation/AddWalletStack';
|
||||
@ -27,7 +26,6 @@ const WalletsAddMultisig: React.FC = () => {
|
||||
const [m, setM] = useState(2);
|
||||
const [n, setN] = useState(3);
|
||||
const [format, setFormat] = useState(MultisigHDWallet.FORMAT_P2WSH);
|
||||
const { isAdvancedModeEnabled } = useSettings();
|
||||
|
||||
const stylesHook = StyleSheet.create({
|
||||
root: {
|
||||
@ -202,7 +200,6 @@ const WalletsAddMultisig: React.FC = () => {
|
||||
</Text>
|
||||
</Text>
|
||||
</View>
|
||||
{isAdvancedModeEnabled && (
|
||||
<View>
|
||||
<ListItem
|
||||
testID="VaultAdvancedCustomize"
|
||||
@ -212,7 +209,7 @@ const WalletsAddMultisig: React.FC = () => {
|
||||
chevron
|
||||
/>
|
||||
</View>
|
||||
)}
|
||||
|
||||
<View style={styles.buttonContainer}>
|
||||
<Button
|
||||
testID="LetsStart"
|
||||
|
@ -1,4 +1,4 @@
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useFocusEffect, useRoute } from '@react-navigation/native';
|
||||
import {
|
||||
ActivityIndicator,
|
||||
@ -8,7 +8,6 @@ import {
|
||||
LayoutAnimation,
|
||||
Platform,
|
||||
StyleSheet,
|
||||
Switch,
|
||||
Text,
|
||||
TouchableOpacity,
|
||||
View,
|
||||
@ -17,7 +16,7 @@ import { Icon } from '@rneui/themed';
|
||||
import A from '../../blue_modules/analytics';
|
||||
import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback';
|
||||
import { encodeUR } from '../../blue_modules/ur';
|
||||
import { BlueButtonLink, BlueFormMultiInput, BlueSpacing10, BlueSpacing20, BlueText, BlueTextCentered } from '../../BlueComponents';
|
||||
import { BlueButtonLink, BlueFormMultiInput, BlueSpacing10, BlueSpacing20, BlueTextCentered } from '../../BlueComponents';
|
||||
import { HDSegwitBech32Wallet, MultisigCosigner, MultisigHDWallet } from '../../class';
|
||||
import presentAlert from '../../components/Alert';
|
||||
import BottomModal from '../../components/BottomModal';
|
||||
@ -35,15 +34,15 @@ import prompt from '../../helpers/prompt';
|
||||
import usePrivacy from '../../hooks/usePrivacy';
|
||||
import loc from '../../loc';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import { scanQrHelper } from '../../helpers/scan-qr';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
import ToolTipMenu from '../../components/TooltipMenu';
|
||||
import { CommonToolTipActions } from '../../typings/CommonToolTipActions';
|
||||
|
||||
const staticCache = {};
|
||||
|
||||
const WalletsAddMultisigStep2 = () => {
|
||||
const { addWallet, saveToDisk, isElectrumDisabled, sleep, currentSharedCosigner, setSharedCosigner } = useStorage();
|
||||
const { isAdvancedModeEnabled } = useSettings();
|
||||
const { colors } = useTheme();
|
||||
|
||||
const { navigate, navigateToWalletsList } = useExtendedNavigation();
|
||||
@ -108,6 +107,9 @@ const WalletsAddMultisigStep2 = () => {
|
||||
root: {
|
||||
backgroundColor: colors.elevated,
|
||||
},
|
||||
askPassphrase: {
|
||||
backgroundColor: colors.lightButton,
|
||||
},
|
||||
textDestination: {
|
||||
color: colors.foregroundColor,
|
||||
},
|
||||
@ -611,6 +613,12 @@ const WalletsAddMultisigStep2 = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const toolTipActions = useMemo(() => {
|
||||
const passphrase = CommonToolTipActions.Passphrase;
|
||||
passphrase.menuState = askPassphrase;
|
||||
return [passphrase];
|
||||
}, [askPassphrase]);
|
||||
|
||||
const renderProvideMnemonicsModal = () => {
|
||||
return (
|
||||
<BottomModal
|
||||
@ -648,18 +656,24 @@ const WalletsAddMultisigStep2 = () => {
|
||||
setAskPassphrase(false);
|
||||
}}
|
||||
>
|
||||
<>
|
||||
<ToolTipMenu
|
||||
isButton
|
||||
isMenuPrimaryAction
|
||||
onPressMenuItem={_id => {
|
||||
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
|
||||
setAskPassphrase(!askPassphrase);
|
||||
}}
|
||||
actions={toolTipActions}
|
||||
style={[styles.askPassprase, stylesHook.askPassphrase]}
|
||||
>
|
||||
<Icon size={22} name="more-horiz" type="material" color={colors.foregroundColor} />
|
||||
</ToolTipMenu>
|
||||
|
||||
<BlueTextCentered>{loc.multisig.type_your_mnemonics}</BlueTextCentered>
|
||||
<BlueSpacing20 />
|
||||
<BlueFormMultiInput value={importText} onChangeText={setImportText} />
|
||||
{isAdvancedModeEnabled && (
|
||||
<>
|
||||
<BlueSpacing10 />
|
||||
<View style={styles.row}>
|
||||
<BlueText>{loc.wallets.import_passphrase}</BlueText>
|
||||
<Switch testID="AskPassphrase" value={askPassphrase} onValueChange={setAskPassphrase} />
|
||||
</View>
|
||||
</>
|
||||
)}
|
||||
</BottomModal>
|
||||
);
|
||||
};
|
||||
@ -798,6 +812,8 @@ const styles = StyleSheet.create({
|
||||
paddingRight: 8,
|
||||
borderRadius: 4,
|
||||
},
|
||||
askPassprase: { top: 0, left: 0, justifyContent: 'center', width: 33, height: 33, borderRadius: 33 / 2 },
|
||||
|
||||
secretContainer: {
|
||||
flexDirection: I18nManager.isRTL ? 'row-reverse' : 'row',
|
||||
justifyContent: 'flex-start',
|
||||
@ -829,12 +845,6 @@ const styles = StyleSheet.create({
|
||||
fontWeight: 'bold',
|
||||
marginLeft: 8,
|
||||
},
|
||||
row: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
marginHorizontal: 16,
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
});
|
||||
|
||||
export default WalletsAddMultisigStep2;
|
||||
|
@ -41,10 +41,9 @@ import { unlockWithBiometrics, useBiometrics } from '../../hooks/useBiometrics';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
import loc, { formatBalanceWithoutSuffix } from '../../loc';
|
||||
import { BitcoinUnit, Chain } from '../../models/bitcoinUnits';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import { useStorage } from '../../hooks/context/useStorage';
|
||||
import { popToTop } from '../../NavigationService';
|
||||
import { useRoute } from '@react-navigation/native';
|
||||
import { useFocusEffect, useRoute } from '@react-navigation/native';
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
scrollViewContent: {
|
||||
@ -113,7 +112,6 @@ 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 { isAdvancedModeEnabled } = useSettings();
|
||||
const [isBIP47Enabled, setIsBIP47Enabled] = useState(wallet.isBIP47Enabled());
|
||||
const [isContactsVisible, setIsContactsVisible] = useState(wallet.allowBIP47() && wallet.isBIP47Enabled());
|
||||
const [hideTransactionsInWalletsList, setHideTransactionsInWalletsList] = useState(!wallet.getHideTransactionsInWalletsList());
|
||||
@ -138,13 +136,17 @@ const WalletDetails = () => {
|
||||
setIsContactsVisible(isBIP47Enabled);
|
||||
}, [isBIP47Enabled]);
|
||||
|
||||
useEffect(() => {
|
||||
if (isAdvancedModeEnabled && wallet.allowMasterFingerprint()) {
|
||||
InteractionManager.runAfterInteractions(() => {
|
||||
useFocusEffect(
|
||||
useCallback(() => {
|
||||
const task = InteractionManager.runAfterInteractions(() => {
|
||||
if (wallet.allowMasterFingerprint()) {
|
||||
setMasterFingerprint(wallet.getMasterFingerprintHex());
|
||||
});
|
||||
}
|
||||
}, [isAdvancedModeEnabled, wallet]);
|
||||
});
|
||||
|
||||
return () => task.cancel();
|
||||
}, [wallet]),
|
||||
);
|
||||
const stylesHook = StyleSheet.create({
|
||||
textLabel1: {
|
||||
color: colors.feeText,
|
||||
@ -541,13 +543,10 @@ const WalletDetails = () => {
|
||||
</View>
|
||||
</>
|
||||
)}
|
||||
{isAdvancedModeEnabled && (
|
||||
<View style={styles.row}>
|
||||
{wallet.allowMasterFingerprint() && (
|
||||
<View style={styles.marginRight16}>
|
||||
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>
|
||||
{loc.wallets.details_master_fingerprint.toLowerCase()}
|
||||
</Text>
|
||||
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.details_master_fingerprint.toLowerCase()}</Text>
|
||||
<BlueText>{masterFingerprint ?? <ActivityIndicator />}</BlueText>
|
||||
</View>
|
||||
)}
|
||||
@ -559,7 +558,6 @@ const WalletDetails = () => {
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
</BlueCard>
|
||||
{(wallet instanceof AbstractHDElectrumWallet || (wallet.type === WatchOnlyWallet.type && wallet.isHd())) && (
|
||||
|
@ -1,28 +1,29 @@
|
||||
import { useNavigation, useRoute } from '@react-navigation/native';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { Keyboard, Platform, StyleSheet, Switch, TouchableWithoutFeedback, View } from 'react-native';
|
||||
|
||||
import { BlueButtonLink, BlueFormLabel, BlueFormMultiInput, BlueSpacing20, BlueText } from '../../BlueComponents';
|
||||
import React, { useEffect, useState, useMemo, useCallback } from 'react';
|
||||
import { useRoute } from '@react-navigation/native';
|
||||
import { Keyboard, Platform, StyleSheet, TouchableWithoutFeedback, View, ScrollView } from 'react-native';
|
||||
import { BlueButtonLink, BlueFormLabel, BlueFormMultiInput, BlueSpacing20 } from '../../BlueComponents';
|
||||
import Button from '../../components/Button';
|
||||
import SafeArea from '../../components/SafeArea';
|
||||
import { useTheme } from '../../components/themes';
|
||||
import { requestCameraAuthorization } from '../../helpers/scan-qr';
|
||||
import usePrivacy from '../../hooks/usePrivacy';
|
||||
import loc from '../../loc';
|
||||
import { useSettings } from '../../hooks/context/useSettings';
|
||||
import {
|
||||
DoneAndDismissKeyboardInputAccessory,
|
||||
DoneAndDismissKeyboardInputAccessoryViewID,
|
||||
} from '../../components/DoneAndDismissKeyboardInputAccessory';
|
||||
import { Icon } from '@rneui/themed';
|
||||
import { CommonToolTipActions } from '../../typings/CommonToolTipActions';
|
||||
import { useKeyboard } from '../../hooks/useKeyboard';
|
||||
import ToolTipMenu from '../../components/TooltipMenu';
|
||||
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
|
||||
|
||||
const WalletsImport = () => {
|
||||
const navigation = useNavigation();
|
||||
const navigation = useExtendedNavigation();
|
||||
const { colors } = useTheme();
|
||||
const route = useRoute();
|
||||
const label = route?.params?.label ?? '';
|
||||
const triggerImport = route?.params?.triggerImport ?? false;
|
||||
const scannedData = route?.params?.scannedData ?? '';
|
||||
const { isAdvancedModeEnabled } = useSettings();
|
||||
const [importText, setImportText] = useState(label);
|
||||
const [isToolbarVisibleForAndroid, setIsToolbarVisibleForAndroid] = useState(false);
|
||||
const [, setSpeedBackdoor] = useState(0);
|
||||
@ -30,23 +31,18 @@ const WalletsImport = () => {
|
||||
const [askPassphrase, setAskPassphrase] = useState(false);
|
||||
const { enableBlur, disableBlur } = usePrivacy();
|
||||
|
||||
// Styles
|
||||
const styles = StyleSheet.create({
|
||||
root: {
|
||||
paddingTop: 10,
|
||||
backgroundColor: colors.elevated,
|
||||
flex: 1,
|
||||
},
|
||||
center: {
|
||||
flex: 1,
|
||||
marginHorizontal: 16,
|
||||
backgroundColor: colors.elevated,
|
||||
},
|
||||
row: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
marginHorizontal: 16,
|
||||
marginTop: 10,
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
});
|
||||
|
||||
const onBlur = () => {
|
||||
@ -55,18 +51,18 @@ const WalletsImport = () => {
|
||||
return valueWithSingleWhitespace;
|
||||
};
|
||||
|
||||
useKeyboard({
|
||||
onKeyboardDidShow: () => {
|
||||
setIsToolbarVisibleForAndroid(true);
|
||||
},
|
||||
onKeyboardDidHide: () => {
|
||||
setIsToolbarVisibleForAndroid(false);
|
||||
},
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
enableBlur();
|
||||
|
||||
const showSubscription = Keyboard.addListener(Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow', () =>
|
||||
setIsToolbarVisibleForAndroid(true),
|
||||
);
|
||||
const hideSubscription = Keyboard.addListener(Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide', () =>
|
||||
setIsToolbarVisibleForAndroid(false),
|
||||
);
|
||||
return () => {
|
||||
showSubscription.remove();
|
||||
hideSubscription.remove();
|
||||
disableBlur();
|
||||
};
|
||||
}, [disableBlur, enableBlur]);
|
||||
@ -122,21 +118,51 @@ const WalletsImport = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const toolTipOnPressMenuItem = useCallback(
|
||||
menuItem => {
|
||||
if (menuItem === CommonToolTipActions.Passphrase.id) {
|
||||
setAskPassphrase(!askPassphrase);
|
||||
} else if (menuItem === CommonToolTipActions.SearchAccount.id) {
|
||||
setSearchAccounts(!searchAccounts);
|
||||
}
|
||||
},
|
||||
[askPassphrase, searchAccounts],
|
||||
);
|
||||
|
||||
// ToolTipMenu actions for advanced options
|
||||
const toolTipActions = useMemo(() => {
|
||||
const askPassphraseAction = CommonToolTipActions.Passphrase;
|
||||
askPassphraseAction.menuState = askPassphrase;
|
||||
|
||||
const searchAccountsAction = CommonToolTipActions.SearchAccount;
|
||||
searchAccountsAction.menuState = searchAccounts;
|
||||
return [askPassphraseAction, searchAccountsAction];
|
||||
}, [askPassphrase, searchAccounts]);
|
||||
|
||||
const HeaderRight = useMemo(
|
||||
() => (
|
||||
<ToolTipMenu
|
||||
isButton
|
||||
testID="HeaderRightButton"
|
||||
isMenuPrimaryAction
|
||||
onPressMenuItem={toolTipOnPressMenuItem}
|
||||
actions={toolTipActions}
|
||||
>
|
||||
<Icon size={22} name="more-horiz" type="material" color={colors.foregroundColor} />
|
||||
</ToolTipMenu>
|
||||
),
|
||||
[toolTipOnPressMenuItem, toolTipActions, colors.foregroundColor],
|
||||
);
|
||||
|
||||
// Adding the ToolTipMenu to the header
|
||||
useEffect(() => {
|
||||
navigation.setOptions({
|
||||
headerRight: () => HeaderRight,
|
||||
});
|
||||
}, [askPassphrase, searchAccounts, colors.foregroundColor, navigation, toolTipActions, HeaderRight]);
|
||||
|
||||
const renderOptionsAndImportButton = (
|
||||
<>
|
||||
{isAdvancedModeEnabled && (
|
||||
<>
|
||||
<View style={styles.row}>
|
||||
<BlueText>{loc.wallets.import_passphrase}</BlueText>
|
||||
<Switch testID="AskPassphrase" value={askPassphrase} onValueChange={setAskPassphrase} />
|
||||
</View>
|
||||
<View style={styles.row}>
|
||||
<BlueText>{loc.wallets.import_search_accounts}</BlueText>
|
||||
<Switch testID="SearchAccounts" value={searchAccounts} onValueChange={setSearchAccounts} />
|
||||
</View>
|
||||
</>
|
||||
)}
|
||||
|
||||
<BlueSpacing20 />
|
||||
<View style={styles.center}>
|
||||
<>
|
||||
@ -154,7 +180,14 @@ const WalletsImport = () => {
|
||||
);
|
||||
|
||||
return (
|
||||
<SafeArea style={styles.root}>
|
||||
<ScrollView
|
||||
contentContainerStyle={styles.root}
|
||||
automaticallyAdjustContentInsets
|
||||
automaticallyAdjustsScrollIndicatorInsets
|
||||
keyboardShouldPersistTaps
|
||||
automaticallyAdjustKeyboardInsets
|
||||
contentInsetAdjustmentBehavior="automatic"
|
||||
>
|
||||
<BlueSpacing20 />
|
||||
<TouchableWithoutFeedback accessibilityRole="button" onPress={speedBackdoorTap} testID="SpeedBackdoor">
|
||||
<BlueFormLabel>{loc.wallets.import_explanation}</BlueFormLabel>
|
||||
@ -194,7 +227,7 @@ const WalletsImport = () => {
|
||||
/>
|
||||
),
|
||||
})}
|
||||
</SafeArea>
|
||||
</ScrollView>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -1,17 +1,7 @@
|
||||
import assert from 'assert';
|
||||
import * as bitcoin from 'bitcoinjs-lib';
|
||||
|
||||
import {
|
||||
expectToBeVisible,
|
||||
extractTextFromElementById,
|
||||
hashIt,
|
||||
helperCreateWallet,
|
||||
helperDeleteWallet,
|
||||
helperSwitchAdvancedMode,
|
||||
sleep,
|
||||
sup,
|
||||
yo,
|
||||
} from './helperz';
|
||||
import { expectToBeVisible, extractTextFromElementById, hashIt, helperCreateWallet, helperDeleteWallet, sleep, sup, yo } from './helperz';
|
||||
import { element } from 'detox';
|
||||
|
||||
/**
|
||||
@ -64,14 +54,8 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
await element(by.id('QuickActionsSwitch')).tap();
|
||||
await element(by.id('QuickActionsSwitch')).tap();
|
||||
await device.pressBack();
|
||||
await device.pressBack();
|
||||
|
||||
// enable AdvancedMode
|
||||
await element(by.id('AdvancedMode')).tap();
|
||||
await device.pressBack();
|
||||
// disable it:
|
||||
await element(by.id('GeneralSettings')).tap();
|
||||
await element(by.id('AdvancedMode')).tap();
|
||||
await device.pressBack();
|
||||
//
|
||||
// currency
|
||||
// change currency to ARS ($) and switch it back to USD ($)
|
||||
@ -472,7 +456,6 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis');
|
||||
}
|
||||
await device.launchApp({ delete: true }); // reinstalling the app just for any case to clean up app's storage
|
||||
await helperSwitchAdvancedMode();
|
||||
await yo('WalletsList');
|
||||
await element(by.id('WalletsList')).swipe('left', 'fast', 1); // in case emu screen is small and it doesnt fit
|
||||
await sleep(200); // Wait until bounce animation finishes.
|
||||
@ -542,7 +525,6 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
|
||||
await device.pressBack();
|
||||
await helperDeleteWallet('Multisig Vault');
|
||||
await helperSwitchAdvancedMode(); // turn off advanced mode
|
||||
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
|
||||
});
|
||||
|
||||
@ -686,9 +668,6 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
await device.launchApp({ delete: true }); // reinstalling the app just for any case to clean up app's storage
|
||||
await yo('WalletsList');
|
||||
|
||||
// enable AdvancedMode to see derivation path in wallet details
|
||||
await helperSwitchAdvancedMode();
|
||||
|
||||
await element(by.id('WalletsList')).swipe('left', 'fast', 1); // in case emu screen is small and it doesnt fit
|
||||
await sleep(200); // Wait until bounce animation finishes.
|
||||
// going to Import Wallet screen and importing mnemonic
|
||||
@ -698,8 +677,10 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
await element(by.id('MnemonicInput')).replaceText(
|
||||
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
|
||||
);
|
||||
await element(by.id('AskPassphrase')).tap();
|
||||
await element(by.id('SearchAccounts')).tap();
|
||||
await element(by.id('HeaderRightButton')).tap();
|
||||
await element(by.text('Passphrase')).tap();
|
||||
await element(by.id('HeaderRightButton')).tap();
|
||||
await element(by.text('Search accounts')).tap();
|
||||
await element(by.id('DoImport')).tap();
|
||||
await sleep(1000);
|
||||
|
||||
@ -734,7 +715,6 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
await device.pressBack();
|
||||
await device.pressBack();
|
||||
await helperDeleteWallet('Imported HD Legacy (BIP44 P2PKH)');
|
||||
await helperSwitchAdvancedMode();
|
||||
|
||||
process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1');
|
||||
});
|
||||
|
@ -382,6 +382,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
|
||||
if (!(await getSwitchValue('BIP47Switch'))) {
|
||||
await expect(element(by.text('Contacts'))).not.toBeVisible();
|
||||
await element(by.id('BIP47Switch')).tap();
|
||||
await element(by.id('WalletDetailsScroll')).swipe('up', 'fast', 1);
|
||||
await expect(element(by.text('Contacts'))).toBeVisible();
|
||||
await element(by.text('Save')).tap(); // automatically goes back 1 screen
|
||||
await element(by.text('OK')).tap();
|
||||
|
@ -142,11 +142,3 @@ export async function helperCreateWallet(walletName) {
|
||||
await element(by.id('WalletsList')).swipe('right', 'fast', 1); // in case emu screen is small and it doesnt fit
|
||||
await expect(element(by.id(walletName || 'cr34t3d'))).toBeVisible();
|
||||
}
|
||||
|
||||
export async function helperSwitchAdvancedMode() {
|
||||
await element(by.id('SettingsButton')).tap();
|
||||
await element(by.id('GeneralSettings')).tap();
|
||||
await element(by.id('AdvancedMode')).tap();
|
||||
await device.pressBack();
|
||||
await device.pressBack();
|
||||
}
|
||||
|
@ -11,6 +11,12 @@ const keys = {
|
||||
ViewInBitcoin: 'viewInBitcoin',
|
||||
ViewInSats: 'viewInSats',
|
||||
ViewInFiat: 'viewInFiat',
|
||||
Entropy: 'entropy',
|
||||
SearchAccount: 'searchAccount',
|
||||
Passphrase: 'passphrase',
|
||||
MoreInfo: 'moreInfo',
|
||||
SaveChanges: 'saveChanges',
|
||||
PaymentsCode: 'paymentsCode',
|
||||
};
|
||||
|
||||
const icons = {
|
||||
@ -35,6 +41,24 @@ const icons = {
|
||||
ViewInFiat: {
|
||||
iconValue: 'coloncurrencysign.circle',
|
||||
},
|
||||
Entropy: {
|
||||
iconValue: 'dice',
|
||||
},
|
||||
SearchAccount: {
|
||||
iconValue: 'magnifyingglass',
|
||||
},
|
||||
Passphrase: {
|
||||
iconValue: 'rectangle.and.pencil.and.ellipsis',
|
||||
},
|
||||
MoreInfo: {
|
||||
iconValue: 'info.circle',
|
||||
},
|
||||
SaveChanges: {
|
||||
iconValue: 'checkmark',
|
||||
},
|
||||
PaymentsCode: {
|
||||
iconValue: 'qrcode',
|
||||
},
|
||||
};
|
||||
|
||||
export const CommonToolTipActions = {
|
||||
@ -78,7 +102,6 @@ export const CommonToolTipActions = {
|
||||
text: loc.total_balance_view.view_in_fiat,
|
||||
icon: icons.ViewInFiat,
|
||||
},
|
||||
|
||||
ViewInSats: {
|
||||
id: keys.ViewInSats,
|
||||
text: loc.total_balance_view.view_in_sats,
|
||||
@ -89,4 +112,38 @@ export const CommonToolTipActions = {
|
||||
text: loc.total_balance_view.view_in_bitcoin,
|
||||
icon: icons.ViewInBitcoin,
|
||||
},
|
||||
Entropy: {
|
||||
id: keys.Entropy,
|
||||
text: loc.wallets.add_entropy_provide,
|
||||
icon: icons.Entropy,
|
||||
},
|
||||
SearchAccount: {
|
||||
id: keys.SearchAccount,
|
||||
text: loc.wallets.import_search_accounts,
|
||||
icon: icons.SearchAccount,
|
||||
menuState: false,
|
||||
},
|
||||
Passphrase: {
|
||||
id: keys.Passphrase,
|
||||
text: loc.wallets.import_passphrase,
|
||||
icon: icons.Passphrase,
|
||||
menuState: false,
|
||||
},
|
||||
MoreInfo: {
|
||||
id: keys.MoreInfo,
|
||||
text: loc.wallets.more_info,
|
||||
icon: icons.MoreInfo,
|
||||
hidden: false,
|
||||
},
|
||||
SaveChanges: {
|
||||
id: keys.SaveChanges,
|
||||
text: loc._.save,
|
||||
icon: icons.SaveChanges,
|
||||
},
|
||||
PaymentCode: {
|
||||
id: keys.PaymentsCode,
|
||||
text: loc.bip47.purpose,
|
||||
icon: icons.PaymentsCode,
|
||||
menuState: false,
|
||||
},
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user