Merge branch 'master' into renovate/ruby-on-rails-packages

This commit is contained in:
Marcos Rodriguez Vélez 2024-08-05 07:40:05 -04:00 committed by GitHub
commit 8511893d98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
123 changed files with 5573 additions and 32323 deletions

View file

@ -11,18 +11,18 @@ jobs:
- checkout
- restore_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
- run: test -d node_modules || yarn
- run: test -d node_modules || npm i
- save_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
paths:
- node_modules
# run tests!
- run:
command: yarn tslint && yarn lint
command: npm run tslint && npm run lint
unit:
docker:
@ -34,18 +34,18 @@ jobs:
- checkout
- restore_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
- run: test -d node_modules || yarn
- run: test -d node_modules || npm i
- save_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
paths:
- node_modules
# run tests!
- run:
command: yarn unit
command: npm run unit
integration:
@ -63,18 +63,18 @@ jobs:
- checkout
- restore_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
- run: test -d node_modules || yarn
- run: test -d node_modules || npm i
- save_cache:
key: node_modules-{{ checksum "yarn.lock" }}
key: node_modules-{{ checksum "package-lock.json" }}
paths:
- node_modules
# run tests!
- run:
command: yarn jest || yarn jest || yarn jest || yarn jest
command: npm run jest || npm run jest || npm run jest || npm run jest
# Orchestrate our job run sequence
workflows:

View file

@ -40,7 +40,7 @@ jobs:
- name: Install dependencies with Bundler
run: bundle install
- name: Install node_modules
run: yarn install
run: npm install
- name: Install CocoaPods Dependencies
run: |
gem install cocoapods
@ -171,4 +171,4 @@ jobs:
...repo,
issue_number: prNumber,
body: message,
});
});

View file

@ -22,13 +22,13 @@ jobs:
with:
node-version: 20
- name: Use yarn caches
- name: Use npm caches
uses: actions/cache@v2
with:
path: ~/.yarn/berry/cache
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-npm-
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@v3
@ -38,7 +38,7 @@ jobs:
cache: 'gradle'
- name: Install node_modules
run: yarn install
run: npm install --production
- name: Extract Version Name
id: version_name

View file

@ -22,27 +22,27 @@ jobs:
with:
node-version: 20
- name: Use yarn caches
- name: Use npm caches
uses: actions/cache@v4
with:
path: ~/.yarn/berry/cache
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-npm-
- name: Use node_modules caches
id: cache-nm
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-nm-${{ hashFiles('yarn.lock') }}
key: ${{ runner.os }}-nm-${{ hashFiles('package-lock.json') }}
- name: Install node_modules
if: steps.cache-nm.outputs.cache-hit != 'true'
run: yarn
run: npm install
- name: Run tests
run: yarn test || yarn test || yarn test || yarn test
run: npm test || npm test || npm test || npm test
env:
BIP47_HD_MNEMONIC: ${{ secrets.BIP47_HD_MNEMONIC}}
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
@ -74,15 +74,15 @@ jobs:
docker-images: true
swap-storage: true
- name: yarn and gradle caches in /mnt
- name: npm and gradle caches in /mnt
run: |
rm -rf ~/.yarn
rm -rf ~/.npm
rm -rf ~/.gradle
sudo mkdir -p /mnt/.yarn
sudo mkdir -p /mnt/.npm
sudo mkdir -p /mnt/.gradle
sudo chown -R runner /mnt/.yarn
sudo chown -R runner /mnt/.npm
sudo chown -R runner /mnt/.gradle
ln -s /mnt/.yarn /home/runner/
ln -s /mnt/.npm /home/runner/
ln -s /mnt/.gradle /home/runner/
- name: Create artifacts directory on /mnt
@ -105,16 +105,16 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Use yarn caches
- name: Use npm caches
uses: actions/cache@v4
with:
path: ~/.yarn/berry/cache
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-npm-
- name: Install node_modules
run: yarn || yarn
run: npm install || npm install
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@v4
@ -129,7 +129,7 @@ jobs:
sudo udevadm trigger --name-match=kvm
- name: Build
run: yarn e2e:release-build
run: npm run e2e:release-build
- name: Run tests
uses: reactivecircus/android-emulator-runner@v2
@ -139,7 +139,7 @@ jobs:
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none -partition-size 2047
arch: x86_64
script: yarn e2e:release-test --record-videos all --record-logs all --take-screenshots all --headless -d 200000 -R 5 --artifacts-location /mnt/artifacts
script: npm run e2e:release-test -- --record-videos all --record-logs all --take-screenshots all --headless -d 200000 -R 5 --artifacts-location /mnt/artifacts
- uses: actions/upload-artifact@v4
if: failure()

11
.gitignore vendored
View file

@ -89,11 +89,6 @@ android/app/.project
android/app/.classpath
android/.settings/org.eclipse.buildship.core.prefs
android/.project
# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
android/.settings/org.eclipse.buildship.core.prefs
android/app/.classpath
android/app/.project

1
.npmrc Normal file
View file

@ -0,0 +1 @@
legacy-peer-deps=true

File diff suppressed because one or more lines are too long

View file

@ -1,5 +0,0 @@
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-3.6.4.cjs
# checksumBehavior: 'update'

View file

@ -2,7 +2,7 @@ source "https://rubygems.org"
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby "3.1.6"
gem 'rubyzip', '2.3.0'
gem 'rubyzip', '2.3.2'
gem "cocoapods", "1.15.2"
gem "activesupport", ">= 6.1.7.3", "< 7.1.4"
gem "fastlane"

View file

@ -23,8 +23,8 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
aws-partitions (1.950.0)
aws-sdk-core (3.201.0)
aws-partitions (1.961.0)
aws-sdk-core (3.201.3)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
@ -32,11 +32,11 @@ GEM
aws-sdk-kms (1.88.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.156.0)
aws-sdk-s3 (1.157.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.8.0)
aws-sigv4 (1.9.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
@ -95,7 +95,7 @@ GEM
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
excon (0.110.0)
excon (0.111.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@ -117,7 +117,7 @@ GEM
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (1.0.1)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
@ -125,7 +125,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.3.1)
fastlane (2.221.1)
fastlane (2.222.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@ -216,7 +216,7 @@ GEM
json (2.7.2)
jwt (2.8.2)
base64
mini_magick (4.13.1)
mini_magick (4.13.2)
mini_mime (1.1.5)
minitest (5.24.1)
molinillo (0.8.0)
@ -243,7 +243,7 @@ GEM
rouge (2.0.7)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.3.0)
rubyzip (2.3.2)
security (0.1.5)
signet (0.19.0)
addressable (~> 2.8)
@ -288,7 +288,7 @@ DEPENDENCIES
activesupport (>= 6.1.7.3, < 7.1.4)
cocoapods (= 1.15.2)
fastlane
rubyzip (= 2.3.0)
rubyzip (= 2.3.2)
RUBY VERSION
ruby 3.1.6p260

View file

@ -27,12 +27,12 @@ Community: [telegram group](https://t.me/bluewallet)
## BUILD & RUN IT
Please refer to the engines field in package.json file for the minimum required versions of Node and yarn. It is preferred that you use an even-numbered version of Node as these are LTS versions.
Please refer to the engines field in package.json file for the minimum required versions of Node and npm. It is preferred that you use an even-numbered version of Node as these are LTS versions.
To view the version of Node and yarn in your environment, run the following in your console:
To view the version of Node and npm in your environment, run the following in your console:
```
node --version && yarn --version
node --version && npm --version
```
* In your console:
@ -40,10 +40,10 @@ node --version && yarn --version
```
git clone https://github.com/BlueWallet/BlueWallet.git
cd BlueWallet
yarn
npm install
```
Please make sure that your console is running the most stable versions of node (even-numbered versions).
Please make sure that your console is running the most stable versions of npm and node (even-numbered versions).
* To run on Android:
@ -69,7 +69,7 @@ The above command will build the app and install it. Once you launch the app it
```
npx pod-install
yarn start
npm start
```
In another terminal window within the BlueWallet folder:
@ -83,15 +83,15 @@ npx react-native run-ios
```
npx pod-install
yarn start
npm start
```
Open ios/BlueWallet.xcworkspace. Once the project loads, select the scheme/target BlueWallet-NoLDK. Click Run.
Open ios/BlueWallet.xcworkspace. Once the project loads, select the scheme/target BlueWallet. Click Run.
## TESTS
```bash
yarn test
npm run test
```

View file

@ -2,27 +2,8 @@
## Apple
* test the build on a real device. It is imperative that you run selftest and it gives you OK
* if necessary, up version number in all relevant files (you can use `./edit-version-number.sh`)
* run `./scripts/release-notes.sh` - it prints changelog between latest tag and now, put this output under
new version in file `ios/fastlane/metadata/en-US/release_notes.txt` (on top); if file got too big
delete the oldest version from the bottom of the file
* now is a good time to commit a ver bump and release notes changes
* create this release version in App Store Connect (iTunes) and attach appropriate build. note
last 4 digits of the build and announce it - this is now a RC. no need to fill release notes yet
* `cd ios/` and then run `DELIVER_USERNAME="my_itunes_email@example.com" DELIVER_PASSWORD="my_itunes_password" fastlane deliver --force --skip_binary_upload --skip_screenshots --ignore_language_directory_validation -a io.bluewallet.bluewallet --app_version "6.6.6"`
but replace `6.6.6` with your version number - this will upload release notes to all locales in itunes
* go back to App Store Connect and press `Submit for Review`. choose Yes, we use identifiers - for installs tracking
* once its approved and released it is safe to cut a release tag: run `git tag -m "REL v6.6.6: 76ed479" v6.6.6 -s`
where `76ed479` is a latest commit in this version. replace the version as well. then run `git push origin --tags`; alternative way to tag: `git tag -a v6.0.0 2e1a00609d5a0dbc91bcda2421df0f61bdfc6b10 -m "v6.0.0" -s`
* you are awesome!
* TBD
## Android
* do android after ios usually
* test the build on a real device. We have accounts with browserstack where you can do so.
* its imperative that you run selftest and it gives you OK. note which build you are testing
* go to appcenter.ms, find this exact build under `master` builds, and press `Distribute` -> `Store` -> `Production`.
in `Release notes` write the release, this field is smaller than iOS, so you need to keep it bellow 500 characters.
* now just wait till appcenter displays a message that it is successfully distributed
* noice!
* TBD

View file

@ -117,7 +117,6 @@ preBuild.dependsOn(copyFiatUnits)
dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
implementation files("../../node_modules/rn-ldk/android/libs/LDK-release.aar")
implementation 'androidx.core:core-ktx'
implementation 'androidx.work:work-runtime-ktx:2.7.1'

View file

@ -1,24 +0,0 @@
#!/bin/sh
echo Uploading to Appetize and publishing link to Github...
echo "Branch "
BRANCH=`git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3`
echo $BRANCH
echo "Branch 2 "
git log -n 1 --pretty=%d HEAD | awk '{print $2}' | sed 's/origin\///' | sed 's/)//'
FILENAME="$APPCENTER_OUTPUT_DIRECTORY/app-release.apk"
if [ -f $FILENAME ]; then
APTZ=`curl "https://$APPETIZE@api.appetize.io/v1/apps" -F "file=@$FILENAME" -F "platform=android"`
echo Apptezize response:
echo $APTZ
APPURL=`node -e "let e = JSON.parse('$APTZ'); console.log(e.publicURL + '?device=pixel4');"`
echo App url: $APPURL
PR=`node scripts/appcenter-post-build-get-pr-number.js`
echo PR: $PR
DLOAD_APK="https://lambda-download-android-build.herokuapp.com/download/$BUILD_BUILDID"
curl -X POST --data "{\"body\":\"♫ This was a triumph. I'm making a note here: HUGE SUCCESS ♫\n\n [android in browser] $APPURL\n\n[download apk]($DLOAD_APK) \"}" -H "Authorization: Bearer $GITHUB" "https://api.github.com/repos/BlueWallet/BlueWallet/issues/$PR/comments"
fi

View file

@ -88,7 +88,7 @@ const storageKey = 'ELECTRUM_PEERS';
const defaultPeer = { host: 'electrum1.bluewallet.io', ssl: '443' };
export const hardcodedPeers: Peer[] = [
{ host: 'mainnet.foundationdevices.com', ssl: '50002' },
{ host: 'bitcoin.lukechilds.co', ssl: '50002' },
// { host: 'bitcoin.lukechilds.co', ssl: '50002' },
// { host: 'electrum.jochen-hoenicke.de', ssl: '50006' },
{ host: 'electrum1.bluewallet.io', ssl: '443' },
{ host: 'electrum.acinq.co', ssl: '50002' },

View file

@ -20,6 +20,8 @@ export interface TinySecp256k1InterfaceExtended {
isXOnlyPoint(p: Uint8Array): boolean;
xOnlyPointAddTweak(p: Uint8Array, tweak: Uint8Array): XOnlyPointAddTweakResult | null;
privateNegate(d: Uint8Array): Uint8Array;
}
necc.utils.sha256Sync = (...messages: Uint8Array[]): Uint8Array => {
@ -119,7 +121,7 @@ const ecc: TinySecp256k1InterfaceExtended & TinySecp256k1Interface & TinySecp256
return ret;
}),
// privateNegate: (d: Uint8Array): Uint8Array => necc.utils.privateNegate(d),
privateNegate: (d: Uint8Array): Uint8Array => necc.utils.privateNegate(d),
sign: (h: Uint8Array, d: Uint8Array, e?: Uint8Array): Uint8Array => {
return necc.signSync(h, d, { der: false, extraEntropy: e });

View file

@ -18,7 +18,6 @@ import { HDSegwitElectrumSeedP2WPKHWallet } from './wallets/hd-segwit-electrum-s
import { HDSegwitP2SHWallet } from './wallets/hd-segwit-p2sh-wallet';
import { LegacyWallet } from './wallets/legacy-wallet';
import { LightningCustodianWallet } from './wallets/lightning-custodian-wallet';
import { LightningLdkWallet } from './wallets/lightning-ldk-wallet';
import { MultisigHDWallet } from './wallets/multisig-hd-wallet';
import { SegwitBech32Wallet } from './wallets/segwit-bech32-wallet';
import { SegwitP2SHWallet } from './wallets/segwit-p2sh-wallet';
@ -425,9 +424,6 @@ export class BlueApp {
unserializedWallet.passphrase = passphrase;
}
break;
case LightningLdkWallet.type:
unserializedWallet = LightningLdkWallet.fromJson(key) as unknown as LightningLdkWallet;
break;
case SLIP39SegwitP2SHWallet.type:
unserializedWallet = SLIP39SegwitP2SHWallet.fromJson(key) as unknown as SLIP39SegwitP2SHWallet;
@ -496,11 +492,6 @@ export class BlueApp {
const ID = wallet.getID();
const tempWallets = [];
if (wallet.type === LightningLdkWallet.type) {
const ldkwallet = wallet;
ldkwallet.stop().then(ldkwallet.purgeLocalStorage).catch(alert);
}
for (const value of this.wallets) {
if (value.getID() === ID) {
// the one we should delete

View file

@ -12,7 +12,6 @@ export * from './wallets/hd-segwit-electrum-seed-p2wpkh-wallet';
export * from './wallets/hd-segwit-p2sh-wallet';
export * from './wallets/legacy-wallet';
export * from './wallets/lightning-custodian-wallet';
export * from './wallets/lightning-ldk-wallet';
export * from './wallets/multisig-hd-wallet';
export * from './wallets/segwit-bech32-wallet';
export * from './wallets/segwit-p2sh-wallet';

View file

@ -8,7 +8,6 @@ import { HDSegwitElectrumSeedP2WPKHWallet } from './wallets/hd-segwit-electrum-s
import { HDSegwitP2SHWallet } from './wallets/hd-segwit-p2sh-wallet';
import { LegacyWallet } from './wallets/legacy-wallet';
import { LightningCustodianWallet } from './wallets/lightning-custodian-wallet'; // Missing import
import { LightningLdkWallet } from './wallets/lightning-ldk-wallet';
import { MultisigHDWallet } from './wallets/multisig-hd-wallet';
import { SegwitBech32Wallet } from './wallets/segwit-bech32-wallet';
import { SLIP39LegacyP2PKHWallet, SLIP39SegwitBech32Wallet, SLIP39SegwitP2SHWallet } from './wallets/slip39-wallets';
@ -26,7 +25,6 @@ export default class WalletGradient {
static defaultGradients: string[] = ['#B770F6', '#9013FE'];
static lightningCustodianWallet: string[] = ['#F1AA07', '#FD7E37']; // Corrected property with missing colors
static aezeedWallet: string[] = ['#8584FF', '#5351FB'];
static ldkWallet: string[] = ['#8584FF', '#5351FB'];
static createWallet = () => {
const { colors } = useTheme();
@ -68,9 +66,6 @@ export default class WalletGradient {
case HDAezeedWallet.type:
gradient = WalletGradient.aezeedWallet;
break;
case LightningLdkWallet.type:
gradient = WalletGradient.ldkWallet;
break;
case LightningCustodianWallet.type:
gradient = WalletGradient.lightningCustodianWallet;
break;
@ -131,9 +126,6 @@ export default class WalletGradient {
case HDAezeedWallet.type:
gradient = WalletGradient.aezeedWallet;
break;
case LightningLdkWallet.type:
gradient = WalletGradient.ldkWallet;
break;
case LightningCustodianWallet.type:
gradient = WalletGradient.lightningCustodianWallet;
break;

View file

@ -12,7 +12,6 @@ import {
HDSegwitP2SHWallet,
LegacyWallet,
LightningCustodianWallet,
LightningLdkWallet,
MultisigHDWallet,
SegwitBech32Wallet,
SegwitP2SHWallet,
@ -183,17 +182,6 @@ const startImport = (
yield { wallet: lnd };
}
// is it LDK?
yield { progress: 'lightning' };
if (text.startsWith('ldk://')) {
const ldk = new LightningLdkWallet();
ldk.setSecret(text);
if (ldk.valid()) {
await ldk.init();
yield { wallet: ldk };
}
}
// check bip39 wallets
yield { progress: 'bip39' };
const hd2 = new HDSegwitBech32Wallet();

View file

@ -1,698 +0,0 @@
import * as bip39 from 'bip39';
import * as bitcoin from 'bitcoinjs-lib';
import bolt11 from 'bolt11';
import RNFS from 'react-native-fs';
import RnLdk from 'rn-ldk/src/index';
import presentAlert from '../../components/Alert';
import { BitcoinUnit, Chain } from '../../models/bitcoinUnits';
import { randomBytes } from '../rng';
import SyncedAsyncStorage from '../synced-async-storage';
import { HDSegwitBech32Wallet } from './hd-segwit-bech32-wallet';
import { LightningCustodianWallet } from './lightning-custodian-wallet';
import { SegwitBech32Wallet } from './segwit-bech32-wallet';
export class LightningLdkWallet extends LightningCustodianWallet {
static readonly type = 'lightningLdk';
static readonly typeReadable = 'Lightning LDK';
// @ts-ignore: override
public readonly type = LightningLdkWallet.type;
// @ts-ignore: override
public readonly typeReadable = LightningLdkWallet.typeReadable;
private _listChannels: any[] = [];
private _listPayments: any[] = [];
private _listInvoices: any[] = [];
private _nodeConnectionDetailsCache: any = {}; // pubkey -> {pubkey, host, port, ts}
private _refundAddressScriptHex: string = '';
private _lastTimeBlockchainCheckedTs: number = 0;
private _unwrapFirstExternalAddressFromMnemonicsCache: string = '';
private static _predefinedNodes: Record<string, string> = {
Bitrefill: '03d607f3e69fd032524a867b288216bfab263b6eaee4e07783799a6fe69bb84fac@3.237.23.179:9735',
'OpenNode.com': '03abf6f44c355dec0d5aa155bdbdd6e0c8fefe318eff402de65c6eb2e1be55dc3e@3.132.230.42:9735',
Fold: '02816caed43171d3c9854e3b0ab2cf0c42be086ff1bd4005acc2a5f7db70d83774@35.238.153.25:9735',
'Moon (paywithmoon.com)': '025f1456582e70c4c06b61d5c8ed3ce229e6d0db538be337a2dc6d163b0ebc05a5@52.86.210.65:9735',
'coingate.com': '0242a4ae0c5bef18048fbecf995094b74bfb0f7391418d71ed394784373f41e4f3@3.124.63.44:9735',
'Blockstream Store': '02df5ffe895c778e10f7742a6c5b8a0cefbe9465df58b92fadeb883752c8107c8f@35.232.170.67:9735',
ACINQ: '03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f@3.33.236.230:9735',
};
static getPredefinedNodes() {
return LightningLdkWallet._predefinedNodes;
}
static pubkeyToAlias(pubkeyHex: string) {
for (const key of Object.keys(LightningLdkWallet._predefinedNodes)) {
const val = LightningLdkWallet._predefinedNodes[key];
if (val.startsWith(pubkeyHex)) return key;
}
return pubkeyHex;
}
constructor() {
super();
this.preferredBalanceUnit = BitcoinUnit.SATS;
this.chain = Chain.OFFCHAIN;
this.user_invoices_raw = []; // compatibility with other lightning wallet class
}
valid() {
try {
const entropy = bip39.mnemonicToEntropy(this.secret.replace('ldk://', ''));
return entropy.length === 64 || entropy.length === 32;
} catch (_) {}
return false;
}
async stop() {
return RnLdk.stop();
}
async wipeLndDir() {}
async listPeers() {
return RnLdk.listPeers();
}
async listChannels() {
try {
// exception might be in case of incompletely-started LDK. then just ignore and return cached version
this._listChannels = await RnLdk.listChannels();
} catch (_) {}
return this._listChannels;
}
async getLndTransactions() {
return [];
}
async getInfo() {
const identityPubkey = await RnLdk.getNodeId();
return {
identityPubkey,
};
}
allowSend() {
return true;
}
timeToCheckBlockchain() {
return +new Date() - this._lastTimeBlockchainCheckedTs > 5 * 60 * 1000; // 5 min, half of block time
}
async fundingStateStepFinalize(txhex: string) {
return RnLdk.openChannelStep2(txhex);
}
async getMaturingBalance(): Promise<number> {
return RnLdk.getMaturingBalance();
}
async getMaturingHeight(): Promise<number> {
return RnLdk.getMaturingHeight();
}
/**
* Probes getNodeId() call. if its available - LDK has started
*
* @return {Promise<boolean>}
*/
async isStarted() {
let rez;
try {
rez = await Promise.race([new Promise(resolve => setTimeout(() => resolve('timeout'), 1000)), RnLdk.getNodeId()]);
} catch (_) {}
if (rez === 'timeout' || !rez) {
return false;
}
return true;
}
/**
* Waiter till getNodeId() starts to respond. Returns true if it eventually does,
* false in case of timeout.
*
* @return {Promise<boolean>}
*/
async waitTillStarted() {
for (let c = 0; c < 30; c++) {
if (await this.isStarted()) return true;
await new Promise(resolve => setTimeout(resolve, 500)); // sleep
}
return false;
}
async openChannel(pubkeyHex: string, host: string, amountSats: number, privateChannel: boolean) {
let triedToConnect = false;
let port = 9735;
if (host.includes(':')) {
const splitted = host.split(':');
host = splitted[0];
port = +splitted[1];
}
for (let c = 0; c < 20; c++) {
const peers = await this.listPeers();
if (peers.includes(pubkeyHex)) {
// all good, connected, lets open channel
return await RnLdk.openChannelStep1(pubkeyHex, +amountSats);
}
if (!triedToConnect) {
triedToConnect = true;
await RnLdk.connectPeer(pubkeyHex, host, +port);
}
await new Promise(resolve => setTimeout(resolve, 500)); // sleep
}
throw new Error('timeout waiting for peer connection');
}
async connectPeer(pubkeyHex: string, host: string, port: number) {
return RnLdk.connectPeer(pubkeyHex, host, +port);
}
async lookupNodeConnectionDetailsByPubkey(pubkey: string) {
// first, trying cache:
if (this._nodeConnectionDetailsCache[pubkey] && +new Date() - this._nodeConnectionDetailsCache[pubkey].ts < 4 * 7 * 24 * 3600 * 1000) {
// cache hit
return this._nodeConnectionDetailsCache[pubkey];
}
// doing actual fetch and filling cache:
const response = await fetch(`https://1ml.com/node/${pubkey}/json`);
const json = await response.json();
if (json && json.addresses && Array.isArray(json.addresses)) {
for (const address of json.addresses) {
if (address.network === 'tcp') {
const ret = {
pubkey,
host: address.addr.split(':')[0],
port: parseInt(address.addr.split(':')[1], 10),
};
this._nodeConnectionDetailsCache[pubkey] = Object.assign({}, ret, { ts: +new Date() });
return ret;
}
}
}
}
getAddress(): string | false {
return false;
}
getSecret() {
return this.secret;
}
timeToRefreshBalance() {
return (+new Date() - this._lastBalanceFetch) / 1000 > 300; // 5 min
}
timeToRefreshTransaction() {
return (+new Date() - this._lastTxFetch) / 1000 > 300; // 5 min
}
async generate() {
const buf = await randomBytes(16);
this.secret = 'ldk://' + bip39.entropyToMnemonic(buf.toString('hex'));
}
getEntropyHex() {
let ret = bip39.mnemonicToEntropy(this.secret.replace('ldk://', ''));
while (ret.length < 64) ret = '0' + ret;
return ret;
}
getStorageNamespace() {
return RnLdk.getStorage().namespace;
}
static async _decodeInvoice(invoice: string) {
return bolt11.decode(invoice);
}
static async _script2address(scriptHex: string) {
return bitcoin.address.fromOutputScript(Buffer.from(scriptHex, 'hex'));
}
async selftest() {
await RnLdk.getStorage().selftest();
await RnLdk.selftest();
}
async init() {
if (!this.getSecret()) return;
console.warn('starting ldk');
try {
// providing simple functions that RnLdk would otherwise rely on 3rd party APIs
RnLdk.provideDecodeInvoiceFunc(LightningLdkWallet._decodeInvoice);
RnLdk.provideScript2addressFunc(LightningLdkWallet._script2address);
const syncedStorage = new SyncedAsyncStorage(this.getEntropyHex());
// await syncedStorage.selftest();
// await RnLdk.selftest();
// console.warn('selftest passed');
await syncedStorage.synchronize();
RnLdk.setStorage(syncedStorage);
if (this._refundAddressScriptHex) {
await RnLdk.setRefundAddressScript(this._refundAddressScriptHex);
} else {
// fallback, unwrapping address from bip39 mnemonic we have
const address = this.unwrapFirstExternalAddressFromMnemonics();
await this.setRefundAddress(address);
}
await RnLdk.start(this.getEntropyHex(), RNFS.DocumentDirectoryPath);
this._execInBackground(this.reestablishChannels);
if (this.timeToCheckBlockchain()) this._execInBackground(this.checkBlockchain);
} catch (error: any) {
presentAlert({ message: 'LDK init error: ' + error.message });
}
}
unwrapFirstExternalAddressFromMnemonics() {
if (this._unwrapFirstExternalAddressFromMnemonicsCache) return this._unwrapFirstExternalAddressFromMnemonicsCache; // cache hit
const hd = new HDSegwitBech32Wallet();
hd.setSecret(this.getSecret().replace('ldk://', ''));
const address = hd._getExternalAddressByIndex(0);
this._unwrapFirstExternalAddressFromMnemonicsCache = address;
return address;
}
unwrapFirstExternalWIFFromMnemonics() {
const hd = new HDSegwitBech32Wallet();
hd.setSecret(this.getSecret().replace('ldk://', ''));
return hd._getExternalWIFByIndex(0);
}
async checkBlockchain() {
this._lastTimeBlockchainCheckedTs = +new Date();
return RnLdk.checkBlockchain();
}
async payInvoice(invoice: string, freeAmount = 0) {
const decoded = this.decodeInvoice(invoice);
// if its NOT zero amount invoice, we forcefully reset passed amount argument so underlying LDK code
// would extract amount from bolt11
if (decoded.num_satoshis && parseInt(decoded.num_satoshis, 10) > 0) freeAmount = 0;
if (await this.channelsNeedReestablish()) {
await this.reestablishChannels();
await this.waitForAtLeastOneChannelBecomeActive();
}
const result = await RnLdk.payInvoice(invoice, freeAmount);
if (!result) throw new Error('Failed');
// ok, it was sent. now, waiting for an event that it was _actually_ paid:
for (let c = 0; c < 60; c++) {
await new Promise(resolve => setTimeout(resolve, 500)); // sleep
for (const sentPayment of RnLdk.sentPayments || []) {
const paidHash = LightningLdkWallet.preimage2hash(sentPayment.payment_preimage);
if (paidHash === decoded.payment_hash) {
this._listPayments = this._listPayments || [];
this._listPayments.push(
Object.assign({}, sentPayment, {
memo: decoded.description || 'Lightning payment',
value: (freeAmount || decoded.num_satoshis) * -1,
received: +new Date(),
payment_preimage: sentPayment.payment_preimage,
payment_hash: decoded.payment_hash,
}),
);
return;
}
}
for (const failedPayment of RnLdk.failedPayments || []) {
if (failedPayment.payment_hash === decoded.payment_hash) throw new Error(JSON.stringify(failedPayment));
}
}
// no? lets just throw timeout error
throw new Error('Payment timeout');
}
/**
* In case user initiated channel opening, and then lost peer connection (i.e. app went in background for an
* extended period of time), when user gets back to the app the channel might already have enough confirmations,
* but will never be acknowledged as 'established' by LDK until peer reconnects so that ldk & peer can negotiate and
* agree that channel is now established
*/
async reconnectPeersWithPendingChannels() {
const peers = await RnLdk.listPeers();
const peers2reconnect: Record<string, boolean> = {};
if (this._listChannels) {
for (const channel of this._listChannels) {
if (!channel.is_funding_locked) {
// pending channel
if (!peers.includes(channel.remote_node_id)) peers2reconnect[channel.remote_node_id] = true;
}
}
}
for (const pubkey of Object.keys(peers2reconnect)) {
const { host, port } = await this.lookupNodeConnectionDetailsByPubkey(pubkey);
await this.connectPeer(pubkey, host, port);
}
}
async getUserInvoices(limit: number | false = false) {
const newInvoices: any[] = [];
let found = false;
// okay, so the idea is that `this._listInvoices` is a persistent storage of invoices, while
// `RnLdk.receivedPayments` is only a temp storage of emitted events
// we iterate through all stored invoices
for (const invoice of this._listInvoices) {
const newInvoice = Object.assign({}, invoice);
// iterate through events of received payments
for (const receivedPayment of RnLdk.receivedPayments || []) {
if (receivedPayment.payment_hash === invoice.payment_hash) {
// match! this particular payment was paid
newInvoice.ispaid = true;
newInvoice.value = Math.floor(parseInt(receivedPayment.amt, 10) / 1000);
found = true;
}
}
newInvoices.push(newInvoice);
}
// overwrite stored array if flag was set
if (found) this._listInvoices = newInvoices;
return this._listInvoices;
}
isInvoiceGeneratedByWallet(paymentRequest: string) {
return Boolean(this?._listInvoices?.some(invoice => invoice.payment_request === paymentRequest));
}
weOwnAddress(address: string) {
return false;
}
async addInvoice(amtSat: number, memo: string) {
if (await this.channelsNeedReestablish()) {
await this.reestablishChannels();
await this.waitForAtLeastOneChannelBecomeActive();
}
if (this.getReceivableBalance() < amtSat) throw new Error('You dont have enough inbound capacity');
const paymentRequest = await RnLdk.addInvoice(amtSat * 1000, memo);
if (!paymentRequest) return false;
const decoded = this.decodeInvoice(paymentRequest);
this._listInvoices = this._listInvoices || [];
const tx = {
payment_request: paymentRequest,
ispaid: false,
timestamp: +new Date(),
expire_time: 3600 * 1000,
amt: amtSat,
type: 'user_invoice',
payment_hash: decoded.payment_hash,
description: memo || '',
};
this._listInvoices.push(tx);
return paymentRequest;
}
async getAddressAsync(): Promise<string> {
throw new Error('getAddressAsync: Not implemented');
}
async allowOnchainAddress(): Promise<boolean> {
throw new Error('allowOnchainAddress: Not implemented');
}
getTransactions() {
const ret = [];
for (const payment of this?._listPayments || []) {
const newTx = Object.assign({}, payment, {
type: 'paid_invoice',
walletID: this.getID(),
});
ret.push(newTx);
}
// ############################################
for (const invoice of this?._listInvoices || []) {
const tx = {
payment_request: invoice.payment_request,
ispaid: invoice.ispaid,
received: invoice.timestamp,
type: invoice.type,
value: invoice.value || invoice.amt,
memo: invoice.description,
timestamp: invoice.timestamp, // important
expire_time: invoice.expire_time, // important
walletID: this.getID(),
};
if (tx.ispaid || invoice.timestamp + invoice.expire_time > +new Date()) {
// expired non-paid invoices are not shown
ret.push(tx);
}
}
ret.sort(function (a, b) {
return b.received - a.received;
});
return ret;
}
async fetchTransactions() {
if (this.timeToCheckBlockchain()) {
try {
// exception might be in case of incompletely-started LDK
this._listChannels = await RnLdk.listChannels();
await this.checkBlockchain();
// ^^^ will be executed if above didnt throw exceptions, which means ldk fully started.
// we need this for a case when app returns from background if it was in bg for a really long time.
// ldk needs to update it's blockchain data, and this is practically the only place where it can
// do that (except on cold start)
} catch (_) {}
}
try {
await this.reconnectPeersWithPendingChannels();
} catch (error: any) {
console.log('fetchTransactions failed');
console.log(error.message);
}
await this.getUserInvoices(); // it internally updates paid user invoices
}
getBalance() {
let sum = 0;
if (this._listChannels) {
for (const channel of this._listChannels) {
if (!channel.is_funding_locked) continue; // pending channel
sum += Math.floor(parseInt(channel.outbound_capacity_msat, 10) / 1000);
}
}
return sum;
}
getReceivableBalance() {
let sum = 0;
if (this._listChannels) {
for (const channel of this._listChannels) {
if (!channel.is_funding_locked) continue; // pending channel
sum += Math.floor(parseInt(channel.inbound_capacity_msat, 10) / 1000);
}
}
return sum;
}
/**
* This method checks if there is balance on first unwapped address we have.
* This address is a fallback in case user has _no_ other wallets to withdraw onchain coins to, so closed-channel
* funds land on this address. Ofcourse, if user provided us a withdraw address, it should be stored in
* `this._refundAddressScriptHex` and its balance frankly is not our concern.
*
* @return {Promise<{confirmedBalance: number}>}
*/
async walletBalance() {
let confirmedSat = 0;
if (this._unwrapFirstExternalAddressFromMnemonicsCache) {
const response = await fetch('https://blockstream.info/api/address/' + this._unwrapFirstExternalAddressFromMnemonicsCache + '/utxo');
const json = await response.json();
if (json && Array.isArray(json)) {
for (const utxo of json) {
if (utxo?.status?.confirmed) {
confirmedSat += parseInt(utxo.value, 10);
}
}
}
}
return { confirmedBalance: confirmedSat };
}
async fetchBalance() {
await this.listChannels(); // updates channels
}
async claimCoins(address: string) {
console.log('unwrapping wif...');
const wif = this.unwrapFirstExternalWIFFromMnemonics();
const wallet = new SegwitBech32Wallet();
wallet.setSecret(String(wif));
console.log('fetching balance...');
await wallet.fetchUtxo();
console.log(wallet.getBalance(), wallet.getUtxo());
console.log('creating transaction...');
// @ts-ignore wtf wallet.getUtxo() and first arg of createTransaction are not compatible
const { tx } = wallet.createTransaction(wallet.getUtxo(), [{ address }], 2, address, 0, false, 0);
if (!tx) throw new Error('claimCoins: could not create transaction');
console.log('broadcasting...');
return await wallet.broadcastTx(tx.toHex());
}
async fetchInfo() {
throw new Error('fetchInfo: Not implemented');
}
allowReceive() {
return true;
}
async closeChannel(fundingTxidHex: string, force = false) {
return force ? await RnLdk.closeChannelForce(fundingTxidHex) : await RnLdk.closeChannelCooperatively(fundingTxidHex);
}
getLatestTransactionTime(): string | 0 {
if (this.getTransactions().length === 0) {
return 0;
}
let max = -1;
for (const tx of this.getTransactions()) {
if (tx.received) max = Math.max(tx.received, max);
}
return new Date(max).toString();
}
async getLogs() {
return RnLdk.getLogs()
.map(log => log.line)
.join('\n');
}
async getLogsWithTs() {
return RnLdk.getLogs()
.map(log => log.ts + ' ' + log.line)
.join('\n');
}
async fetchPendingTransactions() {}
async fetchUserInvoices() {
await this.getUserInvoices();
}
static preimage2hash(preimageHex: string): string {
const hash = bitcoin.crypto.sha256(Buffer.from(preimageHex, 'hex'));
return hash.toString('hex');
}
async reestablishChannels() {
const connectedInThisRun: any = {};
for (const channel of await this.listChannels()) {
if (channel.is_usable) continue; // already connected..?
if (connectedInThisRun[channel.remote_node_id]) continue; // already tried to reconnect (in case there are several channels with the same node)
const { pubkey, host, port } = await this.lookupNodeConnectionDetailsByPubkey(channel.remote_node_id);
await this.connectPeer(pubkey, host, port);
connectedInThisRun[pubkey] = true;
}
}
async channelsNeedReestablish() {
const freshListChannels = await this.listChannels();
const active = freshListChannels.filter(chan => !!chan.is_usable && chan.is_funding_locked).length;
return freshListChannels.length !== +active;
}
async waitForAtLeastOneChannelBecomeActive() {
const active = (await this.listChannels()).filter(chan => !!chan.is_usable).length;
for (let c = 0; c < 10; c++) {
await new Promise(resolve => setTimeout(resolve, 500)); // sleep
const freshListChannels = await this.listChannels();
const active2 = freshListChannels.filter(chan => !!chan.is_usable).length;
if (freshListChannels.length === +active2) return true; // all active kek
if (freshListChannels.length === 0) return true; // no channels at all
if (+active2 > +active) return true; // something became active, lets ret
}
return false;
}
async setRefundAddress(address: string) {
const script = bitcoin.address.toOutputScript(address);
this._refundAddressScriptHex = script.toString('hex');
await RnLdk.setRefundAddressScript(this._refundAddressScriptHex);
}
static async getVersion() {
return RnLdk.getVersion();
}
static getPackageVersion() {
return RnLdk.getPackageVersion();
}
getChannelsClosedEvents() {
return RnLdk.channelsClosed;
}
async purgeLocalStorage() {
return RnLdk.getStorage().purgeLocalStorage();
}
/**
* executes async function in background, so calling code can return immediately, while catching all thrown exceptions
* and showing them in alert() instead of propagating them up
*
* @param func {function} Async functino to execute
* @private
*/
_execInBackground(func: () => void) {
const that = this;
(async () => {
try {
await func.call(that);
} catch (error: any) {
presentAlert({ message: '_execInBackground error:' + error.message });
}
})();
}
}

View file

@ -11,7 +11,6 @@ import { HDSegwitElectrumSeedP2WPKHWallet } from './hd-segwit-electrum-seed-p2wp
import { HDSegwitP2SHWallet } from './hd-segwit-p2sh-wallet';
import { LegacyWallet } from './legacy-wallet';
import { LightningCustodianWallet } from './lightning-custodian-wallet';
import { LightningLdkWallet } from './lightning-ldk-wallet';
import { MultisigHDWallet } from './multisig-hd-wallet';
import { SegwitBech32Wallet } from './segwit-bech32-wallet';
import { SegwitP2SHWallet } from './segwit-p2sh-wallet';
@ -133,7 +132,6 @@ export type TWallet =
| HDSegwitP2SHWallet
| LegacyWallet
| LightningCustodianWallet
| LightningLdkWallet
| MultisigHDWallet
| SLIP39LegacyP2PKHWallet
| SLIP39SegwitBech32Wallet

View file

@ -1,94 +0,0 @@
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import loc, { formatBalanceWithoutSuffix } from '../loc';
import { BitcoinUnit } from '../models/bitcoinUnits';
import { useTheme } from './themes';
interface LNNodeBarProps {
canReceive: number;
canSend: number;
nodeAlias?: string;
disabled?: boolean;
itemPriceUnit?: BitcoinUnit;
}
export const LNNodeBar: React.FC<LNNodeBarProps> = ({
canReceive = 0,
canSend = 0,
nodeAlias = '',
disabled = false,
itemPriceUnit = BitcoinUnit.SATS,
}) => {
const { colors } = useTheme();
const opacity = { opacity: disabled ? 0.5 : 1.0 };
const canSendBarFlex = {
flex: canReceive > 0 && canSend > 0 ? Math.abs(canSend / (canReceive + canSend)) * 1.0 : 1.0,
};
const stylesHook = StyleSheet.create({
nodeAlias: {
color: colors.alternativeTextColor2,
},
});
return (
<View style={[styles.root, opacity]}>
{nodeAlias.trim().length > 0 && <Text style={[styles.nodeAlias, stylesHook.nodeAlias]}>{nodeAlias}</Text>}
<View style={styles.canReceiveBar}>
<View style={styles.fullFlexDirectionRow}>
<View style={[styles.canSendBar, canSendBarFlex]} />
</View>
</View>
<View style={styles.containerBottomText}>
<View style={styles.containerBottomRightText}>
<Text style={styles.titleText}>{loc.lnd.can_send.toUpperCase()}</Text>
<Text style={styles.canSend}>{formatBalanceWithoutSuffix(canSend, itemPriceUnit, true).toString()}</Text>
</View>
<View style={styles.containerBottomLeftText}>
<Text style={styles.titleText}>{loc.lnd.can_receive.toUpperCase()}</Text>
<Text style={styles.canReceive}>{formatBalanceWithoutSuffix(canReceive, itemPriceUnit, true).toString()}</Text>
</View>
</View>
</View>
);
};
export default LNNodeBar;
const styles = StyleSheet.create({
root: {
flex: 1,
},
containerBottomText: {
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 16,
},
nodeAlias: {
marginVertical: 16,
},
canSendBar: {
height: 14,
maxHeight: 14,
backgroundColor: '#4E6CF5',
borderRadius: 6,
},
canReceiveBar: { backgroundColor: '#57B996', borderRadius: 6, height: 14, maxHeight: 14 },
fullFlexDirectionRow: {
flexDirection: 'row',
flex: 1,
},
containerBottomLeftText: {},
containerBottomRightText: {},
titleText: {
color: '#9AA0AA',
},
canReceive: {
color: '#57B996',
textAlign: 'right',
},
canSend: {
color: '#4E6CF5',
textAlign: 'left',
},
});

View file

@ -1,79 +0,0 @@
import React from 'react';
import { DimensionValue, Image, StyleSheet, TouchableOpacity, View } from 'react-native';
import { Text } from '@rneui/themed';
import { useTheme } from './themes';
interface LdkButtonProps {
text: string;
subtext: string;
active: boolean;
style: {
width: DimensionValue;
height: DimensionValue;
};
onPress: () => void;
}
export const LdkButton: React.FC<LdkButtonProps> = ({ text, subtext, active, style, onPress }) => {
const { colors } = useTheme();
const stylesHook = StyleSheet.create({
container: {
borderColor: (active && colors.lnborderColor) || colors.buttonDisabledBackgroundColor,
backgroundColor: colors.buttonDisabledBackgroundColor,
minWidth: style.width,
minHeight: style.height,
height: style.height,
},
text: {
color: colors.lnborderColor,
},
subtext: {
color: colors.alternativeTextColor,
},
});
return (
<TouchableOpacity accessibilityRole="button" onPress={onPress}>
<View style={[stylesHook.container, styles.container]}>
<View style={styles.contentContainer}>
<View>
<Image style={styles.image} source={require('../img/addWallet/lightning.png')} />
</View>
<View>
<Text style={[stylesHook.text, styles.text]}>{text}</Text>
<Text style={[stylesHook.subtext, styles.subtext]}>{subtext}</Text>
</View>
</View>
</View>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
container: {
borderWidth: 1.5,
borderRadius: 8,
flex: 1,
marginBottom: 8,
},
contentContainer: {
marginHorizontal: 16,
marginVertical: 10,
flexDirection: 'row',
alignItems: 'center',
},
image: {
width: 34,
height: 34,
marginRight: 8,
},
text: {
fontWeight: 'bold',
fontSize: 18,
},
subtext: {
fontSize: 13,
fontWeight: '500',
},
});

View file

@ -21,7 +21,7 @@ interface ListItemProps {
switch?: object; // Define more specific type if needed
leftIcon?: any; // Define more specific type if needed
title: string;
subtitle?: string;
subtitle?: string | React.ReactNode;
subtitleNumberOfLines?: number;
rightTitle?: string;
rightTitleStyle?: object;

View file

@ -0,0 +1,386 @@
import React, { useState, useRef, forwardRef, useImperativeHandle } from 'react';
import { View, Text, TouchableOpacity, TextInput, StyleSheet, Platform } from 'react-native';
import BottomModal, { BottomModalHandle } from './BottomModal';
import { useTheme } from './themes';
import loc from '../loc';
import { SecondButton } from './SecondButton';
interface NetworkTransactionFees {
fastestFee: number;
mediumFee: number;
slowFee: number;
}
interface FeePrecalc {
fastestFee: number | null;
mediumFee: number | null;
slowFee: number | null;
current: number | null;
}
interface Option {
label: string;
time: string;
fee: number | null;
rate: number;
active: boolean;
disabled?: boolean;
}
interface SelectFeeModalProps {
networkTransactionFees: NetworkTransactionFees;
feePrecalc: FeePrecalc;
feeRate: number | string;
setCustomFee: (fee: string) => void;
setFeePrecalc: (fn: (fp: FeePrecalc) => FeePrecalc) => void;
}
const SelectFeeModal = forwardRef<BottomModalHandle, SelectFeeModalProps>(
({ networkTransactionFees, feePrecalc, feeRate, setCustomFee, setFeePrecalc }, ref) => {
const [customFee, setCustomFeeState] = useState('');
const feeModalRef = useRef<BottomModalHandle>(null);
const customModalRef = useRef<BottomModalHandle>(null);
const nf = networkTransactionFees;
const { colors } = useTheme();
const stylesHook = StyleSheet.create({
loading: {
backgroundColor: colors.background,
},
root: {
backgroundColor: colors.elevated,
},
feeModalItemActive: {
backgroundColor: colors.feeActive,
},
feeModalLabel: {
color: colors.successColor,
},
feeModalTime: {
backgroundColor: colors.successColor,
},
feeModalTimeText: {
color: colors.background,
},
feeModalValue: {
color: colors.successColor,
},
feeModalCustomText: {
color: colors.buttonAlternativeTextColor,
},
selectLabel: {
color: colors.buttonTextColor,
},
of: {
color: colors.feeText,
},
memo: {
borderColor: colors.formBorder,
borderBottomColor: colors.formBorder,
backgroundColor: colors.inputBackgroundColor,
},
feeLabel: {
color: colors.feeText,
},
feeModalItemDisabled: {
backgroundColor: colors.buttonDisabledBackgroundColor,
},
feeModalItemTextDisabled: {
color: colors.buttonDisabledTextColor,
},
feeRow: {
backgroundColor: colors.feeLabel,
},
feeValue: {
color: colors.feeValue,
},
});
useImperativeHandle(ref, () => ({
present: async () => feeModalRef.current?.present(),
dismiss: async () => feeModalRef.current?.dismiss(),
}));
const options: Option[] = [
{
label: loc.send.fee_fast,
time: loc.send.fee_10m,
fee: feePrecalc.fastestFee,
rate: nf.fastestFee,
active: Number(feeRate) === nf.fastestFee,
},
{
label: loc.send.fee_medium,
time: loc.send.fee_3h,
fee: feePrecalc.mediumFee,
rate: nf.mediumFee,
active: Number(feeRate) === nf.mediumFee,
disabled: nf.mediumFee === nf.fastestFee,
},
{
label: loc.send.fee_slow,
time: loc.send.fee_1d,
fee: feePrecalc.slowFee,
rate: nf.slowFee,
active: Number(feeRate) === nf.slowFee,
disabled: nf.slowFee === nf.mediumFee || nf.slowFee === nf.fastestFee,
},
];
const formatFee = (fee: number | null): string => {
return fee ? `${fee} sat/vB` : '';
};
const handleCustomFeeSubmit = async () => {
if (!/^\d+$/.test(customFee) || Number(customFee) <= 0) {
// Handle error if necessary
return;
}
const fee = Number(customFee) < 1 ? '1' : customFee;
setCustomFee(fee);
await customModalRef.current?.dismiss();
await feeModalRef.current?.dismiss();
};
const handleCancel = async () => {
setCustomFeeState('');
await customModalRef.current?.dismiss();
};
const handlePressCustom = async () => {
await customModalRef.current?.present();
};
const handleSelectOption = async (fee: number | null, rate: number) => {
setFeePrecalc(fp => ({ ...fp, current: fee }));
await feeModalRef.current?.dismiss();
setCustomFee(rate.toString());
};
return (
<BottomModal
ref={feeModalRef}
backgroundColor={colors.modal}
contentContainerStyle={[styles.modalContent, styles.modalContentMinHeight]}
footerDefaultMargins
footer={
<View style={styles.feeModalFooter}>
<TouchableOpacity testID="feeCustom" accessibilityRole="button" onPress={handlePressCustom}>
<Text style={[styles.feeModalCustomText, stylesHook.feeModalCustomText]}>{loc.send.fee_custom}</Text>
</TouchableOpacity>
</View>
}
>
<View style={styles.paddingTop66}>
{options.map(({ label, time, fee, rate, active, disabled }) => (
<TouchableOpacity
accessibilityRole="button"
key={label}
disabled={disabled}
onPress={() => handleSelectOption(fee, rate)}
style={[styles.feeModalItem, active && styles.feeModalItemActive, active && !disabled && stylesHook.feeModalItemActive]}
>
<View style={styles.feeModalRow}>
<Text style={[styles.feeModalLabel, disabled ? stylesHook.feeModalItemTextDisabled : stylesHook.feeModalLabel]}>
{label}
</Text>
<View style={[styles.feeModalTime, disabled ? stylesHook.feeModalItemDisabled : stylesHook.feeModalTime]}>
<Text style={stylesHook.feeModalTimeText}>~{time}</Text>
</View>
</View>
<View style={styles.feeModalRow}>
<Text style={disabled ? stylesHook.feeModalItemTextDisabled : stylesHook.feeModalValue}>{fee && formatFee(fee)}</Text>
<Text style={disabled ? stylesHook.feeModalItemTextDisabled : stylesHook.feeModalValue}>
{rate} {loc.units.sat_vbyte}
</Text>
</View>
</TouchableOpacity>
))}
</View>
<BottomModal
ref={customModalRef}
backgroundColor={colors.modal}
showCloseButton={false}
contentContainerStyle={[styles.modalContent, styles.modalContentMinHeight]}
footer={
<View style={[styles.feeModalFooter, styles.feeModalFooterSpacing]}>
<SecondButton title={loc._.cancel} onPress={handleCancel} />
<View style={styles.feeModalFooterSpacing} />
<SecondButton title={loc._.ok} onPress={handleCustomFeeSubmit} disabled={!customFee || Number(customFee) <= 0} />
</View>
}
footerDefaultMargins
>
<View style={styles.paddingTop30}>
<Text style={[styles.feeModalLabel, stylesHook.feeModalLabel]}>{loc.send.insert_custom_fee}</Text>
<View style={styles.optionsContent} />
<TextInput
style={[styles.feeModalLabel, stylesHook.feeModalLabel, styles.customFeeTextInput]}
keyboardType="numeric"
placeholder={loc.send.create_fee}
value={customFee}
onChangeText={setCustomFeeState}
autoFocus
/>
</View>
</BottomModal>
</BottomModal>
);
},
);
export default SelectFeeModal;
const styles = StyleSheet.create({
loading: {
flex: 1,
paddingTop: 20,
},
root: {
flex: 1,
justifyContent: 'space-between',
},
scrollViewContent: {
flexDirection: 'row',
},
scrollViewIndicator: {
top: 0,
left: 8,
bottom: 0,
right: 8,
},
modalContent: {
margin: 22,
},
modalContentMinHeight: Platform.OS === 'android' ? { minHeight: 400 } : {},
paddingTop66: { paddingVertical: 66 },
paddingTop30: { paddingBottom: 60, paddingTop: 30 },
optionsContent: {
padding: 22,
},
feeModalItem: {
paddingHorizontal: 16,
paddingVertical: 8,
marginBottom: 10,
},
feeModalItemActive: {
borderRadius: 8,
},
feeModalRow: {
justifyContent: 'space-between',
flexDirection: 'row',
alignItems: 'center',
},
feeModalLabel: {
fontSize: 22,
fontWeight: '600',
},
customFeeTextInput: {
backgroundColor: '#FFFFFF',
borderColor: '#9aa0aa',
borderWidth: 1,
borderRadius: 4,
padding: 8,
marginVertical: 8,
fontSize: 16,
},
feeModalTime: {
borderRadius: 5,
paddingHorizontal: 6,
paddingVertical: 3,
},
feeModalCustomText: {
fontSize: 15,
fontWeight: '600',
},
createButton: {
marginVertical: 16,
marginHorizontal: 16,
alignContent: 'center',
minHeight: 44,
},
select: {
marginBottom: 24,
marginHorizontal: 24,
alignItems: 'center',
},
selectTouch: {
flexDirection: 'row',
alignItems: 'center',
},
selectText: {
color: '#9aa0aa',
fontSize: 14,
marginRight: 8,
},
selectWrap: {
flexDirection: 'row',
alignItems: 'center',
marginVertical: 4,
},
selectLabel: {
fontSize: 14,
},
of: {
alignSelf: 'flex-end',
marginRight: 18,
marginVertical: 8,
},
feeModalFooter: {
paddingBottom: 36,
flexDirection: 'row',
justifyContent: 'space-between',
},
feeModalFooterSpacing: {
paddingHorizontal: 24,
},
memo: {
flexDirection: 'row',
borderWidth: 1,
borderBottomWidth: 0.5,
minHeight: 44,
height: 44,
marginHorizontal: 20,
alignItems: 'center',
marginVertical: 8,
borderRadius: 4,
},
memoText: {
flex: 1,
marginHorizontal: 8,
minHeight: 33,
color: '#81868e',
},
fee: {
flexDirection: 'row',
marginHorizontal: 20,
justifyContent: 'space-between',
alignItems: 'center',
},
feeLabel: {
fontSize: 14,
},
feeRow: {
minWidth: 40,
height: 25,
borderRadius: 4,
justifyContent: 'space-between',
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 10,
},
advancedOptions: {
minWidth: 40,
height: 40,
justifyContent: 'center',
},
feeModalCloseButton: {
paddingHorizontal: 10,
paddingVertical: 8,
},
feeModalCloseButtonText: {
color: '#007AFF',
},
});

View file

@ -1,7 +1,7 @@
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import Clipboard from '@react-native-clipboard/clipboard';
import { Linking, View } from 'react-native';
import { Linking, View, ViewStyle } from 'react-native';
import Lnurl from '../class/lnurl';
import { LightningTransaction, Transaction } from '../class/wallets/types';
import TransactionExpiredIcon from '../components/icons/TransactionExpiredIcon';
@ -23,312 +23,321 @@ import { DetailViewStackParamList } from '../navigation/DetailViewStackParamList
import { useStorage } from '../hooks/context/useStorage';
import ToolTipMenu from './TooltipMenu';
import { CommonToolTipActions } from '../typings/CommonToolTipActions';
import { pop } from '../NavigationService';
interface TransactionListItemProps {
itemPriceUnit: BitcoinUnit;
walletID: string;
item: Transaction & LightningTransaction; // using type intersection to have less issues with ts
searchQuery?: string;
style?: ViewStyle;
renderHighlightedText?: (text: string, query: string) => JSX.Element;
}
type NavigationProps = NativeStackNavigationProp<DetailViewStackParamList>;
export const TransactionListItem: React.FC<TransactionListItemProps> = React.memo(({ item, itemPriceUnit = BitcoinUnit.BTC, walletID }) => {
const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1);
const { colors } = useTheme();
const { navigate } = useExtendedNavigation<NavigationProps>();
const menuRef = useRef<ToolTipMenuProps>();
const { txMetadata, counterpartyMetadata, wallets } = useStorage();
const { language } = useSettings();
const containerStyle = useMemo(
() => ({
backgroundColor: 'transparent',
borderBottomColor: colors.lightBorder,
}),
[colors.lightBorder],
);
export const TransactionListItem: React.FC<TransactionListItemProps> = React.memo(
({ item, itemPriceUnit = BitcoinUnit.BTC, walletID, searchQuery, style, renderHighlightedText }) => {
const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1);
const { colors } = useTheme();
const { navigate } = useExtendedNavigation<NavigationProps>();
const menuRef = useRef<ToolTipMenuProps>();
const { txMetadata, counterpartyMetadata, wallets } = useStorage();
const { language } = useSettings();
const containerStyle = useMemo(
() => ({
backgroundColor: 'transparent',
borderBottomColor: colors.lightBorder,
}),
[colors.lightBorder],
);
const shortenContactName = (name: string): string => {
if (name.length < 16) return name;
return name.substr(0, 7) + '...' + name.substr(name.length - 7, 7);
};
const combinedStyle = useMemo(() => [containerStyle, style], [containerStyle, style]);
const title = useMemo(() => {
if (item.confirmations === 0) {
return loc.transactions.pending;
} else {
return transactionTimeToReadable(item.received!);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [item.confirmations, item.received, language]);
const shortenContactName = (name: string): string => {
if (name.length < 16) return name;
return name.substr(0, 7) + '...' + name.substr(name.length - 7, 7);
};
let counterparty;
if (item.counterparty) {
counterparty = counterpartyMetadata?.[item.counterparty]?.label ?? item.counterparty;
}
const txMemo = (counterparty ? `[${shortenContactName(counterparty)}] ` : '') + (txMetadata[item.hash]?.memo ?? '');
const subtitle = useMemo(() => {
let sub = Number(item.confirmations) < 7 ? loc.formatString(loc.transactions.list_conf, { number: item.confirmations }) : '';
if (sub !== '') sub += ' ';
sub += txMemo;
if (item.memo) sub += item.memo;
return sub || undefined;
}, [txMemo, item.confirmations, item.memo]);
const rowTitle = useMemo(() => {
if (item.type === 'user_invoice' || item.type === 'payment_request') {
if (isNaN(Number(item.value))) {
item.value = 0;
}
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (invoiceExpiration > now) {
return formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
const title = useMemo(() => {
if (item.confirmations === 0) {
return loc.transactions.pending;
} else {
if (item.ispaid) {
return transactionTimeToReadable(item.received!);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [item.confirmations, item.received, language]);
let counterparty;
if (item.counterparty) {
counterparty = counterpartyMetadata?.[item.counterparty]?.label ?? item.counterparty;
}
const txMemo = (counterparty ? `[${shortenContactName(counterparty)}] ` : '') + (txMetadata[item.hash]?.memo ?? '');
const subtitle = useMemo(() => {
let sub = Number(item.confirmations) < 7 ? loc.formatString(loc.transactions.list_conf, { number: item.confirmations }) : '';
if (sub !== '') sub += ' ';
sub += txMemo;
if (item.memo) sub += item.memo;
return sub || undefined;
}, [txMemo, item.confirmations, item.memo]);
const rowTitle = useMemo(() => {
if (item.type === 'user_invoice' || item.type === 'payment_request') {
if (isNaN(Number(item.value))) {
item.value = 0;
}
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (invoiceExpiration > now) {
return formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
} else {
return loc.lnd.expired;
if (item.ispaid) {
return formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
} else {
return loc.lnd.expired;
}
}
} else {
return formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
}
} else {
return formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
}
}, [item, itemPriceUnit]);
}, [item, itemPriceUnit]);
const rowTitleStyle = useMemo(() => {
let color = colors.successColor;
const rowTitleStyle = useMemo(() => {
let color = colors.successColor;
if (item.type === 'user_invoice' || item.type === 'payment_request') {
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (item.type === 'user_invoice' || item.type === 'payment_request') {
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (invoiceExpiration > now) {
color = colors.successColor;
} else if (invoiceExpiration < now) {
if (item.ispaid) {
if (invoiceExpiration > now) {
color = colors.successColor;
} else if (invoiceExpiration < now) {
if (item.ispaid) {
color = colors.successColor;
} else {
color = '#9AA0AA';
}
}
} else if (item.value! / 100000000 < 0) {
color = colors.foregroundColor;
}
return {
color,
fontSize: 14,
fontWeight: '600',
textAlign: 'right',
};
}, [item, colors.foregroundColor, colors.successColor]);
const determineTransactionTypeAndAvatar = () => {
if (item.category === 'receive' && item.confirmations! < 3) {
return {
label: loc.transactions.pending_transaction,
icon: <TransactionPendingIcon />,
};
}
if (item.type && item.type === 'bitcoind_tx') {
return {
label: loc.transactions.onchain,
icon: <TransactionOnchainIcon />,
};
}
if (item.type === 'paid_invoice') {
return {
label: loc.transactions.offchain,
icon: <TransactionOffchainIcon />,
};
}
if (item.type === 'user_invoice' || item.type === 'payment_request') {
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (!item.ispaid && invoiceExpiration < now) {
return {
label: loc.transactions.expired_transaction,
icon: <TransactionExpiredIcon />,
};
} else {
color = '#9AA0AA';
return {
label: loc.transactions.incoming_transaction,
icon: <TransactionOffchainIncomingIcon />,
};
}
}
} else if (item.value! / 100000000 < 0) {
color = colors.foregroundColor;
}
return {
color,
fontSize: 14,
fontWeight: '600',
textAlign: 'right',
};
}, [item, colors.foregroundColor, colors.successColor]);
const determineTransactionTypeAndAvatar = () => {
if (item.category === 'receive' && item.confirmations! < 3) {
return {
label: loc.transactions.pending_transaction,
icon: <TransactionPendingIcon />,
};
}
if (item.type && item.type === 'bitcoind_tx') {
return {
label: loc.transactions.onchain,
icon: <TransactionOnchainIcon />,
};
}
if (item.type === 'paid_invoice') {
return {
label: loc.transactions.offchain,
icon: <TransactionOffchainIcon />,
};
}
if (item.type === 'user_invoice' || item.type === 'payment_request') {
const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; // eslint-disable-line no-bitwise
const invoiceExpiration = item.timestamp! + item.expire_time!;
if (!item.ispaid && invoiceExpiration < now) {
if (!item.confirmations) {
return {
label: loc.transactions.expired_transaction,
icon: <TransactionExpiredIcon />,
label: loc.transactions.pending_transaction,
icon: <TransactionPendingIcon />,
};
} else if (item.value! < 0) {
return {
label: loc.transactions.outgoing_transaction,
icon: <TransactionOutgoingIcon />,
};
} else {
return {
label: loc.transactions.incoming_transaction,
icon: <TransactionOffchainIncomingIcon />,
icon: <TransactionIncomingIcon />,
};
}
}
if (!item.confirmations) {
return {
label: loc.transactions.pending_transaction,
icon: <TransactionPendingIcon />,
};
} else if (item.value! < 0) {
return {
label: loc.transactions.outgoing_transaction,
icon: <TransactionOutgoingIcon />,
};
} else {
return {
label: loc.transactions.incoming_transaction,
icon: <TransactionIncomingIcon />,
};
}
};
const { label: transactionTypeLabel, icon: avatar } = determineTransactionTypeAndAvatar();
const amountWithUnit = useMemo(() => {
const amount = formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
const unit = itemPriceUnit === BitcoinUnit.BTC || itemPriceUnit === BitcoinUnit.SATS ? ` ${itemPriceUnit}` : ' ';
return `${amount}${unit}`;
}, [item.value, itemPriceUnit]);
useEffect(() => {
setSubtitleNumberOfLines(1);
}, [subtitle]);
const onPress = useCallback(async () => {
menuRef?.current?.dismissMenu?.();
if (item.hash) {
navigate('TransactionStatus', { hash: item.hash, walletID });
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') {
const lightningWallet = wallets.filter(wallet => wallet?.getID() === item.walletID);
if (lightningWallet.length === 1) {
try {
// is it a successful lnurl-pay?
const LN = new Lnurl(false, AsyncStorage);
let paymentHash = item.payment_hash!;
if (typeof paymentHash === 'object') {
paymentHash = Buffer.from(paymentHash.data).toString('hex');
}
const loaded = await LN.loadSuccessfulPayment(paymentHash);
if (loaded) {
navigate('ScanLndInvoiceRoot', {
screen: 'LnurlPaySuccess',
params: {
paymentHash,
justPaid: false,
fromWalletID: lightningWallet[0].getID(),
},
});
return;
}
} catch (e) {
console.log(e);
}
navigate('LNDViewInvoice', {
invoice: item,
walletID: lightningWallet[0].getID(),
});
}
}
}, [item, wallets, navigate, walletID]);
const handleOnExpandNote = useCallback(() => {
setSubtitleNumberOfLines(0);
}, []);
const subtitleProps = useMemo(() => ({ numberOfLines: subtitleNumberOfLines }), [subtitleNumberOfLines]);
const handleOnCopyAmountTap = useCallback(() => Clipboard.setString(rowTitle.replace(/[\s\\-]/g, '')), [rowTitle]);
const handleOnCopyTransactionID = useCallback(() => Clipboard.setString(item.hash), [item.hash]);
const handleOnCopyNote = useCallback(() => Clipboard.setString(subtitle ?? ''), [subtitle]);
const handleOnViewOnBlockExplorer = useCallback(() => {
const url = `https://mempool.space/tx/${item.hash}`;
Linking.canOpenURL(url).then(supported => {
if (supported) {
Linking.openURL(url);
}
});
}, [item.hash]);
const handleCopyOpenInBlockExplorerPress = useCallback(() => {
Clipboard.setString(`https://mempool.space/tx/${item.hash}`);
}, [item.hash]);
const onToolTipPress = useCallback(
(id: any) => {
if (id === CommonToolTipActions.CopyAmount.id) {
handleOnCopyAmountTap();
} else if (id === CommonToolTipActions.CopyNote.id) {
handleOnCopyNote();
} else if (id === CommonToolTipActions.OpenInBlockExplorer.id) {
handleOnViewOnBlockExplorer();
} else if (id === CommonToolTipActions.ExpandNote.id) {
handleOnExpandNote();
} else if (id === CommonToolTipActions.CopyBlockExplorerLink.id) {
handleCopyOpenInBlockExplorerPress();
} else if (id === CommonToolTipActions.CopyTXID.id) {
handleOnCopyTransactionID();
}
},
[
handleCopyOpenInBlockExplorerPress,
handleOnCopyAmountTap,
handleOnCopyNote,
handleOnCopyTransactionID,
handleOnExpandNote,
handleOnViewOnBlockExplorer,
],
);
const toolTipActions = useMemo((): Action[] | Action[][] => {
const actions: (Action | Action[])[] = [];
if (rowTitle !== loc.lnd.expired) {
actions.push(CommonToolTipActions.CopyAmount);
}
if (subtitle) {
actions.push(CommonToolTipActions.CopyNote);
}
if (item.hash) {
actions.push(CommonToolTipActions.CopyTXID, CommonToolTipActions.CopyBlockExplorerLink, [CommonToolTipActions.OpenInBlockExplorer]);
}
if (subtitle && subtitleNumberOfLines === 1) {
actions.push([CommonToolTipActions.ExpandNote]);
}
return actions as Action[] | Action[][];
}, [item.hash, subtitle, rowTitle, subtitleNumberOfLines]);
const accessibilityState = useMemo(() => {
return {
expanded: subtitleNumberOfLines === 0,
};
}, [subtitleNumberOfLines]);
return (
<ToolTipMenu
isButton
actions={toolTipActions}
onPressMenuItem={onToolTipPress}
onPress={onPress}
accessibilityLabel={`${transactionTypeLabel}, ${amountWithUnit}, ${subtitle ?? title}`}
accessibilityRole="button"
accessibilityState={accessibilityState}
>
<ListItem
leftAvatar={avatar}
title={title}
subtitleNumberOfLines={subtitleNumberOfLines}
subtitle={subtitle}
Component={View}
subtitleProps={subtitleProps}
chevron={false}
rightTitle={rowTitle}
rightTitleStyle={rowTitleStyle}
containerStyle={containerStyle}
/>
</ToolTipMenu>
);
});
const { label: transactionTypeLabel, icon: avatar } = determineTransactionTypeAndAvatar();
const amountWithUnit = useMemo(() => {
const amount = formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString();
const unit = itemPriceUnit === BitcoinUnit.BTC || itemPriceUnit === BitcoinUnit.SATS ? ` ${itemPriceUnit}` : ' ';
return `${amount}${unit}`;
}, [item.value, itemPriceUnit]);
useEffect(() => {
setSubtitleNumberOfLines(1);
}, [subtitle]);
const onPress = useCallback(async () => {
menuRef?.current?.dismissMenu?.();
if (item.hash) {
pop();
navigate('TransactionStatus', { hash: item.hash, walletID });
} else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') {
const lightningWallet = wallets.filter(wallet => wallet?.getID() === item.walletID);
if (lightningWallet.length === 1) {
try {
// is it a successful lnurl-pay?
const LN = new Lnurl(false, AsyncStorage);
let paymentHash = item.payment_hash!;
if (typeof paymentHash === 'object') {
paymentHash = Buffer.from(paymentHash.data).toString('hex');
}
const loaded = await LN.loadSuccessfulPayment(paymentHash);
if (loaded) {
navigate('ScanLndInvoiceRoot', {
screen: 'LnurlPaySuccess',
params: {
paymentHash,
justPaid: false,
fromWalletID: lightningWallet[0].getID(),
},
});
return;
}
} catch (e) {
console.debug(e);
}
navigate('LNDViewInvoice', {
invoice: item,
walletID: lightningWallet[0].getID(),
});
}
}
}, [item, wallets, navigate, walletID]);
const handleOnExpandNote = useCallback(() => {
setSubtitleNumberOfLines(0);
}, []);
const subtitleProps = useMemo(() => ({ numberOfLines: subtitleNumberOfLines }), [subtitleNumberOfLines]);
const handleOnCopyAmountTap = useCallback(() => Clipboard.setString(rowTitle.replace(/[\s\\-]/g, '')), [rowTitle]);
const handleOnCopyTransactionID = useCallback(() => Clipboard.setString(item.hash), [item.hash]);
const handleOnCopyNote = useCallback(() => Clipboard.setString(subtitle ?? ''), [subtitle]);
const handleOnViewOnBlockExplorer = useCallback(() => {
const url = `https://mempool.space/tx/${item.hash}`;
Linking.canOpenURL(url).then(supported => {
if (supported) {
Linking.openURL(url);
}
});
}, [item.hash]);
const handleCopyOpenInBlockExplorerPress = useCallback(() => {
Clipboard.setString(`https://mempool.space/tx/${item.hash}`);
}, [item.hash]);
const onToolTipPress = useCallback(
(id: any) => {
if (id === CommonToolTipActions.CopyAmount.id) {
handleOnCopyAmountTap();
} else if (id === CommonToolTipActions.CopyNote.id) {
handleOnCopyNote();
} else if (id === CommonToolTipActions.OpenInBlockExplorer.id) {
handleOnViewOnBlockExplorer();
} else if (id === CommonToolTipActions.ExpandNote.id) {
handleOnExpandNote();
} else if (id === CommonToolTipActions.CopyBlockExplorerLink.id) {
handleCopyOpenInBlockExplorerPress();
} else if (id === CommonToolTipActions.CopyTXID.id) {
handleOnCopyTransactionID();
}
},
[
handleCopyOpenInBlockExplorerPress,
handleOnCopyAmountTap,
handleOnCopyNote,
handleOnCopyTransactionID,
handleOnExpandNote,
handleOnViewOnBlockExplorer,
],
);
const toolTipActions = useMemo((): Action[] | Action[][] => {
const actions: (Action | Action[])[] = [];
if (rowTitle !== loc.lnd.expired) {
actions.push(CommonToolTipActions.CopyAmount);
}
if (subtitle) {
actions.push(CommonToolTipActions.CopyNote);
}
if (item.hash) {
actions.push(CommonToolTipActions.CopyTXID, CommonToolTipActions.CopyBlockExplorerLink, [CommonToolTipActions.OpenInBlockExplorer]);
}
if (subtitle && subtitleNumberOfLines === 1) {
actions.push([CommonToolTipActions.ExpandNote]);
}
return actions as Action[] | Action[][];
}, [item.hash, subtitle, rowTitle, subtitleNumberOfLines]);
const accessibilityState = useMemo(() => {
return {
expanded: subtitleNumberOfLines === 0,
};
}, [subtitleNumberOfLines]);
return (
<ToolTipMenu
isButton
actions={toolTipActions}
onPressMenuItem={onToolTipPress}
onPress={onPress}
accessibilityLabel={`${transactionTypeLabel}, ${amountWithUnit}, ${subtitle ?? title}`}
accessibilityRole="button"
accessibilityState={accessibilityState}
>
<ListItem
leftAvatar={avatar}
title={title}
subtitleNumberOfLines={subtitleNumberOfLines}
subtitle={subtitle ? (renderHighlightedText ? renderHighlightedText(subtitle, searchQuery ?? '') : subtitle) : undefined}
Component={View}
subtitleProps={subtitleProps}
chevron={false}
rightTitle={rowTitle}
rightTitleStyle={rowTitleStyle}
containerStyle={combinedStyle}
/>
</ToolTipMenu>
);
},
);

View file

@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import Clipboard from '@react-native-clipboard/clipboard';
import { I18nManager, Image, LayoutAnimation, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import { LightningCustodianWallet, LightningLdkWallet, MultisigHDWallet } from '../class';
import { LightningCustodianWallet, MultisigHDWallet } from '../class';
import WalletGradient from '../class/wallet-gradient';
import { TWallet } from '../class/wallets/types';
import loc, { formatBalance, formatBalanceWithoutSuffix } from '../loc';
@ -184,7 +184,6 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
<Image
source={(() => {
switch (wallet.type) {
case LightningLdkWallet.type:
case LightningCustodianWallet.type:
return I18nManager.isRTL ? require('../img/lnd-shape-rtl.png') : require('../img/lnd-shape.png');
case MultisigHDWallet.type:
@ -231,7 +230,7 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
<TouchableOpacity style={styles.walletPreferredUnitView} onPress={changeWalletBalanceUnit}>
<Text style={styles.walletPreferredUnitText}>
{wallet.getPreferredBalanceUnit() === BitcoinUnit.LOCAL_CURRENCY
? (preferredFiatCurrency?.endPointKey ?? FiatUnit.USD)
? preferredFiatCurrency?.endPointKey ?? FiatUnit.USD
: wallet.getPreferredBalanceUnit()}
</Text>
</TouchableOpacity>
@ -247,16 +246,6 @@ const TransactionsNavigationHeader: React.FC<TransactionsNavigationHeaderProps>
<Text style={styles.manageFundsButtonText}>{loc.lnd.title}</Text>
</ToolTipMenu>
)}
{wallet.type === LightningLdkWallet.type && (
<TouchableOpacity
style={styles.manageFundsButton}
accessibilityRole="button"
accessibilityLabel={loc.lnd.title}
onPress={() => handleManageFundsPressed()}
>
<Text style={styles.manageFundsButtonText}>{loc.lnd.title}</Text>
</TouchableOpacity>
)}
{wallet.type === MultisigHDWallet.type && (
<TouchableOpacity style={styles.manageFundsButton} accessibilityRole="button" onPress={() => handleManageFundsPressed()}>
<Text style={styles.manageFundsButtonText}>{loc.multisig.manage_keys}</Text>

View file

@ -8,7 +8,6 @@ import {
Pressable,
StyleSheet,
Text,
TouchableOpacity,
useWindowDimensions,
View,
FlatListProps,
@ -17,7 +16,7 @@ import {
} from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import { BlueSpacing10 } from '../BlueComponents';
import { LightningCustodianWallet, LightningLdkWallet, MultisigHDWallet } from '../class';
import { LightningCustodianWallet, MultisigHDWallet } from '../class';
import WalletGradient from '../class/wallet-gradient';
import { useIsLargeScreen } from '../hooks/useIsLargeScreen';
import loc, { formatBalance, transactionTimeToReadable } from '../loc';
@ -73,12 +72,7 @@ const NewWalletPanel: React.FC<NewWalletPanelProps> = ({ onPress }) => {
});
return (
<TouchableOpacity
accessibilityRole="button"
testID="CreateAWallet"
onPress={onPress}
style={isLargeScreen ? {} : { width: itemWidth * 1.2 }}
>
<Pressable accessibilityRole="button" testID="CreateAWallet" onPress={onPress} style={isLargeScreen ? {} : { width: itemWidth * 1.2 }}>
<View
style={[
nStyles.container,
@ -93,7 +87,7 @@ const NewWalletPanel: React.FC<NewWalletPanelProps> = ({ onPress }) => {
<Text style={[nStyles.buttonText, { color: colors.brandingColor }]}>{loc.wallets.list_create_a_button}</Text>
</View>
</View>
</TouchableOpacity>
</Pressable>
);
};
@ -105,7 +99,8 @@ interface WalletCarouselItemProps {
customStyle?: ViewStyle;
horizontal?: boolean;
isActive?: boolean;
allowOnPressAnimation?: boolean;
searchQuery?: string;
renderHighlightedText?: (text: string, query: string) => JSX.Element;
}
const iStyles = StyleSheet.create({
@ -168,7 +163,7 @@ const iStyles = StyleSheet.create({
});
export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
({ item, onPress, handleLongPress, isSelectedWallet, customStyle, horizontal, allowOnPressAnimation = true }) => {
({ item, onPress, handleLongPress, isSelectedWallet, customStyle, horizontal, searchQuery, renderHighlightedText }) => {
const scaleValue = useRef(new Animated.Value(1.0)).current;
const { colors } = useTheme();
const { walletTransactionUpdateStatus } = useStorage();
@ -202,7 +197,6 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
const opacity = isSelectedWallet === false ? 0.5 : 1.0;
let image;
switch (item.type) {
case LightningLdkWallet.type:
case LightningCustodianWallet.type:
image = I18nManager.isRTL ? require('../img/lnd-shape-rtl.png') : require('../img/lnd-shape.png');
break;
@ -227,15 +221,15 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
return (
<Animated.View
style={[
isLargeScreen || !horizontal ? [iStyles.rootLargeDevice, customStyle] : (customStyle ?? { ...iStyles.root, width: itemWidth }),
isLargeScreen || !horizontal ? [iStyles.rootLargeDevice, customStyle] : customStyle ?? { ...iStyles.root, width: itemWidth },
{ opacity, transform: [{ scale: scaleValue }] },
]}
>
<Pressable
accessibilityRole="button"
testID={item.getLabel()}
onPressIn={allowOnPressAnimation ? onPressedIn : undefined}
onPressOut={allowOnPressAnimation ? onPressedOut : undefined}
onPressIn={onPressedIn}
onPressOut={onPressedOut}
onLongPress={() => {
if (handleLongPress) handleLongPress();
}}
@ -246,7 +240,7 @@ export const WalletCarouselItem: React.FC<WalletCarouselItemProps> = React.memo(
<Image source={image} style={iStyles.image} />
<Text style={iStyles.br} />
<Text numberOfLines={1} style={[iStyles.label, { color: colors.inverseForegroundColor }]}>
{item.getLabel()}
{renderHighlightedText && searchQuery ? renderHighlightedText(item.getLabel(), searchQuery) : item.getLabel()}
</Text>
<View style={iStyles.balanceContainer}>
{item.hideBalance ? (
@ -288,6 +282,8 @@ interface WalletsCarouselProps extends Partial<FlatListProps<any>> {
handleLongPress?: () => void;
data: TWallet[];
scrollEnabled?: boolean;
searchQuery?: string;
renderHighlightedText?: (text: string, query: string) => JSX.Element;
}
type FlatListRefType = FlatList<any> & {
@ -316,7 +312,17 @@ const cStyles = StyleSheet.create({
const ListHeaderComponent: React.FC = () => <View style={cStyles.separatorStyle} />;
const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props, ref) => {
const { horizontal, data, handleLongPress, onPress, selectedWallet, scrollEnabled, onNewWalletPress } = props;
const {
horizontal,
data,
handleLongPress,
onPress,
selectedWallet,
scrollEnabled,
onNewWalletPress,
searchQuery,
renderHighlightedText,
} = props;
const renderItem = useCallback(
({ item, index }: ListRenderItemInfo<TWallet>) =>
item ? (
@ -326,34 +332,40 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
handleLongPress={handleLongPress}
onPress={onPress}
horizontal={horizontal}
searchQuery={searchQuery}
renderHighlightedText={renderHighlightedText}
/>
) : null,
[horizontal, selectedWallet, handleLongPress, onPress],
[horizontal, selectedWallet, handleLongPress, onPress, searchQuery, renderHighlightedText],
);
const flatListRef = useRef<FlatList<any>>(null);
useImperativeHandle(ref, (): any => {
return {
scrollToEnd: (params: { animated?: boolean | null | undefined } | undefined) => flatListRef.current?.scrollToEnd(params),
scrollToIndex: (params: {
animated?: boolean | null | undefined;
index: number;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}) => flatListRef.current?.scrollToIndex(params),
scrollToItem: (params: {
animated?: boolean | null | undefined;
item: any;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}) => flatListRef.current?.scrollToItem(params),
scrollToOffset: (params: { animated?: boolean | null | undefined; offset: number }) => flatListRef.current?.scrollToOffset(params),
recordInteraction: () => flatListRef.current?.recordInteraction(),
flashScrollIndicators: () => flatListRef.current?.flashScrollIndicators(),
getNativeScrollRef: () => flatListRef.current?.getNativeScrollRef(),
};
}, []);
useImperativeHandle(
ref,
(): any => {
return {
scrollToEnd: (params: { animated?: boolean | null | undefined } | undefined) => flatListRef.current?.scrollToEnd(params),
scrollToIndex: (params: {
animated?: boolean | null | undefined;
index: number;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}) => flatListRef.current?.scrollToIndex(params),
scrollToItem: (params: {
animated?: boolean | null | undefined;
item: any;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}) => flatListRef.current?.scrollToItem(params),
scrollToOffset: (params: { animated?: boolean | null | undefined; offset: number }) => flatListRef.current?.scrollToOffset(params),
recordInteraction: () => flatListRef.current?.recordInteraction(),
flashScrollIndicators: () => flatListRef.current?.flashScrollIndicators(),
getNativeScrollRef: () => flatListRef.current?.getNativeScrollRef(),
};
},
[],
);
const onScrollToIndexFailed = (error: { averageItemLength: number; index: number }): void => {
console.debug('onScrollToIndexFailed');
@ -402,6 +414,8 @@ const WalletsCarousel = forwardRef<FlatListRefType, WalletsCarouselProps>((props
handleLongPress={handleLongPress}
onPress={onPress}
key={index}
searchQuery={props.searchQuery}
renderHighlightedText={props.renderHighlightedText}
/>
) : null,
)}

View file

@ -0,0 +1,26 @@
import { useEffect, useRef } from 'react';
import { Animated } from 'react-native';
const useBounceAnimation = (query: string) => {
const bounceAnim = useRef(new Animated.Value(1.0)).current;
useEffect(() => {
if (query) {
Animated.timing(bounceAnim, {
toValue: 1.2,
duration: 150,
useNativeDriver: true,
}).start(() => {
Animated.timing(bounceAnim, {
toValue: 1.0,
duration: 150,
useNativeDriver: true,
}).start();
});
}
}, [bounceAnim, query]);
return bounceAnim;
};
export default useBounceAnimation;

View file

@ -1,386 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSMinimumSystemVersion</key>
<string>11</string>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>io.bluewallet.bluewallet.fetchTxsForWallet</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>BlueWallet</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>PSBT</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>io.bluewallet.psbt</string>
</array>
</dict>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>TXN</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>io.bluewallet.psbt.txn</string>
</array>
</dict>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>ELECTRUMBACKUP</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<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/>
<key>CFBundleTypeName</key>
<string>BW COSIGNER</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>io.bluewallet.bwcosigner</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>bitcoin</string>
<string>lightning</string>
<string>bluewallet</string>
<string>lapp</string>
<string>blue</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.finance</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
<string>http</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>onion</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>tailscale.net</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>ts.net</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
<key>NSCameraUsageDescription</key>
<string>In order to quickly scan the recipient&apos;s address, we need your permission to use the camera to scan their QR Code.</string>
<key>NSFaceIDUsageDescription</key>
<string>In order to use FaceID please confirm your permission.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Your authorization is required to save this image.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>In order to import an image for scanning, we need your permission to access your photo library.</string>
<key>NSUserActivityTypes</key>
<array>
<string>io.bluewallet.bluewallet.receiveonchain</string>
<string>io.bluewallet.bluewallet.xpub</string>
</array>
<key>UIAppFonts</key>
<array>
<string>Entypo.ttf</string>
<string>FontAwesome.ttf</string>
<string>FontAwesome5_Brands.ttf</string>
<string>FontAwesome5_Regular.ttf</string>
<string>FontAwesome5_Solid.ttf</string>
<string>Ionicons.ttf</string>
<string>MaterialIcons.ttf</string>
<string>Octicons.ttf</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
<string>remote-notification</string>
</array>
<key>UIFileSharingEnabled</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Partially Signed Bitcoin Transaction</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.psbt</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>psbt</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.json</string>
</array>
<key>UTTypeDescription</key>
<string>BW COSIGNER</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.bwcosigner</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>bwcosigner</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Bitcoin Transaction</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.psbt.txn</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>txn</string>
</array>
</dict>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.text</string>
</array>
<key>UTTypeDescription</key>
<string>JSON File</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>public.json</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>json</string>
</array>
<key>public.mime-type</key>
<array>
<string>application/json</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Partially Signed Bitcoin Transaction</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.psbt</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>psbt</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Bitcoin Transaction</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.psbt.txn</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>txn</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Electrum Backup</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.backup</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>backup</string>
</array>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.json</string>
</array>
<key>UTTypeDescription</key>
<string>BW COSIGNER</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>io.bluewallet.bwcosigner</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>bwcosigner</string>
</array>
</dict>
</dict>
</array>
<key>bugsnag</key>
<dict>
<key>apiKey</key>
<string>17ba9059f676f1cc4f45d98182388b01</string>
</dict>
</dict>
</plist>

View file

@ -9,7 +9,6 @@
/* Begin PBXBuildFile section */
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
2B2B129397ACA4E7FCCB4F6F /* libPods-BlueWallet-NoLDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 52FA0F1447D69747BD547E1E /* libPods-BlueWallet-NoLDK.a */; };
32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; };
32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; };
6D2A6464258BA92D0092292B /* Stickers.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2A6463258BA92D0092292B /* Stickers.xcassets */; };
@ -59,13 +58,11 @@
B40D4E632258425500428FCC /* ReceiveInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5B2258425500428FCC /* ReceiveInterfaceController.swift */; };
B40D4E642258425500428FCC /* WalletDetailsInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5C2258425500428FCC /* WalletDetailsInterfaceController.swift */; };
B40FC3FA29CCD1D00007EBAC /* SwiftTCPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40FC3F829CCD1AC0007EBAC /* SwiftTCPClient.swift */; };
B411DA832C2F1D3700115221 /* SwiftTCPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40FC3F829CCD1AC0007EBAC /* SwiftTCPClient.swift */; };
B41B76852B66B2FF002C48D5 /* Bugsnag in Frameworks */ = {isa = PBXBuildFile; productRef = B41B76842B66B2FF002C48D5 /* Bugsnag */; };
B41B76872B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin in Frameworks */ = {isa = PBXBuildFile; productRef = B41B76862B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin */; };
B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; };
B41C2E572BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; };
B41C2E582BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; };
B41C2E592BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; };
B43D0378225847C500FBAA95 /* WalletGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0372225847C500FBAA95 /* WalletGradient.swift */; };
B43D0379225847C500FBAA95 /* WatchDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0373225847C500FBAA95 /* WatchDataSource.swift */; };
B43D037A225847C500FBAA95 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0374225847C500FBAA95 /* Transaction.swift */; };
@ -75,112 +72,65 @@
B44033BF2BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; };
B44033C02BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; };
B44033C12BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; };
B44033C22BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; };
B44033C42BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; };
B44033C52BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; };
B44033C62BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; };
B44033C72BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; };
B44033CA2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; };
B44033CB2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; };
B44033CC2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; };
B44033CD2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; };
B44033CE2BCC352900162242 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; };
B44033CF2BCC352C00162242 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; };
B44033D02BCC352F00162242 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; };
B44033D32BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; };
B44033D42BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; };
B44033D52BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; };
B44033D62BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; };
B44033D72BCC369400162242 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; };
B44033D82BCC369500162242 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; };
B44033D92BCC369900162242 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; };
B44033DA2BCC369A00162242 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; };
B44033DB2BCC369B00162242 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; };
B44033DD2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; };
B44033DE2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; };
B44033DF2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; };
B44033E02BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; };
B44033E12BCC36CA00162242 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; };
B44033E22BCC36CB00162242 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; };
B44033E42BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; };
B44033E52BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; };
B44033E62BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; };
B44033E72BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; };
B44033E92BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; };
B44033EA2BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; };
B44033EB2BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; };
B44033EC2BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; };
B44033EE2BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; };
B44033EF2BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; };
B44033F02BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; };
B44033F12BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; };
B44033F42BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; };
B44033F52BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; };
B44033F62BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; };
B44033F72BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; };
B44033F92BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; };
B44033FA2BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; };
B44033FB2BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; };
B44033FC2BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; };
B44033FD2BCC37D600162242 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; };
B44033FE2BCC37D700162242 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; };
B44034002BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; };
B44034012BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; };
B44034022BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; };
B44034032BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; };
B44034042BCC389100162242 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B44034052BCC389200162242 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B44034062BCC389F00162242 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; };
B44034072BCC38A000162242 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; };
B440340F2BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; };
B44034102BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; };
B44034112BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; };
B44034122BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; };
B45010982C0FCB7700619044 /* MarketAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* MarketAPI+Electrum.swift */; };
B450109C2C0FCD8A00619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; };
B450109D2C0FCD9F00619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; };
B450109E2C0FCDA000619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; };
B450109F2C0FCDA500619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; };
B45010A62C1507DE00619044 /* CustomSegmentedControlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B45010A52C1507DE00619044 /* CustomSegmentedControlManager.m */; };
B4549F362B82B10D002E3153 /* ci_post_clone.sh in Resources */ = {isa = PBXBuildFile; fileRef = B4549F352B82B10D002E3153 /* ci_post_clone.sh */; };
B461B852299599F800E431AA /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = B461B851299599F800E431AA /* AppDelegate.mm */; };
B47462D02C1538D800100825 /* CustomSegmentedControlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B45010A52C1507DE00619044 /* CustomSegmentedControlManager.m */; };
B47B21EC2B2128B8001F6690 /* BlueWalletUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47B21EB2B2128B8001F6690 /* BlueWalletUITests.swift */; };
B48A6A292C1DF01000030AB9 /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = B48A6A282C1DF01000030AB9 /* KeychainSwift */; };
B49038D92B8FBAD300A8164A /* BlueWalletUITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49038D82B8FBAD300A8164A /* BlueWalletUITest.swift */; };
B4A29A2C2B55C990002A67DF /* EventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D32C5C52596CE3A008C077C /* EventEmitter.m */; };
B4A29A2D2B55C990002A67DF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
B4A29A2E2B55C990002A67DF /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = B461B851299599F800E431AA /* AppDelegate.mm */; };
B4A29A2F2B55C990002A67DF /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; };
B4A29A312B55C990002A67DF /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; };
B4A29A322B55C990002A67DF /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; };
B4A29A352B55C990002A67DF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; };
B4A29A372B55C990002A67DF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
B4A29A3A2B55C990002A67DF /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; platformFilter = ios; };
B4A29A3C2B55C990002A67DF /* Stickers.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B4A29A3D2B55C990002A67DF /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B4AB225D2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B4AB225E2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B4B1A4622BFA73110072E3BB /* WidgetHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */; };
B4B1A4642BFA73110072E3BB /* WidgetHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */; };
B4B1A4652BFA73110072E3BB /* WidgetHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */; };
B4D0B2622C1DEA11006B6B1B /* ReceivePageInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2612C1DEA11006B6B1B /* ReceivePageInterfaceController.swift */; };
B4D0B2642C1DEA99006B6B1B /* ReceiveType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2632C1DEA99006B6B1B /* ReceiveType.swift */; };
B4D0B2662C1DEB7F006B6B1B /* ReceiveInterfaceMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2652C1DEB7F006B6B1B /* ReceiveInterfaceMode.swift */; };
B4D0B2682C1DED67006B6B1B /* ReceiveMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2672C1DED67006B6B1B /* ReceiveMethod.swift */; };
B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; };
B4EFF73B2C3F6C5E0095D655 /* MockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EFF73A2C3F6C5E0095D655 /* MockData.swift */; };
B4EFF73C2C3F6C5E0095D655 /* MockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EFF73A2C3F6C5E0095D655 /* MockData.swift */; };
B4EFF73D2C3F6C6C0095D655 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; };
B4EFF7412C3F6C960095D655 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; };
B4EFF7422C3F6C990095D655 /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; };
B4EFF7432C3F6F650095D655 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; };
B4EFF7442C3F6F6A0095D655 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; };
B4EFF7452C3F6FF30095D655 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; };
B4EFF7462C3F6FF90095D655 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; };
B4EFF7472C3F70010095D655 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; };
B4EFF7482C3F70090095D655 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; };
C59F90CE0D04D3E4BB39BC5D /* libPods-BlueWalletUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F02C2F7CA3591E4E0B06EBA /* libPods-BlueWalletUITests.a */; };
C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; };
/* End PBXBuildFile section */
@ -220,41 +170,6 @@
remoteGlobalIDString = B40D4E2F225841EC00428FCC;
remoteInfo = BlueWalletWatch;
};
B47B21EF2B2128B8001F6690 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
remoteInfo = BlueWallet;
};
B49038D62B8FBA2500A8164A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = B4A29A212B55C990002A67DF;
remoteInfo = "BlueWallet-NoLDK";
};
B4A29A252B55C990002A67DF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6D99465D2555A660000E52E8;
remoteInfo = MarketWidgetExtension;
};
B4A29A272B55C990002A67DF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6D2A6460258BA92C0092292B;
remoteInfo = Stickers;
};
B4A29A292B55C990002A67DF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6DD4109B266CADF10087DE03;
remoteInfo = WidgetsExtension;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
@ -292,29 +207,6 @@
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
B4A29A392B55C990002A67DF /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
dstSubfolderSpec = 16;
files = (
B4A29A3A2B55C990002A67DF /* BlueWalletWatch.app in Embed Watch Content */,
);
name = "Embed Watch Content";
runOnlyForDeploymentPostprocessing = 0;
};
B4A29A3B2B55C990002A67DF /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
B4A29A3C2B55C990002A67DF /* Stickers.appex in Embed App Extensions */,
B4A29A3D2B55C990002A67DF /* WidgetsExtension.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@ -341,7 +233,6 @@
44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = "<group>"; };
47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = "<group>"; };
4F12F501B686459183E0BE0D /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
52FA0F1447D69747BD547E1E /* libPods-BlueWallet-NoLDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWallet-NoLDK.a"; sourceTree = BUILT_PRODUCTS_DIR; };
5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = "<group>"; };
6A65D81712444D37BA152B06 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = "<group>"; };
6D203C2025D4ED2500493AD1 /* BlueWalletWatch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BlueWalletWatch.entitlements; sourceTree = "<group>"; };
@ -408,14 +299,12 @@
849047C92702A32A008EE567 /* Handoff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Handoff.swift; sourceTree = "<group>"; };
84E05A832721191B001A0D3A /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
8637D4B5E14D443A9031DA95 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = "<group>"; };
8B160AC12BDAD72BB70BC175 /* Pods-BlueWallet-NoLDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet-NoLDK.release.xcconfig"; path = "Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK.release.xcconfig"; sourceTree = "<group>"; };
90F86BC5194548CA87D729A9 /* libToolTipMenu.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libToolTipMenu.a; sourceTree = "<group>"; };
94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = "<group>"; };
95208B2A05884A76B5BB99C0 /* libRCTGoogleAnalyticsBridge.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTGoogleAnalyticsBridge.a; sourceTree = "<group>"; };
95304AD151F1F531985AA341 /* libPods-BlueWallet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWallet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
9DF4E6C040764E4BA1ACC1EB /* libTcpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libTcpSockets.a; sourceTree = "<group>"; };
9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = "<group>"; };
A16A0CF8A3E6F577B90BF8A4 /* Pods-BlueWallet-NoLDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet-NoLDK.debug.xcconfig"; path = "Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK.debug.xcconfig"; sourceTree = "<group>"; };
A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = "<group>"; };
AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNReactNativeHapticFeedback.a; sourceTree = "<group>"; };
B40D4E30225841EC00428FCC /* BlueWalletWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWalletWatch.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -460,11 +349,8 @@
B4549F352B82B10D002E3153 /* ci_post_clone.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; };
B461B850299599F800E431AA /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = BlueWallet/AppDelegate.h; sourceTree = "<group>"; };
B461B851299599F800E431AA /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = BlueWallet/AppDelegate.mm; sourceTree = "<group>"; };
B47B21E92B2128B8001F6690 /* BlueWalletUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlueWalletUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
B47B21EB2B2128B8001F6690 /* BlueWalletUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueWalletUITests.swift; sourceTree = "<group>"; };
B49038D82B8FBAD300A8164A /* BlueWalletUITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueWalletUITest.swift; sourceTree = "<group>"; };
B4A29A452B55C990002A67DF /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; };
B4A29A462B55C990002A67DF /* BlueWallet-NoLDK.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "BlueWallet-NoLDK.plist"; sourceTree = "<absolute>"; };
B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLParserDelegate.swift; sourceTree = "<group>"; };
B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetHelper.swift; sourceTree = "<group>"; };
B4D0B2612C1DEA11006B6B1B /* ReceivePageInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceivePageInterfaceController.swift; sourceTree = "<group>"; };
@ -536,24 +422,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B47B21E62B2128B8001F6690 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C59F90CE0D04D3E4BB39BC5D /* libPods-BlueWalletUITests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
B4A29A302B55C990002A67DF /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
B4A29A312B55C990002A67DF /* libz.tbd in Frameworks */,
B4A29A322B55C990002A67DF /* libsqlite3.0.tbd in Frameworks */,
2B2B129397ACA4E7FCCB4F6F /* libPods-BlueWallet-NoLDK.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -585,7 +453,6 @@
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
B4A29A462B55C990002A67DF /* BlueWallet-NoLDK.plist */,
13B07FB71A68108700A75B9A /* main.m */,
32B5A3292334450100F8D608 /* Bridge.swift */,
32B5A3282334450100F8D608 /* BlueWallet-Bridging-Header.h */,
@ -612,7 +479,6 @@
3271B0AA236E2E0700DA766F /* NotificationCenter.framework */,
6D333B3A252FE1A3004D72DF /* WidgetKit.framework */,
6D333B3C252FE1A3004D72DF /* SwiftUI.framework */,
52FA0F1447D69747BD547E1E /* libPods-BlueWallet-NoLDK.a */,
95304AD151F1F531985AA341 /* libPods-BlueWallet.a */,
6F02C2F7CA3591E4E0B06EBA /* libPods-BlueWalletUITests.a */,
);
@ -756,8 +622,6 @@
B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */,
6D2A6461258BA92C0092292B /* Stickers.appex */,
6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */,
B47B21E92B2128B8001F6690 /* BlueWalletUITests.xctest */,
B4A29A452B55C990002A67DF /* BlueWallet.app */,
);
name = Products;
sourceTree = "<group>";
@ -915,8 +779,6 @@
children = (
B68F8552DD4428F64B11DCFB /* Pods-BlueWallet.debug.xcconfig */,
77ED97C3CA4284744868B15D /* Pods-BlueWallet.release.xcconfig */,
A16A0CF8A3E6F577B90BF8A4 /* Pods-BlueWallet-NoLDK.debug.xcconfig */,
8B160AC12BDAD72BB70BC175 /* Pods-BlueWallet-NoLDK.release.xcconfig */,
6E8A234AFCA1624321AE54F5 /* Pods-BlueWalletUITests.debug.xcconfig */,
0C3D27CE367C0DD11F4B8772 /* Pods-BlueWalletUITests.release.xcconfig */,
);
@ -1030,56 +892,6 @@
productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */;
productType = "com.apple.product-type.watchkit2-extension";
};
B47B21E82B2128B8001F6690 /* BlueWalletUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = B47B21F32B2128B8001F6690 /* Build configuration list for PBXNativeTarget "BlueWalletUITests" */;
buildPhases = (
6A7B5D072DAE0808347B48AA /* [CP] Check Pods Manifest.lock */,
B47B21E52B2128B8001F6690 /* Sources */,
B47B21E62B2128B8001F6690 /* Frameworks */,
B47B21E72B2128B8001F6690 /* Resources */,
5BF4F7E206022ECCBEE8C01A /* [CP] Embed Pods Frameworks */,
22A7683E080229A2C227229E /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
B47B21F02B2128B8001F6690 /* PBXTargetDependency */,
B49038D72B8FBA2500A8164A /* PBXTargetDependency */,
);
name = BlueWalletUITests;
productName = BlueWalletUITests;
productReference = B47B21E92B2128B8001F6690 /* BlueWalletUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
B4A29A212B55C990002A67DF /* BlueWallet-NoLDK */ = {
isa = PBXNativeTarget;
buildConfigurationList = B4A29A422B55C990002A67DF /* Build configuration list for PBXNativeTarget "BlueWallet-NoLDK" */;
buildPhases = (
B4A29A2A2B55C990002A67DF /* [CP] Check Pods Manifest.lock */,
B4A29A2B2B55C990002A67DF /* Sources */,
B4A29A302B55C990002A67DF /* Frameworks */,
B4A29A342B55C990002A67DF /* Resources */,
B4A29A382B55C990002A67DF /* Bundle React Native code and images */,
B4A29A392B55C990002A67DF /* Embed Watch Content */,
B4A29A3B2B55C990002A67DF /* Embed App Extensions */,
B4A29A3E2B55C990002A67DF /* Upload source maps to Bugsnag */,
B4A29A3F2B55C990002A67DF /* Upload Bugsnag dSYM */,
B4A29A402B55C990002A67DF /* [CP] Embed Pods Frameworks */,
B4A29A412B55C990002A67DF /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
B4A29A242B55C990002A67DF /* PBXTargetDependency */,
B4A29A262B55C990002A67DF /* PBXTargetDependency */,
B4A29A282B55C990002A67DF /* PBXTargetDependency */,
);
name = "BlueWallet-NoLDK";
productName = "Hello World";
productReference = B4A29A452B55C990002A67DF /* BlueWallet.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -1117,10 +929,6 @@
};
};
};
B47B21E82B2128B8001F6690 = {
CreatedOnToolsVersion = 15.0.1;
TestTargetID = B4A29A212B55C990002A67DF;
};
};
};
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BlueWallet" */;
@ -1169,8 +977,6 @@
B40D4E3B225841ED00428FCC /* BlueWalletWatch Extension */,
6D2A6460258BA92C0092292B /* Stickers */,
6DD4109B266CADF10087DE03 /* WidgetsExtension */,
B47B21E82B2128B8001F6690 /* BlueWalletUITests */,
B4A29A212B55C990002A67DF /* BlueWallet-NoLDK */,
);
};
/* End PBXProject section */
@ -1226,24 +1032,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B47B21E72B2128B8001F6690 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
B4A29A342B55C990002A67DF /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B41C2E592BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */,
B44034122BCC40A400162242 /* fiatUnits.json in Resources */,
B4A29A352B55C990002A67DF /* LaunchScreen.storyboard in Resources */,
B4A29A372B55C990002A67DF /* Images.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
@ -1278,23 +1066,6 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
22A7683E080229A2C227229E /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
3018134BCE2C10C2242F4CA3 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1355,45 +1126,6 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources.sh\"\n";
showEnvVarsInLog = 0;
};
5BF4F7E206022ECCBEE8C01A /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWalletUITests/Pods-BlueWalletUITests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
6A7B5D072DAE0808347B48AA /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-BlueWalletUITests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
A8D9893AE3CD454A9094B651 /* Upload source maps to Bugsnag */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1408,111 +1140,6 @@
shellPath = /bin/sh;
shellScript = "SOURCE_MAP=\"$TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\" ../node_modules/@bugsnag/react-native/bugsnag-react-native-xcode.sh\n";
};
B4A29A2A2B55C990002A67DF /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-BlueWallet-NoLDK-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
B4A29A382B55C990002A67DF /* Bundle React Native code and images */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Bundle React Native code and images";
outputPaths = (
);
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";
};
B4A29A3E2B55C990002A67DF /* Upload source maps to Bugsnag */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Upload source maps to Bugsnag";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "SOURCE_MAP=\"$TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\" ../node_modules/@bugsnag/react-native/bugsnag-react-native-xcode.sh\n";
};
B4A29A3F2B55C990002A67DF /* Upload Bugsnag dSYM */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}",
);
name = "Upload Bugsnag dSYM";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = "/usr/bin/env ruby";
shellScript = "api_key = nil # Insert your key here to use it directly from this script\n\n# Attempt to get the API key from an environment variable\nunless api_key\n api_key = ENV[\"BUGSNAG_API_KEY\"]\n\n # If not present, attempt to lookup the value from the Info.plist\n unless api_key\n info_plist_path = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"INFOPLIST_PATH\"]}\"\n plist_buddy_response = `/usr/libexec/PlistBuddy -c \"print :bugsnag:apiKey\" \"#{info_plist_path}\"`\n plist_buddy_response = `/usr/libexec/PlistBuddy -c \"print :BugsnagAPIKey\" \"#{info_plist_path}\"` if !$?.success?\n api_key = plist_buddy_response if $?.success?\n end\nend\n\nfail(\"No Bugsnag API key detected - add your key to your Info.plist, BUGSNAG_API_KEY environment variable or this Run Script phase\") unless api_key\n\nfork do\n Process.setsid\n STDIN.reopen(\"/dev/null\")\n STDOUT.reopen(\"/dev/null\", \"a\")\n STDERR.reopen(\"/dev/null\", \"a\")\n\n require 'shellwords'\n\n Dir[\"#{ENV[\"DWARF_DSYM_FOLDER_PATH\"]}/*/Contents/Resources/DWARF/*\"].each do |dsym|\n curl_command = \"curl --http1.1 -F dsym=@#{Shellwords.escape(dsym)} -F projectRoot=#{Shellwords.escape(ENV[\"PROJECT_DIR\"])} \"\n curl_command += \"-F apiKey=#{Shellwords.escape(api_key)} \"\n curl_command += \"https://upload.bugsnag.com/\"\n system(curl_command)\n end\nend\n";
showEnvVarsInLog = 0;
};
B4A29A402B55C990002A67DF /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
B4A29A412B55C990002A67DF /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet-NoLDK/Pods-BlueWallet-NoLDK-resources.sh\"\n";
showEnvVarsInLog = 0;
};
CF0725821442A3000F20E874 /* Upload Bugsnag dSYM */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1654,59 +1281,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B47B21E52B2128B8001F6690 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B49038D92B8FBAD300A8164A /* BlueWalletUITest.swift in Sources */,
B4EFF7472C3F70010095D655 /* LatestTransaction.swift in Sources */,
B4EFF7422C3F6C990095D655 /* PriceView.swift in Sources */,
B4EFF7482C3F70090095D655 /* BitcoinUnit.swift in Sources */,
B4EFF73D2C3F6C6C0095D655 /* MarketData.swift in Sources */,
B4EFF73C2C3F6C5E0095D655 /* MockData.swift in Sources */,
B4EFF7432C3F6F650095D655 /* Currency.swift in Sources */,
B4EFF7412C3F6C960095D655 /* PriceWidget.swift in Sources */,
B4EFF7462C3F6FF90095D655 /* WalletData.swift in Sources */,
B4EFF7452C3F6FF30095D655 /* Placeholders.swift in Sources */,
B4EFF7442C3F6F6A0095D655 /* FiatUnit.swift in Sources */,
B47B21EC2B2128B8001F6690 /* BlueWalletUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
B4A29A2B2B55C990002A67DF /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B44033D72BCC369400162242 /* UserDefaultsExtension.swift in Sources */,
B44033F72BCC377F00162242 /* WidgetData.swift in Sources */,
B44033E12BCC36CA00162242 /* Placeholders.swift in Sources */,
B47462D02C1538D800100825 /* CustomSegmentedControlManager.m in Sources */,
B44033E72BCC36FF00162242 /* WalletData.swift in Sources */,
B44033E02BCC36C300162242 /* LatestTransaction.swift in Sources */,
B44033D92BCC369900162242 /* Colors.swift in Sources */,
B4A29A2C2B55C990002A67DF /* EventEmitter.m in Sources */,
B44033D62BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */,
B44033FD2BCC37D600162242 /* MarketAPI.swift in Sources */,
B4A29A2D2B55C990002A67DF /* main.m in Sources */,
B45010982C0FCB7700619044 /* MarketAPI+Electrum.swift in Sources */,
B4A29A2E2B55C990002A67DF /* AppDelegate.mm in Sources */,
B44033C72BCC332400162242 /* Balance.swift in Sources */,
B44033FC2BCC379200162242 /* WidgetDataStore.swift in Sources */,
B411DA832C2F1D3700115221 /* SwiftTCPClient.swift in Sources */,
B44033C22BCC32F800162242 /* BitcoinUnit.swift in Sources */,
B4B1A4652BFA73110072E3BB /* WidgetHelper.swift in Sources */,
B44033F12BCC374500162242 /* Numeric+abbreviated.swift in Sources */,
B44034032BCC37F800162242 /* Bundle+decode.swift in Sources */,
B44033CD2BCC350A00162242 /* Currency.swift in Sources */,
B44034062BCC389F00162242 /* FiatUnit.swift in Sources */,
B44033CF2BCC352C00162242 /* UserDefaultsGroup.swift in Sources */,
B4A29A2F2B55C990002A67DF /* Bridge.swift in Sources */,
B44034042BCC389100162242 /* XMLParserDelegate.swift in Sources */,
B450109E2C0FCDA000619044 /* Utilities.swift in Sources */,
B44033EC2BCC371A00162242 /* MarketData.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@ -1736,31 +1310,6 @@
target = B40D4E2F225841EC00428FCC /* BlueWalletWatch */;
targetProxy = B40D4E4B225841ED00428FCC /* PBXContainerItemProxy */;
};
B47B21F02B2128B8001F6690 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 13B07F861A680F5B00A75B9A /* BlueWallet */;
targetProxy = B47B21EF2B2128B8001F6690 /* PBXContainerItemProxy */;
};
B49038D72B8FBA2500A8164A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = B4A29A212B55C990002A67DF /* BlueWallet-NoLDK */;
targetProxy = B49038D62B8FBA2500A8164A /* PBXContainerItemProxy */;
};
B4A29A242B55C990002A67DF /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
targetProxy = B4A29A252B55C990002A67DF /* PBXContainerItemProxy */;
};
B4A29A262B55C990002A67DF /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
platformFilter = ios;
target = 6D2A6460258BA92C0092292B /* Stickers */;
targetProxy = B4A29A272B55C990002A67DF /* PBXContainerItemProxy */;
};
B4A29A282B55C990002A67DF /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */;
targetProxy = B4A29A292B55C990002A67DF /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
@ -1846,13 +1395,13 @@
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development io.bluewallet.bluewallet";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore io.bluewallet.bluewallet catalyst";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = "1,2,6";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@ -1901,12 +1450,12 @@
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore io.bluewallet.bluewallet";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore io.bluewallet.bluewallet catalyst";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = "1,2,6";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
@ -2009,7 +1558,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1703136680;
DEAD_CODE_STRIPPING = YES;
@ -2038,7 +1587,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development io.bluewallet.bluewallet.MarketWidget";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development io.bluewallet.bluewallet.MarketWidget macos";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore io.bluewallet.bluewallet.MarketWidget catalyst";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
@ -2064,7 +1613,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1703136680;
@ -2093,7 +1642,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore io.bluewallet.bluewallet.MarketWidget";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development io.bluewallet.bluewallet.MarketWidget macos";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore io.bluewallet.bluewallet.MarketWidget catalyst";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
@ -2417,202 +1966,6 @@
};
name = Release;
};
B47B21F12B2128B8001F6690 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6E8A234AFCA1624321AE54F5 /* Pods-BlueWalletUITests.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1703136680;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = A7W54YZ4WU;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.BlueWalletUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = "BlueWallet-NoLDK";
};
name = Debug;
};
B47B21F22B2128B8001F6690 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 0C3D27CE367C0DD11F4B8772 /* Pods-BlueWalletUITests.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1703136680;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = A7W54YZ4WU;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.BlueWalletUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = "BlueWallet-NoLDK";
};
name = Release;
};
B4A29A432B55C990002A67DF /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = A16A0CF8A3E6F577B90BF8A4 /* Pods-BlueWallet-NoLDK.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1703136680;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = A7W54YZ4WU;
ENABLE_BITCODE = NO;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"COCOAPODS=1",
"FB_SONARKIT_ENABLED=1",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = "BlueWallet-NoLDK.plist";
INFOPLIST_KEY_CFBundleDisplayName = BlueWallet;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 6.6.9;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
"-lc++",
);
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet;
PRODUCT_NAME = BlueWallet;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
B4A29A442B55C990002A67DF /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 8B160AC12BDAD72BB70BC175 /* Pods-BlueWallet-NoLDK.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWalletRelease.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1703136680;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = A7W54YZ4WU;
ENABLE_BITCODE = NO;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = "BlueWallet-NoLDK.plist";
INFOPLIST_KEY_CFBundleDisplayName = BlueWallet;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(SDKROOT)/usr/lib/swift",
"$(SDKROOT)/System/iOSSupport/usr/lib/swift",
"$(inherited)",
);
MARKETING_VERSION = 6.6.9;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
"-lc++",
);
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet;
PRODUCT_NAME = BlueWallet;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@ -2670,24 +2023,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B47B21F32B2128B8001F6690 /* Build configuration list for PBXNativeTarget "BlueWalletUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B47B21F12B2128B8001F6690 /* Debug */,
B47B21F22B2128B8001F6690 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B4A29A422B55C990002A67DF /* Build configuration list for PBXNativeTarget "BlueWallet-NoLDK" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B4A29A432B55C990002A67DF /* Debug */,
B4A29A442B55C990002A67DF /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */

View file

@ -1,95 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1520"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<PreActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "cd ${SRCROOT}&#10;cd ..&#10;cp scripts/maccatalystpatches/lightning-ldk-wallet.ts class/wallets/lightning-ldk-wallet.ts&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B4A29A212B55C990002A67DF"
BuildableName = "BlueWallet.app"
BlueprintName = "BlueWallet-NoLDK"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
</PreActions>
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B4A29A212B55C990002A67DF"
BuildableName = "BlueWallet.app"
BlueprintName = "BlueWallet-NoLDK"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B4A29A212B55C990002A67DF"
BuildableName = "BlueWallet.app"
BlueprintName = "BlueWallet-NoLDK"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B4A29A212B55C990002A67DF"
BuildableName = "BlueWallet.app"
BlueprintName = "BlueWallet-NoLDK"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<PreActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "cd ${SRCROOT}&#10;cd ..&#10;cp scripts/maccatalystpatches/lightning-ldk-wallet.ts class/wallets/lightning-ldk-wallet.ts&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B47B21E82B2128B8001F6690"
BuildableName = "BlueWalletUITests.xctest"
BlueprintName = "BlueWalletUITests"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
</PreActions>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B47B21E82B2128B8001F6690"
BuildableName = "BlueWalletUITests.xctest"
BlueprintName = "BlueWalletUITests"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -19,25 +19,15 @@
<key>orderHint</key>
<integer>71</integer>
</dict>
<key>BlueWallet-NoLDK.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>136</integer>
</dict>
<key>BlueWallet.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>BlueWalletUITests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>97</integer>
</dict>
<key>BlueWalletWatch (Complication).xcscheme</key>
<dict>
<key>orderHint</key>
<integer>123</integer>
<integer>9</integer>
</dict>
<key>BlueWalletWatch (Glance).xcscheme_^#shared#^_</key>
<dict>
@ -107,6 +97,11 @@
<key>primary</key>
<true/>
</dict>
<key>B4A29A212B55C990002A67DF</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,42 @@
{
"originHash" : "52530e6b1e3a85c8854952ef703a6d1bbe1acd82713be2b3166476b9b277db23",
"pins" : [
{
"identity" : "bugsnag-cocoa",
"kind" : "remoteSourceControl",
"location" : "https://github.com/bugsnag/bugsnag-cocoa",
"state" : {
"revision" : "16b9145fc66e5296f16e733f6feb5d0e450574e8",
"version" : "6.28.1"
}
},
{
"identity" : "efqrcode",
"kind" : "remoteSourceControl",
"location" : "https://github.com/EFPrefix/EFQRCode.git",
"state" : {
"revision" : "2991c2f318ad9529d93b2a73a382a3f9c72c64ce",
"version" : "6.2.2"
}
},
{
"identity" : "keychain-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/evgenyneu/keychain-swift.git",
"state" : {
"revision" : "5e1b02b6a9dac2a759a1d5dbc175c86bd192a608",
"version" : "24.0.0"
}
},
{
"identity" : "swift_qrcodejs",
"kind" : "remoteSourceControl",
"location" : "https://github.com/ApolloZhu/swift_qrcodejs.git",
"state" : {
"revision" : "374dc7f7b9e76c6aeb393f6a84590c6d387e1ecb",
"version" : "2.2.2"
}
}
],
"version" : 3
}

View file

@ -12,7 +12,6 @@ enum WalletGradient: String {
case SegwitHD = "HDsegwitP2SH"
case Segwit = "segwitP2SH"
case LightningCustodial = "lightningCustodianWallet"
case LightningLDK = "lightningLdk"
case SegwitNative = "HDsegwitBech32"
case WatchOnly = "watchOnly"
case MultiSig = "HDmultisig"
@ -27,7 +26,7 @@ enum WalletGradient: String {
return "walletHD"
case .WatchOnly:
return "walletWatchOnly"
case .LightningCustodial, .LightningLDK:
case .LightningCustodial:
return "walletLightningCustodial"
case .MultiSig:
return "watchMultisig"

View file

@ -43,7 +43,7 @@ class ReceiveInterfaceController: WKInterfaceController {
}
private func setupView() {
if receiveMethod == .CreateInvoice && (wallet?.type == WalletGradient.LightningCustodial.rawValue || wallet?.type == WalletGradient.LightningLDK.rawValue) {
if receiveMethod == .CreateInvoice && (wallet?.type == WalletGradient.LightningCustodial.rawValue) {
presentController(withName: SpecifyInterfaceController.identifier, context: wallet?.identifier)
} else {
setupQRCode()
@ -92,7 +92,7 @@ class ReceiveInterfaceController: WKInterfaceController {
}
private func isCreatingInvoice() -> Bool {
return receiveMethod == .CreateInvoice && (wallet?.type == WalletGradient.LightningCustodial.rawValue || wallet?.type == WalletGradient.LightningLDK.rawValue)
return receiveMethod == .CreateInvoice && (wallet?.type == WalletGradient.LightningCustodial.rawValue)
}
override func didDeactivate() {

View file

@ -40,7 +40,7 @@ class SpecifyInterfaceController: WKInterfaceController {
let wallet = WatchDataSource.shared.wallets[identifier]
self.wallet = wallet
self.createButton.setAlpha(0.5)
self.specifiedQRContent.bitcoinUnit = (wallet.type == WalletGradient.LightningCustodial.rawValue || wallet.type == WalletGradient.LightningLDK.rawValue) ? .SATS : .BTC
self.specifiedQRContent.bitcoinUnit = (wallet.type == WalletGradient.LightningCustodial.rawValue) ? .SATS : .BTC
NotificationCenter.default.addObserver(forName: NumericKeypadInterfaceController.NotificationName.keypadDataChanged, object: nil, queue: nil) { [weak self] (notification) in
guard let amountObject = notification.object as? [String], !amountObject.isEmpty else { return }
if amountObject.count == 1 && (amountObject.first == "." || amountObject.first == "0") {
@ -60,7 +60,7 @@ class SpecifyInterfaceController: WKInterfaceController {
var isShouldCreateButtonBeEnabled = amountDouble > 0 && !title.isEmpty
if (wallet.type == WalletGradient.LightningCustodial.rawValue || wallet.type == WalletGradient.LightningLDK.rawValue) && !WCSession.default.isReachable {
if (wallet.type == WalletGradient.LightningCustodial.rawValue) && !WCSession.default.isReachable {
isShouldCreateButtonBeEnabled = false
}

View file

@ -41,14 +41,14 @@ class WalletDetailsInterfaceController: WKInterfaceController {
walletNameLabel.setText(wallet.label)
walletBasicsGroup.setBackgroundImageNamed(WalletGradient(rawValue: wallet.type)?.imageString)
let isLightningWallet = wallet.type == WalletGradient.LightningCustodial.rawValue || wallet.type == WalletGradient.LightningLDK.rawValue
let isLightningWallet = wallet.type == WalletGradient.LightningCustodial.rawValue
createInvoiceButton.setHidden(!isLightningWallet)
receiveButton.setHidden(wallet.receiveAddress.isEmpty)
viewXPubButton.setHidden(!isXPubAvailable(wallet: wallet))
}
private func isXPubAvailable(wallet: Wallet) -> Bool {
return (wallet.type != WalletGradient.LightningCustodial.rawValue && wallet.type != WalletGradient.LightningLDK.rawValue) && !(wallet.xpub ?? "").isEmpty
return (wallet.type != WalletGradient.LightningCustodial.rawValue) && !(wallet.xpub ?? "").isEmpty
}
private func updateTransactionsTable(forWallet wallet: Wallet) {

View file

@ -60,16 +60,6 @@ end
target 'BlueWallet' do
configure_target()
# Manually add rn-ldk pod for this target
pod 'rn-ldk', :path => '../node_modules/rn-ldk'
end
target 'BlueWallet-NoLDK' do
configure_target()
end
target 'BlueWalletUITests' do
configure_target()
end
post_install do |installer|
@ -88,4 +78,4 @@ post_install do |installer|
end
__apply_Xcode_12_5_M1_post_install_workaround(installer)
end
end
end

View file

@ -466,8 +466,6 @@ PODS:
- React-Core
- RealmJS (12.12.1):
- React
- rn-ldk (0.8.4):
- React-Core
- RNCAsyncStorage (1.24.0):
- React-Core
- RNCClipboard (1.14.1):
@ -480,14 +478,14 @@ PODS:
- React-Core
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.17.1):
- RNGestureHandler (2.18.1):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- RNHandoff (0.0.3):
- React
- RNKeychain (8.2.0):
- React-Core
- RNLocalize (3.2.0):
- RNLocalize (3.2.1):
- React-Core
- RNPermissions (4.1.5):
- React-Core
@ -497,13 +495,14 @@ PODS:
- React
- RNRate (1.2.12):
- React-Core
- RNReactNativeHapticFeedback (2.2.0):
- RNReactNativeHapticFeedback (2.3.0):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- RNReanimated (3.14.0):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- ReactCommon/turbomodule/core
- RNScreens (3.32.0):
- RNScreens (3.33.0):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- React-RCTImage
@ -581,7 +580,6 @@ DEPENDENCIES:
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- ReactNativeCameraKit (from `../node_modules/react-native-camera-kit`)
- RealmJS (from `../node_modules/realm`)
- rn-ldk (from `../node_modules/rn-ldk`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)"
- "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)"
@ -727,8 +725,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-camera-kit"
RealmJS:
:path: "../node_modules/realm"
rn-ldk:
:path: "../node_modules/rn-ldk"
RNCAsyncStorage:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
@ -837,24 +833,23 @@ SPEC CHECKSUMS:
ReactCommon: ff94462e007c568d8cdebc32e3c97af86ec93bb5
ReactNativeCameraKit: 9d46a5d7dd544ca64aa9c03c150d2348faf437eb
RealmJS: f4f6d27b325b1c1b402eb0aa5ee79e9d5f603293
rn-ldk: 0d8749d98cc5ce67302a32831818c116b67f7643
RNCAsyncStorage: ec53e44dc3e75b44aa2a9f37618a49c3bc080a7a
RNCClipboard: 0a720adef5ec193aa0e3de24c3977222c7e52a37
RNCPushNotificationIOS: 64218f3c776c03d7408284a819b2abfda1834bc8
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
RNDeviceInfo: b899ce37a403a4dea52b7cb85e16e49c04a5b88e
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 53f1b8fcdf62b349da820ef4616abeed04cde85c
RNGestureHandler: 9e0d0a46b7af6d21fbe3343912502afa8baf755e
RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa
RNKeychain: bfe3d12bf4620fe488771c414530bf16e88f3678
RNLocalize: b77875884750cb6a58cd6865863fe2ba2729b72b
RNLocalize: 4f22418187ecd5ca693231093ff1d912d1b3c9bc
RNPermissions: 9fa74223844f437bc309e112994859dc47194829
RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93
RNRate: ef3bcff84f39bb1d1e41c5593d3eea4aab2bd73a
RNReactNativeHapticFeedback: ec56a5f81c3941206fd85625fa669ffc7b4545f9
RNReactNativeHapticFeedback: 5eee8b6c8f2b1595f4441e884d4c353c18eb7003
RNReanimated: e71a1d6bb6427f45ea57c5e23f99030129b6db62
RNScreens: ad1c105ac9107cf1a613bf80889485458eb20bd7
RNScreens: 01092d6104b707ddd6258dadefc9997a9f523c35
RNShare: 0fad69ae2d71de9d1f7b9a43acf876886a6cb99c
RNSVG: af3907ac5d4fa26a862b75a16d8f15bc74f2ceda
RNVectorIcons: 32462e7c7e58fe457474fc79c4d7de3f0ef08d70
@ -863,6 +858,6 @@ SPEC CHECKSUMS:
TrueSheet: 3ba036b4f20ea78a2953fcf7949e8a60dd63d3f6
Yoga: c32e0be1a17f8f1f0e633a3122f7666441f52c82
PODFILE CHECKSUM: f19eea438501edfe85fb2fa51d40ba1b57540758
PODFILE CHECKSUM: f6f6fbdfa280f2c07d8569ee5cb4ca320636ebf4
COCOAPODS: 1.15.2

View file

@ -6,25 +6,25 @@ brew install cocoapods
echo "CocoaPods installation complete."
echo "===== Installing Node.js ====="
brew install node@18
brew install node@20
echo "Node.js installation complete."
# Configure environment to use node@18
echo "Configuring environment to use node@18..."
echo 'export PATH="/usr/local/opt/node@18/bin:$PATH"' >> ~/.zshrc
export PATH="/usr/local/opt/node@18/bin:$PATH"
# Configure environment to use node@20
echo "Configuring environment to use node@20..."
echo 'export PATH="/usr/local/opt/node@20/bin:$PATH"' >> ~/.zshrc
export PATH="/usr/local/opt/node@20/bin:$PATH"
echo 'export LDFLAGS="-L/usr/local/opt/node@18/lib"' >> ~/.zshrc
export LDFLAGS="-L/usr/local/opt/node@18/lib"
echo 'export LDFLAGS="-L/usr/local/opt/node@20/lib"' >> ~/.zshrc
export LDFLAGS="-L/usr/local/opt/node@20/lib"
echo 'export CPPFLAGS="-I/usr/local/opt/node@18/include"' >> ~/.zshrc
export CPPFLAGS="-I/usr/local/opt/node@18/include"
echo 'export CPPFLAGS="-I/usr/local/opt/node@20/include"' >> ~/.zshrc
export CPPFLAGS="-I/usr/local/opt/node@20/include"
echo "Configuration complete."
# Install dependencies using yarn
echo "===== Running yarn install ====="
yarn install | tee yarn-install-log.txt
echo "yarn install complete. Full log output in yarn-install-log.txt"
# 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 pod install ====="
cd ios

View file

@ -102,13 +102,13 @@ lane :fetch_appstore_profiles_catalyst do
end
desc "Clear derived data"
desc "Clear derived data"
lane :clear_derived_data_lane do
UI.message("Clearing derived data...")
clear_derived_data
end
end
desc "Increment build number"
desc "Increment build number"
lane :increment_build_number_lane do
UI.message("Incrementing build number to current timestamp...")
@ -134,7 +134,7 @@ end
scheme: "BlueWallet",
workspace: "BlueWallet.xcworkspace",
export_method: "app-store",
include_bitcode: true,
include_bitcode: false,
configuration: "Release",
skip_profile_detection: true,
include_symbols: true,
@ -211,37 +211,6 @@ end
last_commit = last_git_commit
already_built_flag = ".already_built_#{last_commit[:sha]}"
File.write(already_built_flag, Time.now.to_s)
end
desc "Build and distribute the Mac Catalyst app for BlueWallet-NoLDK (Universal)"
lane :build_and_distribute_catalyst_universal do |options|
# Conditionally fetch the right provisioning profiles
if options[:type] == "development"
fetch_dev_profiles_catalyst
else
fetch_appstore_profiles_catalyst
end
# Build the Mac Catalyst app (Universal Build for Apple Silicon and Intel)
build_app(
scheme: "BlueWallet-NoLDK",
configuration: "Release",
catalyst_platform: "macos",
export_method: options[:type] || "app-store", # Default to app-store if not specified
xcargs: "ARCHS='arm64 x86_64' VALID_ARCHS='arm64 x86_64'",
export_options: {
provisioningProfiles: {
"io.bluewallet.bluewallet" => "Provisioning Profile Name for Catalyst",
# Include other identifiers as necessary
},
signingStyle: "manual",
}
)
# Optionally, upload the build to TestFlight or App Store Connect for app-store type
if options[:type] != "development"
upload_to_testflight(skip_waiting_for_build_processing: true)
end
end
desc "Update 'What's New' section in App Store Connect for all localizations"

View file

@ -48,34 +48,17 @@
"network": "خطأ في الشبكة"
},
"lnd": {
"active": "نشط",
"inactive": "غير نشط",
"channels": "القنوات",
"no_channels": "لا يوجد قنوات",
"claim_balance": "المطالبة برصيد {balance}",
"close_channel": "اغلق القناة",
"new_channel": "قناة جديدة",
"force_close_channel": "هل تود فرض اغلاق القناة؟",
"expired": "منتهية الصلاحية",
"node_alias": "اسم النود",
"expiresIn": "تنتهي بعد {time} دقيقة",
"payButton": "دفع",
"placeholder": "عنوان أو برقية",
"open_channel": "فتح قناة",
"opening_channnel_for_from": "جارِ فتح قناة للمحفظة {forWalletLabel} بتمويل من {fromWalletLabel}",
"are_you_sure_open_channel": "هل أنت متأكد أنك تريد فتح هذه القناة؟",
"potentialFee": "الرسوم المحتملة: {fee}",
"remote_host": "المضيف البعيد",
"refill": "إعادة التعبئة",
"reconnect_peer": "إعادة الاتصال بالأقران",
"refill_create": "للمتابعة، يُرجى إنشاء محفظة بتكوين لإعادة التعبئة باستخدامها.",
"refill_external": "إعادة التعبئة باستخدام محفظة خارجية",
"refill_lnd_balance": "إعادة تعبئة رصيد محفظة البرق (Lightning)",
"sameWalletAsInvoiceError": "لا يمكنك دفع فاتورة بنفس المحفظة المستخدمة لإنشائها.",
"title": "إدارة الأموال",
"can_send": "يمكن أن ترسل",
"can_receive": "يمكن ان تستقبل",
"view_logs": "عرض السجلات"
"title": "إدارة الأموال"
},
"lndViewInvoice": {
"additional_info": "معلومة إضافية",
@ -427,7 +410,6 @@
"list_tryagain": "إعادة المحاولة",
"no_ln_wallet_error": "قبل دفع البرقية، يجب عليك أولاً إضافة محفظة برق.",
"looks_like_bip38": "يبدوا ان هذا مفتاح خاص محمي بكلمة مرور (BIP38).",
"reorder_title": "إعادة ترتيب المحافظ",
"please_continue_scanning": "الرجاء متابعة الفحص.",
"select_no_bitcoin": "لا توجد محافظ بتكوين متاحة حاليًا.",
"select_no_bitcoin_exp": "تحتاج إلى محفظة بتكوين لإعادة تعبئة محافظ البرق. يُرجى إنشاء محفظة أو استيراد واحدة.",

View file

@ -39,13 +39,7 @@
"network": "Памылка Сеткі"
},
"lnd": {
"inactive": "Неактыўны",
"channels": "Каналы",
"no_channels": "Няма каналаў",
"close_channel": "Зачыніць канал",
"new_channel": "Новы канал",
"expired": "Скончыўся",
"open_channel": "Адкрыць Канал"
"expired": "Скончыўся"
},
"plausibledeniability": {
"success": "Посьпех"

View file

@ -48,37 +48,19 @@
"network": "ختا شبکه"
},
"lnd": {
"active": "فعال",
"inactive": "قیر فعال",
"channels": "تورگیل",
"no_channels": "بؽ تورگه",
"claim_balance": "تسویه مۉجۊڌی {balance}",
"close_channel": "بستن تورگه",
"new_channel": "تورگه نۊ",
"errorInvoiceExpired": "سۊرت هساو مونقزی وابیڌه.",
"force_close_channel": "بستن اجباری تورگه؟",
"expired": "مونقزی وابیڌه",
"node_alias": "نوم موستعار گره",
"expiresIn": "تا {time} دیقه دی مونقزی ابۊ",
"payButton": "پرداخت",
"payment": "پرداخت",
"placeholder": "سۊرت هساو یا آدرس",
"open_channel": "گۊشیڌن تورگه",
"funding_amount_placeholder": "هندا بۊدجه، سی نمووه، 0.001",
"opening_channnel_for_from": "هونی تورگه نه اگوشه سی کیف پیل {forWalletLabel}، وا تمین پیل زه {fromWalletLabel}",
"are_you_sure_open_channel": "زه گۊشیڌن ای تورگه اتمینۉ داری؟",
"potentialFee": "کارمزد ائتمالی: {fee}",
"remote_host": "میزبۉ ره دیر",
"refill": "پور کردن",
"reconnect_peer": "منپیز دوارته به همتا",
"refill_create": "سی ادامه، یه کیف پیل بیت کوین سی پور کردن وورکل کۊنین.",
"refill_external": "پور کردن وا کیف پیل خارجی",
"refill_lnd_balance": "پور کردن مۉجۊڌی کیف پیل لایتنینگ",
"sameWalletAsInvoiceError": "ایسا نترین سۊرت هساوی نه وا همو کیف پیلی که وورکل کردین، پرداخت کۊنین.",
"title": "دؽوۉداری دارایی",
"can_send": "تره فشنه",
"can_receive": "تره گره",
"view_logs": "نیشتن تفاقا"
"title": "دؽوۉداری دارایی"
},
"lndViewInvoice": {
"additional_info": "دۉسمندیا بیشتر",

View file

@ -48,30 +48,16 @@
"network": "Error de red"
},
"lnd": {
"active": "Actiu",
"inactive": "Inactiu",
"channels": "Canals",
"no_channels": "No hi ha canals",
"claim_balance": "Reclamar el saldo {balance}",
"close_channel": "Tancar el canal",
"new_channel": "Nou canal",
"force_close_channel": "Forçar tancar el canal?",
"expired": "Caducat",
"node_alias": "Àlies del node",
"expiresIn": "Caduca en {time} minuts",
"payButton": "Pagar",
"payment": "Pagament",
"placeholder": "Factura o adreça",
"open_channel": "Obra el canal",
"are_you_sure_open_channel": "Esteu segur que voleu obrir aquest canal?",
"refill": "Recarregar",
"refill_external": "Recarregar amb un moneder extern",
"refill_lnd_balance": "Recarregar el balanç del moneder Lightning",
"sameWalletAsInvoiceError": "No pots pagar una factura amb el mateix moneder que l'ha creat.",
"title": "gestionar fons",
"can_send": "Pots enviar",
"can_receive": "Pots rebre",
"view_logs": "Veure Registres"
"title": "gestionar fons"
},
"lndViewInvoice": {
"additional_info": "Informació addicional",
@ -299,7 +285,6 @@
"list_long_scan": "Escaneja el codi QR",
"list_title": "moneders",
"list_tryagain": "Torna-ho a provar",
"reorder_title": "Reorganitzar moneder",
"select_wallet": "Seleccioni moneder",
"xpub_copiedToClipboard": "Copiat al porta-retalls."
},

View file

@ -52,37 +52,19 @@
"network": "Chyba sítě"
},
"lnd": {
"active": "Aktivní",
"inactive": "Neaktivní",
"channels": "Kanály",
"no_channels": "Žádné kanály",
"claim_balance": "Požadovat zůstatek {balance}",
"close_channel": "Zavřít kanál",
"new_channel": "Nový kanál",
"errorInvoiceExpired": "Platnost faktury vypršela.",
"force_close_channel": "Vynutit uzavření kanálu?",
"expired": "Expirováno",
"node_alias": "Alias uzlu",
"expiresIn": "Vyprší za {time} minut",
"payButton": "Zaplatit",
"payment": "Platba",
"placeholder": "Faktura nebo adresa",
"open_channel": "Otevřít kanál",
"funding_amount_placeholder": "Výše financování, např. 0,001",
"opening_channnel_for_from": "Otevření kanálu pro peněženku {forWalletLabel}, financováním z {fromWalletLabel}",
"are_you_sure_open_channel": "Jste si jisti, že chcete tento kanál otevřít?",
"potentialFee": "Potenciální poplatek: {fee}",
"remote_host": "Vzdálený hostitel",
"refill": "Doplnit",
"reconnect_peer": "Znovu připojit peera",
"refill_create": "Chcete-li pokračovat, vytvořte prosím bitcoinovou peněženku, kterou můžete doplnit.",
"refill_external": "Doplnit pomocí externí peněženky",
"refill_lnd_balance": "Doplnit zůstatek na Lightning peněžence",
"sameWalletAsInvoiceError": "Fakturu nemůžete zaplatit pomocí stejné peněženky, kterou jste použili k jejímu vytvoření.",
"title": "Správa prostředků",
"can_send": "Může odeslat",
"can_receive": "Může přijmout",
"view_logs": "Zobrazit logy"
"title": "Správa prostředků"
},
"lndViewInvoice": {
"additional_info": "Dodatečné informace",
@ -187,6 +169,7 @@
"fee_1d": "1 d",
"fee_3h": "3 h",
"fee_custom": "Vlastní",
"insert_custom_fee": "Vložte vlastní poplatek",
"fee_fast": "Rychle",
"fee_medium": "Středně rychle",
"fee_replace_minvb": "Celková sazba poplatku (satoshi na vByte), kterou chcete zaplatit, by měla být vyšší než {min} sat/vByte.",
@ -484,7 +467,8 @@
"list_tryagain": "Zkuste to znovu",
"no_ln_wallet_error": "Před zaplacením Lightning faktury musíte nejdříve přidat Lightning peněženku.",
"looks_like_bip38": "Tohle vypadá jako soukromý klíč chráněný heslem (BIP38).",
"reorder_title": "Seřadit peněženky",
"manage_title": "Spravovat peněženky",
"no_results_found": "Nebyly nalezeny žádné výsledky.",
"please_continue_scanning": "Pokračujte ve skenování.",
"select_no_bitcoin": "V současné době nejsou k dispozici žádné bitcoinové peněženky.",
"select_no_bitcoin_exp": "Bitcoinová peněženka je vyžadována pro doplnění Lightning peněženky. Nějakou prosím vytvořte nebo importujte.",
@ -495,7 +479,7 @@
"add_ln_wallet_first": "Nejdříve musíte přidat Lightning peněženku.",
"identity_pubkey": "Identity Pubkey",
"xpub_title": "XPUB peněženky",
"search_wallets": "Vyhledat peněženky"
"manage_wallets_search_placeholder": "Prohledat peněženky, poznámky"
},
"multisig": {
"multisig_vault": "Úložiště",

View file

@ -111,7 +111,6 @@
"list_create_a_wallet": "Tilføj en tegnebog",
"list_empty_txs1": "Dine transaktioner vil blive vist her,",
"list_latest_transaction": "seneste transaktion",
"reorder_title": "Ændre rækkefølgen af wallets",
"select_wallet": "Vælg wallet",
"xpub_copiedToClipboard": "Kopieret til udklipsholder."
},

View file

@ -52,37 +52,19 @@
"network": "Netzwerkfehler"
},
"lnd": {
"active": "Aktiv",
"inactive": "Inaktiv",
"channels": "Kanäle",
"no_channels": "Keine Kanäle",
"claim_balance": "Saldo von {balance} beanspruchen",
"close_channel": "Kanal schließen",
"new_channel": "Neuer Kanal",
"errorInvoiceExpired": "Rechnung verfallen.",
"force_close_channel": "Kanal zwangsweise schließen?",
"expired": "Abgelaufen",
"node_alias": "Knoten-Alias",
"expiresIn": "Läuft in {time} Minuten ab",
"payButton": "Zahlen",
"payment": "Zahlung",
"placeholder": "Rechnung oder Adresse",
"open_channel": "Kanal öffnen",
"funding_amount_placeholder": "Finanzierungsbetrag, z.B. 0.001",
"opening_channnel_for_from": "Kanal für Wallet {forWalletLabel} finanziert durch Wallet {fromWalletLabel} eröffnen.",
"are_you_sure_open_channel": "Diesen Kanal definitiv eröffnen?",
"potentialFee": "Geschätzte Gebühr: {fee}",
"remote_host": "Entfernter Rechner",
"refill": "Aufladen",
"reconnect_peer": "Erneut zu Peer verbinden",
"refill_create": "Bitte eine Bitcoin Wallet erstellen um fortzufahren",
"refill_external": "Mit externem Wallet aufladen",
"refill_lnd_balance": "Lade deine Lightning Wallet auf",
"sameWalletAsInvoiceError": "Du kannst nicht die Rechnung mit der Wallet begleichen, die du für die Erstellung dieser Rechnung verwendet hast.",
"title": "Beträge verwalten",
"can_send": "Kann senden",
"can_receive": "Kann empfangen",
"view_logs": "Protokolle anzeigen"
"title": "Beträge verwalten"
},
"lndViewInvoice": {
"additional_info": "Weiterführende Informationen",
@ -475,7 +457,6 @@
"list_tryagain": "Nochmal versuchen",
"no_ln_wallet_error": "Vor Bezahlung einer Lightning Rechnung zuerst ein Lightning Wallet eröffnen.",
"looks_like_bip38": "Passwortgeschützter Privatschlüssel (BIP38) erkannt.",
"reorder_title": "Wallets neu ordnen",
"please_continue_scanning": "Bitte Scanvorgang fortsetzten",
"select_no_bitcoin": "Es sind momentan keine Bitcoin Wallets verfügbar.",
"select_no_bitcoin_exp": "Eine Bitcoin Wallet ist Voraussetzung dafür, um eine Lightning Wallet zu befüllen. Bitte erstelle oder importiere eines.",
@ -485,8 +466,7 @@
"warning_do_not_disclose": "Warnung! Nicht veröffentlichen",
"add_ln_wallet_first": "Bitte zuerst ein Lightning-Wallet hinzufügen.",
"identity_pubkey": "Pubkey-Identität",
"xpub_title": "Wallet xPub",
"search_wallets": "Wallets suchen"
"xpub_title": "Wallet xPub"
},
"multisig": {
"multisig_vault": "Tresor",

View file

@ -36,28 +36,16 @@
"network": "Σφάλμα δικτύου"
},
"lnd": {
"active": "Ενεργό",
"inactive": "Ανενεργό",
"channels": "Κανάλια",
"no_channels": "Δεν υπάρχουν κανάλια",
"close_channel": "Κλείσιμο καναλιού",
"new_channel": "Νέο κανάλι",
"errorInvoiceExpired": "Το τιμολόγιο έληξε",
"expired": "Έληξε",
"node_alias": "Ψευδώνυμο κόμβου",
"expiresIn": "Λήγει σε {time} λεπτά",
"payButton": "Πληρωμή",
"payment": "Πληρωμή",
"placeholder": "Τιμολόγιο ή διεύθυνση",
"open_channel": "Άνοιγμα καναλιού",
"are_you_sure_open_channel": "Είσαι βέβαιος ότι θέλεις να ανοίξεις αυτό το κανάλι;",
"remote_host": "Απομακρυσμένος υπολογιστής",
"refill": "Γέμισμα πορτοφολιού",
"refill_lnd_balance": "Γέμισε το πορτοφόλι Lightning",
"sameWalletAsInvoiceError": "Δεν μπορείς να εξοφλήσεις ένα τιμολόγιο από το ίδιο πορτοφόλι με το οποίο δημιουργήθηκε.",
"title": "Διαχείριση χρημάτων",
"can_send": "Μπορεί να αποσταλεί",
"can_receive": "Μπορεί να ληφθεί"
"title": "Διαχείριση χρημάτων"
},
"lndViewInvoice": {
"additional_info": "Επιπρόσθετη πληροφορία",
@ -314,7 +302,6 @@
"list_long_scan": "Σάρωση QR Code",
"list_title": "Πορτοφόλια",
"list_tryagain": "Προσπαθήστε ξανά",
"reorder_title": "Αναδιάταξη των πορτοφολιών",
"select_wallet": "Επιλογή πορτοφολιού",
"xpub_copiedToClipboard": "Αντιγράφηκε στο πρόχειρο",
"xpub_title": "XPUB του πορτοφολιού"

View file

@ -52,37 +52,19 @@
"network": "Network Error"
},
"lnd": {
"active": "Active",
"inactive": "Inactive",
"channels": "Channels",
"no_channels": "No channels",
"claim_balance": "Claim balance {balance}",
"close_channel": "Close channel",
"new_channel": "New channel",
"errorInvoiceExpired": "Invoice expired.",
"force_close_channel": "Force close channel?",
"expired": "Expired",
"node_alias": "Node alias",
"expiresIn": "Expires in {time} minutes",
"payButton": "Pay",
"payment": "Payment",
"placeholder": "Invoice or address",
"open_channel": "Open Channel",
"funding_amount_placeholder": "Funding amount, for example, 0.001",
"opening_channnel_for_from": "Opening channel for wallet {forWalletLabel}, by funding from {fromWalletLabel}",
"are_you_sure_open_channel": "Are you sure you want to open this channel?",
"potentialFee": "Potential fee: {fee}",
"remote_host": "Remote host",
"refill": "Refill",
"reconnect_peer": "Reconnect peer",
"refill_create": "In order to proceed, please create a Bitcoin wallet to refill with.",
"refill_external": "Refill with External Wallet",
"refill_lnd_balance": "Refill Lightning Wallet Balance",
"sameWalletAsInvoiceError": "You cannot pay an invoice with the same wallet used to create it.",
"title": "Manage Funds",
"can_send": "Can Send",
"can_receive": "Can Receive",
"view_logs": "View Logs"
"title": "Manage Funds"
},
"lndViewInvoice": {
"additional_info": "Additional Information",
@ -187,6 +169,7 @@
"fee_1d": "1d",
"fee_3h": "3h",
"fee_custom": "Custom",
"insert_custom_fee": "Insert custom fee",
"fee_fast": "Fast",
"fee_medium": "Medium",
"fee_replace_minvb": "The total fee rate (satoshi per vByte) you want to pay should be higher than {min} sat/vByte.",
@ -484,7 +467,8 @@
"list_tryagain": "Try again",
"no_ln_wallet_error": "Before paying a Lightning invoice, you must first add a Lightning wallet.",
"looks_like_bip38": "This looks like a password-protected private key (BIP38).",
"reorder_title": "Re-order Wallets",
"manage_title": "Manage Wallets",
"no_results_found": "No results found.",
"please_continue_scanning": "Please continue scanning.",
"select_no_bitcoin": "There are currently no Bitcoin wallets available.",
"select_no_bitcoin_exp": "A Bitcoin wallet is required to refill Lightning wallets. Please create or import one.",
@ -495,7 +479,7 @@
"add_ln_wallet_first": "You must first add a Lightning wallet.",
"identity_pubkey": "Identity Pubkey",
"xpub_title": "Wallet XPUB",
"search_wallets": "Search Wallets"
"manage_wallets_search_placeholder": "Search wallets, memos"
},
"multisig": {
"multisig_vault": "Vault",

View file

@ -40,33 +40,16 @@
"network": "Error de red"
},
"lnd": {
"active": "Activo",
"inactive": "Inactivo",
"channels": "Canales",
"no_channels": "Sin canales",
"claim_balance": "Reclamar saldo {balance}",
"close_channel": "Cerrar canal",
"new_channel": "Nuevo canal",
"force_close_channel": "¿Forzar el cierre del canal?",
"expired": "Expirado",
"node_alias": "Alias del nodo",
"expiresIn": "Expira en {time} minutos",
"payButton": "Pagar",
"open_channel": "Abrir canal",
"opening_channnel_for_from": "Abrir canal para la cartera {forWalletLabel}, financiado desde {fromWalletLabel}",
"are_you_sure_open_channel": "¿Estás seguro de que quieres abrir este canal?",
"potentialFee": "Comisión estimada: {fee}",
"remote_host": "Host remoto",
"refill": "Recargar",
"reconnect_peer": "Reconectar a los pares",
"refill_create": "Para continuar, por favor crea una cartera de Bitcoin con la que recargar.",
"refill_external": "Recargar con una cartera externa",
"refill_lnd_balance": "Recargar saldo de la cartera Lightning",
"sameWalletAsInvoiceError": "No puedes pagar una factura con la misma cartera que usaste para crearla.",
"title": "Administrar fondos",
"can_send": "Puede enviar",
"can_receive": "Puede recibir",
"view_logs": "Ver registros"
"title": "Administrar fondos"
},
"lndViewInvoice": {
"additional_info": "Información adicional",
@ -414,7 +397,6 @@
"list_tryagain": "Inténtalo otra vez",
"no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debe agregar una cartera Lightning.",
"looks_like_bip38": "Parece que esto es una llave privada protegida con contraseña (BIP38).",
"reorder_title": "Reorganizar carteras",
"please_continue_scanning": "Por favor, continúa escaneando.",
"select_no_bitcoin": "No hay carteras de Bitcoin disponibles.",
"select_no_bitcoin_exp": "Una cartera de Bitcoin es necesaria para recargar una cartera Lightning. Por favor, cree o importe una.",

View file

@ -52,37 +52,19 @@
"network": "Error de red"
},
"lnd": {
"active": "Activo",
"inactive": "Inactivo",
"channels": "Canales",
"no_channels": "Sin canales",
"claim_balance": "Reclamar saldo {balance}",
"close_channel": "Cerrar canal",
"new_channel": "Nuevo canal",
"errorInvoiceExpired": "Factura caducada.",
"force_close_channel": "¿Forzar el cierre del canal?",
"expired": "Expirado",
"node_alias": "Alias del nodo",
"expiresIn": "Expira en {time} minutos",
"payButton": "Pagar",
"payment": "Pago",
"placeholder": "Factura o dirección",
"open_channel": "Abrir canal",
"funding_amount_placeholder": "Importe de financiación, por ejemplo, 0,001",
"opening_channnel_for_from": "Abrir canal para la billetera {forWalletLabel}, por la financiación de {fromWalletLabel}",
"are_you_sure_open_channel": "¿Estás seguro de que quieres abrir este canal?",
"potentialFee": "Tasas potenciales: {fee}",
"remote_host": "Host remoto",
"refill": "Recarga",
"reconnect_peer": "Reconectar a los pares",
"refill_create": "Para continuar, crea una billetera Bitcoin para recargar.",
"refill_external": "Recarga con billetera externa",
"refill_lnd_balance": "Recargar el saldo de la billetera Lightning",
"sameWalletAsInvoiceError": "No puedes pagar una factura con la misma billetera que usaste para crearla.",
"title": "Manejar fondos",
"can_send": "Puede enviar",
"can_receive": "Puede recibir",
"view_logs": "Ver registros"
"title": "Manejar fondos"
},
"lndViewInvoice": {
"additional_info": "Información adicional",
@ -484,7 +466,6 @@
"list_tryagain": "Intenta otra vez",
"no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debes agregar una billetera Lightning.",
"looks_like_bip38": "Esto parece una clave privada protegida por contraseña (BIP38).",
"reorder_title": "Reorganizar Billeteras",
"please_continue_scanning": "Por favor continúa escaneando.",
"select_no_bitcoin": "Actualmente no hay billeteras Bitcoin disponibles.",
"select_no_bitcoin_exp": "Se requiere una billetera Bitcoin para recargar las billeteras Lightning. Por favor, crea o importa una.",
@ -494,8 +475,7 @@
"warning_do_not_disclose": "¡Advertencia! No revelar.",
"add_ln_wallet_first": "Primero debes agregar una billetera Lightning.",
"identity_pubkey": "Identidad Pubkey",
"xpub_title": "XPUB de la billetera",
"search_wallets": "Buscar billeteras"
"xpub_title": "XPUB de la billetera"
},
"multisig": {
"multisig_vault": "Bóveda",

View file

@ -48,35 +48,18 @@
"network": "خطای شبکه"
},
"lnd": {
"active": "فعال",
"inactive": "غیرفعال",
"channels": "کانال‌ها",
"no_channels": "بدون کانال",
"claim_balance": "تسویهٔ موجودی {balance}",
"close_channel": "بستن کانال",
"new_channel": "کانال جدید",
"force_close_channel": "بستن اجباری کانال؟",
"expired": "منقضی‌شده",
"node_alias": "نام مستعار گره",
"expiresIn": "تا {time} دقیقهٔ دیگر منقضی می‌شود",
"payButton": "پرداخت",
"payment": "پرداخت",
"placeholder": "صورت‌حساب یا آدرس",
"open_channel": "بازکردن کانال",
"opening_channnel_for_from": "درحال بازکردن کانال برای کیف پول {forWalletLabel}، با تأمین وجه از {fromWalletLabel}",
"are_you_sure_open_channel": "آیا از بازکردن این کانال اطمینان دارید؟",
"potentialFee": "کارمزد احتمالی: {fee}",
"remote_host": "میزبان راه‌دور",
"refill": "پرکردن",
"reconnect_peer": "اتصال مجدد به همتا",
"refill_create": "جهت ادامه، لطفاً یک کیف پول بیت‌کوین جهت پرکردن ایجاد کنید.",
"refill_external": "پرکردن با کیف پول خارجی",
"refill_lnd_balance": "پرکردن موجودی کیف پول لایتنینگ",
"sameWalletAsInvoiceError": "شما نمی‌توانید صورت‌حسابی را با همان کیف پولی که برای ایجاد آن استفاده کرده‌اید بپردازید.",
"title": "مدیریت دارایی",
"can_send": "می‌تواند ارسال کند",
"can_receive": "می‌تواند دریافت کند",
"view_logs": "مشاهدهٔ رخدادها"
"title": "مدیریت دارایی"
},
"lndViewInvoice": {
"additional_info": "اطلاعات بیشتر",
@ -434,7 +417,6 @@
"list_tryagain": "دوباره امتحان کنید",
"no_ln_wallet_error": "قبل از پرداخت یک صورت‌حساب لایتنینگ، ابتدا باید یک کیف پول لایتنینگ اضافه کنید.",
"looks_like_bip38": "این به کلید خصوصی محافظت‌شده با گذرواژه (BIP38) شباهت دارد.",
"reorder_title": "بازچینی کیف پول‌ها",
"please_continue_scanning": "لطفاً به اسکن‌کردن ادامه دهید.",
"select_no_bitcoin": "هیچ کیف پول بیت‌کوینی درحال‌حاضر دردسترس نیست.",
"select_no_bitcoin_exp": "یک کیف پول بیت‌کوین برای پرکردن کیف پول‌های لایتنینگ نیاز است. لطفاً یکی بسازید یا وارد کنید.",
@ -444,8 +426,7 @@
"warning_do_not_disclose": "هشدار! فاش نکنید.",
"add_ln_wallet_first": "ابتدا باید یک کیف پول لایتنینگ اضافه کنید.",
"identity_pubkey": "هویت/کلید عمومی",
"xpub_title": "کلید XPUB کیف پول",
"search_wallets": "جستجوی کیف‌پول‌ها"
"xpub_title": "کلید XPUB کیف پول"
},
"multisig": {
"multisig_vault": "گاوصندوق",

View file

@ -51,37 +51,19 @@
"network": "Verkkovirhe"
},
"lnd": {
"active": "Aktiivinen",
"inactive": "Passiivinen",
"channels": "Kanavat",
"no_channels": "Ei kanavia",
"claim_balance": "Lunasta saldo {balance}",
"close_channel": "Sulje kanava",
"new_channel": "Uusi kanava",
"errorInvoiceExpired": "Lasku vanheni.",
"force_close_channel": "Pakota kanavan sulku?",
"expired": "Erääntynyt",
"node_alias": "Solmun lempinimi",
"expiresIn": "Vanhenee {time} minuutissa",
"payButton": "Maksa",
"payment": "Maksu",
"placeholder": "Lasku",
"open_channel": "Avaa kanava",
"funding_amount_placeholder": "Rahoitettava määrä, esimerkiksi 0.001",
"opening_channnel_for_from": "Ota rahoitus {fromWalletLabel}:sta kanavan avaamiseksi lompakkoon {forWalletLabel}",
"are_you_sure_open_channel": "Oletko varma että haluat avata tämän kanavan?",
"potentialFee": "Mahdollinen siirtokulu: {fee}",
"remote_host": "Etäpalvelin",
"refill": "Täytä",
"reconnect_peer": "Palauta yhteys naapuriin",
"refill_create": "Jatka luomalla Bitcoin-lompakko, jolla voit täyttää sen.",
"refill_external": "Täytä ulkoisella lompakolla",
"refill_lnd_balance": "Täytä Salamalompakon saldoa",
"sameWalletAsInvoiceError": "Et voi maksaa laskua samalla lompakolla, jolla se on luotu.",
"title": "hallinnoi varoja",
"can_send": "Lähetettävissä",
"can_receive": "Vastaanotettavissa",
"view_logs": "Näytä lokitiedot"
"title": "hallinnoi varoja"
},
"lndViewInvoice": {
"additional_info": "Lisäinformaatio",
@ -460,7 +442,6 @@
"list_tryagain": "Yritä uudelleen",
"no_ln_wallet_error": "Ennen kuin maksat Salamalaskun, sinun on ensin lisättävä Salamalompakko.",
"looks_like_bip38": "Tämä näyttää salasanalla suojatulta yksityiseltä avaimelta (BIP38)",
"reorder_title": "Järjestele Lompakot",
"please_continue_scanning": "Jatka skannausta",
"select_no_bitcoin": "Bitcoin-lompakkoa ei tällä hetkellä ole saatavana.",
"select_no_bitcoin_exp": "Bitcoin-lompakkoa vaaditaan Salamalompakkojen täyttämiseksi. Luo tai tuo yksi.",
@ -470,8 +451,7 @@
"warning_do_not_disclose": "Varoitus! Älä paljasta",
"add_ln_wallet_first": "Sinun on ensin lisättävä Salamalompakko.",
"identity_pubkey": "Tunnus Pubkey",
"xpub_title": "lompakon XPUB",
"search_wallets": "Etsi lompakoista"
"xpub_title": "lompakon XPUB"
},
"multisig": {
"multisig_vault": "Vault",

View file

@ -43,36 +43,18 @@
"network": "Erreur réseau"
},
"lnd": {
"active": "Actif",
"inactive": "Inactif",
"channels": "Canaux",
"no_channels": "Pas de canaux",
"claim_balance": "Réclamer le solde {balance}",
"close_channel": "Fermer le canal",
"new_channel": "Nouveau canal",
"errorInvoiceExpired": "Requête expirée.",
"force_close_channel": "Forcer la fermeture du canal ?",
"expired": "Expiré",
"node_alias": "Alias du node",
"expiresIn": "Expire dans {time} minutes",
"payButton": "Payer",
"placeholder": "Facture ou adresse",
"open_channel": "Ouverture canal",
"funding_amount_placeholder": "Montant financement, par exemple 0,001",
"opening_channnel_for_from": "Canal d'ouverture pour le portefeuille {forWalletLabel}, financement depuis {fromWalletLabel}",
"are_you_sure_open_channel": "Etes vous sûre de vouloir ouvrir ce canal?",
"potentialFee": "Frais potentiels : {fee}",
"remote_host": "Hôte distant",
"refill": "Déposer des fonds",
"reconnect_peer": "Reconnecter le pair",
"refill_create": "Pour continuer, veuillez créer un portefeuille Bitcoin à partir duquel déposer des fonds.",
"refill_external": "Déposer des fonds depuis un portefeuille externe",
"refill_lnd_balance": "Déposer des fonds dans votre portfeuille Lightning",
"sameWalletAsInvoiceError": "Vous ne pouvez pas payer une facture avec le même portefeuille utilisé pour la créer.",
"title": "gérer vos fonds",
"can_send": "Peut envoyer",
"can_receive": "Peut recevoir",
"view_logs": "Voir les logs"
"title": "gérer vos fonds"
},
"lndViewInvoice": {
"additional_info": "Informations complémentaires",
@ -438,7 +420,6 @@
"list_tryagain": "Réessayer",
"no_ln_wallet_error": "Avant de payer une facture Ligthning, vous devez créer un portefeuille Ligthning.",
"looks_like_bip38": "Ceci ressemble a une clé privée protégée par un mot de passe (BIP38)",
"reorder_title": "Trier vos portefeuilles",
"please_continue_scanning": "Merci de continuer à scaner",
"select_no_bitcoin": "Il n'y a aucun portefeuille Bitcoin disponible pour le moment.",
"select_no_bitcoin_exp": "Un portefeuille Bitcoin est nécessaire pour approvisionner les portefeuilles Lightning. Veuillez en créer ou en importer un.",

View file

@ -52,37 +52,19 @@
"network": "שגיאת רשת"
},
"lnd": {
"active": "פעיל",
"inactive": "לא פעיל",
"channels": "ערוצים",
"no_channels": "אין ערוצים",
"claim_balance": "מאזן דרישה {balance}",
"close_channel": "סגירת ערוץ",
"new_channel": "ערוץ חדש",
"errorInvoiceExpired": "חשבונית פגה",
"force_close_channel": "כפיית סגירת ערוץ?",
"expired": "פג",
"node_alias": "כינוי צומת",
"expiresIn": "פג בעוד {time} דקות",
"payButton": "תשלום",
"payment": "תשלום",
"placeholder": "חשבונית או כתובת",
"open_channel": "פתיחת ערוץ",
"funding_amount_placeholder": "סכום מימון, לדוגמה, 0.001",
"opening_channnel_for_from": "פתיחת ערוץ עבור ארנק {forWalletLabel}, בעמצאות מימון מארנק {fromWalletLabel}",
"are_you_sure_open_channel": "האם אתם בטוחים שברצונכם לפתוח ערוץ זה?",
"potentialFee": "עמלה פוטנציאלית: {fee}",
"remote_host": "מארח מרוחק",
"refill": "טעינה",
"reconnect_peer": "התחברות מחדש לעמית",
"refill_create": "כדי להמשיך, אנא צרו ארנק ביטקוין כדי לטעון באמצעותו.",
"refill_external": "טעינה בעזרת ארנק חיצוני",
"refill_lnd_balance": "מלאו את יתרת ארנק הברק",
"sameWalletAsInvoiceError": "לא ניתן לשלם חשבונית עם אותו הארנק שיצר אותה.",
"title": "ניהול כספים",
"can_send": "ניתן לשלוח",
"can_receive": "ניתן לקבל",
"view_logs": "צפייה ביומנים"
"title": "ניהול כספים"
},
"lndViewInvoice": {
"additional_info": "מידע נוסף",
@ -473,7 +455,6 @@
"list_tryagain": "נסו שוב",
"no_ln_wallet_error": "לפני תשלום חשבונית ברק, עלייך להוסיף ארנק ברק.",
"looks_like_bip38": "זה נראה כמו מפתח פרטי מוגן בסיסמה (BIP38)",
"reorder_title": "ארגון ארנקים מחדש ",
"please_continue_scanning": "אנא המשיכו בסריקה.",
"select_no_bitcoin": "אין ארנקי ביטקוין זמינים.",
"select_no_bitcoin_exp": "דרוש ארנק ביטקוין בכדי לטעון את ארנקי הברק. צרו או יבאו אחד.",
@ -483,8 +464,7 @@
"warning_do_not_disclose": "אזהרה! אין לחשוף.",
"add_ln_wallet_first": "עלייך להוסיף ארנק ברק קודם.",
"identity_pubkey": "מפתח זהות ציבורי",
"xpub_title": "מפתח צפייה של הארנק",
"search_wallets": "חיפוש ארנקים"
"xpub_title": "מפתח צפייה של הארנק"
},
"multisig": {
"multisig_vault": "כספת",

View file

@ -123,7 +123,6 @@
"list_empty_txs1": "Vaše transakcije će se pojaviti ovdje",
"list_latest_transaction": "posljednja transakcija",
"list_title": "Voleti",
"reorder_title": "Uredi volete",
"select_wallet": "Odaberi volet",
"xpub_copiedToClipboard": "Kopirano u međuspremnik.",
"xpub_title": "volet XPUB"

View file

@ -41,36 +41,18 @@
"network": "Hálózati hiba"
},
"lnd": {
"active": "Aktív",
"inactive": "Inaktív",
"channels": "Csatornák",
"no_channels": "Nincsenek csatornák",
"claim_balance": "Egyenleg lefoglalása {balance}",
"close_channel": "Csatorna zárása",
"new_channel": "Új csatorna",
"errorInvoiceExpired": "A számla lejárt.",
"force_close_channel": "Csatorna erőltetett zárása?",
"expired": "Lejárt",
"node_alias": "Node aliasz",
"expiresIn": "{time} percen belül elévül",
"payButton": "Fizess",
"placeholder": "Számla",
"open_channel": "Csatorna nyitása",
"funding_amount_placeholder": "Feltöltési mennyiség, például 0.001",
"opening_channnel_for_from": "Csatornanyitás a {forWalletLabel} tárca számára, {fromWalletLabel} által finanszírozva.",
"are_you_sure_open_channel": "Biztosan meg akarja nyitni ezt a csatornát?",
"potentialFee": "Várható díj: {fee}",
"remote_host": "Távoli host",
"refill": "Feltölt",
"reconnect_peer": "Társ újracsatlakoztatása",
"refill_create": "A folytatáshoz, hozz létre egy Bitcoin tárcát amire feltölthetsz.",
"refill_external": "Feltöltés külső tárcáról",
"refill_lnd_balance": "Lightning egyenleg feltöltése",
"sameWalletAsInvoiceError": "Számlát nem fizethesz be ugyanarról a tárcáról, mint amellyel létrehoztad.",
"title": "kezelés",
"can_send": "Tud küldeni",
"can_receive": "Tud fogadni",
"view_logs": "Eseménynapló Megtekintése"
"title": "kezelés"
},
"lndViewInvoice": {
"additional_info": "További információk",
@ -430,7 +412,6 @@
"list_tryagain": "Próbáld újra",
"no_ln_wallet_error": "Mielőtt tudnál fizetni a villámhálózaton, először egy Lightning tárcát kell létrehoznod vagy betöltened.",
"looks_like_bip38": "Ez egy jelszó védett privát kulcsnak (BIP38) tűnik",
"reorder_title": "Tárcák rendezése",
"please_continue_scanning": "Kérem szkenneljen folyamatosan.",
"select_no_bitcoin": "Jelenleg nincs elérhető Bitcoin tárca.",
"select_no_bitcoin_exp": "A Lightning tárca feltöltéséhez Bitcoin tárcára van szükség. Készíts vagy importálj egy Bitcoin tárcát.",

View file

@ -48,32 +48,16 @@
"network": "Kesalahan Jaringan"
},
"lnd": {
"active": "Aktif",
"inactive": "Tidak aktif",
"channels": "Kanal",
"no_channels": "Tidak ada kanal",
"claim_balance": "Klaim saldo {saldo}",
"close_channel": "Tutup kanal",
"new_channel": "Kanal baru",
"force_close_channel": "Tutup paksa kanal?",
"expired": "Kadaluarsa",
"node_alias": "Alias node",
"expiresIn": "Kadaluwarsa dalam {waktu} menit",
"payButton": "Bayar",
"open_channel": "Buka kanal",
"are_you_sure_open_channel": "Apakah Anda yakin ingin membuka kanal ini?",
"potentialFee": "Potensi biaya: {fee}",
"remote_host": "Host jarak jauh",
"refill": "Isi ulang",
"reconnect_peer": "Sambungkan rekan kembali",
"refill_create": "Untuk melanjutkan, buat dompet Bitcoin untuk diisi ulang.",
"refill_external": "Isi ulang dengan Dompet Eksternal",
"refill_lnd_balance": "Isi ulang saldo Lightning",
"sameWalletAsInvoiceError": "Kamu tidak bisa membayar invoice dengan dompet yang sama yang dipakai untuk membuat invoice.",
"title": "Atur Dana",
"can_send": "Bisa Mengirim",
"can_receive": "Bisa Menerima",
"view_logs": "Lihat Catatan"
"title": "Atur Dana"
},
"lndViewInvoice": {
"additional_info": "Informasi Tambahan",
@ -355,7 +339,6 @@
"list_long_scan": "Pindai QR Code",
"list_title": "Dompet",
"list_tryagain": "Coba lagi",
"reorder_title": "Susun Dompet",
"please_continue_scanning": "Harap lanjutkan memindai.",
"select_wallet": "Pilih dompet",
"xpub_copiedToClipboard": "Disalin ke clipboard.",

View file

@ -48,34 +48,17 @@
"network": "Errore di rete"
},
"lnd": {
"active": "Attivo",
"inactive": "Inattivo",
"channels": "Canali",
"no_channels": "Nessun canale",
"claim_balance": "Richiedi il saldo {balance}",
"close_channel": "Chiudi il canale",
"new_channel": "Nuovo canale",
"force_close_channel": "Forza la chiusura del canale?",
"expired": "Scaduto",
"node_alias": "Alias del nodo",
"expiresIn": "Scade tra {time} minuti",
"payButton": "Paga",
"placeholder": "Fattura o indirizzo",
"open_channel": "Apri canale",
"opening_channnel_for_from": "Apri canale per il wallet {forWalletLabel}, caricando fondi da {fromWalletLabel}",
"are_you_sure_open_channel": "Sei sicuro di voler aprie questo canale?",
"potentialFee": "Commissioni potenziali: {fee}",
"remote_host": "Host remoto",
"refill": "Ricarica",
"reconnect_peer": "Riconnetti peer",
"refill_create": "Per continuare, crea un portafoglio Bitcoin dal quale ricaricare.",
"refill_external": "Ricarica con un wallet esterno",
"refill_lnd_balance": "Ricarica saldo del portafoglio Lightning",
"sameWalletAsInvoiceError": "Non puoi pagare una fattura con lo stesso portafoglio utilizzato per crearla.",
"title": "Gestisci fondi",
"can_send": "Puoi inviare",
"can_receive": "Puoi ricevere",
"view_logs": "Visualizza i log"
"title": "Gestisci fondi"
},
"lndViewInvoice": {
"additional_info": "Ulteriori Informazioni",
@ -424,7 +407,6 @@
"list_tryagain": "Riprova",
"no_ln_wallet_error": "Prima di pagare una fattura Lightning, devi aggiungere un portafoglio Lightning.",
"looks_like_bip38": "Questa sembra essere una chiave privata protetta da password (BIP38).",
"reorder_title": "Riordina Portafogli",
"please_continue_scanning": "Per favore continua ad effettuare la scansione.",
"select_no_bitcoin": "Non è disponibile alcun portafoglio Bitcoin.",
"select_no_bitcoin_exp": "È necessario un portafoglio Bitcoin per ricaricare i portafogli Lightning. Per favore creane o importane uno.",

View file

@ -52,37 +52,19 @@
"network": "ネットワークエラー"
},
"lnd": {
"active": "アクティブ",
"inactive": "非アクティブ",
"channels": "チャネル",
"no_channels": "チャネルなし",
"claim_balance": "残高{balance}を請求",
"close_channel": "チャネルを閉じる",
"new_channel": "新規チャネル",
"errorInvoiceExpired": "インボイス失効",
"force_close_channel": "チャネルを強制的に閉じますか?",
"expired": "失効",
"node_alias": "ノードエイリアス",
"expiresIn": "失効まで{time}分",
"payButton": "支払う",
"payment": "支払い",
"placeholder": "インボイスまたはアドレス",
"open_channel": "チャネルを開く",
"funding_amount_placeholder": "デポジット額0.001",
"opening_channnel_for_from": "{fromWalletLabel} の資金を使い、ウォレット {forWalletLabel} のチャネルを開きます",
"are_you_sure_open_channel": "本当にこのチャネルを開きますか?",
"potentialFee": "手数料推計: {fee}",
"remote_host": "リモートホスト",
"refill": "送金",
"reconnect_peer": "ピアに再接続",
"refill_create": "先に進むためには、ビットコインウォレットを作成して補充してください。",
"refill_external": "外部ウォレットで補充",
"refill_lnd_balance": "Lightning ウォレットへ送金",
"sameWalletAsInvoiceError": "インボイスを作成したのと同じウォレットで支払うことはできません。",
"title": "資金の管理",
"can_send": "送金可能",
"can_receive": "受取可能",
"view_logs": "ログを見る"
"title": "資金の管理"
},
"lndViewInvoice": {
"additional_info": "追加情報",
@ -187,6 +169,7 @@
"fee_1d": "1日",
"fee_3h": "3時間",
"fee_custom": "カスタム",
"insert_custom_fee": "カスタム手数料を入力",
"fee_fast": "高速",
"fee_medium": "中速",
"fee_replace_minvb": "希望する手数料レートvByteあたりsatoshiは{min} sat/vByteより高くするのが良いです。",
@ -484,7 +467,8 @@
"list_tryagain": "再度試す",
"no_ln_wallet_error": "ライトニングインボイスの支払いを行う前に、ライトニングウォレットを追加する必要があります。",
"looks_like_bip38": "パスワード保護された秘密鍵(BIP38)のようです。",
"reorder_title": "ウォレットの並び替え",
"manage_title": "ウォレット管理",
"no_results_found": "結果は見つかりませんでした。",
"please_continue_scanning": "スキャンを続けてください。",
"select_no_bitcoin": "現在利用可能なビットコインウォレットがありません。",
"select_no_bitcoin_exp": "ライトニングウォレットのリフィルにはビットコインウォレットが必要です。作成するか、インポートしてください。",
@ -495,7 +479,7 @@
"add_ln_wallet_first": "先にライトニングウォレットを追加する必要があります。",
"identity_pubkey": "識別用公開鍵",
"xpub_title": "ウォレット XPUB",
"search_wallets": "ウォレットを検索"
"manage_wallets_search_placeholder": "ウォレット・メモを検索"
},
"multisig": {
"multisig_vault": "金庫",

View file

@ -24,8 +24,7 @@
"lnd": {
"expiresIn": "Мерзімі {time} минутта аяқталады",
"payButton": "Төлем жасау",
"refill": "Қайта толтыру",
"can_send": "Жібере алу"
"refill": "Қайта толтыру"
},
"lndViewInvoice": {
"sats": "сат."

View file

@ -40,31 +40,14 @@
"network": "네크워크 오류"
},
"lnd": {
"active": "활성",
"inactive": "비활성",
"channels": "챈널",
"no_channels": "챈널 없음",
"claim_balance": "현 잔고{balance} 찾아가기",
"close_channel": "챈널 닫기",
"new_channel": "새 챈널",
"force_close_channel": "챈널을 강제로 닫을까요?",
"expired": "만료되었습니다",
"node_alias": "노드 별칭",
"expiresIn": "{time}분 뒤 무효화됩니다",
"payButton": "지불하기",
"open_channel": "챈널 열기",
"opening_channnel_for_from": "{fromWalletLabel} 지갑의 기금으로 {forWalletLabel} 지갑에 챈널을 개설중",
"are_you_sure_open_channel": "정말 이 챈널을 개설하기 원하십니까?",
"remote_host": "원격 호스트",
"refill": "재충전",
"reconnect_peer": "피어 재연결",
"refill_create": "진행을 위해서 재충전할 수있는 비트코인 지갑을 만들어주세요.",
"refill_external": "외부 지갑으로 재충전합니다.",
"refill_lnd_balance": "라이트닝 월렛잔액 재충전하기",
"title": "자금 관리하기",
"can_send": "보내기 가능",
"can_receive": "받기가능",
"view_logs": "내역 보기"
"title": "자금 관리하기"
},
"lndViewInvoice": {
"additional_info": "추가적인 정보",
@ -405,7 +388,6 @@
"list_tryagain": "다시 시도하기",
"no_ln_wallet_error": "라이트닝 청구서를 지불하기 전 먼저 라이트닝 지갑을 추가해야 합니다.",
"looks_like_bip38": "이것은 패스워드 보호된 비밀키(BIP38)로 보입니다.",
"reorder_title": "지갑 재정렬",
"please_continue_scanning": "계속 스캔하세요.",
"select_no_bitcoin": "현재 사용 가능한 비트코인 월렛이 없습니다.",
"select_no_bitcoin_exp": "라이트닝 지갑을 재충전하시려면 비트코인 지갑이 필요합니다. 새로 만들기 또는 들여오기를 하시기바랍니다.",

View file

@ -26,27 +26,15 @@
"network": "ختا شبکه"
},
"lnd": {
"active": "فعال",
"inactive": "قیر فعال",
"channels": "تورگیا",
"no_channels": "بؽ تورگه",
"claim_balance": "تسویه مۉجۊدی {balance}",
"close_channel": "بستن تورگه",
"new_channel": "تورگه نۊ",
"errorInvoiceExpired": "سۊرت هساو مونقزی بیه.",
"force_close_channel": "بستن اجباری تورگه؟",
"expired": "مونقزی بیه",
"node_alias": "نوم موستعار گره",
"payButton": "پرداخت",
"payment": "پرداخت",
"placeholder": "سۊرت هساو یا آدرس",
"open_channel": "واز کردن تورگه",
"potentialFee": "کارمزد ائتمالی: {fee}",
"refill": "پور کردن",
"refill_external": "پور کردن وا کیف پیلٛ خارجی",
"refill_lnd_balance": "پور کردن مۉجۊدی کیف پیلٛ لایتنینگ",
"can_send": "مؽتونه کلٛ بکه",
"can_receive": "مؽتونه بگره"
"refill_lnd_balance": "پور کردن مۉجۊدی کیف پیلٛ لایتنینگ"
},
"lndViewInvoice": {
"additional_info": "دونسمنیا بؽشتر",

View file

@ -37,31 +37,14 @@
"network": "Ralat Rangkaian"
},
"lnd": {
"active": "Giat",
"inactive": "Tidak Giat",
"channels": "Saluran",
"no_channels": "Tiada saluran",
"claim_balance": "Tebus baki {balance}",
"close_channel": "Tutup saluran",
"new_channel": "Saluran baru",
"force_close_channel": "Tutup saluran secara paksa?",
"expired": "Tamat tempoh",
"node_alias": "Surihan nod",
"expiresIn": "Tamat tempoh dalam {time} minit",
"payButton": "Bayar",
"open_channel": "Saluran Terbuka",
"opening_channnel_for_from": "Membuka saluran untuk dompet {forWalletLabel}, atas pembiayaan dari {fromWalletLabel}",
"are_you_sure_open_channel": "Adakah anda pasti anda mahu membuka saluran ini?",
"remote_host": "Host Jauh",
"refill": "Isi semula",
"reconnect_peer": "Sambung semula dengan rakan",
"refill_create": "Untuk meneruskan, sila buat dompet Bitcoin untuk diisi semula.",
"refill_external": "Isi Semula dengan Dompet Luaran",
"refill_lnd_balance": "Isi Semula Baki Dompet Lightning",
"title": "Uruskan Wang",
"can_send": "Boleh Menghantar",
"can_receive": "Boleh Menerima",
"view_logs": "Lihat Log"
"title": "Uruskan Wang"
},
"lndViewInvoice": {
"additional_info": "Maklumat Tambahan",
@ -374,7 +357,6 @@
"list_tryagain": "Cuba lagi",
"no_ln_wallet_error": "Sebelum membayar invois Lightning, anda perlu menambah dompet Lightning terlebih dahulu.",
"looks_like_bip38": "Ini nampak seperti kunci persendirian yang dilindungi kata laluan (BIP38)",
"reorder_title": "Ubah Aturan Dompet",
"please_continue_scanning": "Sila teruskan mengimbas.",
"select_no_bitcoin": "Tiada dompet Bitcoin ketika ini.",
"select_no_bitcoin_exp": "Dompet Bitcoin diperlukan untuk mengisi dompet Lightning. Sila cipta atau pindah masuk sebuah dompet.",

View file

@ -40,32 +40,15 @@
"network": "Nettverksfeil"
},
"lnd": {
"active": "Aktiv",
"inactive": "Inaktiv",
"channels": "Kanaler",
"no_channels": "Ingen kanaler",
"claim_balance": "Få saldo {balance}",
"close_channel": "Lukk kanal",
"new_channel": "Ny kanal",
"force_close_channel": "Tvinge kanal til å lukke?",
"expired": "Utløpt",
"node_alias": "Node alias",
"expiresIn": "Utløper om {time} minutter",
"payButton": "Betal",
"open_channel": "Åpne kanal",
"opening_channnel_for_from": "Åpner kanal for lommebok {forWalletLabel}, med finansiering fra {fromWalletLabel}",
"are_you_sure_open_channel": "Er du sikker på at du vil åpne denne kanalen?",
"remote_host": "Remote host",
"refill": "Fyll på",
"reconnect_peer": "Koble til peer på nytt",
"refill_create": "For å fortsette må du lage en Bitcoin-lommebok du kan fylle på med.",
"refill_external": "Fyll på med Ekstern Lommebok",
"refill_lnd_balance": "Fyll på Lightning Wallet-balanse",
"sameWalletAsInvoiceError": "Du kan ikke betale en faktura med samme lommebok som brukes til å lage den.",
"title": "Administrer Midler",
"can_send": "Kan Sende",
"can_receive": "Kan Motta",
"view_logs": "Vis Logg"
"title": "Administrer Midler"
},
"lndViewInvoice": {
"additional_info": "Tilleggsinformasjon",
@ -408,7 +391,6 @@
"list_tryagain": "Prøv igjen",
"no_ln_wallet_error": "Før du betaler en Lightning-faktura, må du først legge til en Lightning-lommebok.",
"looks_like_bip38": "Dette ser ut som en passordbeskyttet privat nøkkel (BIP38).",
"reorder_title": "Omorganisere Lommebøker",
"please_continue_scanning": "Vennligst fortsett å skanne.",
"select_no_bitcoin": "Det er for øyeblikket ingen tilgjengelige Bitcoin-lommebøker.",
"select_no_bitcoin_exp": "En Bitcoin-lommebok kreves for å fylle Lightning-lommebøker. Opprett eller importer en.",

View file

@ -47,31 +47,14 @@
"network": "नेटवर्क एर्रोर"
},
"lnd": {
"active": "सक्रिय",
"inactive": "निष्क्रिय",
"channels": "च्यानलहरू",
"no_channels": "च्यानलहरू छैनन्",
"claim_balance": "दावी ब्यालेन्स {balance}",
"close_channel": "च्यानलहरू बन्द गर्नुहोस्",
"new_channel": "नयाँ च्यानल",
"force_close_channel": "जबरजस्ती च्यानल बन्द गर्ने हो?",
"expired": "म्याद सकियो",
"node_alias": "नोड को उपनाम",
"expiresIn": "{time} मिनेटमा म्याद सकिन्छ",
"payButton": "तिर्नुहोस्",
"open_channel": "च्यानल खोल्नुहोस्",
"opening_channnel_for_from": "वालेट {forWalletLabel} को लागि वालेट {fromWalletLabel} को कोषद्वारा बाट च्यानल खोल्दै",
"are_you_sure_open_channel": "के तपाइँ यो च्यानल खोल्न निश्चित हुनुहुन्छ?",
"remote_host": "रिमोट होस्ट",
"refill": "फेरि भर्नु",
"reconnect_peer": "पियर पुन: जडान गर्नुहोस्",
"refill_create": "अगाडि बढ्नको लागि, कृपया बिटकोइन वालेट सिर्जना गर्नुहोस्।",
"refill_external": "बाहिरको वालेटको साथ रिफिल गर्नुहोस्",
"refill_lnd_balance": "लाइटनिङ वालेट ब्यालेन्स रिफिल गर्नुहोस्",
"title": "कोष प्रबन्ध गर्नुहोस्",
"can_send": "पठाउन सकिन्छ",
"can_receive": "प्राप्त गर्न सक्छ",
"view_logs": "लगहरू हेर्नुहोस्"
"title": "कोष प्रबन्ध गर्नुहोस्"
},
"lndViewInvoice": {
"additional_info": "थप जानकारी",
@ -322,7 +305,6 @@
"list_tryagain": "पुन: प्रयास गर्नुहोस्",
"no_ln_wallet_error": "लाइटनिङ इनभ्वाइस भुक्तान गर्नु अघि, तपाईंले पहिले लाइटनिङ वालेट थप्नुपर्छ।",
"looks_like_bip38": "यो पासवर्ड सुरक्षित निजी कुञ्जी जस्तो देखिन्छ (BIP38)।",
"reorder_title": "वालेटहरू पुन: अर्डर गर्नुहोस्",
"please_continue_scanning": "कृपया स्क्यान जारी राख्नुहोस्।",
"select_no_bitcoin": "हाल कुनै बिटकोइन वालेटहरू उपलब्ध छैनन्।",
"select_no_bitcoin_exp": "लाइटनिङ वालेटहरू पुन: भर्नको लागि बिटकोइन वालेट आवश्यक छ। कृपया बिटकोइन वालेट सिर्जना वा आयात गर्नुहोस्।",

View file

@ -48,37 +48,19 @@
"network": "Netwerkfout"
},
"lnd": {
"active": "Actief",
"inactive": "Inactief",
"channels": "Kanalen",
"no_channels": "Geen kanalen",
"claim_balance": "Saldo claimen {balance}",
"close_channel": "Sluit kanaal",
"new_channel": "Nieuw kanaal",
"errorInvoiceExpired": "Factuur verlopen.",
"force_close_channel": "Het sluiten van een kanaal forceren?",
"expired": "Verlopen",
"node_alias": "Node alias",
"expiresIn": "Verloopt in {time} minuten",
"payButton": "Betalen",
"payment": "Betaling",
"placeholder": "Factuur of adres",
"open_channel": "Open kanaal",
"funding_amount_placeholder": "Stortingsbedrag, bijvoorbeeld 0.001",
"opening_channnel_for_from": "Open kanaal voor wallet {forWalletLabel}, door financiering vanuit {fromWalletLabel}",
"are_you_sure_open_channel": "Weet je het zeker dat je dit kanaal wilt openen?",
"potentialFee": "Mogelijke fee: {fee}",
"remote_host": "Externe host",
"refill": "Bijvullen",
"reconnect_peer": "Verbind opnieuw",
"refill_create": "Om verder te gaan, moet u een Bitcoin-wallet maken om mee te vullen.",
"refill_external": "Aanvullen met externe wallet",
"refill_lnd_balance": "Vul Lightning-walletsaldo bij",
"sameWalletAsInvoiceError": "U kunt geen factuur betalen met dezelfde wallet die is gebruikt om de factuur te maken.",
"title": "tegoeden beheren",
"can_send": "Kan verzenden",
"can_receive": "Kan verzenden",
"view_logs": "Bekijk logs"
"title": "tegoeden beheren"
},
"lndViewInvoice": {
"additional_info": "Extra informatie",
@ -412,7 +394,6 @@
"list_tryagain": "Probeer opnieuw",
"no_ln_wallet_error": "Voordat u een Lightning-factuur betaalt, moet u eerst een Lightning-wallet toevoegen.",
"looks_like_bip38": "Dit lijkt op een met een wachtwoord beveiligde private key (BIP38)",
"reorder_title": "Wallets opnieuw ordenen",
"please_continue_scanning": "Ga door met scannen",
"select_no_bitcoin": "Er is momenteel geen Bitcoin-wallet beschikbaar",
"select_no_bitcoin_exp": "Een Bitcoin-wallet is vereist om Lightning-wallets opnieuw te vullen. Maak of importeer er een.",

View file

@ -10,11 +10,7 @@
"success": "You correct"
},
"lnd": {
"are_you_sure_open_channel": "You sure say you wan open this channel?",
"refill_create": "To proceed like this so, abeg create Bitcoin wallet wey you go refill am with",
"can_send": "You fit send",
"can_receive": "You fit receive",
"view_logs": "run shadow your logs"
"refill_create": "To proceed like this so, abeg create Bitcoin wallet wey you go refill am with"
},
"lndViewInvoice": {
"please_pay_between_and": "Abeg pay between {min} and {max}",

View file

@ -52,37 +52,19 @@
"network": "Błąd sieciowy"
},
"lnd": {
"active": "Aktywny",
"inactive": "Nieaktywny",
"channels": "Kanały",
"no_channels": "Brak kanałów",
"claim_balance": "Zażądaj pozostałej kwoty {balance}",
"close_channel": "Zamknij kanał",
"new_channel": "Nowy kanał",
"errorInvoiceExpired": "Faktura wygasła.",
"force_close_channel": "Wymusić zamknięcie kanału?",
"expired": "Przeterminowana",
"node_alias": "Alias węzła",
"expiresIn": "Traci ważność w ciągu {time} minut",
"payButton": "Zapłać",
"payment": "Płatność",
"placeholder": "Faktura lub adres",
"open_channel": "Otwórz kanał",
"funding_amount_placeholder": "Kwota finansowania, na przykład, 0.001",
"opening_channnel_for_from": "Otwieram kanał dla portfela {forWalletLabel} fundując z {fromWalletLabel}",
"are_you_sure_open_channel": "Na pewno otworzyć ten kanał?",
"potentialFee": "Potencjalna opłata transakcyjna: {fee}",
"remote_host": "Zdalny host",
"refill": "Doładuj",
"reconnect_peer": "Połącz ponownie",
"refill_create": "Aby kontynuować, utwórz portfel Bitcoinowy który potem doładujesz.",
"refill_external": "Doładowanie z zewnętrznego portfela",
"refill_lnd_balance": "Doładowanie stanu portfela Lightning",
"sameWalletAsInvoiceError": "Nie możesz zapłacić wezwania z tego samego portfela, który stworzyłeś.",
"title": "Zarządzaj środkami",
"can_send": "Może wysłać",
"can_receive": "Może otrzymać",
"view_logs": "Pokaż dziennik zdarzeń"
"title": "Zarządzaj środkami"
},
"lndViewInvoice": {
"additional_info": "Dodatkowe informacje",
@ -123,6 +105,7 @@
"details_setAmount": "Otrzymaj kwotę",
"details_share": "Udostępnij...",
"header": "Otrzymaj",
"reset": "Reset",
"maxSats": "Kwota maksymalna to {max} satoshi",
"maxSatsFull": "Maksymalna kwota to {max} satoshi lub {currency}",
"minSats": "Kwota minimalna to {min} satoshi",
@ -186,6 +169,7 @@
"fee_1d": "1 dzień",
"fee_3h": "3 godz.",
"fee_custom": "Niestandardowe",
"insert_custom_fee": "Wprowadź niestandardową opłatę",
"fee_fast": "Szybkie",
"fee_medium": "Średnie",
"fee_replace_minvb": "Opłata całkowita (satoshi za vByte), którą chcesz ponieść powinna być wyższa niż {min} satoshi/vBajt",
@ -362,6 +346,12 @@
"transaction_saved": "Zapisano",
"details_show_in_block_explorer": "Zobacz w eksploratorze bloków",
"details_title": "Transakcja",
"incoming_transaction": "Transakcja przychodząca",
"outgoing_transaction": "Transakcja wychodząca",
"expired_transaction": "Transakcja przeterminowana",
"pending_transaction": "Transakcja w toku",
"offchain": "Offchain",
"onchain": "Onchain",
"details_to": "Wyjście",
"enable_offline_signing": "Ten portfel nie jest używany w połączeniu z podpisem offline. Czy chcesz to teraz włączyć?",
"list_conf": "potwierdzenia: {number}",
@ -383,7 +373,9 @@
"txid": "ID Transakcji",
"from": "Od: {counterparty}",
"to": "Do: {counterparty}",
"updating": "Aktualizuję..."
"updating": "Aktualizuję...",
"watchOnlyWarningTitle": "Ostrzeżenie bezpieczeństwa",
"watchOnlyWarningDescription": "Zachowaj ostrożność wobec oszustów, którzy często używają portfeli „tylko do odczytu” do wprowadzania użytkowników w błąd. Te portfele nie pozwalają na kontrolowanie ani wysyłanie środków; umożliwiają jedynie przeglądanie salda."
},
"wallets": {
"add_bitcoin": "Bitcoin",
@ -475,7 +467,8 @@
"list_tryagain": "Spróbuj ponownie",
"no_ln_wallet_error": "Musisz najpierw dodać portfel Lightning, zanim zapłacisz fakturę.",
"looks_like_bip38": "To wygląda na klucz prywatny chroniony hasłem (BIP38).",
"reorder_title": "Zmień kolejność portfeli",
"manage_title": "Zarządzaj portfelami",
"no_results_found": "Nie znaleziono wyników.",
"please_continue_scanning": "Proszę skanuj dalej.",
"select_no_bitcoin": "Nie ma dostępnych portfeli Bitcoin.",
"select_no_bitcoin_exp": "Portfel Bitcoin jest wymagany by uzupełnić portfel Lightning. Proszę utwórz lub zaimportuj.",
@ -486,7 +479,7 @@
"add_ln_wallet_first": "Najpierw musisz dodać portfel Lightning.",
"identity_pubkey": "Klucz publiczny tożsamości",
"xpub_title": "XPUB portfela",
"search_wallets": "Szukaj portfeli"
"manage_wallets_search_placeholder": "Szukaj portfeli, notatek"
},
"multisig": {
"multisig_vault": "Skarbiec",
@ -645,7 +638,7 @@
"notification_tx_unconfirmed": "Transakcja powiadomienia nie została jeszcze potwierdzona, proszę czekać",
"failed_create_notif_tx": "Nie udało się utworzyć transakcji on-chain",
"onchain_tx_needed": "Wymagana transakcja on-chain",
"notif_tx_sent": "Transakcja powiadomienia wysłana. Proszę czekać na jej potwierdzenie",
"notif_tx_sent" : "Transakcja powiadomienia wysłana. Proszę czekać na jej potwierdzenie",
"notif_tx": "Transakcja powiadomienia",
"not_found": "Kod płatności nie znaleziony"
}

View file

@ -52,37 +52,19 @@
"network": "Erro na rede"
},
"lnd": {
"active": "Ativo",
"inactive": "Inativo",
"channels": "Canais",
"no_channels": "Nenhum canal",
"claim_balance": "Reinvindicar saldo {balance}",
"close_channel": "Fechar canal",
"new_channel": "Novo canal",
"errorInvoiceExpired": "Fatura expirada",
"force_close_channel": "Forçar fechamento do canal?",
"expired": "Expirada",
"node_alias": "Apelido do nó",
"expiresIn": "Expira em {time} minutos",
"payButton": "Pagar",
"payment": "Pagamento",
"placeholder": "Fatura ou endereço",
"open_channel": "Abrir canal",
"funding_amount_placeholder": "Quantidade financiamento, exemplo: 0.001",
"opening_channnel_for_from": "Abrindo canal para carteira {forWalletLabel}, com financiamento de {fromWalletLabel}",
"are_you_sure_open_channel": "Tem certeza que deseja abrir esse canal?",
"potentialFee": "Taxa potencial: {fee}",
"remote_host": "Hospedeiro remoto",
"refill": "Recarregar",
"reconnect_peer": "Reconectar par",
"refill_create": "Para continuar, por favor, crie uma carteira Bitcoin para recarregar.",
"refill_external": "Recarregar com uma carteira externa",
"refill_lnd_balance": "Recarregar a carteira Lightning",
"sameWalletAsInvoiceError": "Você não pode pagar um boleto com a mesma carteira que o criou.",
"title": "Administrar fundos",
"can_send": "Pode enviar",
"can_receive": "Pode receber",
"view_logs": "Ver logs"
"title": "Administrar fundos"
},
"lndViewInvoice": {
"additional_info": "Informação adicional",
@ -475,7 +457,6 @@
"list_tryagain": "Tente novamente",
"no_ln_wallet_error": "Antes de pagar uma fatura Lightning, você deve primeiro adicionar uma carteira Lightning.",
"looks_like_bip38": "Parece que esta é uma chave privada protegida por senha (BIP38)",
"reorder_title": "Reordenar Carteiras",
"please_continue_scanning": "Por favor, continue a leitura.",
"select_no_bitcoin": "Não há carteiras Bitcoin disponíveis no momento.",
"select_no_bitcoin_exp": "É necessário ter uma carteira Bitcoin para recarregar as carteiras Lightning. Por favor, crie ou importe uma.",
@ -485,8 +466,7 @@
"warning_do_not_disclose": "Cuidado! Não divulgue.",
"add_ln_wallet_first": "Primeiro você deve adicionar uma carteira Lightning.",
"identity_pubkey": "Identificar chave pública",
"xpub_title": "XPUB da Carteira",
"search_wallets": "Procurar Carteiras"
"xpub_title": "XPUB da Carteira"
},
"multisig": {
"multisig_vault": "Cofre",

View file

@ -43,13 +43,10 @@
"network": "Erro da rede"
},
"lnd": {
"new_channel": "Novo canal",
"expired": "Expirado",
"expiresIn": "Expira em {time} minutos",
"payButton": "Paga",
"placeholder": "Fatura ou endereço",
"open_channel": "Abrir canal",
"are_you_sure_open_channel": "Tem a certeza de que quer abrir este canal?",
"potentialFee": "Taxa provável: {fee}",
"refill": "Carregar",
"refill_create": "Para continuar, crie uma carteira Bitcoin para recarregar.",
@ -349,7 +346,6 @@
"list_long_scan": "Leia o código QR",
"list_title": "carteiras",
"list_tryagain": "Tente novamente",
"reorder_title": "Reordenar Wallets",
"select_no_bitcoin": "No momento, não há carteiras Bitcoin disponíveis.",
"select_no_bitcoin_exp": "Uma carteira Bitcoin é necessária para recarregar as carteiras Lightning. Por favor, crie ou importe uma.",
"select_wallet": "Seleccione uma Wallet",

View file

@ -40,28 +40,14 @@
"network": "Eroare de rețea"
},
"lnd": {
"active": "Activ",
"inactive": "Inactiv",
"channels": "Canale",
"no_channels": "Niciun canal",
"claim_balance": "Revendică sold {balance}",
"close_channel": "Închide canal",
"new_channel": "Canal nou",
"force_close_channel": "Forțează închiderea canalului?",
"expired": "Expirat",
"node_alias": "Alias nod",
"expiresIn": "Expiră în {time} minute",
"payButton": "Plătește",
"open_channel": "Deschide canal",
"are_you_sure_open_channel": "Sigur vrei să deschizi acest canal?",
"refill": "Reumple",
"refill_create": "Pentru a continua, creează un portofel Bitcoin cu care să reumpli.",
"refill_external": "Reumple cu Portofel Extern",
"refill_lnd_balance": "Reumple balanța portofelului Lightning",
"title": "Administrează fondurile",
"can_send": "Poate trimite",
"can_receive": "Poate primi",
"view_logs": "Vezi jurnalele"
"title": "Administrează fondurile"
},
"lndViewInvoice": {
"additional_info": "Informații suplimentare",
@ -382,7 +368,6 @@
"list_tryagain": "Încearcă din nou",
"no_ln_wallet_error": "Înainte de a plăti o factură Lightning, trebuie mai întîi să adaugi un portofel Lightning.",
"looks_like_bip38": "Aceasta arată ca o cheie privată protejată de o parolă (BIP38).",
"reorder_title": "Reordonează portofelele",
"please_continue_scanning": "Continuă scanarea.",
"select_no_bitcoin": "Nu e niciun portofel Bitcoin disponibil.",
"select_no_bitcoin_exp": "E necesar un portofel Bitcoin pentru a re-umple portofelele Lightning. Creează sau importă unul.",

View file

@ -49,37 +49,19 @@
"network": "Ошибка сети"
},
"lnd": {
"active": "Активный",
"inactive": "Неактивный",
"channels": "Каналы",
"no_channels": "Нет каналов",
"claim_balance": "Требовать баланс {balance}",
"close_channel": "Закрыть канал",
"new_channel": "Новый канал",
"errorInvoiceExpired": "Инвойс просрочен.",
"force_close_channel": "Закрыть канал принудительно?",
"expired": "Истекший",
"node_alias": "Псевдоним ноды",
"expiresIn": "Истекает через {time} мин",
"payButton": "Оплатить",
"payment": "Платеж",
"placeholder": "Инвойс",
"open_channel": "Открыть Канал",
"funding_amount_placeholder": "Количество для пополнения, например 0.001",
"opening_channnel_for_from": "Открытие канала для кошелька {forWalletLabel} средствами из {fromWalletLabel}",
"are_you_sure_open_channel": "Вы уверены, что хотите открыть этот канал?",
"potentialFee": "Примерная комиссия: {fee}",
"remote_host": "Удалённый хост",
"refill": "Пополнить",
"reconnect_peer": "Переподключиться",
"refill_create": "Чтобы продолжить, пожалуйста, создайте биткоин-кошелёк для пополнения.",
"refill_external": "Пополнить с помощью внешнего кошелька",
"refill_lnd_balance": "Пополнить баланс кошелька Lightning",
"sameWalletAsInvoiceError": "Ты не можешь оплатить Инвойс тем же кошельком, который ты использовал для его создания.",
"title": "Мои средства",
"can_send": "Может Отправлять",
"can_receive": "Может Получать",
"view_logs": "Посмотреть Логи"
"title": "Мои средства"
},
"lndViewInvoice": {
"additional_info": "Дополнительная информация",
@ -449,7 +431,6 @@
"list_tryagain": "Попробовать еще раз",
"no_ln_wallet_error": "Прежде чем оплачивать Лайтнинг-инвойсы, нужно добавить Лайтнинг-кошелёк.",
"looks_like_bip38": "Это похоже на закрытый ключ, защищенный паролем (BIP38)",
"reorder_title": "Отсортировать кошельки",
"please_continue_scanning": "Продолжайте сканировать",
"select_no_bitcoin": "В настоящее время нет доступных кошельков Bitcoin.",
"select_no_bitcoin_exp": "Кошелёк Bitcoin необходим для пополнения кошельков Lightning. Пожалуйста, создайте или импортируйте его.",
@ -459,8 +440,7 @@
"warning_do_not_disclose": "Внимание! Не разглашать",
"add_ln_wallet_first": "Сначала добавьте Лайтнинг-кошелёк.",
"identity_pubkey": "Identity Pubkey",
"xpub_title": "XPUB кошелька",
"search_wallets": "Поиск Кошельков"
"xpub_title": "XPUB кошелька"
},
"multisig": {
"multisig_vault": "Хранилище",

View file

@ -40,31 +40,14 @@
"network": "ජාලකරණ දෝෂයකි"
},
"lnd": {
"active": "ක්‍රියාකාරී",
"inactive": "අක්‍රීය",
"channels": "නාලිකා",
"no_channels": "නාලිකා කිසිවක් නැත",
"claim_balance": "ශේෂය ඉල්ලන්න {balance}",
"close_channel": "නාලිකාව වසන්න",
"new_channel": "නව නාලිකාව",
"force_close_channel": "කෙසේ හෝ නාලිකාව වසා දමන්නද?",
"expired": "කල් ඉකුත් වී ඇත",
"node_alias": "නෝඩ් අන්වර්ථ නාමය",
"expiresIn": "මිනිත්තුවලින් {time} කල් ඉකුත් වේ",
"payButton": "ගෙවන්න",
"open_channel": "විවෘත නාලිකාව",
"opening_channnel_for_from": "මුදල් පසුම්බිය සඳහා {forWalletLabel}, {fromWalletLabel} අරමුදල් මඟින් නාලිකාව විවෘත කිරීම",
"are_you_sure_open_channel": "ඔබට මෙම නාලිකාව විවෘත කිරීමට අවශ්‍ය බව විශ්වාසද?",
"remote_host": "දුරස්ථ ධාරකයා",
"refill": "නැවත පුරවන්න",
"reconnect_peer": "මිතුරා නැවත සම්බන්ධ කරන්න",
"refill_create": "ඉදිරියට යාමට, කරුණාකර නැවත පිරවීම සඳහා බිට්කොයින් පසුම්බියක් සාදන්න.",
"refill_external": "බාහිර පසුම්බිය සමඟ නැවත පුරවන්න",
"refill_lnd_balance": "ලයිට්නින් පසුම්බියේ ශේෂය නැවත පුරවන්න",
"title": "අරමුදල් කළමනාකරණය කරන්න",
"can_send": "යැවිය හැක",
"can_receive": "ලබා ගත හැක",
"view_logs": "ලොග් බලන්න"
"title": "අරමුදල් කළමනාකරණය කරන්න"
},
"lndViewInvoice": {
"additional_info": "අමතර තොරතුරු",
@ -403,7 +386,6 @@
"list_tryagain": "නැවත උත්සාහ කරන්න",
"no_ln_wallet_error": "අකුණු ඉන්වොයිසියක් ගෙවීමට පෙර, ඔබ මුලින්ම අකුණු පසුම්බියක් එකතු කළ යුතුය.",
"looks_like_bip38": "මෙය මුරපදයකින් ආරක්‍ෂිත පුද්ගලික යතුරක් ලෙස පෙනේ (BIP38).",
"reorder_title": "පසුම්බි නැවත ඇණවුම් කරන්න",
"please_continue_scanning": "කරුණාකර ස්කෑන් කිරීම දිගටම කරගෙන යන්න.",
"select_no_bitcoin": "දැනට බිට්කොයින් පසුම්බි නොමැත.",
"select_no_bitcoin_exp": "ලයිට්නින් පසුම්බි නැවත පිරවීම සඳහා බිට්කොයින් පසුම්බියක් අවශ්‍ය වේ. කරුණාකර එකක් සාදා හෝ ආයාත කරන්න.",

View file

@ -33,22 +33,15 @@
"network": "Sieťová chyba"
},
"lnd": {
"active": "Aktívne",
"inactive": "Neaktívne",
"channels": "Kanály",
"close_channel": "Zatvoriť kanál",
"new_channel": "Nový kanál",
"expired": "Expirovaná",
"expiresIn": "Vyprší za {time} minút",
"payButton": "Zaplatiť",
"open_channel": "Otvoriť kanál",
"refill": "Doplniť",
"refill_create": "Pre pokračovanie, prosím, vytvorte si Bitcoinovú peňaženku",
"refill_external": "Doplniť z externej peňaženky",
"refill_lnd_balance": "Doplniť zostatok na Lightning peňaženke",
"sameWalletAsInvoiceError": "Faktúra sa nedá uhradiť s rovnakou peňaženkou ako tá, ktorá ju vytvorila.",
"title": "spravovať zostatok",
"can_send": "Môže poslať"
"title": "spravovať zostatok"
},
"lndViewInvoice": {
"additional_info": "Doplňujúce informácie",
@ -236,7 +229,6 @@
"list_long_scan": "Skenovať QR kód",
"list_title": "peňaženky",
"list_tryagain": "Skúste znovu",
"reorder_title": "Zoradiť peňaženky",
"select_no_bitcoin": "Žiadne Bitcoinové peňaženky nie sú k dispozícii.",
"select_wallet": "Vyberte peňaženku",
"xpub_copiedToClipboard": "Skopírované do schránky.",

View file

@ -40,32 +40,16 @@
"network": "Omrežna napaka"
},
"lnd": {
"active": "Aktivno",
"inactive": "Neaktivno",
"channels": "Kanali",
"no_channels": "Ni odprtih kanalov",
"close_channel": "Zapri kanal",
"new_channel": "Nov kanal",
"force_close_channel": "Prisilno zapri kanal?",
"expired": "Potekel",
"node_alias": "Vzdevek vozlišča",
"expiresIn": "Poteče čez {time} min",
"payButton": "Plačaj",
"open_channel": "Odpri kanal",
"opening_channnel_for_from": "Odpiranje kanala denarnice {forWalletLabel}, z uporabo sredstev iz {fromWalletLabel}",
"are_you_sure_open_channel": "Ali ste prepričani, da želite odpreti ta kanal?",
"potentialFee": "Morebitna omrežnina: {fee}",
"remote_host": "Oddaljeni gostitelj",
"refill": "Napolni",
"reconnect_peer": "Ponovna vzpostavitev povezave",
"refill_create": "Če želite nadaljevati, ustvarite Bitcoin denarnico, s katero boste napolnili.",
"refill_external": "Napolni z zunanjo denarnico",
"refill_lnd_balance": "Napolni stanje Lightning denarnice",
"sameWalletAsInvoiceError": "Plačilo računa ni mogoče z denarnico, s katero je bil ustvarjen.",
"title": "Uredi sredstva",
"can_send": "Mogoče poslati",
"can_receive": "Mogoče prejeti",
"view_logs": "Prikaži dnevnik"
"title": "Uredi sredstva"
},
"lndViewInvoice": {
"additional_info": "Dodatne Informacije",
@ -412,7 +396,6 @@
"list_tryagain": "Poskusi ponovno",
"no_ln_wallet_error": "Za plačilo Lightning računa, morate najprej dodati Lightning denarnico.",
"looks_like_bip38": "Zasebni ključ je verjetno zaščiten z geslom (BIP38)",
"reorder_title": "Preureditev Denarnic",
"please_continue_scanning": "Nadaljujte s skeniranjem",
"select_no_bitcoin": "Trenutno ni na voljo nobena Bitcoin denarnica.",
"select_no_bitcoin_exp": "Za napolnitev Lightning denarnic je potrebna Bitcoin denarnica. Ustvarite ali uvozite denarnico.",

View file

@ -47,35 +47,18 @@
"network": "Nätverks fel"
},
"lnd": {
"active": "Aktiva",
"inactive": "Inaktiv",
"channels": "Kanaler",
"no_channels": "Inga kanaler",
"claim_balance": "Begär saldo {saldo}",
"close_channel": "Säng kanal",
"new_channel": "Ny kanal",
"force_close_channel": "Tvinga stänga kanal",
"expired": "Förfallen",
"node_alias": "Node alias",
"expiresIn": "Går ut om {time} minuter",
"payButton": "Betala",
"payment": "Betalning",
"placeholder": "Faktura eller adress",
"open_channel": "Öppna kanal",
"opening_channnel_for_from": "Öppnande kanal för plånbok {forWalletLabel}, genom insättning från {fromWalletLabel}",
"are_you_sure_open_channel": "Är du säker på att du vill öppna den här kanalen? ",
"potentialFee": "Potentiell avgift: {avgift}",
"remote_host": "Fjärrvärd",
"refill": "Sätt in",
"reconnect_peer": "Återanslut peer",
"refill_create": "För att fortsätta, vänligen skapa en Bitcoin plånbok att fylla på med",
"refill_external": "Fyll på från extern plånbok",
"refill_lnd_balance": "Fyll på Lightning-plånbok",
"sameWalletAsInvoiceError": "Du kan inte betala en faktura från samma plånbok som användes för att skapa den.",
"title": "sätt in / ta ut",
"can_send": "Kan skicka",
"can_receive": "Kan ta emot",
"view_logs": "Visa loggar"
"title": "sätt in / ta ut"
},
"lndViewInvoice": {
"additional_info": "Ytterligare information",
@ -426,7 +409,6 @@
"list_tryagain": "Försök igen",
"no_ln_wallet_error": "Innan du betalar en Lightning-faktura måste du först lägga till en Lightning-plånbok.",
"looks_like_bip38": "Detta ser ut som en lösenordsskyddad privat nyckel (BIP38).",
"reorder_title": "Sortera plånböcker",
"please_continue_scanning": "Fortsätt att skanna.",
"select_no_bitcoin": "Det finns för närvarande inga tillgängliga Bitcoin-plånböcker.",
"select_no_bitcoin_exp": "En Bitcoin-plånbok krävs för att fylla på Lightning-plånböcker. Vänligen skapa eller importera en.",

View file

@ -273,7 +273,6 @@
"list_long_scan": "สแกนคิวอาร์โค้ด",
"list_title": "กระเป๋าสตางค์",
"list_tryagain": "พยายามอีกครั้ง",
"reorder_title": "เปลี่ยนลำดับกระเป๋าสตางค์",
"select_no_bitcoin": "ขณะนี้ไม่มีกระเป๋าสตางค์บิตคอยน์",
"select_no_bitcoin_exp": "ก่อนที่จะเติมเงินเข้ากระเป๋าสตางค์ไลท์นิง ท่านต้องมีกระเป๋าสตางค์บิตคอยน์",
"select_wallet": "เลือกกระเป๋าสตางค์",

View file

@ -40,29 +40,13 @@
"network": "Ağ Hatası"
},
"lnd": {
"active": "Aktif",
"inactive": "Inaktif",
"channels": "Kanallar",
"no_channels": "Kanal yok",
"claim_balance": "Talep balansı (balans)",
"close_channel": "Kanalı kapa",
"new_channel": "Yeni kanal",
"force_close_channel": "Kanalı kapamaya zorla",
"expired": "Süresi doldu",
"node_alias": "Node mahlası",
"expiresIn": "{time} dakika içerisinde sona erer",
"payButton": "Öde",
"open_channel": "Kanal aç",
"opening_channnel_for_from": "{fromWalletLabel} tarafından fonlanan kanal {forWalletLabel} için aılıyor",
"are_you_sure_open_channel": "Bu kanalı açmak istediğinizden emin misiniz?",
"refill": "Yükle",
"reconnect_peer": "Eş'e tekrar bağlan",
"refill_lnd_balance": "Lightning cüzdana bakiye yükle",
"sameWalletAsInvoiceError": "Bir faturayı, oluştururken kullandığınız cüzdan ile ödeyemezsiniz.",
"title": "Bakiyeleri Yönet",
"can_send": "Gönderebilir",
"can_receive": "Alabilir",
"view_logs": "Logları gör"
"title": "Bakiyeleri Yönet"
},
"lndViewInvoice": {
"additional_info": "Ek Bilgi",
@ -225,7 +209,6 @@
"list_empty_txs1": "İşlemleriniz burada görünür,",
"list_latest_transaction": "en son işlem",
"list_title": "cüzdanlar",
"reorder_title": "Cüzdanları Sırala",
"select_wallet": "Cüzdan Seç",
"xpub_copiedToClipboard": "Panoya kopyalandı",
"xpub_title": "cüzdan XPUB"

View file

@ -48,32 +48,15 @@
"network": "Помилка Мережі"
},
"lnd": {
"active": "Активний",
"inactive": "Неактивний",
"channels": "Канали",
"no_channels": "Немає каналів",
"claim_balance": "Баланс вимоги {баланс}",
"close_channel": "Закрити канал",
"new_channel": "Новий канал",
"force_close_channel": "Примусово закрити канал?",
"expired": "Термін дії закінчився",
"node_alias": "Псевдонім вузла",
"expiresIn": "Закінчується через {час} хвилин",
"payButton": "Оплатити",
"placeholder": "Рахунок або адреса",
"open_channel": "Відкрити Канал",
"opening_channnel_for_from": "Відкриття каналу для гаманця {forWalletLabel}, за рахунок фінансування з {fromWalletLabel}",
"are_you_sure_open_channel": "Ви впевнені, що хочете відкрити цей канал?",
"remote_host": "Віддалений хост",
"refill": "Поповнити",
"reconnect_peer": "Перепідключити одноранговий",
"refill_create": "Щоб продовжити, будь ласка, створіть біткоїн-гаманець для поповнення.",
"refill_external": "Поповнити з зовнішнього гаманця",
"refill_lnd_balance": "Збільшити баланс Lightning гаманця",
"title": "Мої Кошти",
"can_send": "Можна Надіслати",
"can_receive": "Можна Отримати",
"view_logs": "Переглянути Логи"
"title": "Мої Кошти"
},
"lndViewInvoice": {
"additional_info": "Додаткова Інформація",

View file

@ -47,32 +47,15 @@
"network": "Lỗi mạng"
},
"lnd": {
"active": "Kích hoạt",
"inactive": "Không kích hoạt",
"channels": "Các kênh",
"no_channels": "Không có kênh",
"claim_balance": "Yêu cầu số dư {balance}",
"close_channel": "Đóng kênh",
"new_channel": "Kênh mới",
"force_close_channel": "Buộc đóng kênh",
"expired": "Hết hạn",
"node_alias": "Bí danh node",
"expiresIn": "Hết hạn sau {time} phút",
"payButton": "Thanh toán",
"placeholder": "Hóa đơn hoặc địa chỉ",
"open_channel": "Mở kênh",
"opening_channnel_for_from": "Đang mở kênh cho ví {forWalletLabel} bằng cách tài trợ từ {fromWalletLabel}",
"are_you_sure_open_channel": "Bạn có chắc muốn mở kênh này không?",
"remote_host": "Máy chủ từ xa",
"refill": "Đổ đầy",
"reconnect_peer": "Kết nối lại với peer",
"refill_create": "Để tiếp tục, vui lòng tạo một ví Bitcoin để nạp tiền. ",
"refill_external": "Nạp lại với ví bên ngoài",
"refill_lnd_balance": "Nạp lại số dư ví Lightning",
"title": "Quản lý quỹ",
"can_send": "Gửi được",
"can_receive": "Nhận được",
"view_logs": "Xem các bản ghi"
"title": "Quản lý quỹ"
},
"lndViewInvoice": {
"additional_info": "Thông tin thêm",
@ -419,7 +402,6 @@
"list_tryagain": "Thử lại",
"no_ln_wallet_error": "Trước khi thanh toán hoá đơn Lightning, đầu tiên bạn phải thêm một ví Lightning.",
"looks_like_bip38": "Cái này trông giống một khoá cá nhân được bảo vệ bằng mật khẩu (BIP38).",
"reorder_title": "Sắp xếp lại các vị",
"please_continue_scanning": "Vui lòng quét tiếp.",
"select_no_bitcoin": "Hiện tại không có ví Bitcoin có sẵn.",
"select_no_bitcoin_exp": "Bạn phải sử dụng ví Bitcoin đễ nạp tiền vào ví Lightning. Hãy tạo hoặc nhập một ví Bitcoin.",

View file

@ -44,33 +44,18 @@
"network": "Netwerk Vout"
},
"lnd": {
"active": "Aktief",
"inactive": "Onaktief",
"channels": "Kanale",
"no_channels": "Geen kanale",
"claim_balance": "Eis balaans {balance}",
"close_channel": "Sluit kanaal",
"new_channel": "Nuwe kanaal",
"errorInvoiceExpired": "Faktuur het verval.",
"force_close_channel": "Dwing kanaal sluiting?",
"expired": "Verval",
"node_alias": "Knoop-punt noem naam",
"expiresIn": "Verval in {time} minute",
"payButton": "Betaal",
"payment": "Betaling",
"placeholder": "Faktuur of adres",
"open_channel": "Open Kanaal",
"opening_channnel_for_from": "Skep kanaal vir beursie {forWalletLabel}, deur befondsing vanaf {fromWalletLabel}",
"are_you_sure_open_channel": "Is jy seker jy wil hierdie kanaal oop maak?",
"refill": "Herlaai",
"refill_create": "Om voort te gaan, skep asb 'n Bitcoin beursie om vondse mee aan te vul.",
"refill_external": "Vul aan met Eksterne Beursie",
"refill_lnd_balance": "Herlaai Lightning beursie",
"sameWalletAsInvoiceError": "U kan nie n faktuur betaal met die selfde beursie waarmee die faktuur geksep is nie.",
"title": "bestuur fondse",
"can_send": "Kan Stuur",
"can_receive": "Kan Ontvang",
"view_logs": "Sien Aktiwiteits Register"
"title": "bestuur fondse"
},
"lndViewInvoice": {
"additional_info": "Bykomende Inligting",
@ -222,7 +207,6 @@
"list_latest_transaction": "laaste transaksie",
"list_title": "beursies",
"no_ln_wallet_error": "Voordat jy 'n Lightning faktuur betaal moet jy eers 'n Lightning beursie aanwys.",
"reorder_title": "Herorganiseer Beursies",
"select_wallet": "Kies Beursie",
"xpub_copiedToClipboard": "Gestuur na klipbord.",
"add_ln_wallet_first": "Jy moet eers 'n Lightning beursie byvoeg.",

View file

@ -142,7 +142,6 @@
"list_empty_txs1": "Intengiso yakho iya kubonakala apha,",
"list_latest_transaction": "Utshintsho olutsha",
"list_title": "Ingxowa",
"reorder_title": "Yenza kwakhona ingxowa",
"select_wallet": "Khetha ingxowa",
"xpub_copiedToClipboard": "Ikopishwe kwi-clipboard",
"xpub_title": "ingxowa XPUB"

View file

@ -40,8 +40,6 @@
"network": "网络错误"
},
"lnd": {
"active": "激活",
"inactive": "无效",
"expired": "已过期",
"payButton": "支付",
"refill": "充值",
@ -340,7 +338,6 @@
"list_tryagain": "再试一次",
"no_ln_wallet_error": "在支付闪电账单之前,必须先添加一个闪电钱包。",
"looks_like_bip38": "这看起来像是受密码保护的私钥BIP38。",
"reorder_title": "重新排列钱包",
"please_continue_scanning": "请继续扫描。",
"select_no_bitcoin": "当前没有可用的比特币钱包。",
"select_no_bitcoin_exp": "需要一个比特币钱包来为闪电钱包充值。 请创建或导入一个。",

View file

@ -44,9 +44,7 @@
"refill_external": "用外部錢包增值",
"refill_lnd_balance": "給閃電錢包增值",
"sameWalletAsInvoiceError": "你不能用建立賬單的錢包去支付該賬單",
"title": "管理資金",
"can_send": "能傳送",
"can_receive": "能接收"
"title": "管理資金"
},
"lndViewInvoice": {
"additional_info": "附加信息",
@ -333,7 +331,6 @@
"list_tryagain": "再試一次",
"no_ln_wallet_error": "在繳付閃電賬單之前,必須先添加一個閃電錢包。",
"looks_like_bip38": "這看起來像是受密碼保護的私鑰BIP38。",
"reorder_title": "重新排列錢包",
"please_continue_scanning": "請繼續掃描。",
"select_no_bitcoin": "當前沒有可用的比特幣錢包。",
"select_no_bitcoin_exp": "需要一個比特幣錢包來為閃電錢包增值,請建立或導入一個。",

View file

@ -11,7 +11,6 @@ import {
ImportWalletComponent,
ImportWalletDiscoveryComponent,
PleaseBackupComponent,
PleaseBackupLdkComponent,
PleaseBackupLNDHubComponent,
ProvideEntropyComponent,
WalletsAddMultisigComponent,
@ -27,7 +26,6 @@ export type AddWalletStackParamList = {
ImportCustomDerivationPath: undefined;
PleaseBackup: undefined;
PleaseBackupLNDHub: undefined;
PleaseBackupLdk: undefined;
ProvideEntropy: undefined;
WalletsAddMultisig: {
walletLabel: string;
@ -87,15 +85,6 @@ const AddWalletStack = () => {
component={PleaseBackupLNDHubComponent}
options={navigationStyle({ gestureEnabled: false, headerBackVisible: false, title: loc.pleasebackup.title })(theme)}
/>
<Stack.Screen
name="PleaseBackupLdk"
component={PleaseBackupLdkComponent}
options={navigationStyle({
title: loc.pleasebackup.title,
gestureEnabled: false,
headerBackVisible: false,
})(theme)}
/>
<Stack.Screen
name="ProvideEntropy"
component={ProvideEntropyComponent}

View file

@ -7,7 +7,6 @@ import navigationStyle, { CloseButtonPosition } from '../components/navigationSt
import { useTheme } from '../components/themes';
import { useExtendedNavigation } from '../hooks/useExtendedNavigation';
import loc from '../loc';
import LdkInfo from '../screen/lnd/ldkInfo';
import LNDViewAdditionalInvoiceInformation from '../screen/lnd/lndViewAdditionalInvoiceInformation';
import LNDViewAdditionalInvoicePreImage from '../screen/lnd/lndViewAdditionalInvoicePreImage';
import LNDViewInvoice from '../screen/lnd/lndViewInvoice';
@ -25,7 +24,6 @@ import TransactionStatus from '../screen/transactions/TransactionStatus';
import WalletAddresses from '../screen/wallets/WalletAddresses';
import WalletDetails from '../screen/wallets/details';
import GenerateWord from '../screen/wallets/generateWord';
import LdkViewLogs from '../screen/wallets/ldkViewLogs';
import SelectWallet from '../screen/wallets/SelectWallet';
import WalletTransactions from '../screen/wallets/transactions';
import WalletsList from '../screen/wallets/WalletsList';
@ -52,10 +50,8 @@ import {
ToolsComponent,
} from './LazyLoadSettingsStack';
import PaymentCodesListComponent from './LazyLoadPaymentCodeStack';
import LDKOpenChannelRoot from './LDKOpenChannelStack';
import LNDCreateInvoiceRoot from './LNDCreateInvoiceStack';
import ReceiveDetailsStackRoot from './ReceiveDetailsStack';
import ReorderWalletsStackRoot from './ReorderWalletsStack';
import ScanLndInvoiceRoot from './ScanLndInvoiceStack';
import ScanQRCodeStackRoot from './ScanQRCodeStack';
import SendDetailsStack from './SendDetailsStack';
@ -66,6 +62,7 @@ import WalletXpubStackRoot from './WalletXpubStack';
import PlusIcon from '../components/icons/PlusIcon';
import SettingsButton from '../components/icons/SettingsButton';
import ExportMultisigCoordinationSetupStack from './ExportMultisigCoordinationSetupStack';
import ManageWallets from '../screen/wallets/ManageWallets';
const DetailViewStackScreensStack = () => {
const theme = useTheme();
@ -116,19 +113,6 @@ const DetailViewStackScreensStack = () => {
component={WalletTransactions}
options={WalletTransactions.navigationOptions(theme)}
/>
<DetailViewStack.Screen
name="LDKOpenChannelRoot"
component={LDKOpenChannelRoot}
options={navigationStyle({
title: loc.lnd.new_channel,
headerLargeTitle: true,
statusBarStyle: 'auto',
closeButtonPosition: CloseButtonPosition.Right,
headerBackVisible: false,
gestureEnabled: false,
})(theme)}
/>
<DetailViewStack.Screen name="LdkInfo" component={LdkInfo} options={LdkInfo.navigationOptions(theme)} />
<DetailViewStack.Screen
name="WalletDetails"
component={WalletDetails}
@ -138,7 +122,6 @@ const DetailViewStackScreensStack = () => {
headerRight: () => SaveButton,
})(theme)}
/>
<DetailViewStack.Screen name="LdkViewLogs" component={LdkViewLogs} options={LdkViewLogs.navigationOptions(theme)} />
<DetailViewStack.Screen
name="TransactionDetails"
component={TransactionDetails}
@ -247,11 +230,7 @@ const DetailViewStackScreensStack = () => {
/>
<DetailViewStack.Screen name="AddWalletRoot" component={AddWalletStack} options={NavigationFormModalOptions} />
<DetailViewStack.Screen
name="SendDetailsRoot"
component={SendDetailsStack}
options={navigationStyle({ headerShown: false, presentation: isDesktop ? 'fullScreenModal' : 'modal' })(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} />
<DetailViewStack.Screen name="AztecoRedeemRoot" component={AztecoRedeemStackRoot} options={NavigationDefaultOptions} />
@ -379,13 +358,15 @@ const DetailViewStackScreensStack = () => {
}}
/>
<DetailViewStack.Screen
name="ReorderWallets"
component={ReorderWalletsStackRoot}
options={{
headerShown: false,
name="ManageWallets"
component={ManageWallets}
options={navigationStyle({
headerBackVisible: false,
headerLargeTitle: true,
gestureEnabled: false,
presentation: 'modal',
}}
title: loc.wallets.manage_title,
})(theme)}
/>
</DetailViewStack.Navigator>
);

View file

@ -5,10 +5,7 @@ export type DetailViewStackParamList = {
UnlockWithScreen: undefined;
WalletsList: { scannedData?: string };
WalletTransactions: { walletID: string; walletType: string };
LDKOpenChannelRoot: undefined;
LdkInfo: undefined;
WalletDetails: { walletID: string };
LdkViewLogs: undefined;
TransactionDetails: { transactionId: string };
TransactionStatus: { hash?: string; walletID?: string };
CPFP: { transactionId: string };
@ -103,5 +100,5 @@ export type DetailViewStackParamList = {
paymentCode: string;
walletID: string;
};
ReorderWallets: undefined;
ManageWallets: undefined;
};

View file

@ -1,27 +0,0 @@
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import React from 'react';
import navigationStyle from '../components/navigationStyle';
import { useTheme } from '../components/themes';
import loc from '../loc';
import { LdkOpenChannelComponent, SelectWalletComponent, SuccessComponent } from './LazyLoadLDKOpenChannelStack';
const Stack = createNativeStackNavigator();
const LDKOpenChannelRoot = () => {
const theme = useTheme();
return (
<Stack.Navigator screenOptions={{ headerShadowVisible: false }} initialRouteName="SelectWallet">
<Stack.Screen
name="SelectWallet"
component={SelectWalletComponent}
options={navigationStyle({ title: loc.wallets.select_wallet })(theme)}
/>
<Stack.Screen name="LDKOpenChannelSetAmount" component={LdkOpenChannelComponent} />
<Stack.Screen name="Success" component={SuccessComponent} options={{ headerShown: false, gestureEnabled: false }} />
</Stack.Navigator>
);
};
export default LDKOpenChannelRoot;

View file

@ -10,7 +10,6 @@ const ImportSpeed = lazy(() => import('../screen/wallets/importSpeed'));
const ImportWallet = lazy(() => import('../screen/wallets/import'));
const PleaseBackup = lazy(() => import('../screen/wallets/PleaseBackup'));
const PleaseBackupLNDHub = lazy(() => import('../screen/wallets/pleaseBackupLNDHub'));
const PleaseBackupLdk = lazy(() => import('../screen/wallets/pleaseBackupLdk'));
const ProvideEntropy = lazy(() => import('../screen/wallets/ProvideEntropy'));
const WalletsAddMultisig = lazy(() => import('../screen/wallets/WalletsAddMultisig'));
const WalletsAddMultisigStep2 = lazy(() => import('../screen/wallets/addMultisigStep2'));
@ -58,12 +57,6 @@ export const PleaseBackupLNDHubComponent = () => (
</Suspense>
);
export const PleaseBackupLdkComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>
<PleaseBackupLdk />
</Suspense>
);
export const ProvideEntropyComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>
<ProvideEntropy />

View file

@ -1,25 +0,0 @@
import React, { lazy, Suspense } from 'react';
import { LazyLoadingIndicator } from './LazyLoadingIndicator';
const SelectWallet = lazy(() => import('../screen/wallets/SelectWallet'));
const LdkOpenChannel = lazy(() => import('../screen/lnd/ldkOpenChannel'));
const Success = lazy(() => import('../screen/send/success'));
export const SelectWalletComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>
<SelectWallet />
</Suspense>
);
export const LdkOpenChannelComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>
<LdkOpenChannel />
</Suspense>
);
export const SuccessComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>
<Success />
</Suspense>
);

View file

@ -3,7 +3,7 @@ import React, { lazy, Suspense } from 'react';
import { LazyLoadingIndicator } from './LazyLoadingIndicator';
// Define lazy imports
const WalletExport = lazy(() => import('../screen/wallets/export'));
const WalletExport = lazy(() => import('../screen/wallets/WalletExport'));
export const WalletExportComponent = () => (
<Suspense fallback={<LazyLoadingIndicator />}>

View file

@ -1,30 +0,0 @@
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import React from 'react';
import navigationStyle from '../components/navigationStyle';
import { useTheme } from '../components/themes';
import loc from '../loc';
import ReorderWallets from '../screen/wallets/ReorderWallets';
const Stack = createNativeStackNavigator();
const ReorderWalletsStackRoot = () => {
const theme = useTheme();
return (
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
<Stack.Screen
name="ReorderWalletsScreen"
component={ReorderWallets}
options={navigationStyle({
headerBackVisible: false,
headerLargeTitle: true,
headerTitle: loc.wallets.reorder_title,
})(theme)}
/>
</Stack.Navigator>
);
};
export default ReorderWalletsStackRoot;

View file

@ -99,10 +99,7 @@ export type DetailViewStackParamList = {
UnlockWithScreen: undefined;
WalletsList: undefined;
WalletTransactions: { walletID: string; walletType: string };
LDKOpenChannelRoot: undefined;
LdkInfo: undefined;
WalletDetails: { walletID: string };
LdkViewLogs: undefined;
TransactionDetails: { transactionId: string };
TransactionStatus: { hash?: string; walletID?: string };
CPFP: { transactionId: string };
@ -213,5 +210,5 @@ export type DetailViewStackParamList = {
paymentCode: string;
walletID: string;
};
ReorderWallets: undefined;
ManageWallets: undefined;
};

15318
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,7 @@
"eslint-config-standard-jsx": "^11.0.0",
"eslint-config-standard-react": "^13.0.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.7.0",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.1.1",
@ -43,30 +44,29 @@
"typescript": "^5.1.6"
},
"engines": {
"node": ">=16",
"npm": ">=6.9.0"
"node": ">=20"
},
"scripts": {
"clean": "cd android/; ./gradlew clean; cd ..; rm -r -f /tmp/metro-cache/; rm -r -f node_modules/; yarn cache clean; yarn install; yarn start --reset-cache",
"clean:ios": "rm -fr node_modules && rm -fr ios/Pods && yarn && cd ios && pod update && cd ..; yarn start --reset-cache",
"clean": "cd android/; ./gradlew clean; cd ..; rm -r -f /tmp/metro-cache/; rm -r -f node_modules/; npm cache clean --force; npm i; npm start -- --reset-cache",
"clean:ios": "rm -fr node_modules && rm -fr ios/Pods && npm i && cd ios && pod update && cd ..; npm start -- --reset-cache",
"releasenotes2json": "./scripts/release-notes.sh > release-notes.txt; node -e 'console.log(JSON.stringify(require(\"fs\").readFileSync(\"release-notes.txt\", \"utf8\")));' > release-notes.json",
"branch2json": "./scripts/current-branch.sh > current-branch.json",
"start": "react-native start",
"start": "node node_modules/react-native/local-cli/cli.js start",
"android": "react-native run-android",
"android:clean": "cd android; ./gradlew clean; cd .. ;yarn android",
"android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android",
"ios": "react-native run-ios",
"postinstall": "rn-nodeify --install buffer,events,process,stream,inherits,path,assert,crypto --hack; yarn releasenotes2json; yarn branch2json; yarn patches",
"patches": "patch -p1 < scripts/rn-ldk.patch; patch -p1 < scripts/react-native-camera-kit.patch;",
"test": "yarn tslint && yarn lint && yarn unit && yarn jest",
"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;",
"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",
"e2e:debug-test": "detox test -c android.debug -d 200000 -l info",
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || yarn e2e:debug-build; yarn e2e:debug-test",
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test",
"e2e:release-build": "detox build -c android.release",
"e2e:release-test": "detox test -c android.release",
"tslint": "tsc",
"lint": " yarn tslint && node scripts/find-unused-loc.js && eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components navigation typings",
"lint:fix": "yarn lint --fix",
"lint": " npm run tslint && node scripts/find-unused-loc.js && eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components navigation typings",
"lint:fix": "npm run lint -- --fix",
"lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep -E '\\.js|\\.ts' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0",
"unit": "jest -b -w tests/unit/*"
},
@ -103,25 +103,24 @@
]
},
"dependencies": {
"@babel/preset-env": "^7.20.0",
"@babel/preset-env": "7.25.3",
"@bugsnag/react-native": "7.25.0",
"@bugsnag/source-maps": "2.3.3",
"@keystonehq/bc-ur-registry": "0.6.4",
"@lodev09/react-native-true-sheet": "0.12.4",
"@lodev09/react-native-true-sheet": "github:BlueWallet/react-native-true-sheet#730a84b0261ef2dd2e7e9adadba7f260c7f76726",
"@ngraveio/bc-ur": "1.1.12",
"@remobile/react-native-qrcode-local-image": "github:BlueWallet/react-native-qrcode-local-image#31b0113110fbafcf5a5f3ca4183a563550f5c352",
"@noble/secp256k1": "1.6.3",
"@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": "1.1.2",
"@react-native/metro-config": "0.74.84",
"@react-navigation/drawer": "6.7.2",
"@react-navigation/native": "6.1.18",
"@react-navigation/native-stack": "6.11.0",
"@remobile/react-native-qrcode-local-image": "github:BlueWallet/react-native-qrcode-local-image#31b0113110fbafcf5a5f3ca4183a563550f5c352",
"@rneui/base": "4.0.0-rc.8",
"@rneui/themed": "4.0.0-rc.8",
"@spsina/bip47": "github:BlueWallet/bip47#f4b8047c7efbe382c268b3074a4956698087f984",
"@spsina/bip47": "github:BlueWallet/bip47#f4b8047",
"aezeed": "0.0.5",
"assert": "2.1.0",
"base-x": "4.0.0",
@ -130,7 +129,7 @@
"bignumber.js": "9.1.1",
"bip21": "2.0.3",
"bip32": "3.0.1",
"bip38": "github:BlueWallet/bip38#7ec4b1932b98eaaff16c5a26765a26466958e6b4",
"bip38": "github:BlueWallet/bip38",
"bip39": "3.1.0",
"bitcoinjs-lib": "6.1.6",
"bitcoinjs-message": "2.2.0",
@ -142,7 +141,7 @@
"detox": "20.25.1",
"ecpair": "2.0.1",
"ecurve": "1.0.6",
"electrum-client": "github:BlueWallet/rn-electrum-client#1bfe3cc4249d5440b816baac942b0cfa921eebf9",
"electrum-client": "github:BlueWallet/rn-electrum-client#1bfe3cc",
"electrum-mnemonic": "2.0.0",
"events": "3.3.0",
"frisbee": "3.1.4",
@ -154,38 +153,39 @@
"process": "0.11.10",
"prop-types": "15.8.1",
"react": "18.2.0",
"react-localization": "github:BlueWallet/react-localization#ae7969a8998128aebf1169f931fb22587dc5f874",
"react-localization": "github:BlueWallet/react-localization#ae7969a",
"react-native": "0.72.14",
"react-native-biometrics": "3.0.1",
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442425bd835e185284fbc62e84b7155bc441",
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442",
"react-native-camera-kit": "13.0.0",
"react-native-crypto": "2.2.0",
"react-native-default-preference": "1.4.4",
"react-native-device-info": "11.1.0",
"react-native-document-picker": "github:BlueWallet/react-native-document-picker#ba9299e01be6d0ddaa5f1b491406481a5ad0f315",
"react-native-draggable-flatlist": "github:BlueWallet/react-native-draggable-flatlist#3061e3055cbe0a9c7665b9c4b90912c30f668a3d",
"react-native-document-picker": "9.3.0",
"react-native-draggable-flatlist": "github:BlueWallet/react-native-draggable-flatlist#v4.0.1",
"react-native-fs": "2.20.0",
"react-native-gesture-handler": "2.17.1",
"react-native-handoff": "github:BlueWallet/react-native-handoff#31d005f93d31099d0e564590a3bbd052b8a02b39",
"react-native-haptic-feedback": "2.2.0",
"react-native-idle-timer": "github:BlueWallet/react-native-idle-timer#7300b637c465c86e8db874c442e687950111da40",
"react-native-gesture-handler": "2.18.1",
"react-native-handoff": "github:BlueWallet/react-native-handoff#v0.0.4",
"react-native-haptic-feedback": "2.3.0",
"react-native-idle-timer": "github:BlueWallet/react-native-idle-timer#v2.2.3",
"react-native-image-picker": "7.1.2",
"react-native-ios-context-menu": "github:BlueWallet/react-native-ios-context-menu#v1.15.3",
"react-native-ios-context-menu": "github:BlueWallet/react-native-ios-context-menu#e5c1217cd220bfab6e6d9a7c65838545082e3f8e",
"react-native-keychain": "8.2.0",
"react-native-linear-gradient": "2.8.3",
"react-native-localize": "3.2.0",
"react-native-localize": "3.2.1",
"react-native-obscure": "github:BlueWallet/react-native-obscure#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb",
"react-native-permissions": "4.1.5",
"react-native-privacy-snapshot": "github:BlueWallet/react-native-privacy-snapshot#529e4627d93f67752a27e82a040ff7b64dca0783",
"react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376",
"react-native-privacy-snapshot": "github:BlueWallet/react-native-privacy-snapshot#529e4627d93f67752a27e82a040ff7b64dca0783",
"react-native-push-notification": "8.1.1",
"react-native-qrcode-svg": "6.3.1",
"react-native-quick-actions": "0.3.13",
"react-native-randombytes": "3.6.1",
"react-native-rate": "1.2.12",
"react-native-reanimated": "3.14.0",
"@react-native/metro-config": "0.74.84",
"react-native-safe-area-context": "4.10.8",
"react-native-screens": "3.32.0",
"react-native-screens": "3.33.0",
"react-native-secure-key-store": "github:BlueWallet/react-native-secure-key-store#2076b4849e88aa0a78e08bfbb4ce3923e0925cbc",
"react-native-share": "10.2.1",
"react-native-svg": "13.14.1",
@ -194,13 +194,12 @@
"react-native-watch-connectivity": "1.1.0",
"readable-stream": "3.6.2",
"realm": "12.12.1",
"rn-ldk": "github:BlueWallet/rn-ldk#v0.8.4",
"rn-nodeify": "10.3.0",
"scryptsy": "2.1.0",
"silent-payments": "github:BlueWallet/SilentPayments#7ac4d17b85dc875a3ebb072883dd1d92ac286d98",
"slip39": "github:BlueWallet/slip39-js#d316ee6a929ab645fe5462ef1c91720eb66889c8",
"silent-payments": "github:BlueWallet/SilentPayments#7ac4d17",
"slip39": "https://github.com/BlueWallet/slip39-js#d316ee6",
"stream-browserify": "3.0.0",
"url": "0.11.3",
"url": "0.11.4",
"wif": "2.0.6"
},
"react-native": {
@ -216,14 +215,13 @@
"stream": "stream-browserify"
},
"browser": {
"_stream_duplex": "readable-stream/duplex",
"_stream_passthrough": "readable-stream/passthrough",
"_stream_readable": "readable-stream/readable",
"_stream_transform": "readable-stream/transform",
"_stream_writable": "readable-stream/writable",
"crypto": "react-native-crypto",
"path": "path-browserify",
"_stream_transform": "readable-stream/transform",
"_stream_readable": "readable-stream/readable",
"_stream_writable": "readable-stream/writable",
"_stream_duplex": "readable-stream/duplex",
"_stream_passthrough": "readable-stream/passthrough",
"stream": "stream-browserify"
},
"packageManager": "yarn@3.6.4"
}
}

Some files were not shown because too many files have changed in this diff Show more